"""`_catalog_names` — the drug names shown to `LlmQueryUnderstander`. Reproduces a live 2026-08-06 bug: picking the first N aliases alphabetically could drop a drug's own recognizable name entirely, breaking multi-turn follow-ups where the drug is no longer restated in the raw turn text (see `docs/progress-log.md` for the exact failure: "Liều paracetamol cho trẻ em" -> two clarify rounds -> "Không tìm thấy paracetamol"). """ from bootstrap import _catalog_names def test_alphabetically_early_junk_alias_does_not_bury_the_canonical_name(): aliases = { "paracetamol_acetaminophen": { "0Frezefev", "ABAB", "Ace kid 80", "PARACETAMOL", "Acetaminophen", }, } shown = _catalog_names(aliases)["paracetamol_acetaminophen"] assert "paracetamol acetaminophen" in shown def test_canonical_name_is_always_first(): aliases = {"metformin": {"METFORMIN", "Axiol", "Dybis", "Zzyzx"}} shown = _catalog_names(aliases)["metformin"] assert shown.split(", ")[0] == "metformin" def test_drug_with_no_aliases_still_shows_its_canonical_name(): shown = _catalog_names({"some_drug": set()})["some_drug"] assert shown == "some drug" def test_output_is_capped_and_does_not_duplicate_the_canonical_name(): aliases = {"drug_x": {f"Brand{i}" for i in range(20)} | {"DRUG X", "drug x"}} shown = _catalog_names(aliases)["drug_x"].split(", ") assert shown[0] == "drug x" assert shown.count("drug x") == 1 assert len(shown) <= 3