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.
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)