Files
client-web/src/api/overseasFailure.test.mjs
T
2026-09-29 17:56:03 +08:00

34 lines
1.6 KiB
JavaScript

import assert from 'node:assert/strict'
import { readFile } from 'node:fs/promises'
import test from 'node:test'
import ts from 'typescript'
const source = await readFile(new URL('./types.ts', import.meta.url), 'utf8')
const compiled = ts.transpileModule(source, {
compilerOptions: { module: ts.ModuleKind.ESNext, target: ts.ScriptTarget.ES2022 },
}).outputText
const { isApiFailure, isApiEnvelope } = await import(`data:text/javascript;base64,${Buffer.from(compiled).toString('base64')}`)
test('recognizes a security failure without data and preserves diagnostics', () => {
const failure = { code: 'A0403', message: 'Access denied', requestId: 'request-1', traceId: 'trace-1' }
assert.equal(isApiFailure(failure), true)
assert.equal(isApiEnvelope(failure), false)
assert.equal(failure.requestId, 'request-1')
assert.equal(failure.traceId, 'trace-1')
})
test('does not accept malformed or data-less successful responses', () => {
for (const value of [null, {}, { code: 403, message: 'Denied' }, { code: 'A0403' },
{ code: 'A0403', message: 'Denied', traceId: {} }, { code: '200', message: 'OK' }]) {
assert.equal(isApiFailure(value), false)
}
assert.equal(isApiEnvelope({ code: '200', message: 'OK' }), false)
assert.equal(isApiEnvelope({ code: '200', message: 'OK', data: [] }), true)
})
test('unified transport handles business-code and HTTP security failures', async () => {
const transport = await readFile(new URL('./http.ts', import.meta.url), 'utf8')
assert.match(transport, /if \(isApiFailure\(invalid\)\)/)
assert.match(transport, /isApiEnvelope\(body\) \|\| isApiFailure\(body\)/)
})