Services can resolve legacy aliases and expose the catalog over CLI and HTTP instead of ad-hoc error strings. Co-authored-by: Cursor <cursoragent@cursor.com>
79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
package conformance
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"error-code-system/domains"
|
|
"error-code-system/errcode"
|
|
)
|
|
|
|
func TestSeedCatalog(t *testing.T) {
|
|
reg := errcode.NewRegistry()
|
|
domains.RegisterAll(reg)
|
|
|
|
seen := map[errcode.Code]struct{}{}
|
|
for _, def := range reg.List("") {
|
|
if !def.Code.Valid() {
|
|
t.Fatalf("invalid code %s", def.Code)
|
|
}
|
|
if err := def.Validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, ok := seen[def.Code]; ok {
|
|
t.Fatalf("duplicate %s", def.Code)
|
|
}
|
|
seen[def.Code] = struct{}{}
|
|
if def.SideEffects != errcode.SideEffectNone && def.Retry == errcode.RetryAlways {
|
|
t.Fatalf("%s: side_effects=%s forbids retry=always", def.Code, def.SideEffects)
|
|
}
|
|
for _, alias := range def.Aliases {
|
|
got, ok := reg.Lookup(alias)
|
|
if !ok || got.Code != def.Code {
|
|
t.Fatalf("alias %s -> %+v ok=%v", alias, got.Code, ok)
|
|
}
|
|
}
|
|
}
|
|
|
|
legacy := map[string]errcode.Code{
|
|
"canceled": errcode.AgentCanceled,
|
|
"deadline_exceeded": errcode.AgentDeadlineExceeded,
|
|
"budget_exceeded": errcode.AgentBudgetExceeded,
|
|
"provider_unavailable": errcode.AgentProviderUnavailable,
|
|
"provider_rejected": errcode.AgentProviderRejected,
|
|
"tool_rejected": errcode.AgentToolRejected,
|
|
"path_outside_workspace": errcode.AgentPathOutsideWorkspace,
|
|
"missing_capability": errcode.AgentMissingCapability,
|
|
"missing_deliverable": errcode.AgentMissingDeliverable,
|
|
"empty_output": errcode.AgentEmptyOutput,
|
|
"unknown_outcome": errcode.AgentUnknownOutcome,
|
|
"internal": errcode.AgentInternal,
|
|
"PROMPT_EMPTY": errcode.AgentPromptEmpty,
|
|
"UNAUTHORIZED": errcode.AgentUnauthorized,
|
|
"TIMEOUT": errcode.AgentTimeout,
|
|
"CANCELLED": errcode.AgentCanceled,
|
|
"TRANSIENT": errcode.AgentTransient,
|
|
"MISSING_TARGET": errcode.AgentMissingDeliverable,
|
|
"RUN_FAILED": errcode.AgentRunFailed,
|
|
}
|
|
for alias, want := range legacy {
|
|
got, ok := reg.Lookup(alias)
|
|
if !ok || got.Code != want {
|
|
t.Fatalf("legacy %s => %s, got %+v ok=%v", alias, want, got.Code, ok)
|
|
}
|
|
}
|
|
|
|
unknown := reg.Resolve("not-a-code")
|
|
if unknown.Code != errcode.SysUnknownCode || unknown.Retry != errcode.RetryNever || unknown.SideEffects != errcode.SideEffectUnknown {
|
|
t.Fatalf("fallback %+v", unknown)
|
|
}
|
|
if unknown.HTTP != 500 {
|
|
t.Fatalf("fallback http %d", unknown.HTTP)
|
|
}
|
|
|
|
for _, domain := range []string{"sys", "agent", "squad"} {
|
|
if len(reg.List(domain)) == 0 {
|
|
t.Fatalf("domain %s empty", domain)
|
|
}
|
|
}
|
|
}
|