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(); 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>; }; 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(); 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}", ]); }); });