Merge pull request #982 from yyovil/fix/cli-config-not-found-error-981

fix(cli): catch ConfigNotFoundError for clean error output
This commit is contained in:
yyovil 2026-04-12 00:42:15 +05:30 committed by GitHub
commit c48b078a7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 76 additions and 7 deletions

View File

@ -1,14 +1,73 @@
import { describe, expect, it, vi } from "vitest";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const parse = vi.fn();
let parseAsync: ReturnType<typeof vi.fn>;
vi.mock("../src/program.js", () => ({
createProgram: () => ({ parse }),
}));
beforeEach(() => {
vi.resetModules();
parseAsync = vi.fn().mockResolvedValue(undefined);
vi.doMock("../src/program.js", () => ({
createProgram: () => ({ parseAsync }),
}));
});
afterEach(() => {
vi.restoreAllMocks();
});
describe("cli entrypoint", () => {
it("parses the created program", async () => {
await import("../src/index.js");
expect(parse).toHaveBeenCalledOnce();
expect(parseAsync).toHaveBeenCalledOnce();
});
it("prints a clean message and exits 1 on ConfigNotFoundError", async () => {
const { ConfigNotFoundError } = await import("@composio/ao-core");
const error = new ConfigNotFoundError();
let rejectionHandler:
| ((reason: unknown) => unknown)
| undefined;
parseAsync.mockImplementation(
() =>
({
catch: (handler: (reason: unknown) => unknown) => {
rejectionHandler = handler;
},
}) as Promise<void>,
);
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
const exitSpy = vi
.spyOn(process, "exit")
.mockImplementation(() => undefined as never);
await import("../src/index.js");
expect(rejectionHandler).toBeTypeOf("function");
rejectionHandler?.(error);
expect(errorSpy).toHaveBeenCalledWith(`Error: ${error.message}`);
expect(exitSpy).toHaveBeenCalledWith(1);
});
it("re-throws non-ConfigNotFoundError errors", async () => {
const error = new Error("unexpected");
let rejectionHandler:
| ((reason: unknown) => unknown)
| undefined;
parseAsync.mockImplementation(
() =>
({
catch: (handler: (reason: unknown) => unknown) => {
rejectionHandler = handler;
},
}) as Promise<void>,
);
await import("../src/index.js");
expect(rejectionHandler).toBeTypeOf("function");
expect(() => rejectionHandler?.(error)).toThrow(error);
});
});

View File

@ -1,5 +1,15 @@
#!/usr/bin/env node
import { ConfigNotFoundError } from "@composio/ao-core";
import { createProgram } from "./program.js";
createProgram().parse();
createProgram()
.parseAsync()
.catch((err) => {
if (err instanceof ConfigNotFoundError) {
console.error(`Error: ${err.message}`);
process.exit(1);
return;
}
throw err;
});