Files
kenaito-kopsc/internal/executor/gitbackup_test.go
T
odboy f3b90d205c feat: 新增 git retime,把指定日期范围的提交时间改到 21:00-23:00 并强推
- 保留每个提交的原日期,只重排时分秒到 21:00-23:00;同日严格递增,
  间隔 5-40 分钟且秒位随机;窗口不足时自动压紧并在预览中标注
- 支持 --window/--since/--until、--interval(含 match-remote)、--seed、
  --remote、--branch、--no-push
- 安全措施:默认只预览(退出码 2)、脏工作区拒绝、改写前创建
  refs/kopsc-backup/<分支>-<时间戳> 备份、推送前比对 tree 哈希、
  只用 --force-with-lease
- BuiltinRequest 增加 Confirmed,使内置命令能获知 CLI 已确认 --yes
- 文档:新增 README.git.md,主 README 补充导航与示例
2026-11-01 09:49:03 +08:00

70 lines
2.1 KiB
Go

package executor
import (
"context"
"strings"
"testing"
"time"
)
func TestBackupRefName(t *testing.T) {
now := time.Date(2026, 11, 1, 9, 30, 15, 0, cst)
got := backupRefName("main", now)
if got != "refs/kopsc-backup/main-20261101-093015" {
t.Fatalf("backupRefName = %q", got)
}
if !strings.HasPrefix(got, backupRefPrefix) {
t.Errorf("ref must live under %s: %q", backupRefPrefix, got)
}
}
func TestCreateBackupWritesRef(t *testing.T) {
runner := &fakeGitRunner{responses: map[string]gitResponse{
"update-ref refs/kopsc-backup/main-20261101-093015 abc123": {out: ""},
}}
now := time.Date(2026, 11, 1, 9, 30, 15, 0, cst)
ref, err := createBackup(context.Background(), runner, "main", "abc123", now)
if err != nil {
t.Fatalf("createBackup: %v", err)
}
if ref != "refs/kopsc-backup/main-20261101-093015" {
t.Fatalf("ref = %q", ref)
}
if len(runner.calls) != 1 || !strings.Contains(runner.calls[0], "update-ref "+ref+" abc123") {
t.Fatalf("calls = %v", runner.calls)
}
}
func TestEnsureCleanWorktreeRejectsDirtyTree(t *testing.T) {
runner := &fakeGitRunner{responses: map[string]gitResponse{
"status --porcelain": {out: " M main.go\n"},
}}
err := ensureCleanWorktree(context.Background(), runner)
if err == nil || !strings.Contains(err.Error(), "未提交的改动") {
t.Fatalf("err = %v, want a dirty-worktree rejection", err)
}
if !strings.Contains(err.Error(), "stash") {
t.Errorf("error should tell the user how to proceed: %v", err)
}
}
func TestEnsureCleanWorktreeAcceptsCleanTree(t *testing.T) {
runner := &fakeGitRunner{responses: map[string]gitResponse{
"status --porcelain": {out: ""},
}}
if err := ensureCleanWorktree(context.Background(), runner); err != nil {
t.Fatalf("clean tree should pass: %v", err)
}
}
func TestBackupHint(t *testing.T) {
hint := backupHint("main", "refs/kopsc-backup/main-20261101-093015")
if !strings.Contains(hint, "git update-ref refs/heads/main refs/kopsc-backup/main-20261101-093015") {
t.Errorf("hint = %q", hint)
}
if !strings.Contains(hint, "git reset --hard") {
t.Errorf("hint should mention reset --hard: %q", hint)
}
}