71 lines
2.8 KiB
Go
71 lines
2.8 KiB
Go
|
|
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()
|
||
|
|
|
||
|
|
writeOverrideCalled := false
|
||
|
|
restoreWrite := state.TestHookSetWriteIntentOverride(func(path string, in state.Intent) error {
|
||
|
|
writeOverrideCalled = true
|
||
|
|
return errors.New("forced write override")
|
||
|
|
})
|
||
|
|
err := state.WriteIntent(intentPath, state.Intent{State: state.IntentNormal})
|
||
|
|
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)
|
||
|
|
}
|
||
|
|
}
|