Files
git-air/cmd/hook_test.go
T
unclesam b04d70b99a feat: 拆分评审与提交消息提示词并增加 hook 备份与 JSON 输出
- 新增 custom_reviewer_prompt 和 custom_commit_msg_prompt,兼容旧 custom_prompt
- pre-commit hook 安装时备份已有 hook,卸载时恢复
- 支持 --format json 输出评审结果
- diff 发送前自动脱敏敏感信息
2026-08-23 22:31:30 +08:00

88 lines
2.1 KiB
Go

package cmd
import (
"os"
"path/filepath"
"strings"
"testing"
)
func TestInstallPreCommitHookIsIdempotent(t *testing.T) {
dir := t.TempDir()
hookPath := filepath.Join(dir, "pre-commit")
original := "#!/bin/sh\necho original\n"
if err := os.WriteFile(hookPath, []byte(original), 0755); err != nil {
t.Fatal(err)
}
if err := installPreCommitHook(hookPath); err != nil {
t.Fatal(err)
}
backupPath := hookPath + preCommitBackupSuffix
backup, err := os.ReadFile(backupPath)
if err != nil {
t.Fatal(err)
}
if string(backup) != original {
t.Fatalf("原 Hook 备份内容被改变: %q", backup)
}
first, err := os.ReadFile(hookPath)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(first), preCommitMarker) {
t.Fatal("安装后的 Hook 缺少 git-air 标记")
}
if err := installPreCommitHook(hookPath); err != nil {
t.Fatal(err)
}
second, err := os.ReadFile(hookPath)
if err != nil {
t.Fatal(err)
}
if string(second) != string(first) {
t.Fatal("重复安装不应改写 git-air Hook")
}
backupAfter, err := os.ReadFile(backupPath)
if err != nil {
t.Fatal(err)
}
if string(backupAfter) != original {
t.Fatal("重复安装不应改变原 Hook 备份")
}
}
func TestPreCommitScriptRunsOnlyExecutableBackup(t *testing.T) {
script := preCommitScript()
if !strings.Contains(script, "if [ -x \"$old_hook\" ]; then") {
t.Fatalf("Hook 没有检查备份文件的可执行权限:\n%s", script)
}
}
func TestUninstallPreCommitHookRestoresOriginal(t *testing.T) {
dir := t.TempDir()
hookPath := filepath.Join(dir, "pre-commit")
original := "#!/bin/sh\necho original\n"
if err := os.WriteFile(hookPath, []byte(original), 0755); err != nil {
t.Fatal(err)
}
if err := installPreCommitHook(hookPath); err != nil {
t.Fatal(err)
}
if err := uninstallPreCommitHook(hookPath); err != nil {
t.Fatal(err)
}
restored, err := os.ReadFile(hookPath)
if err != nil {
t.Fatal(err)
}
if string(restored) != original {
t.Fatalf("原 Hook 未正确恢复: %q", restored)
}
if _, err := os.Stat(hookPath + preCommitBackupSuffix); !os.IsNotExist(err) {
t.Fatalf("备份文件未清理: %v", err)
}
}