117 lines
2.7 KiB
Bash
117 lines
2.7 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"
|
|
|
|
[ -d "$SKILLS_DST_ROOT" ]
|
|
}
|
|
|
|
@test "安装 - 复制 skill 目录" {
|
|
skip_if_no_skills
|
|
|
|
sh "$SCRIPT_PATH"
|
|
|
|
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" "$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" "$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" nonexistent-skill
|
|
|
|
[ "$status" -ne 0 ]
|
|
}
|
|
|
|
@test "幂等性 - 多次安装结果一致" {
|
|
skip_if_no_skills
|
|
|
|
sh "$SCRIPT_PATH"
|
|
CHECKSUM1=$(find "$SKILLS_DST_ROOT" -type f -name "SKILL.md" ! -path "$SKILLS_DST_ROOT"'/*.bak.*/*' -exec md5sum {} \; | sort | md5sum)
|
|
|
|
sh "$SCRIPT_PATH"
|
|
CHECKSUM2=$(find "$SKILLS_DST_ROOT" -type f -name "SKILL.md" ! -path "$SKILLS_DST_ROOT"'/*.bak.*/*' -exec md5sum {} \; | sort | md5sum)
|
|
|
|
[ "$CHECKSUM1" = "$CHECKSUM2" ]
|
|
}
|