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 与旧扁平模块
This commit is contained in:
1 parent
d978a13a83
commit
0df07ad0ae
48 files changed
+5813
-6812
No files matched your search
@@ -0,0 +1,67 @@
|
||||
# ============================================================================
|
||||
# 缓存管理模块测试(src/lib/cache.sh)
|
||||
# ============================================================================
|
||||
|
||||
setup() {
|
||||
CACHE_DIR="$(mktemp -d)"
|
||||
TMDB_LANG="zh-CN"
|
||||
}
|
||||
|
||||
teardown() {
|
||||
rm -rf "$CACHE_DIR"
|
||||
}
|
||||
|
||||
# cache_path:搜索类用 md5 哈希文件名
|
||||
test_cache_path_search_endpoint() {
|
||||
local p
|
||||
p="$(cache_path "/search/movie" "query=刀剑&year=2020")"
|
||||
assert_eq "$CACHE_DIR/tmdb/search/movie/$(cache_key_hash "query=刀剑&year=2020").json" "$p"
|
||||
}
|
||||
|
||||
# cache_path:tv 详情含语言段
|
||||
test_cache_path_tv_detail() {
|
||||
assert_eq "$CACHE_DIR/tmdb/tv/12345.zh-CN.json" "$(cache_path "/tv/12345" "x")"
|
||||
}
|
||||
|
||||
# cache_path:季数据含语言段
|
||||
test_cache_path_tv_season() {
|
||||
assert_eq "$CACHE_DIR/tmdb/tv/12345/season/1.zh-CN.json" "$(cache_path "/tv/12345/season/1" "x")"
|
||||
}
|
||||
|
||||
# cache_path:movie 详情含语言段
|
||||
test_cache_path_movie_detail() {
|
||||
assert_eq "$CACHE_DIR/tmdb/movie/6789.zh-CN.json" "$(cache_path "/movie/6789" "x")"
|
||||
}
|
||||
|
||||
# cache_path:语言切换后路径变化(缓存自动失效)
|
||||
test_cache_path_lang_switch_changes_path() {
|
||||
TMDB_LANG="ja-JP"
|
||||
assert_eq "$CACHE_DIR/tmdb/tv/12345.ja-JP.json" "$(cache_path "/tv/12345" "x")"
|
||||
}
|
||||
|
||||
# cache_key:拼接参数并追加 lang
|
||||
test_cache_key_joins_args_with_lang() {
|
||||
assert_eq "query=刀剑&lang=zh-CN" "$(cache_key "query=刀剑")"
|
||||
assert_eq "a=1&b=2&lang=zh-CN" "$(cache_key "a=1" "&b=2")"
|
||||
}
|
||||
|
||||
# cache_key_hash:md5 稳定
|
||||
test_cache_key_hash_stable() {
|
||||
local h1 h2
|
||||
h1="$(cache_key_hash "query=hello")"
|
||||
h2="$(cache_key_hash "query=hello")"
|
||||
assert_eq "$h1" "$h2"
|
||||
assert_eq "5d41402abc4b2a76b9719d911017c592" "$(cache_key_hash "hello")"
|
||||
}
|
||||
|
||||
# cache_expired:TTL 内不失效,超期失效
|
||||
test_cache_expired_ttl() {
|
||||
local f="$CACHE_DIR/f.json"
|
||||
echo '{}' >"$f"
|
||||
touch -d "2 days ago" "$f"
|
||||
assert_success cache_expired "$f" 1
|
||||
assert_failure cache_expired "$f" 30
|
||||
# 新文件不失效
|
||||
echo '{}' >"$f"
|
||||
assert_failure cache_expired "$f" 1
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
# ============================================================================
|
||||
# 账本与冷却模块测试(src/lib/ledger.sh)
|
||||
# ============================================================================
|
||||
|
||||
setup() {
|
||||
TEST_DIR="$(mktemp -d)"
|
||||
CACHE_DIR="$TEST_DIR/cache"
|
||||
DRY_RUN=false
|
||||
FAIL_RETRY_COOLDOWN_HOURS=1
|
||||
LEDGER_LINKED=()
|
||||
LEDGER_INODE=()
|
||||
COOLDOWN_MAP=()
|
||||
CORRECTIONS_MAP=()
|
||||
}
|
||||
|
||||
teardown() {
|
||||
rm -rf "$TEST_DIR"
|
||||
}
|
||||
|
||||
# ledger_mark_linked + ledger_is_linked:标记后判定已链接
|
||||
test_ledger_mark_and_is_linked() {
|
||||
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
|
||||
mkdir -p "$TEST_DIR/dest"
|
||||
echo data >"$src"
|
||||
ln "$src" "$dest"
|
||||
ledger_mark_linked "$src" "$dest"
|
||||
assert_success ledger_is_linked "$src"
|
||||
}
|
||||
|
||||
# ledger_is_linked:目标被删 → 失效(重新识别)
|
||||
test_ledger_is_linked_invalid_when_dest_deleted() {
|
||||
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
|
||||
mkdir -p "$TEST_DIR/dest"
|
||||
echo data >"$src"
|
||||
ln "$src" "$dest"
|
||||
ledger_mark_linked "$src" "$dest"
|
||||
rm -f "$dest"
|
||||
assert_failure ledger_is_linked "$src"
|
||||
}
|
||||
|
||||
# ledger_is_linked:未标记 → 未链接
|
||||
test_ledger_is_linked_unmarked() {
|
||||
local src="$TEST_DIR/a.mkv"
|
||||
echo data >"$src"
|
||||
assert_failure ledger_is_linked "$src"
|
||||
}
|
||||
|
||||
# cooldown_set + cooldown_active:冷却期内判定
|
||||
test_cooldown_set_and_active() {
|
||||
local src="$TEST_DIR/a.mkv"
|
||||
echo data >"$src"
|
||||
cooldown_set "$src" "request_failed"
|
||||
assert_success cooldown_active "$src"
|
||||
}
|
||||
|
||||
# cooldown_active:源文件消失 → 不冷却(允许重试)
|
||||
test_cooldown_inactive_when_src_gone() {
|
||||
local src="$TEST_DIR/a.mkv"
|
||||
echo data >"$src"
|
||||
cooldown_set "$src" "request_failed"
|
||||
rm -f "$src"
|
||||
assert_failure cooldown_active "$src"
|
||||
}
|
||||
|
||||
# cooldown_active:过期 → 不冷却
|
||||
test_cooldown_inactive_when_expired() {
|
||||
local src="$TEST_DIR/a.mkv"
|
||||
echo data >"$src"
|
||||
COOLDOWN_MAP["$src"]=$(($(date +%s) - 10))
|
||||
assert_failure cooldown_active "$src"
|
||||
}
|
||||
|
||||
# ledger_flush:落盘 linked.json 并可重新加载
|
||||
test_ledger_flush_roundtrip() {
|
||||
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
|
||||
mkdir -p "$TEST_DIR/dest"
|
||||
echo data >"$src"
|
||||
ln "$src" "$dest"
|
||||
ledger_mark_linked "$src" "$dest"
|
||||
ledger_flush
|
||||
assert_file_exists "$CACHE_DIR/media_organizer/linked.json"
|
||||
LEDGER_LINKED=()
|
||||
LEDGER_INODE=()
|
||||
ledger_load
|
||||
assert_success ledger_is_linked "$src"
|
||||
}
|
||||
|
||||
# ledger_flush:干运行零持久化副作用
|
||||
test_ledger_flush_skipped_in_dry_run() {
|
||||
local src="$TEST_DIR/a.mkv"
|
||||
echo data >"$src"
|
||||
ledger_mark_linked "$src" "$TEST_DIR/dest.mkv"
|
||||
DRY_RUN=true
|
||||
ledger_flush
|
||||
assert_file_absent "$CACHE_DIR/media_organizer/linked.json"
|
||||
}
|
||||
Reference in new issue
Block a user