import { OpenAPIHono } from "@hono/zod-openapi"; import { createOpenAPIRegistry } from "@suaveplan/api-openapi"; import { createPluginContext } from "@suaveplan/api-plugin"; import type { AuthService } from "@suaveplan/api-plugin-auth"; import { EventBus } from "@suaveplan/events"; import { describe, expect, it } from "@suaveplan/testing/runner"; import { createUserPlugin } from "../../src/plugin/plugin.js"; import type { UserPluginConfig } from "../../src/types/types.js"; const noopLogger = { debug: () => undefined, info: () => undefined, warn: () => undefined, error: () => undefined, }; function fakeAuthService(): AuthService { return { getBetterAuthInstance: () => ({ $context: Promise.resolve({}) }) as never, getCurrentPrincipal: () => null, getSession: async () => null, }; } const okDb = { query: async () => [], execute: async () => ({ rowsAffected: 0 }), }; describe("openapi-doc", () => { it("served doc lists 3 /users/me routes with Zod-typed schemas", { timeout: 30_000, }, async () => { const app = new OpenAPIHono(); const registry = createOpenAPIRegistry({ info: { title: "user-test", version: "0.1.0" }, }); const plugin = createUserPlugin({ applySchemaOnInit: false }); const services = new Map(); services.set("app", app); services.set("openAPIRegistry", registry); services.set("authService", fakeAuthService()); services.set("db", okDb); await plugin.onInit?.( createPluginContext({ logger: noopLogger, eventBus: new EventBus(), signal: new AbortController().signal, config: plugin.defaults as UserPluginConfig, services, }) ); registry.applyTo(app, "/openapi.json"); const res = await app.request("/openapi.json"); const doc = (await res.json()) as { paths: Record>; }; const me = doc.paths?.["/users/me"]; expect(me).toBeDefined(); const methods = Object.keys(me as object).sort(); expect(methods).toEqual(["delete", "get", "patch"]); }); });