playbook/tests/scripts/test_install_codex_skills.bats

117 lines
2.8 KiB
Bash

#!/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" ]
}