#!/usr/bin/env bats # install_codex_skills.sh 测试套件 setup() { export TEST_DIR="$(mktemp -d)" export PLAYBOOK_ROOT="$(cd "$BATS_TEST_DIRNAME/../.." && pwd)" export SCRIPT_PATH="$PLAYBOOK_ROOT/scripts/install_codex_skills.sh" # 创建临时 HOME 避免污染真实环境 export ORIGINAL_HOME="$HOME" export HOME="$TEST_DIR/home" mkdir -p "$HOME" export CODEX_HOME="$HOME/.codex" export SKILLS_DST_ROOT="$CODEX_HOME/skills" cd "$TEST_DIR" } teardown() { export HOME="$ORIGINAL_HOME" if [ -n "$TEST_DIR" ] && [ -d "$TEST_DIR" ]; then chmod -R u+w "$TEST_DIR" 2>/dev/null || true rm -rf "$TEST_DIR" fi } skip_if_no_skills() { if [ ! -d "$PLAYBOOK_ROOT/codex/skills" ]; then skip "No codex/skills directory found" fi } first_skill_name() { ls -1 "$PLAYBOOK_ROOT/codex/skills" 2>/dev/null | head -n 1 } # ============================================== # 基础功能测试 # ============================================== @test "install_codex_skills.sh 脚本存在且可执行" { [ -f "$SCRIPT_PATH" ] } @test "安装 - 创建 skills 目录" { skip_if_no_skills [ ! -d "$SKILLS_DST_ROOT" ] sh "$SCRIPT_PATH" -all [ -d "$SKILLS_DST_ROOT" ] } @test "安装 - 复制 skill 目录" { skip_if_no_skills sh "$SCRIPT_PATH" -all SKILL_DIRS=$(find "$SKILLS_DST_ROOT" -mindepth 1 -maxdepth 1 -type d) [ -n "$SKILL_DIRS" ] for dir in $SKILL_DIRS; do [ -f "$dir/SKILL.md" ] done } @test "安装 - 指定单个 skill" { skip_if_no_skills SKILL_NAME="$(first_skill_name)" [ -n "$SKILL_NAME" ] sh "$SCRIPT_PATH" -skills "$SKILL_NAME" [ -d "$SKILLS_DST_ROOT/$SKILL_NAME" ] COUNT=$(find "$SKILLS_DST_ROOT" -mindepth 1 -maxdepth 1 -type d | wc -l) [ "$COUNT" -eq 1 ] } @test "备份 - 同名 skill 目录会创建备份" { skip_if_no_skills SKILL_NAME="$(first_skill_name)" [ -n "$SKILL_NAME" ] mkdir -p "$SKILLS_DST_ROOT/$SKILL_NAME" echo "marker" > "$SKILLS_DST_ROOT/$SKILL_NAME/marker.txt" sh "$SCRIPT_PATH" -skills "$SKILL_NAME" BACKUP_DIRS=$(find "$SKILLS_DST_ROOT" -maxdepth 1 -type d -name "$SKILL_NAME.bak.*") [ -n "$BACKUP_DIRS" ] } @test "错误处理 - 指定不存在 skill 报错" { skip_if_no_skills run sh "$SCRIPT_PATH" -skills nonexistent-skill [ "$status" -ne 0 ] } @test "幂等性 - 多次安装结果一致" { skip_if_no_skills sh "$SCRIPT_PATH" -all CHECKSUM1=$(find "$SKILLS_DST_ROOT" -type f -name "SKILL.md" ! -path "$SKILLS_DST_ROOT"'/*.bak.*/*' -exec md5sum {} \; | sort | md5sum) sh "$SCRIPT_PATH" -all CHECKSUM2=$(find "$SKILLS_DST_ROOT" -type f -name "SKILL.md" ! -path "$SKILLS_DST_ROOT"'/*.bak.*/*' -exec md5sum {} \; | sort | md5sum) [ "$CHECKSUM1" = "$CHECKSUM2" ] }