Files
ukmesh/frontend/src/utils/api.test.ts
T

47 lines
1.4 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import {
ApiResponseError,
checkedJson,
withScopeParams,
} from './api.js';
test('scope parameters preserve existing queries', () => {
assert.equal(
withScopeParams('/api/items?limit=2', { network: 'ukmesh', observer: 'AA' }),
'/api/items?limit=2&network=ukmesh&observer=AA',
);
});
test('checked JSON rejects HTTP, malformed, oversized, and schema-invalid responses', async () => {
await assert.rejects(
checkedJson(new Response('no', { status: 503 })),
(error: unknown) => error instanceof ApiResponseError && error.status === 503,
);
await assert.rejects(
checkedJson(new Response('not-json', { status: 200 })),
/not valid JSON/,
);
await assert.rejects(
checkedJson(new Response(JSON.stringify({ value: '12345' }), { status: 200 }), { maxBytes: 4 }),
/byte limit/,
);
await assert.rejects(
checkedJson<{ value: number }>(
new Response(JSON.stringify({ value: 'wrong' }), { status: 200 }),
{
validate: (value): value is { value: number } => (
typeof value === 'object'
&& value !== null
&& typeof (value as { value?: unknown }).value === 'number'
),
},
),
/expected schema/,
);
assert.deepEqual(
await checkedJson<{ value: number }>(new Response('{"value":3}', { status: 200 })),
{ value: 3 },
);
});