import assert from 'node:assert/strict' import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import path from 'node:path' import test from 'node:test' import { discoverOpenApiFiles, parseServiceModules, summarizeCoverage, validateRepositoryOpenApi } from './validate-openapi.mjs' test('discovers new static OpenAPI documents without a handwritten file list', async (t) => { const root = await mkdtemp(path.join(tmpdir(), 'baiyue-openapi-discovery-')) t.after(() => rm(root, { recursive: true, force: true })) const openapi = path.join(root, 'new-service', 'src', 'main', 'resources', 'openapi') const ignored = path.join(root, 'new-service', 'target', 'src', 'main', 'resources', 'openapi') await mkdir(openapi, { recursive: true }) await mkdir(ignored, { recursive: true }) await writeFile(path.join(openapi, 'new-api.yaml'), 'openapi: 3.0.3\n', 'utf8') await writeFile(path.join(openapi, 'new-api.json'), '{"openapi":"3.0.3"}\n', 'utf8') await writeFile(path.join(openapi, 'notes.md'), 'not an OpenAPI document\n', 'utf8') await writeFile(path.join(ignored, 'ignored.yaml'), 'openapi: 3.0.3\n', 'utf8') assert.deepEqual(await discoverOpenApiFiles(root), [ 'new-service/src/main/resources/openapi/new-api.json', 'new-service/src/main/resources/openapi/new-api.yaml' ]) }) test('derives static and code-first service coverage from service-map', () => { const serviceModules = parseServiceModules('services:\n alpha:\n port: 1\n beta:\n port: 2\n') assert.deepEqual(serviceModules, ['alpha', 'beta']) assert.deepEqual(summarizeCoverage([ 'alpha/src/main/resources/openapi/alpha.yaml' ], serviceModules), { coveredServices: ['alpha'], codeFirstServices: ['beta'] }) }) test('rejects an unresolved OpenAPI reference', async (t) => { const root = await mkdtemp(path.join(tmpdir(), 'baiyue-openapi-ref-')) t.after(() => rm(root, { recursive: true, force: true })) const openapi = path.join(root, 'alpha', 'src', 'main', 'resources', 'openapi') await mkdir(openapi, { recursive: true }) await mkdir(path.join(root, 'deploy'), { recursive: true }) await writeFile(path.join(root, 'deploy', 'service-map.yml'), 'services:\n alpha:\n port: 1\n', 'utf8') await writeFile(path.join(openapi, 'broken.yaml'), `openapi: 3.0.3 info: title: Broken API version: 1.0.0 paths: /broken: get: responses: '200': description: broken content: application/json: schema: $ref: '#/components/schemas/Missing' `, 'utf8') await assert.rejects(validateRepositoryOpenApi(root), /Missing \$ref pointer/) })