test: add architecture and OpenAPI validation tooling

This commit is contained in:
2026-08-25 12:22:14 +08:00
parent 24df851acf
commit 0e0b6f8264
13 changed files with 544 additions and 17 deletions
@@ -0,0 +1,67 @@
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/)
})