zcbot/tests/test_shortcuts.py

83 lines
2.4 KiB
Python

"""core/shortcuts.py:解析 + 入口层展开(纯函数 + 文件读)。"""
from __future__ import annotations
from uuid import uuid4
from core import shortcuts
SAMPLE = """\
# 我的快捷指令
| 触发词 | 指令 |
|---|---|
| 简报 | 给我输出一份昨日的 AI 新闻简报 |
| Standup | Summarize yesterday's commits |
| 简报 | 这条重复应被首行覆盖 |
"""
def test_parse_skips_header_and_separator():
m = shortcuts.parse_shortcuts(SAMPLE)
# 表头「触发词」、分隔行 |---| 都不进表
assert "触发词" not in m
assert "---" not in m
assert "简报" in m
assert m["简报"] == "给我输出一份昨日的 AI 新闻简报" # 首行赢
def test_parse_case_insensitive_key():
m = shortcuts.parse_shortcuts(SAMPLE)
# 触发词归一化用 casefold,英文键存成小写
assert "standup" in m
assert m["standup"] == "Summarize yesterday's commits"
def test_parse_empty_and_garbage():
assert shortcuts.parse_shortcuts("") == {}
assert shortcuts.parse_shortcuts("没有表格\n只是普通文本") == {}
# 单元格缺失 / 只有一列 → 跳过
assert shortcuts.parse_shortcuts("| 只有一列 |") == {}
def _write(tmp_path, user_id, body):
d = tmp_path / "users" / str(user_id) / ".memory"
d.mkdir(parents=True, exist_ok=True)
(d / "shortcuts.md").write_text(body, encoding="utf-8")
def test_expand_exact_match(tmp_path):
uid = uuid4()
_write(tmp_path, uid, SAMPLE)
out, hit = shortcuts.expand(tmp_path, uid, "简报")
assert out == "给我输出一份昨日的 AI 新闻简报"
assert hit == "简报"
# 首尾空格 / 大小写不影响命中
out2, hit2 = shortcuts.expand(tmp_path, uid, " Standup ")
assert out2 == "Summarize yesterday's commits"
assert hit2 == "Standup"
def test_expand_no_partial_match(tmp_path):
uid = uuid4()
_write(tmp_path, uid, SAMPLE)
# 整条不等于触发词 → 原样返回,不展开
out, hit = shortcuts.expand(tmp_path, uid, "帮我出个简报")
assert out == "帮我出个简报"
assert hit is None
def test_expand_missing_file(tmp_path):
uid = uuid4() # 没写文件
out, hit = shortcuts.expand(tmp_path, uid, "简报")
assert out == "简报"
assert hit is None
def test_expand_empty_text(tmp_path):
uid = uuid4()
_write(tmp_path, uid, SAMPLE)
out, hit = shortcuts.expand(tmp_path, uid, " ")
assert out == " "
assert hit is None