fix: bind writeback operations to agents directory

This commit is contained in:
Yoilun
2026-05-25 21:42:02 +08:00
parent d7b75a1112
commit d3bc73ba29
5 changed files with 248 additions and 123 deletions

View File

@@ -115,6 +115,46 @@ func TestWriteRejectsAgentsDirectoryReplacementBeforeBackup(t *testing.T) {
assertFileContent(t, filepath.Join(externalDir, "backend.toml"), `name = "外部"`+"\n")
}
func TestWriteBindsBackupToAgentsDirectoryAfterFinalVerify(t *testing.T) {
store, target := writebackFixture(t, `name = "旧名称"`+"\n")
validation, err := store.ValidateDraft("backend", `name = "新名称"`+"\n")
if err != nil {
t.Fatal(err)
}
root := filepath.Dir(filepath.Dir(target))
agentsDir := filepath.Join(root, "agents")
realAgentsDir := filepath.Join(root, "agents-real")
externalDir := filepath.Join(root, "external")
if err := os.MkdirAll(externalDir, 0o755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(externalDir, "backend.toml"), []byte(`name = "外部"`+"\n"), 0o644); err != nil {
t.Fatal(err)
}
writebackTestHookAfterVerifyBeforeBackup = func() {
if err := os.Rename(agentsDir, realAgentsDir); err != nil {
t.Fatal(err)
}
if err := os.Symlink(externalDir, agentsDir); err != nil {
t.Fatal(err)
}
}
defer func() { writebackTestHookAfterVerifyBeforeBackup = nil }()
_, err = store.WriteDraft("backend", `name = "新名称"`+"\n", validation.CurrentHash)
if !errors.Is(err, ErrWriteConflict) && !errors.Is(err, codexhome.ErrForbiddenPath) {
t.Fatalf("expected post-verify directory replacement to be rejected, got %v", err)
}
assertFileContent(t, filepath.Join(realAgentsDir, "backend.toml"), `name = "旧名称"`+"\n")
assertFileContent(t, filepath.Join(externalDir, "backend.toml"), `name = "外部"`+"\n")
if backups, err := filepath.Glob(filepath.Join(externalDir, "*.bak-*")); err != nil {
t.Fatal(err)
} else if len(backups) != 0 {
t.Fatalf("backup was created through replaced symlink directory: %#v", backups)
}
}
func TestWriteRejectsTargetChangeAfterBackup(t *testing.T) {
store, target := writebackFixture(t, `name = "旧名称"`+"\n")
validation, err := store.ValidateDraft("backend", `name = "新名称"`+"\n")