94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
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]
|