fix(httpapi): align request body openapi shape (#24811)

This commit is contained in:
Kit Langton
2026-04-28 12:55:37 -04:00
committed by GitHub
parent 2c2fc3499b
commit c00058ed7a
2 changed files with 97 additions and 3 deletions

View File

@@ -50,8 +50,24 @@ function openApiParameters(spec: { paths: Record<string, Partial<Record<(typeof
)
}
function openApiRequestBodies(spec: { paths: Record<string, Partial<Record<(typeof methods)[number], Operation>>> }) {
return Object.fromEntries(
Object.entries(spec.paths).flatMap(([path, item]) =>
methods
.filter((method) => item[method])
.map((method) => [`${method.toUpperCase()} ${path}`, requestBodyKey(item[method]?.requestBody)]),
),
)
}
type Operation = {
parameters?: unknown[]
requestBody?: unknown
}
type RequestBody = {
content?: Record<string, { schema?: { $ref?: string; type?: string } }>
required?: boolean
}
function parameterKey(param: unknown) {
@@ -60,6 +76,17 @@ function parameterKey(param: unknown) {
return `${param.in}:${param.name}:${"required" in param && param.required === true}`
}
function requestBodyKey(body: unknown) {
if (!body || typeof body !== "object" || !("content" in body)) return ""
const requestBody = body as RequestBody
return JSON.stringify({
required: requestBody.required === true,
content: Object.entries(requestBody.content ?? {})
.map(([type, value]) => [type, value.schema?.$ref ?? value.schema?.type ?? "inline"])
.sort(),
})
}
function authorization(username: string, password: string) {
return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`
}
@@ -100,6 +127,17 @@ describe("HttpApi server", () => {
).toEqual([])
})
test("matches generated OpenAPI request body shape", async () => {
const hono = openApiRequestBodies(await Server.openapi())
const effect = openApiRequestBodies(OpenApi.fromApi(PublicApi))
expect(
Object.keys(hono)
.filter((route) => hono[route] !== effect[route])
.map((route) => ({ route, hono: hono[route], effect: effect[route] })),
).toEqual([])
})
test("allows requests when auth is disabled", async () => {
await using tmp = await tmpdir({ git: true })
await Bun.write(`${tmp.path}/hello.txt`, "hello")