Tester un commutateur de langue Wagtail avec Factory Boy

Dans ce tutoriel, on va tester un changement de langue qui garde l'utilisateur sur la même page et est capable de gérer les pages Wagtail ainsi que les pages en dehors de l'arborescence Wagtail.

15 Juillet 2020 13:27
Thèmes: Plusieurs langues Tester

On a développé un tel commutateur de langue dans un didacticiel précédent. Pour le tester, on doit avoir un site contenant quelques pages. Dans un autre tutoriel, on a mis en place un petit framework pour cela, en utilisant Factory Boy. On le réutilise pour configurer nos données de test dans un fichier /tests/test_languages.py:

from .factories import HomePageFactory, ArticlePageFactory, ArticleIndexPageFactory
from django.conf import settings
from django.test import TestCase, RequestFactory, Client
from wagtail.core.models import Page, Site
from wagtailtrans.models import Language, TranslatablePage

class TestChangeLanguageViews(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.client = Client()
        cls.factory = RequestFactory()
        cls.site = Site.objects.create(is_default_site=True, root_page=Page.get_first_root_node())
        cls.homepage = HomePageFactory()
        cls.articleindexpage = ArticleIndexPageFactory(parent=cls.homepage)
        cls.articlepage1 = ArticlePageFactory(parent=cls.articleindexpage)
        cls.foreign_language_code = [code for code, lang in settings.LANGUAGES if code != settings.LANGUAGE_CODE][0]
        # note: Wagtailtrans automatically creates a language tree for every language that is defined
        cls.foreign_language = Language.objects.get_or_create(code=cls.foreign_language_code)[0]
        cls.foreign_articlepage1 = TranslatablePage.objects.get(language=cls.foreign_language,
                                                              canonical_page=cls.articlepage1)

On a besoin du client et du request factory de Django pour nos tests. Les instances de Page, c'est à dire homepage, articleindexpage et articlepage1, sont créés de la même manière que dans le didacticiel précédent. On a également vu le code de langue étrangère et la version étrangère de la page de l'article lors des tests de notre menu. Il est temps pour notre premier test: vérifiez si la vue set_language_from_url nous amène correctement à la page d'accueil dans la langue demandée lorsqu'aucune page précédente n'est donnée. On utilise le client de test Django pour obtenir une réponse de l'url de notre view:

from django.urls import reverse

def test_change_language_without_previous_page(self):
    response = self.client.get(
        reverse('set_language_from_url', kwargs={'language_code': self.foreign_language_code}))
    expected_url = '/' + self.foreign_language_code + '/'
    self.assertEquals(response.url, expected_url)

L'exécution du test se fait avec:

python3 manage.py test cms.tests.test_languages

Si la page précédente a une URL en dehors de l'arbre Wagtail, comme /accounts/login/, la fonction set_language_from_url devrait nous amener à la version traduite de ceci:

from django.utils import translation

def test_change_language_of_login_url(self):
    # get the url from the get_language_from_url view and make a request object
    url = reverse('set_language_from_url', kwargs={'language_code': self.foreign_language_code})
    request = self.factory.get(url)

    # manually set the HTTP_REFERER value to login url
    request.META['HTTP_REFERER'] = '/' + settings.LANGUAGE_CODE + '/accounts/login/'
    translation.activate(settings.LANGUAGE_CODE)
    response = set_language_from_url(request, self.foreign_language_code)
    expected_url = '/' + self.foreign_language_code + '/accounts/login/'
    self.assertEquals(response.url, expected_url)

On a besoin d'un objet request, car on doit y ajouter les informations HTTP_REFERER, on utilise donc la RequestFactory de Django. On simule que la page précédente est dans la langue par défaut et active cette langue, puis appelle notre fonction. On attend de notre fonction qu'elle traduise l'URL avec le préfixe de la langue étrangère. L'exécution du test nous indique si tout fonctionne comme prévu.

Enfin, on teste si set_language_from_url fait de même lorsque la page de référence fait partie de l'arbre Wagtail, à savoir articlepage1. La séquence est la même: définissez l'URL et la requête, ajoutez-y la page de référence, définissez la langue et appelez la fonction pour voir si la traduction est correcte:

def test_change_language_from_canonical_page(self):
    # get the url, make a request object and set the HTTP_REFERER
    url = reverse('set_language_from_url', kwargs={'language_code': self.foreign_language_code})
    request = self.factory.get(url)
    request.META['HTTP_REFERER'] = str(self.articlepage1.url)
    translation.activate(settings.LANGUAGE_CODE)
    response = set_language_from_url(request, self.foreign_language_code)
    self.assertEqual(response.url, self.foreign_articlepage1.url)

Vérifiez notre couverture de code:

coverage run --source=cms manage.py test cms

Notre views.py est assez bien couvert. Continuons tester notre fonctionnalité de commentaire, et nos streamforms.

Commentez cet article (connectez-vous d'abord ou confirmez par nom et email ci-dessous)