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() 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) } 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) } }