1 | # -*- coding: utf-8 -*-
|
---|
2 | import pytest
|
---|
3 |
|
---|
4 | from rfc3986.uri import URIReference
|
---|
5 | from rfc3986.normalizers import (
|
---|
6 | normalize_scheme,
|
---|
7 | normalize_percent_characters,
|
---|
8 | remove_dot_segments,
|
---|
9 | encode_component,
|
---|
10 | normalize_host,
|
---|
11 | )
|
---|
12 |
|
---|
13 |
|
---|
14 | def test_normalize_scheme():
|
---|
15 | assert "http" == normalize_scheme("htTp")
|
---|
16 | assert "http" == normalize_scheme("http")
|
---|
17 | assert "http" == normalize_scheme("HTTP")
|
---|
18 |
|
---|
19 |
|
---|
20 | def test_normalize_percent_characters():
|
---|
21 | expected = "%3Athis_should_be_lowercase%DF%AB%4C"
|
---|
22 | assert expected == normalize_percent_characters(
|
---|
23 | "%3athis_should_be_lowercase%DF%ab%4c"
|
---|
24 | )
|
---|
25 | assert expected == normalize_percent_characters(
|
---|
26 | "%3Athis_should_be_lowercase%DF%AB%4C"
|
---|
27 | )
|
---|
28 | assert expected == normalize_percent_characters(
|
---|
29 | "%3Athis_should_be_lowercase%DF%aB%4C"
|
---|
30 | )
|
---|
31 |
|
---|
32 |
|
---|
33 | paths = [
|
---|
34 | # (Input, expected output)
|
---|
35 | ("/foo/bar/.", "/foo/bar/"),
|
---|
36 | ("/foo/bar/", "/foo/bar/"),
|
---|
37 | ("/foo/bar", "/foo/bar"),
|
---|
38 | ("./foo/bar", "foo/bar"),
|
---|
39 | ("/./foo/bar", "/foo/bar"),
|
---|
40 | ("/foo%20bar/biz%2Abaz", "/foo%20bar/biz%2Abaz"),
|
---|
41 | ("../foo/bar", "foo/bar"),
|
---|
42 | ("/../foo/bar", "/foo/bar"),
|
---|
43 | ("a/./b/../b/%63/%7Bfoo%7D", "a/b/%63/%7Bfoo%7D"),
|
---|
44 | ("//a/./b/../b/%63/%7Bfoo%7D", "//a/b/%63/%7Bfoo%7D"),
|
---|
45 | ("mid/content=5/../6", "mid/6"),
|
---|
46 | ("/a/b/c/./../../g", "/a/g"),
|
---|
47 | ]
|
---|
48 |
|
---|
49 |
|
---|
50 | @pytest.fixture(params=paths)
|
---|
51 | def path_fixture(request):
|
---|
52 | return request.param
|
---|
53 |
|
---|
54 |
|
---|
55 | @pytest.fixture(params=paths)
|
---|
56 | def uris(request):
|
---|
57 | to_norm, normalized = request.param
|
---|
58 | return (
|
---|
59 | URIReference(None, None, to_norm, None, None),
|
---|
60 | URIReference(None, None, normalized, None, None),
|
---|
61 | )
|
---|
62 |
|
---|
63 |
|
---|
64 | def test_remove_dot_segments(path_fixture):
|
---|
65 | to_normalize, expected = path_fixture
|
---|
66 | assert expected == remove_dot_segments(to_normalize)
|
---|
67 |
|
---|
68 |
|
---|
69 | def test_normalized_equality(uris):
|
---|
70 | assert uris[0] == uris[1]
|
---|
71 |
|
---|
72 |
|
---|
73 | def test_hostname_normalization():
|
---|
74 | assert URIReference(
|
---|
75 | None, "EXAMPLE.COM", None, None, None
|
---|
76 | ) == URIReference(None, "example.com", None, None, None)
|
---|
77 |
|
---|
78 |
|
---|
79 | @pytest.mark.parametrize(
|
---|
80 | ["authority", "expected_authority"],
|
---|
81 | [
|
---|
82 | ("user%2aName@EXAMPLE.COM", "user%2AName@example.com"),
|
---|
83 | ("[::1%eth0]", "[::1%25eth0]"),
|
---|
84 | ],
|
---|
85 | )
|
---|
86 | def test_authority_normalization(authority, expected_authority):
|
---|
87 | uri = URIReference(None, authority, None, None, None).normalize()
|
---|
88 | assert uri.authority == expected_authority
|
---|
89 |
|
---|
90 |
|
---|
91 | def test_fragment_normalization():
|
---|
92 | uri = URIReference(None, "example.com", None, None, "fiz%DF").normalize()
|
---|
93 | assert uri.fragment == "fiz%DF"
|
---|
94 |
|
---|
95 |
|
---|
96 | @pytest.mark.parametrize(
|
---|
97 | ["component", "encoded_component"],
|
---|
98 | [
|
---|
99 | ("/%", "/%25"),
|
---|
100 | ("/~", "/~"),
|
---|
101 | ("/%a", "/%25a"),
|
---|
102 | ("/%ag", "/%25ag"),
|
---|
103 | ("/%af", "/%af"),
|
---|
104 | ("/%20/%", "/%2520/%25"),
|
---|
105 | ("/%20%25", "/%20%25"),
|
---|
106 | ("/%21%22%23%ah%12%ff", "/%2521%2522%2523%25ah%2512%25ff"),
|
---|
107 | ],
|
---|
108 | )
|
---|
109 | def test_detect_percent_encoded_component(component, encoded_component):
|
---|
110 | assert encode_component(component, "utf-8") == encoded_component
|
---|
111 |
|
---|
112 |
|
---|
113 | @pytest.mark.parametrize(
|
---|
114 | ["host", "normalized_host"],
|
---|
115 | [
|
---|
116 | ("LOCALHOST", "localhost"),
|
---|
117 | ("[::1%eth0]", "[::1%25eth0]"),
|
---|
118 | ("[::1%25]", "[::1%2525]"),
|
---|
119 | ("[::1%%25]", "[::1%25%25]"),
|
---|
120 | ("[::1%25%25]", "[::1%25%25]"),
|
---|
121 | ("[::Af%Ff]", "[::af%25Ff]"),
|
---|
122 | ("[::Af%%Ff]", "[::af%25%Ff]"),
|
---|
123 | ("[::Af%25Ff]", "[::af%25Ff]"),
|
---|
124 | ],
|
---|
125 | )
|
---|
126 | def test_normalize_host(host, normalized_host):
|
---|
127 | assert normalize_host(host) == normalized_host
|
---|