diff --git a/tests/test_url_query.py b/tests/test_url_query.py index 5d9c6d159..a9bed76a3 100644 --- a/tests/test_url_query.py +++ b/tests/test_url_query.py @@ -12,8 +12,6 @@ # ======================================== URLS_WITH_BASIC_QUERY_VALUES = [ - - # Empty strings, keys and values ( URL('http://example.com'), MultiDict(), @@ -26,8 +24,9 @@ URL('http://example.com?a='), MultiDict([('a', '')]), ), +] # type: List[Tuple[URL, MultiDict]] - # ASCII chars +URLS_WITH_ASCII_QUERY_VALUES = [ ( # TODO: Double check if key is expected as `a b` or `a+b`. URL('http://example.com?a+b=c+d'), @@ -41,8 +40,10 @@ URL('http://example.com?a=1&b=2&a=3'), MultiDict([('a', '1'), ('b', '2'), ('a', '3')]), ), +] # type: List[Tuple[URL, MultiDict]] - # Non-ASCI BMP chars +URLS_WITH_NON_ASCII_QUERY_VALUES = [ + # BMP chars ( URL('http://example.com?ключ=знач'), MultiDict({'ключ': 'знач'}), @@ -62,7 +63,9 @@ @pytest.mark.parametrize( 'original_url, expected_query', - URLS_WITH_BASIC_QUERY_VALUES, + URLS_WITH_BASIC_QUERY_VALUES + + URLS_WITH_ASCII_QUERY_VALUES + + URLS_WITH_NON_ASCII_QUERY_VALUES, ) def test_query_basic_parsing(original_url, expected_query): assert isinstance(original_url.query, MultiDictProxy) @@ -71,13 +74,11 @@ def test_query_basic_parsing(original_url, expected_query): @pytest.mark.parametrize( 'original_url, expected_query', - URLS_WITH_BASIC_QUERY_VALUES, + URLS_WITH_ASCII_QUERY_VALUES + URLS_WITH_NON_ASCII_QUERY_VALUES, ) def test_query_basic_update_query(original_url, expected_query): new_url = original_url.update_query({}) - # FIXME: `?a` becomes `?a=` right now. Maybe support `None` values? - # assert new_url == original_url - assert new_url is not None + assert new_url == original_url def test_query_dont_unqoute_twice(): @@ -167,3 +168,51 @@ def test_query_from_empty_update_query( # FIXME: Broken because of asymmetric query encoding # assert new_url == original_url + + +# ======================================== +# Setting and getting query values +# ======================================== + +def test_query_set_encoded_url_as_value(): + original_url = URL('http://example.com') + + new_url_1 = original_url.update_query({'foo': '𝕦𝕟𝕚'}) + assert '𝕦𝕟𝕚' == new_url_1.query['foo'] + + new_url_1_str = str(new_url_1) + assert ( + 'http://example.com/?foo=%F0%9D%95%A6%F0%9D%95%9F%F0%9D%95%9A' + ) == new_url_1_str + + new_url_2 = original_url.update_query({'bar': new_url_1_str}) + # FIXME: Double-decoding query value + # assert new_url_1_str == new_url_2.query['bar'] + assert 'http://example.com/?foo=𝕦𝕟𝕚' == new_url_2.query['bar'] + + new_url_2_str = str(new_url_2) + # FIXME: Double-decoding query value + # assert ( + # 'http://example.com/?bar=http%3A//example.com/%3Ffoo%3D' + # '%25F0%259D%2595%25A6%25F0%259D%2595%259F%25F0%259D%2595%259A' + # ) == new_url_2_str + assert ( + 'http://example.com/?bar=http://example.com/?foo%3D' + '%F0%9D%95%A6%F0%9D%95%9F%F0%9D%95%9A' + ) == new_url_2_str + + new_url_3 = original_url.with_query({'bar': new_url_1_str}) + # FIXME: Double-decoding query value + # assert new_url_1_str == new_url_3.query['bar'] + assert 'http://example.com/?foo=𝕦𝕟𝕚' == new_url_3.query['bar'] + + new_url_3_str = str(new_url_3) + # FIXME: Double-decoding query value + # assert ( + # 'http://example.com/?bar=http%3A//example.com/%3Ffoo%3D' + # '%25F0%259D%2595%25A6%25F0%259D%2595%259F%25F0%259D%2595%259A' + # ) == new_url_3_str + assert ( + 'http://example.com/?bar=http://example.com/?foo%3D' + '%F0%9D%95%A6%F0%9D%95%9F%F0%9D%95%9A' + ) == new_url_3_str