from n_m3u8dl_py.utils import replace_vars, truncate_filename, valid_filename def test_replace_vars_supports_dash_number_formats() -> None: values = {"RepresentationID": "audio", "Number": 28324} assert replace_vars("$RepresentationID$/$Number%08x$/$Number%05d$/$Number%08X$", values) == "audio/00006ea4/28324/00006EA4" def test_replace_vars_keeps_unknown_values() -> None: assert replace_vars("$Number%08x$", {}) == "$Number%08x$" def test_filename_truncation_is_stable_and_unicode_safe() -> None: value = "δΈ­" * 100 result = truncate_filename(value, 50) assert len(result.encode("utf-8")) <= 50 assert "\ufffd" not in result assert valid_filename("a:b*c") == "a_b_c" def test_replace_vars_supports_upper_and_lower_hex() -> None: assert replace_vars("$Number%08x$/$Number%08X$", {"Number": 22999}) == "000059d7/000059D7"