diff --git a/src/hyperlink/_url.py b/src/hyperlink/_url.py index 8797b5c..61be463 100644 --- a/src/hyperlink/_url.py +++ b/src/hyperlink/_url.py @@ -1617,7 +1617,7 @@ def click(self, href=u""): if clicked.absolute: return clicked else: - clicked = self + clicked = self.replace(fragment=u"") query = clicked.query if clicked.scheme and not clicked.rooted: diff --git a/src/hyperlink/test/test_decoded_url.py b/src/hyperlink/test/test_decoded_url.py index 4845257..9102e68 100644 --- a/src/hyperlink/test/test_decoded_url.py +++ b/src/hyperlink/test/test_decoded_url.py @@ -15,6 +15,17 @@ class TestURL(HyperlinkTestCase): + def test_click_empty_reference_clears_fragment(self): + # type: () -> None + base = DecodedURL.from_text("http://example.com/a/b?x=1#old") + expected = "http://example.com/a/b?x=1" + assert base.click("").to_text() == expected + assert base.click().to_text() == expected + assert base.click("") == base.click(URL()) + assert base.click("") == base.click(DecodedURL()) + assert base.click("#new").fragment == "new" + assert base.fragment == "old" + def test_durl_basic(self): # type: () -> None bdurl = DecodedURL.from_text(BASIC_URL) diff --git a/src/hyperlink/test/test_url.py b/src/hyperlink/test/test_url.py index 37c9172..a08aef5 100644 --- a/src/hyperlink/test/test_url.py +++ b/src/hyperlink/test/test_url.py @@ -474,6 +474,21 @@ def test_click(self): u3 = u.click(u2) self.assertEqual(u3.to_text(), "http://localhost/foo/bar") + def test_click_empty_reference_clears_fragment(self): + # type: () -> None + for text, expected in ( + ("http://example.com/a/b?x=1#old", "http://example.com/a/b?x=1"), + ("http://example.com/a/../b#old", "http://example.com/b"), + ("http://example.com/#old", "http://example.com/"), + ): + base = URL.from_text(text) + assert base.click("").to_text() == expected + assert base.click().to_text() == expected + assert base.click("") == base.click(URL()) + assert base.click("#new").fragment == "new" + assert base.click("#").fragment == "" + assert base.fragment == "old" + def test_clickRFC3986(self): # type: () -> None """