# ============================================================================ # 账本与冷却模块测试(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" }