File: test_urls.py

package info (click to toggle)
python-django-parler 2.3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,032 kB
  • sloc: python: 4,293; makefile: 164; sh: 6
file content (165 lines) | stat: -rw-r--r-- 6,982 bytes parent folder | download | duplicates (2)
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)