34 lines
1.6 KiB
JavaScript
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\)/)
|
|
})
|