@@ -256,3 +256,27 @@ def test_tag_with_spaces_is_quoted_in_request() -> None:
256256 labels = {tag .get ("label" ) for tag in root .findall (".//tag" )}
257257 assert '"Yearly Sales"' in labels
258258 assert "simple" in labels
259+
260+
261+ @pytest .mark .parametrize (
262+ "tag, expected_encoded" ,
263+ [
264+ ("tag#name" , "tag%23name" ), # issue #675: hash must be percent-encoded
265+ ("tag.name" , "tag.name" ), # issue #994: dot is safe, no encoding needed
266+ ("tag+name" , "tag%2Bname" ), # plus must be percent-encoded
267+ ("tag/name" , "tag%2Fname" ), # slash must be percent-encoded (safe='' fix)
268+ ("tag name" , "tag%20name" ), # space must be percent-encoded
269+ ],
270+ )
271+ def test_delete_tags_special_characters_encoded (get_server , tag , expected_encoded ) -> None :
272+ """Verify delete_tags percent-encodes special characters in the tag path segment."""
273+ server = get_server
274+ workbook = make_workbook ()
275+
276+ with requests_mock .mock () as m :
277+ m .delete (requests_mock .ANY , status_code = 200 )
278+ server .workbooks .delete_tags (workbook , tag )
279+ history = m .request_history
280+
281+ assert len (history ) == 1
282+ assert history [0 ].url .endswith (f"/tags/{ expected_encoded } " )
0 commit comments