Files
2026-05-27 23:29:53 +01:00

91 lines
3.2 KiB
TypeScript

import { OpenAPIHono } from "@hono/zod-openapi";
import { createOpenAPIRegistry } from "@suaveplan/api-openapi";
import { createPluginContext } from "@suaveplan/api-plugin";
import { EventBus } from "@suaveplan/events";
import { describe, expect, it } from "@suaveplan/testing/runner";
import { createVaultPlugin } from "../../src/plugin/plugin.js";
import { createMemoryDrive } from "../setup/memory-drive.js";
const noopLogger = {
debug: () => undefined,
info: () => undefined,
warn: () => undefined,
error: () => undefined,
};
describe("openapi-doc", () => {
it("served doc lists 5 /vault/items routes", {
timeout: 30_000,
}, async () => {
const app = new OpenAPIHono();
const registry = createOpenAPIRegistry({
info: { title: "vault-test", version: "0.1.0" },
});
const services = new Map<string, unknown>();
services.set("app", app);
services.set("openAPIRegistry", registry);
const plugin = createVaultPlugin({
storage: createMemoryDrive(),
applySchemaOnInit: false,
});
await plugin.onInit?.(
createPluginContext({
logger: noopLogger,
eventBus: new EventBus(),
signal: new AbortController().signal,
config: plugin.defaults as never,
services,
})
);
const routes = registry.getRoutesByPlugin("vault");
expect(routes.length).toBe(5);
registry.applyTo(app, "/openapi.json");
const res = await app.request("/openapi.json");
const doc = (await res.json()) as {
paths: Record<string, Record<string, unknown>>;
};
const vaultPaths = Object.keys(doc.paths).filter((p) =>
p.startsWith("/vault/")
);
expect(vaultPaths.length).toBeGreaterThanOrEqual(2);
expect(doc.paths["/vault/items"]).toBeDefined();
expect(doc.paths["/vault/items/{id}"]).toBeDefined();
});
it("served /openapi.json includes 5 /vault/items routes", {
timeout: 30_000,
}, async () => {
const app = new OpenAPIHono();
const registry = createOpenAPIRegistry({
info: { title: "vault-test", version: "0.1.0" },
});
const services = new Map<string, unknown>();
services.set("app", app);
services.set("openAPIRegistry", registry);
const plugin = createVaultPlugin({
storage: createMemoryDrive(),
applySchemaOnInit: false,
});
await plugin.onInit?.(
createPluginContext({
logger: noopLogger,
eventBus: new EventBus(),
signal: new AbortController().signal,
config: plugin.defaults as never,
services,
})
);
const methods = registry
.getRoutesByPlugin("vault")
.map((r) => `${r.method.toUpperCase()} ${r.path}`);
expect(methods).toEqual([
"GET /vault/items",
"POST /vault/items",
"GET /vault/items/{id}",
"PATCH /vault/items/{id}",
"DELETE /vault/items/{id}",
]);
});
});