1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
from django.test import RequestFactory
from django.test.utils import override_settings
from django.urls import get_urlconf, resolve, reverse
from django.utils import translation
from parler.templatetags.parler_tags import get_translated_url
from .testapp.models import ArticleSlugModel
from .utils import AppTestCase
class UrlTests(AppTestCase):
"""
Test model construction
"""
@classmethod
def setUpClass(cls):
super().setUpClass()
article = ArticleSlugModel(_current_language=cls.conf_fallback, slug="default")
article.set_current_language(cls.other_lang1)
article.slug = "lang1"
article.set_current_language(cls.other_lang2)
article.slug = "lang2"
article.save()
cls.article = article
def test_init_data(self):
"""
Test whether the model is properly stored.
"""
self.assertEqual(
self.article.safe_translation_getter("slug", language_code=self.conf_fallback),
"default",
)
self.assertEqual(
self.article.safe_translation_getter("slug", language_code=self.other_lang1), "lang1"
)
self.assertEqual(
self.article.safe_translation_getter("slug", language_code=self.other_lang2), "lang2"
)
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_get_absolute_url(self):
"""
Test whether the absolute URL values are correct.
"""
self.article.set_current_language(self.conf_fallback)
self.assertEqual(
self.article.get_absolute_url(), f"/{self.conf_fallback}/article/default/"
)
# Switching gives the proper URL prefix too because switch_translation(self) is applied.
self.article.set_current_language(self.other_lang1)
self.assertEqual(self.article.get_absolute_url(), f"/{self.other_lang1}/article/lang1/")
self.article.set_current_language(self.other_lang2)
self.assertEqual(self.article.get_absolute_url(), f"/{self.other_lang2}/article/lang2/")
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_get_translated_url(self):
"""
Test whether get_translated_url works properly in templates.
"""
# Pretend there is a request on /af/article-lang1/
with translation.override(self.other_lang1):
self.article.set_current_language(self.other_lang1)
context = {
"request": RequestFactory().get(f"/{self.other_lang1}/article/lang1/"),
"object": self.article,
}
# Simulate {% get_translated_url CODE object %} syntax.
# The object.get_absolute_url() will be used to get a translated URL.
self.assertEqual(
get_translated_url(context, lang_code=self.other_lang2),
f"/{self.other_lang2}/article/lang2/",
)
self.assertEqual(
get_translated_url(context, lang_code=self.conf_fallback),
f"/{self.conf_fallback}/article/default/",
)
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_get_translated_url_view_kwargs(self):
"""
Test that get_translated_url can handle view kwargs.
"""
with translation.override(self.other_lang1):
url = reverse("view-kwargs-test-view")
self.assertEqual(url, f"/{self.other_lang1}/tests/kwargs-view/")
context = {
"request": RequestFactory().get(url),
}
context["request"].resolver_match = resolve(url) # Simulate WSGIHandler.get_response()
# Simulate {% get_translated_url CODE %} syntax
# The request.resolver_match will be used to get a translated URL.
self.assertEqual(
get_translated_url(context, lang_code=self.other_lang2),
f"/{self.other_lang2}/tests/kwargs-view/",
)
self.assertEqual(
get_translated_url(context, lang_code=self.conf_fallback),
f"/{self.conf_fallback}/tests/kwargs-view/",
)
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_get_translated_url_query_string(self):
"""
Test that the querystring is copied to the translated URL.
"""
# Pretend there is a request on /af/article-lang1/
with translation.override(self.other_lang1):
self.article.set_current_language(self.other_lang1)
context = {
"request": RequestFactory().get(
f"/{self.other_lang1}/article/lang1/", {"next": "/fr/propri\xe9t\xe9/add/"}
),
"object": self.article,
}
# Simulate {% get_translated_url CODE object %} syntax.
# The object.get_absolute_url() will be used to get a translated URL.
added_qs = "?next=%2Ffr%2Fpropri%C3%A9t%C3%A9%2Fadd%2F"
self.assertEqual(
get_translated_url(context, lang_code=self.other_lang2),
f"/{self.other_lang2}/article/lang2/{added_qs}",
)
self.assertEqual(
get_translated_url(context, lang_code=self.conf_fallback),
f"/{self.conf_fallback}/article/default/{added_qs}",
)
# If the object is passed explicitly, it's likely not the current page.
# Hence the querystring will not be copied in this case.
self.assertEqual(
get_translated_url(context, lang_code=self.other_lang2, object=self.article),
f"/{self.other_lang2}/article/lang2/",
)
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_translatable_slug_mixin(self):
"""
Test whether translated slugs are properly resolved.
"""
# Try calls on regular translated views first
with translation.override(self.other_lang1): # This simulates LocaleMiddleware
response = self.client.get(f"/{self.other_lang1}/article/lang1/")
self.assertContains(response, "view: lang1")
with translation.override(self.other_lang2):
response = self.client.get(f"/{self.other_lang2}/article/lang2/")
self.assertContains(response, "view: lang2")
@override_settings(ROOT_URLCONF="parler.tests.testapp.urls")
def test_translatable_slug_mixin_redirect(self):
"""
Test whether calling a translated URL by their fallback causes a redirect.
"""
# Try call on the default slug (which is resolvable), although there is a translated version.
with translation.override(self.other_lang2):
response = self.client.get(f"/{self.other_lang2}/article/default/")
self.assertRedirects(response, f"/{self.other_lang2}/article/lang2/", status_code=301)
|