from __future__ import annotations import pytest from sticker_downloader.errors import InvalidPackReference from sticker_downloader.urls import ( parse_pack_name, parse_pack_reference_lines, read_pack_references, ) @pytest.mark.parametrize( "reference", [ "https://t.me/addstickers/MyPack", "http://t.me/addstickers/MyPack", "https://www.t.me/addstickers/MyPack", "t.me/addstickers/MyPack", "https://telegram.me/addstickers/MyPack", "https://telegram.dog/addstickers/MyPack", "https://t.me/addstickers/MyPack/", "https://t.me/addstickers/MyPack?utm_source=x", "tg://addstickers?set=MyPack", "addstickers/MyPack", "MyPack", " MyPack ", '"https://t.me/addstickers/MyPack"', ], ) def test_accepts_every_reasonable_form(reference: str) -> None: assert parse_pack_name(reference) == "MyPack" def test_accepts_custom_emoji_links() -> None: assert parse_pack_name("https://t.me/addemoji/MyPack") == "MyPack" @pytest.mark.parametrize( "reference", [ "", " ", # The original urls.txt had this typo on its first line. "me/addstickers/LokisStickers", "https://example.com/addstickers/MyPack", "https://t.me/MyPack", "https://t.me/joinchat/MyPack", "https://t.me/addstickers/", "My-Pack!", "tg://addstickers?other=MyPack", ], ) def test_rejects_non_sticker_references(reference: str) -> None: with pytest.raises(InvalidPackReference): parse_pack_name(reference) def test_reference_lines_skip_comments_blanks_and_duplicates() -> None: references, problems = parse_pack_reference_lines( [ "# a comment", "", " ", "https://t.me/addstickers/One", "https://t.me/addstickers/Two", # Same pack, different spelling: only the first survives. "One", "t.me/addstickers/one", ] ) assert references == ["https://t.me/addstickers/One", "https://t.me/addstickers/Two"] assert problems == [] def test_reference_lines_report_bad_lines_with_line_numbers() -> None: references, problems = parse_pack_reference_lines( ["https://t.me/addstickers/Good", "not a link at all"], source="urls.txt" ) assert references == ["https://t.me/addstickers/Good"] assert len(problems) == 1 assert problems[0].startswith("urls.txt:2:") def test_read_pack_references_from_file(tmp_path) -> None: path = tmp_path / "urls.txt" path.write_text( "# packs\nhttps://t.me/addstickers/Alpha\nbroken line\n", encoding="utf-8" ) references, problems = read_pack_references(path) assert references == ["https://t.me/addstickers/Alpha"] assert len(problems) == 1 assert str(path) in problems[0]