2026-04-09 04:56:41 -03:00
|
|
|
package statequality
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"strings"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"scm.bstein.dev/bstein/ananke/internal/state"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TestStateTestHookOverrideSetters runs one orchestration or CLI step.
|
|
|
|
|
// Signature: TestStateTestHookOverrideSetters(t *testing.T).
|
|
|
|
|
// Why: drives top-level test-hook override branches so root-mode quality gates
|
|
|
|
|
// keep deterministic failure injection coverage above the per-file threshold.
|
|
|
|
|
func TestStateTestHookOverrideSetters(t *testing.T) {
|
|
|
|
|
root := t.TempDir()
|
|
|
|
|
intentPath := filepath.Join(root, "intent.json")
|
|
|
|
|
|
|
|
|
|
restoreWriteNil := state.TestHookSetWriteIntentOverride(nil)
|
|
|
|
|
if err := state.WriteIntent(intentPath, state.Intent{State: state.IntentNormal}); err != nil {
|
|
|
|
|
t.Fatalf("expected default write intent path after nil override, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
restoreWriteNil()
|
|
|
|
|
|
2026-04-21 17:33:26 -03:00
|
|
|
restoreReadNil := state.TestHookSetReadIntentOverride(nil)
|
|
|
|
|
readAfterNil, err := state.ReadIntent(intentPath)
|
|
|
|
|
if err != nil || readAfterNil.State != state.IntentNormal {
|
|
|
|
|
t.Fatalf("expected default read intent path after nil override, got %v / %v", readAfterNil, err)
|
|
|
|
|
}
|
|
|
|
|
restoreReadNil()
|
|
|
|
|
|
|
|
|
|
readOverrideCalled := false
|
|
|
|
|
restoreRead := state.TestHookSetReadIntentOverride(func(path string) (state.Intent, error) {
|
|
|
|
|
readOverrideCalled = true
|
|
|
|
|
return state.Intent{}, errors.New("forced read override")
|
|
|
|
|
})
|
|
|
|
|
_, err = state.ReadIntent(intentPath)
|
|
|
|
|
if err == nil || !strings.Contains(err.Error(), "forced read override") {
|
|
|
|
|
t.Fatalf("expected forced read override error, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !readOverrideCalled {
|
|
|
|
|
t.Fatalf("expected read override to be invoked")
|
|
|
|
|
}
|
|
|
|
|
restoreRead()
|
|
|
|
|
if _, err := state.TestHookReadIntentDefault(intentPath); err != nil {
|
|
|
|
|
t.Fatalf("expected explicit default read helper to succeed, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-09 04:56:41 -03:00
|
|
|
writeOverrideCalled := false
|
|
|
|
|
restoreWrite := state.TestHookSetWriteIntentOverride(func(path string, in state.Intent) error {
|
|
|
|
|
writeOverrideCalled = true
|
|
|
|
|
return errors.New("forced write override")
|
|
|
|
|
})
|
2026-04-21 17:33:26 -03:00
|
|
|
err = state.WriteIntent(intentPath, state.Intent{State: state.IntentNormal})
|
2026-04-09 04:56:41 -03:00
|
|
|
if err == nil || !strings.Contains(err.Error(), "forced write override") {
|
|
|
|
|
t.Fatalf("expected forced write override error, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !writeOverrideCalled {
|
|
|
|
|
t.Fatalf("expected write override to be invoked")
|
|
|
|
|
}
|
|
|
|
|
restoreWrite()
|
|
|
|
|
if err := state.TestHookWriteIntentDefault(filepath.Join(root, "intent-default.json"), state.Intent{State: state.IntentNormal}); err != nil {
|
|
|
|
|
t.Fatalf("expected explicit default write helper to succeed, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
payload := []byte("{bad-json")
|
|
|
|
|
replacement := []byte("{}\n")
|
|
|
|
|
quarantinePath := filepath.Join(root, "quarantine-default.json")
|
|
|
|
|
if err := state.TestHookQuarantineCorruptFileDefault(quarantinePath, payload, replacement, 0o640); err != nil {
|
|
|
|
|
t.Fatalf("expected explicit default quarantine helper to succeed, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
restoreQuarantineNil := state.TestHookSetQuarantineCorruptFileOverride(nil)
|
|
|
|
|
restoreQuarantineNil()
|
|
|
|
|
|
|
|
|
|
quarantineOverrideCalled := false
|
|
|
|
|
restoreQuarantine := state.TestHookSetQuarantineCorruptFileOverride(func(path string, payload []byte, replacement []byte, mode os.FileMode) error {
|
|
|
|
|
quarantineOverrideCalled = true
|
|
|
|
|
return errors.New("forced quarantine override")
|
|
|
|
|
})
|
|
|
|
|
err = state.TestHookQuarantineCorruptFile(filepath.Join(root, "quarantine-forced.json"), payload, replacement, 0o640)
|
|
|
|
|
if err == nil || !strings.Contains(err.Error(), "forced quarantine override") {
|
|
|
|
|
t.Fatalf("expected forced quarantine override error, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !quarantineOverrideCalled {
|
|
|
|
|
t.Fatalf("expected quarantine override to be invoked")
|
|
|
|
|
}
|
|
|
|
|
restoreQuarantine()
|
|
|
|
|
if err := state.TestHookQuarantineCorruptFile(filepath.Join(root, "quarantine-after-restore.json"), payload, replacement, 0o640); err != nil {
|
|
|
|
|
t.Fatalf("expected quarantine helper to use default impl after restore, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|