Define processing outcomes and failure contracts

This commit is contained in:
2026-09-24 17:01:19 +00:00
parent 8ffbf41b89
commit 7dc1be5a08
8 changed files with 221 additions and 43 deletions

View File

@@ -3,6 +3,8 @@ package structuredoutput
import (
"errors"
"testing"
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
)
func TestFailureClassificationKeepsCauseAndSafeMessage(t *testing.T) {
@@ -16,3 +18,28 @@ func TestFailureClassificationKeepsCauseAndSafeMessage(t *testing.T) {
t.Fatalf("runtime classification: %v", runtime)
}
}
func TestRecoverableFailureKeepsTypedCauseOutOfSafeMessage(t *testing.T) {
cause := errors.New("provider response contained a secret")
failure := &Failure{
Class: FailureRecoverable,
Reason: outcomes.ReasonTransportFailed,
Message: "model transport failed",
Cause: cause,
}
wrapped := errors.Join(errors.New("operation failed"), failure)
if !IsRecoverable(wrapped) || !errors.Is(wrapped, cause) {
t.Fatalf("recoverable failure lost classification or cause: %v", wrapped)
}
if failure.Error() != "model transport failed" {
t.Fatalf("unsafe failure text: %q", failure.Error())
}
for _, class := range []FailureClass{FailureFatal, FailureCanceled} {
if IsRecoverable(&Failure{Class: class, Cause: cause}) {
t.Fatalf("%s classified as recoverable", class)
}
}
if IsRecoverable(cause) {
t.Fatal("bare internal error classified as recoverable")
}
}