package promptkit import ( "context" "errors" "fmt" "testing" "gitea.maximumdirect.net/eric/promptkit/internal/usecase" ) func TestMapPublicErrorPreservesGenerationCancellation(t *testing.T) { internalErr := fmt.Errorf("%w: %w", usecase.ErrLLMGenerate, context.Canceled) err := mapPublicError(internalErr) if !errors.Is(err, ErrLLMGenerate) { t.Fatalf("mapped error=%v, want ErrLLMGenerate", err) } if !errors.Is(err, context.Canceled) { t.Fatalf("mapped error=%v, want context.Canceled", err) } } func TestMapPublicErrorTranslatesCapacityError(t *testing.T) { internalErr := &usecase.CapacityError{BackendID: "limited"} err := mapPublicError(internalErr) var publicErr *CapacityError if !errors.As(err, &publicErr) || publicErr == nil { t.Fatalf("mapped error=%v, want public CapacityError", err) } if publicErr.BackendID != "limited" { t.Fatalf("mapped backend ID=%q, want limited", publicErr.BackendID) } if !errors.Is(err, ErrCapacityExceeded) { t.Fatalf("mapped error=%v, want ErrCapacityExceeded", err) } if errors.Is(err, ErrInvalidRequest) || errors.Is(err, ErrLLMGenerate) { t.Fatalf("mapped capacity error has an unrelated category: %v", err) } var leakedInternalErr *usecase.CapacityError if errors.As(err, &leakedInternalErr) { t.Fatalf("mapped error exposes internal CapacityError: %v", err) } internalErr.BackendID = "changed" if publicErr.BackendID != "limited" { t.Fatalf("mapped backend ID changed with source error: %q", publicErr.BackendID) } }