57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
describeConnectionDiagnostic,
|
|
describeConnectionFailure,
|
|
describeOperationFailure,
|
|
describeTurnFailure
|
|
} from "./errors";
|
|
|
|
describe("player-safe failure copy", () => {
|
|
it("offers an immediate retry only for retryable turn failures", () => {
|
|
const retryable = describeTurnFailure({
|
|
code: "provider_unavailable",
|
|
message: "upstream secret diagnostic",
|
|
retryable: true
|
|
});
|
|
const invalid = describeTurnFailure({
|
|
code: "invalid_input",
|
|
message: "private validation detail",
|
|
retryable: false
|
|
});
|
|
|
|
expect(retryable.retryable).toBe(true);
|
|
expect(retryable.noCommitMessage).toContain("没有写入故事");
|
|
expect(invalid.retryable).toBe(false);
|
|
});
|
|
|
|
it("does not echo provider or hidden-check diagnostics", () => {
|
|
const privateDetail = "roll=97 target=42 api_key=do-not-show";
|
|
const turn = describeTurnFailure({
|
|
code: "invalid_model_output",
|
|
message: privateDetail,
|
|
retryable: true
|
|
});
|
|
|
|
expect(JSON.stringify(turn)).not.toContain(privateDetail);
|
|
expect(describeOperationFailure({ message: privateDetail })).not.toContain(privateDetail);
|
|
expect(describeConnectionFailure({ message: privateDetail })).not.toContain(privateDetail);
|
|
expect(describeConnectionDiagnostic("VAULT_CREDENTIAL_NOT_FOUND")).not.toContain(privateDetail);
|
|
});
|
|
|
|
it("does not suggest blindly retrying a stale branch", () => {
|
|
const failure = describeTurnFailure({
|
|
code: "stale_node",
|
|
retryable: true
|
|
});
|
|
|
|
expect(failure.retryable).toBe(false);
|
|
expect(failure.message).toContain("重新打开");
|
|
});
|
|
|
|
it("uses connection diagnostic codes without displaying provider text", () => {
|
|
expect(describeConnectionDiagnostic("WAIT_TIMEOUT")).toContain("超时");
|
|
expect(describeConnectionDiagnostic("VAULT_CREDENTIAL_NOT_FOUND")).toContain("LAPP Vault");
|
|
});
|
|
});
|