refactor(errors): route fatal app errors

This commit is contained in:
ZacharyZhang-NY committed 2026-04-24 03:31:39 -04:00
1 parent ead9475b71
commit 38e2807f6c
6 files changed
+84 -27

No files matched your search

+30
View File
@@ -0,0 +1,30 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { logAppError, setFatalErrorRouteForTesting } from "../../src/main/errors";
import type { AppError } from "../../src/main/errors";
describe("AppError fatal route", () => {
afterEach(() => {
setFatalErrorRouteForTesting(null);
});
it("routes fatal errors through the process-level handler", () => {
const logger = { error: vi.fn(), warn: vi.fn() };
const routed: AppError[] = [];
const sentinel = new Error("fatal route called");
setFatalErrorRouteForTesting((error) => {
routed.push(error);
throw sentinel;
});
expect(() => logAppError(logger, new Error("sqlite corrupt"), {
kind: "fatal",
code: "db.sqlite.corrupt",
message: "SQLite profile is corrupt",
context: { profile: "test" },
})).toThrow(sentinel);
expect(routed[0]?.kind).toBe("fatal");
expect(routed[0]?.code).toBe("db.sqlite.corrupt");
expect(logger.error).toHaveBeenCalled();
});
});
+15 -1
View File
@@ -5,6 +5,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { AppDatabase } from "../../src/main/database";
import { CredentialStore } from "../../src/main/credentials/credential-store";
import { CredentialResolver, CredentialError } from "../../src/main/credentials/credential-resolver";
import { AppError } from "../../src/main/errors";
beforeAll(() => {
process.env.AGENTCOMPANY_ALLOW_INSECURE_VAULT = "true";
@@ -56,7 +57,20 @@ describe("CredentialResolver", () => {
it("throws CREDENTIAL_MISSING when the env-backed key is unset", async () => {
delete process.env.XAI_API_KEY;
store.save("xai", { kind: "api_key", value: { source: "env", value: "XAI_API_KEY" } });
await expect(resolver.resolve("xai")).rejects.toBeInstanceOf(CredentialError);
let thrown: unknown;
try {
await resolver.resolve("xai");
} catch (error) {
thrown = error;
}
expect(thrown).toBeInstanceOf(CredentialError);
expect(thrown).toBeInstanceOf(AppError);
expect(thrown).toMatchObject({
kind: "upstream",
code: "CREDENTIAL_MISSING",
connectorId: "xai",
context: { connectorId: "xai" },
});
});
it("assembles AWS extraEnv for IAM auth mode", async () => {