"""Skill 关键词触发匹配纯函数测试。""" from types import SimpleNamespace from app.modules.skills.matcher import match_skills def _skill(name: str, trigger: str, status: str = "enabled") -> SimpleNamespace: return SimpleNamespace(name=name, trigger=trigger, status=status) def test_match_by_keyword() -> None: skills = [_skill("coding", "代码,编程")] assert len(match_skills("帮我写代码", skills)) == 1 def test_no_match() -> None: skills = [_skill("coding", "代码,编程")] assert match_skills("今天天气不错", skills) == [] def test_case_insensitive() -> None: skills = [_skill("en", "Python")] assert len(match_skills("用 python 写", skills)) == 1 def test_multiple_keywords_any_match() -> None: skills = [_skill("dev", "代码,debug,编程")] assert len(match_skills("帮我 debug", skills)) == 1 def test_disabled_not_matched() -> None: skills = [_skill("coding", "代码", status="disabled")] assert match_skills("写代码", skills) == [] def test_empty_trigger_not_matched() -> None: skills = [_skill("empty", "")] assert match_skills("任意文本", skills) == [] def test_multiple_skills_order_preserved() -> None: skills = [_skill("a", "代码"), _skill("b", "天气"), _skill("c", "编程")] matched = match_skills("写代码和编程", skills) assert [s.name for s in matched] == ["a", "c"] def test_empty_context() -> None: skills = [_skill("a", "代码")] assert match_skills("", skills) == [] def test_whitespace_only_trigger_ignored() -> None: skills = [_skill("ws", " , , ")] assert match_skills("任意文本", skills) == []