summaryrefslogtreecommitdiff
path: root/tests/urlpatterns_reverse
diff options
context:
space:
mode:
Diffstat (limited to 'tests/urlpatterns_reverse')
-rw-r--r--tests/urlpatterns_reverse/tests.py82
1 files changed, 81 insertions, 1 deletions
diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py
index 91d3f237ec..59a48c9987 100644
--- a/tests/urlpatterns_reverse/tests.py
+++ b/tests/urlpatterns_reverse/tests.py
@@ -11,7 +11,12 @@ from admin_scripts.tests import AdminScriptTestCase
from django.conf import settings
from django.contrib.auth.models import User
from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
-from django.http import HttpRequest, HttpResponsePermanentRedirect, HttpResponseRedirect
+from django.http import (
+ HttpRequest,
+ HttpResponsePermanentRedirect,
+ HttpResponseRedirect,
+ QueryDict,
+)
from django.shortcuts import redirect
from django.test import RequestFactory, SimpleTestCase, TestCase, override_settings
from django.test.utils import override_script_prefix
@@ -531,6 +536,81 @@ class URLPatternReverse(SimpleTestCase):
with self.assertRaises(NoReverseMatch):
reverse(views.view_func_from_cbv)
+ def test_reverse_with_query(self):
+ self.assertEqual(
+ reverse("test", query={"hello": "world", "foo": 123}),
+ "/test/1?hello=world&foo=123",
+ )
+
+ def test_reverse_with_query_sequences(self):
+ cases = [
+ [("hello", "world"), ("foo", 123), ("foo", 456)],
+ (("hello", "world"), ("foo", 123), ("foo", 456)),
+ {"hello": "world", "foo": (123, 456)},
+ ]
+ for query in cases:
+ with self.subTest(query=query):
+ self.assertEqual(
+ reverse("test", query=query), "/test/1?hello=world&foo=123&foo=456"
+ )
+
+ def test_reverse_with_fragment(self):
+ self.assertEqual(reverse("test", fragment="tab-1"), "/test/1#tab-1")
+
+ def test_reverse_with_fragment_not_encoded(self):
+ self.assertEqual(
+ reverse("test", fragment="tab 1 is the best!"), "/test/1#tab 1 is the best!"
+ )
+
+ def test_reverse_with_query_and_fragment(self):
+ self.assertEqual(
+ reverse("test", query={"hello": "world", "foo": 123}, fragment="tab-1"),
+ "/test/1?hello=world&foo=123#tab-1",
+ )
+
+ def test_reverse_with_empty_fragment(self):
+ self.assertEqual(reverse("test", fragment=None), "/test/1")
+ self.assertEqual(reverse("test", fragment=""), "/test/1#")
+
+ def test_reverse_with_invalid_fragment(self):
+ cases = [0, False, {}, [], set(), ()]
+ for fragment in cases:
+ with self.subTest(fragment=fragment):
+ with self.assertRaises(TypeError):
+ reverse("test", fragment=fragment)
+
+ def test_reverse_with_empty_query(self):
+ cases = [None, "", {}, [], set(), (), QueryDict()]
+ for query in cases:
+ with self.subTest(query=query):
+ self.assertEqual(reverse("test", query=query), "/test/1")
+
+ def test_reverse_with_invalid_query(self):
+ cases = [0, False, [1, 3, 5], {1, 2, 3}]
+ for query in cases:
+ with self.subTest(query=query):
+ with self.assertRaises(TypeError):
+ print(reverse("test", query=query))
+
+ def test_reverse_encodes_query_string(self):
+ self.assertEqual(
+ reverse(
+ "test",
+ query={
+ "hello world": "django project",
+ "foo": [123, 456],
+ "@invalid": ["?", "!", "a b"],
+ },
+ ),
+ "/test/1?hello+world=django+project&foo=123&foo=456"
+ "&%40invalid=%3F&%40invalid=%21&%40invalid=a+b",
+ )
+
+ def test_reverse_with_query_from_querydict(self):
+ query_string = "a=1&b=2&b=3&c=4"
+ query_dict = QueryDict(query_string)
+ self.assertEqual(reverse("test", query=query_dict), f"/test/1?{query_string}")
+
class ResolverTests(SimpleTestCase):
def test_resolver_repr(self):