summaryrefslogtreecommitdiff
path: root/tests/requests_tests/test_accept_header.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/requests_tests/test_accept_header.py')
-rw-r--r--tests/requests_tests/test_accept_header.py78
1 files changed, 75 insertions, 3 deletions
diff --git a/tests/requests_tests/test_accept_header.py b/tests/requests_tests/test_accept_header.py
index 608af58b62..f6febc937a 100644
--- a/tests/requests_tests/test_accept_header.py
+++ b/tests/requests_tests/test_accept_header.py
@@ -173,6 +173,19 @@ class AcceptHeaderTests(TestCase):
[
"text/html",
"application/xhtml+xml",
+ "text/*",
+ "application/xml; q=0.9",
+ "*/*; q=0.8",
+ ],
+ )
+ self.assertEqual(
+ [
+ str(accepted_type)
+ for accepted_type in request.accepted_types_by_precedence
+ ],
+ [
+ "text/html",
+ "application/xhtml+xml",
"application/xml; q=0.9",
"text/*",
"*/*; q=0.8",
@@ -196,7 +209,10 @@ class AcceptHeaderTests(TestCase):
"text/*, text/plain, text/plain;format=flowed, */*"
)
self.assertEqual(
- [str(accepted_type) for accepted_type in request.accepted_types],
+ [
+ str(accepted_type)
+ for accepted_type in request.accepted_types_by_precedence
+ ],
[
"text/plain; format=flowed",
"text/plain",
@@ -261,6 +277,16 @@ class AcceptHeaderTests(TestCase):
"text/*; q=0.8",
],
)
+ self.assertEqual(
+ [
+ str(accepted_type)
+ for accepted_type in request.accepted_types_by_precedence
+ ],
+ [
+ "text/html; q=0.8",
+ "text/*; q=0.8",
+ ],
+ )
def test_no_matching_accepted_type(self):
request = HttpRequest()
@@ -289,7 +315,7 @@ class AcceptHeaderTests(TestCase):
]:
self.assertEqual(request.get_preferred_type(media_types), expected)
- def test_quality(self):
+ def test_quality_for_media_type_rfc7231(self):
"""
Taken from https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.2.
"""
@@ -314,7 +340,36 @@ class AcceptHeaderTests(TestCase):
for media_types, expected in [
(["text/html", "text/html; level=1"], "text/html; level=1"),
- (["text/html; level=2", "text/html; level=3"], "text/html; level=2"),
+ (["text/html; level=2", "text/html; level=3"], "text/html; level=3"),
+ ]:
+ self.assertEqual(request.get_preferred_type(media_types), expected)
+
+ def test_quality_for_media_type_rfc9110(self):
+ """
+ Taken from https://www.rfc-editor.org/rfc/rfc9110.html#section-12.5.1-18.
+ """
+ request = HttpRequest()
+ request.META["HTTP_ACCEPT"] = (
+ "text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed, "
+ "text/plain;format=fixed;q=0.4, */*;q=0.5"
+ )
+
+ for media_type, quality in [
+ ("text/plain;format=flowed", 1),
+ ("text/plain", 0.7),
+ ("text/html", 0.3),
+ ("image/jpeg", 0.5),
+ ("text/plain;format=fixed", 0.4),
+ ("text/html;level=3", 0.3), # https://www.rfc-editor.org/errata/eid7138
+ ]:
+ with self.subTest(media_type):
+ accepted_media_type = request.accepted_type(media_type)
+ self.assertIsNotNone(accepted_media_type)
+ self.assertEqual(accepted_media_type.quality, quality)
+
+ for media_types, expected in [
+ (["text/plain", "text/plain; format=flowed"], "text/plain; format=flowed"),
+ (["text/html", "image/jpeg"], "image/jpeg"),
]:
self.assertEqual(request.get_preferred_type(media_types), expected)
@@ -334,3 +389,20 @@ class AcceptHeaderTests(TestCase):
self.assertEqual(
request.get_preferred_type(["text/html", "text/plain"]), "text/html"
)
+
+ def test_quality_over_specificity(self):
+ """
+ For media types with the same quality, prefer the more specific type.
+ """
+ request = HttpRequest()
+ request.META["HTTP_ACCEPT"] = "text/*,image/jpeg"
+
+ self.assertEqual(request.accepted_type("text/plain").quality, 1)
+ self.assertEqual(request.accepted_type("text/plain").specificity, 1)
+
+ self.assertEqual(request.accepted_type("image/jpeg").quality, 1)
+ self.assertEqual(request.accepted_type("image/jpeg").specificity, 2)
+
+ self.assertEqual(
+ request.get_preferred_type(["text/plain", "image/jpeg"]), "image/jpeg"
+ )