"""Industry taxonomy file + deterministic label → slug mapping.""" from __future__ import annotations import pytest from companyatlas.registry.industries import ( industry_index, is_valid_slug, load_industries, map_industry, map_label, map_sic, top_level_of, top_level_slugs, ) EXPECTED = { "software industry": ["software"], "Software": ["software"], "banking": ["banking"], "bank": ["banking"], "video game industry": ["gaming"], "automotive industry": ["automotive"], "insurance": ["insurance"], "pharmaceutical industry": ["pharmaceuticals"], "semiconductor industry": ["semiconductors"], "e-commerce": ["e-commerce"], "retail": ["retail"], "telecommunications industry": ["telecommunications"], "airline": ["airlines"], "film industry": ["entertainment"], "financial services": ["financial-services"], "oil and gas industry": ["oil-gas"], "renewable energy": ["renewables"], "biotechnology": ["biotechnology"], "hospitality industry": ["hospitality"], "aerospace manufacturer": ["aerospace-defense"], "arms industry": ["defense"], "food industry": ["food-beverage"], "fashion": ["apparel"], "mass media": ["media"], "real estate": ["real-estate"], "construction industry": ["construction"], "steel industry": ["mining"], "chemical industry": ["chemicals"], "cloud computing": ["cloud-infrastructure"], "artificial intelligence": ["artificial-intelligence"], "payment system": ["payments"], "asset management": ["asset-management"], "management consulting": ["consulting"], "agriculture": ["agriculture"], "robotics": ["robotics"], "machinery industry": ["industrial-machinery"], "public utility": ["utilities"], "glass industry": ["materials"], "health care industry": ["healthcare"], "medical device": ["medical-devices"], "toy industry": ["consumer-goods"], "logistics": ["logistics"], "shipping": ["shipping"], "education": ["education"], "tourism": ["travel"], "think tank": ["education"], # longest keyword wins over "tank" (defense) "cybersecurity": ["cybersecurity"], "social media": ["internet"], } @pytest.mark.parametrize(("label", "slugs"), sorted(EXPECTED.items())) def test_map_label(label: str, slugs: list[str]) -> None: assert map_industry(label) == slugs def test_unknown_and_empty() -> None: assert map_industry("") == [] assert map_industry(None) == [] assert map_industry("zzz nothing here") == [] assert map_label("post-production") == [] # hyphenated words are not split into keywords def test_multi_label_order_and_dedupe() -> None: assert map_industry(["banking", "insurance", "banking", "software industry"]) == ["banking", "insurance", "software"] assert map_industry(["a", "b", "c", "d", "e"] + ["banking"] * 3, limit=1) == ["banking"] def test_taxonomy_integrity() -> None: inds = load_industries() slugs = [i.slug for i in inds] assert len(slugs) == len(set(slugs)) >= 45 for i in inds: assert i.name and i.description assert len(i.keywords) >= 3, i.slug assert i.parent is None or i.parent in slugs assert i.parent is None or industry_index()[i.parent].parent is None, "max two levels" required = {"technology", "software", "artificial-intelligence", "semiconductors", "cloud-infrastructure", "cybersecurity", "internet", "e-commerce", "fintech", "payments", "banking", "insurance", "asset-management", "real-estate", "construction", "retail", "consumer-goods", "food-beverage", "apparel", "energy", "oil-gas", "renewables", "utilities", "mining", "chemicals", "materials", "manufacturing", "industrial-machinery", "automotive", "aerospace-defense", "transportation", "logistics", "airlines", "shipping", "telecommunications", "media", "entertainment", "gaming", "healthcare", "biotechnology", "pharmaceuticals", "medical-devices", "hospitality", "travel", "education", "professional-services", "consulting", "agriculture", "robotics", "defense"} assert required <= set(slugs) assert "technology" in top_level_slugs() and "software" not in top_level_slugs() assert top_level_of("software") == "technology" and top_level_of("technology") == "technology" assert is_valid_slug("banking") and not is_valid_slug("banks") def test_map_sic() -> None: assert map_sic(7372) == "software" assert map_sic("3674") == "semiconductors" assert map_sic(6021) == "banking" assert map_sic(2836) == "biotechnology" assert map_sic(4512) == "airlines" assert map_sic(1311) == "oil-gas" assert map_sic(9999) is None assert map_sic(None) is None and map_sic("") is None and map_sic("abc") is None