from urllib.parse import urlencode from multidict import MultiDict, MultiDictProxy from yarl import URL # query def test_query_spaces(): url = URL("http://example.com?a+b=c+d") assert url.query == MultiDict({"a b": "c d"}) def test_query_empty(): url = URL("http://example.com") assert isinstance(url.query, MultiDictProxy) assert url.query == MultiDict() def test_query(): url = URL("http://example.com?a=1&b=2") assert url.query == MultiDict([("a", "1"), ("b", "2")]) def test_query_repeated_args(): url = URL("http://example.com?a=1&b=2&a=3") assert url.query == MultiDict([("a", "1"), ("b", "2"), ("a", "3")]) def test_query_empty_arg(): url = URL("http://example.com?a") assert url.query == MultiDict([("a", "")]) def test_query_dont_unqoute_twice(): sample_url = "http://base.place?" + urlencode({"a": "/////"}) query = urlencode({"url": sample_url}) full_url = "http://test_url.aha?" + query url = URL(full_url) assert url.query["url"] == sample_url def test_query_nonascii(): url = URL("http://example.com?ключ=знач") assert url.query == MultiDict({"ключ": "знач"}) # query separators def test_ampersand_as_separator(): u = URL("http://127.0.0.1/?a=1&b=2") assert len(u.query) == 2 def test_ampersand_as_value(): u = URL("http://127.0.0.1/?a=1%26b=2") assert len(u.query) == 1 assert u.query["a"] == "1&b=2" def test_semicolon_as_separator(): u = URL("http://127.0.0.1/?a=1;b=2") assert len(u.query) == 2 def test_semicolon_as_value(): u = URL("http://127.0.0.1/?a=1%3Bb=2") assert len(u.query) == 1 assert u.query["a"] == "1;b=2"