Files
Shuery 0df07ad0ae refactor: 迁移至 bashly CLI 与功能域模块结构
- CLI 定义迁移至 src/bashly.yml(bashly 1.4 生成参数解析),入口收敛为 src/root_command.sh
- 源码按功能域重组:config/storage/integrate/media/pipeline,消除扁平散落
- 新增零依赖测试框架 tests/(123 用例)与 CI 流水线(lint + test + build + 产物一致性)
- build.sh 支持版本单一来源注入与 --check 产物校验;新增 lint.sh(bash -n + shellcheck 零容忍)
- 删除旧单文件 media_organizer.sh 与旧扁平模块
2026-08-14 22:41:28 +08:00

109 lines
3.5 KiB
Bash

# ============================================================================
# 匹配规则测试(src/lib/rules.sh):match_rules.json 加载与查询
# ============================================================================
setup() {
TEST_DIR="$(mktemp -d)"
AUTOMATED=true # 跳过交互创建
load_match_rules "$TEST_DIR/match_rules.json"
}
teardown() {
rm -rf "$TEST_DIR"
}
# load_match_rules:搜索别名(字符串与对象形式)+ ID 映射
test_load_match_rules_basic() {
cat >"$TEST_DIR/match_rules.json" <<'EOF'
{
"search_aliases": {
"俺妹": "Ore no Imouto ga Konna ni Kawaii Wake ga Nai",
"路人女主剧场版": {"term": "Saekano the Movie", "year": "2019"}
},
"id_maps": {
"movie": {"刀剑神域": 20982},
"tv": {"魔法禁书目录": 4654}
}
}
EOF
load_match_rules "$TEST_DIR/match_rules.json"
# 别名:字符串形式(无 year)与对象形式(带 year)
assert_eq "Ore no Imouto ga Konna ni Kawaii Wake ga Nai " \
"$(match_rule_lookup_alias "俺妹")"
assert_eq "Saekano the Movie 2019" \
"$(match_rule_lookup_alias "路人女主剧场版")"
# ID 映射:movie/tv 分表,键归一化后命中
assert_eq "20982" "${MATCH_RULES_ID_MOVIE[刀剑神域]:-}"
assert_eq "4654" "${MATCH_RULES_ID_TV[魔法禁书目录]:-}"
# 未命中
assert_empty "$(match_rule_lookup_alias "不存在的标题")"
assert_empty "${MATCH_RULES_ID_MOVIE[不存在的标题]:-}"
assert_empty "${MATCH_RULES_ID_TV[不存在的标题]:-}"
}
# load_match_rules:键归一化(大小写/空白)后命中
test_load_match_rules_key_normalized() {
cat >"$TEST_DIR/match_rules.json" <<'EOF'
{
"search_aliases": {
"Sword Art Online": "ソードアート・オンライン"
},
"id_maps": {
"movie": {"A B": 1}
}
}
EOF
load_match_rules "$TEST_DIR/match_rules.json"
assert_eq "ソードアート・オンライン " "$(match_rule_lookup_alias "sword art online")"
assert_eq "1" "${MATCH_RULES_ID_MOVIE[a b]:-}"
}
# load_match_rules:文件缺失 → 空规则(不报错)
test_load_match_rules_missing_file() {
assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}"
assert_empty "$(match_rule_lookup_alias "任意标题")"
}
# load_match_rules:非 JSON 对象 → 空规则 + 不阻断
test_load_match_rules_invalid_json() {
echo 'not json' >"$TEST_DIR/match_rules.json"
load_match_rules "$TEST_DIR/match_rules.json"
assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}"
assert_eq "0" "${#MATCH_RULES_ID_MOVIE[@]}"
}
# load_match_rules:空别名 term 的条目跳过(不产生空键)
test_load_match_rules_empty_term_skipped() {
cat >"$TEST_DIR/match_rules.json" <<'EOF'
{
"search_aliases": {
"空词": ""
},
"id_maps": {
"tv": {"空ID": ""}
}
}
EOF
load_match_rules "$TEST_DIR/match_rules.json"
assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}"
assert_eq "0" "${#MATCH_RULES_ID_TV[@]}"
}
# init_match_rules:自动化模式 + 文件缺失 → 不创建、空规则
test_init_match_rules_automated_missing() {
MATCH_RULES_FILE="$TEST_DIR/nonexistent/match_rules.json"
init_match_rules "$MATCH_RULES_FILE"
assert_file_absent "$MATCH_RULES_FILE"
assert_eq "0" "${#MATCH_RULES_ALIAS_TERM[@]}"
}
# init_match_rules:文件存在 → 正常加载
test_init_match_rules_existing() {
cat >"$TEST_DIR/rules.json" <<'EOF'
{"search_aliases": {"别名": "Term"}, "id_maps": {"movie": {"影": 9}}}
EOF
init_match_rules "$TEST_DIR/rules.json"
assert_eq "Term " "$(match_rule_lookup_alias "别名")"
assert_eq "9" "${MATCH_RULES_ID_MOVIE[影]:-}"
}