File: querystring_test.py

package info (click to toggle)
python-urlobject 2.4.3-7
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 288 kB
  • sloc: python: 1,332; makefile: 134
file content (183 lines) | stat: -rw-r--r-- 8,010 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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# -*- coding: utf-8 -*-

import unittest

from urlobject.query_string import QueryString
from urlobject.six import u


class QueryStringTest(unittest.TestCase):

    def test_preserves_equality_with_original_string(self):
        assert QueryString('abc=123') == 'abc=123'

    def test_preserves_hash_value_of_original_string(self):
        assert hash(QueryString('abc=123')) == hash('abc=123')

    def test_list_returns_an_empty_list_for_empty_QueryStrings(self):
        assert QueryString('').list == []

    def test_list_correctly_splits_on_ampersands(self):
        assert QueryString('abc=123&def=456').list == [
            ('abc', '123'), ('def', '456')]

    def test_list_correctly_splits_on_semicolons(self):
        assert QueryString('abc=123;def=456').list == [
            ('abc', '123'), ('def', '456')]

    def test_list_correctly_decodes_special_chars(self):
        assert QueryString('a%20b=c%20d').list == [('a b', 'c d')]
        assert QueryString('a+b=c+d').list == [('a b', 'c d')]
        assert (QueryString('my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F').list ==
                [('my weird field', 'q1!2"\'w$5&7/z8)?')])

    def test_list_correctly_decodes_utf_8(self):
        assert QueryString('foo=%EF%BF%BD').list == [('foo', u('\ufffd'))]

    def test_list_doesnt_split_on_percent_encoded_special_chars(self):
        assert QueryString('a%26b%3Dc%3F=a%26b%3Dc%3F').list == [
            ('a&b=c?', 'a&b=c?')]

    def test_list_doesnt_break_if_two_parameters_have_the_same_name(self):
        assert QueryString('abc=123;abc=456').list == [
            ('abc', '123'), ('abc', '456')]

    def test_list_uses_none_as_the_value_for_valueless_parameters(self):
        assert QueryString('abc').list == [('abc', None)]
        assert QueryString('abc=123&def&ghi=456').list == [
            ('abc', '123'), ('def', None), ('ghi', '456')]

    def test_list_uses_empty_string_for_empty_valued_parameters(self):
        assert QueryString('abc=').list == [('abc', '')]
        assert QueryString('abc=123&def=&ghi=456').list == [
            ('abc', '123'), ('def', ''), ('ghi', '456')]

    def test_list_uses_empty_string_for_anonymous_parameters(self):
        assert QueryString('=123').list == [('', '123')]
        assert QueryString('abc=123&=456&ghi=789').list == [
            ('abc', '123'), ('', '456'), ('ghi', '789')]

    def test_list_can_handle_void_parameters(self):
        assert QueryString('abc=123&&def=456').list == [
            ('abc', '123'), ('', None), ('def', '456')]
        assert QueryString('abc=123&=&def=456').list == [
            ('abc', '123'), ('', ''), ('def', '456')]

    def test_dict_returns_a_dictionary_with_one_value_per_key(self):
        assert QueryString('abc=123&abc=456').dict == {'abc': '456'}

    def test_multi_dict_returns_a_dictionary_with_all_values_per_key(self):
        assert QueryString('abc=123&abc=456').multi_dict == {
            'abc': ['123', '456']}

    def test_add_param_encodes_and_adds_the_given_parameter_to_the_QueryString(self):
        s = QueryString('')
        assert s.add_param('abc', '123') == 'abc=123'
        assert (s.add_param('abc', '123')
                 .add_param('def', '456') == 'abc=123&def=456')

    def test_add_param_can_add_valueless_parameters(self):
        s = QueryString('abc=123')
        assert s.add_param('def', None) == 'abc=123&def'

    def test_add_param_can_add_empty_valued_parameters(self):
        s = QueryString('abc=123')
        assert s.add_param('def', '') == 'abc=123&def='

    def test_add_param_can_add_anonymous_parameters(self):
        s = QueryString('abc=123')
        assert s.add_param('', '456') == 'abc=123&=456'

    def test_add_param_encodes_utf8(self):
        s = QueryString('abc=123')
        assert s.add_param('foo', u('\ufffd')) == 'abc=123&foo=%EF%BF%BD'

    def test_add_param_accepts_int(self):
        s = QueryString('')
        assert s.add_param('abc', 123) == 'abc=123'

    def test_add_param_allows_the_same_parameter_name_to_be_added_twice(self):
        s = QueryString('abc=123')
        assert s.add_param('abc', '456') == 'abc=123&abc=456'

    def test_add_param_encodes_special_characters(self):
        s = QueryString('abc=123')
        assert s.add_param('d e f', '4+5#6') == 'abc=123&d+e+f=4%2B5%236'

    def test_set_param_replaces_existing_parameter_names(self):
        s = QueryString('abc=123&abc=456')
        assert s.set_param('abc', '789') == 'abc=789'

    def test_del_param_removes_all_instances_of_the_parameter_from_the_QueryString(self):
        s = QueryString('abc=123&def=456&abc=789')
        assert s.del_param('abc') == 'def=456'
        assert s.del_param('def') == 'abc=123&abc=789'

    def test_del_param_can_remove_valueless_parameters(self):
        valueless = QueryString('abc=123&def&abc=456')
        empty_valued = QueryString('abc=123&def=&abc=456')
        assert valueless.del_param('def') == 'abc=123&abc=456'
        assert empty_valued.del_param('def') == 'abc=123&abc=456'

    def test_del_param_can_remove_anonymous_parameters(self):
        s = QueryString('abc=123&=456&def=789')
        assert s.del_param('') == 'abc=123&def=789'

    def test_add_params_is_equivalent_to_calling_add_param_multiple_times(self):
        s = QueryString('')
        assert (s.add_params([('abc', '123'), ('def', '456')]) ==
                s.add_param('abc', '123').add_param('def', '456'))

    def test_add_params_accepts_the_same_args_as_dict(self):
        s = QueryString('')
        added = s.add_params({'abc': '123'}, foo='bar', xyz='456')
        assert added.dict == {'abc': '123', 'foo': 'bar', 'xyz': '456'}
        added2 = s.add_params([('abc', '123')], foo='bar', xyz='456')
        assert added2.dict == {'abc': '123', 'foo': 'bar', 'xyz': '456'}
        # It also has to fail in the same way as `dict`. If you pass more than
        # one positional argument it should raise a TypeError.
        self.assertRaises(TypeError,
                          s.add_params, {'abc': '123'}, {'foo': 'bar'})

    def test_add_params_accepts_the_same_parameter_name_multiple_times(self):
        s = (QueryString('')
             .add_params([('abc', '123'), ('abc', '456')]))
        assert s.list == [('abc', '123'), ('abc', '456')]

    def test_add_params_with_multiple_values_adds_the_same_parameter_multiple_times(self):
        s = QueryString('')
        assert (s.add_params({'foo': ['bar', 'baz']}) ==
                s.add_param('foo', 'bar').add_param('foo', 'baz'))

    def test_set_params_is_equivalent_to_calling_set_param_multiple_times(self):
        s = QueryString('')
        assert (s.set_params([('abc', '123'), ('def', '456')]) ==
                s.set_param('abc', '123').set_param('def', '456'))

    def test_set_params_accepts_the_same_args_as_dict(self):
        s = QueryString('')
        added = s.set_params({'abc': '123'}, abc='456')
        assert added.dict == {'abc': '456'}
        added2 = s.set_params([('abc', '123')], abc='456')
        assert added2.dict == {'abc': '456'}

    def test_set_params_accepts_the_same_parameter_name_multiple_times(self):
        s = (QueryString('')
             .set_params([('abc', '123'), ('abc', '456')]))
        assert s.list == [('abc', '456')]

    def test_set_params_with_multiple_values_sets_the_same_name_multiple_times(self):
        s = QueryString('foo=spam')
        assert (s.set_params({'foo': ['bar', 'baz']}) ==
                'foo=bar&foo=baz')
        s2 = QueryString('foo=bar&foo=baz')
        assert (s2.set_params({'foo': ['spam', 'ham']}) ==
                'foo=spam&foo=ham')

    def test_del_params_accepts_an_iterable_and_removes_all_listed_parameters(self):
        s = QueryString('abc=123&def=456&xyz=789')
        assert s.del_params(('abc', 'xyz')) == 'def=456'

    def test_del_param_value_removes_the_specified_value_only(self):
        s = QueryString('abc=123&abc=456&def=789')
        assert s.del_param_value('abc', '456') == 'abc=123&def=789'