feat(ql3): cut alpha.1 candidate milestone

This commit is contained in:
whyour
2026-08-26 01:41:20 +08:00
parent c2df0c7215
commit 07cdc76bae
94 changed files with 1469 additions and 168 deletions
@@ -0,0 +1,75 @@
const assert = require('node:assert/strict');
const test = require('node:test');
const {
PostgresApiCredentialPepperReferenceRepository,
} = require('../dist/security/apiCredentialPepperReferenceRepository.js');
test('returns bounded current pepper references using database time', async () => {
const calls = [];
const repository = new PostgresApiCredentialPepperReferenceRepository({
async query(sql, parameters) {
calls.push({ sql, parameters });
return {
rows: [
{ observedAtMs: '1000', credentialId: 'credential-a' },
{ observedAtMs: '1000', credentialId: 'credential-b' },
{ observedAtMs: '1000', credentialId: 'credential-c' },
],
};
},
});
assert.deepEqual(await repository.inspect('legacy-v1', 2), {
pepperKeyId: 'legacy-v1',
observedAtMs: 1000,
credentialIds: ['credential-a', 'credential-b'],
hasMore: true,
});
assert.deepEqual(calls[0].parameters, ['legacy-v1', 3]);
assert.match(calls[0].sql, /statement_timestamp\(\)/);
assert.match(calls[0].sql, /newer\.version > credential\.version/);
});
test('represents an empty reference set without losing database time', async () => {
const repository = new PostgresApiCredentialPepperReferenceRepository({
async query() {
return { rows: [{ observedAtMs: 1000, credentialId: null }] };
},
});
assert.deepEqual(await repository.inspect('retired-v1'), {
pepperKeyId: 'retired-v1',
observedAtMs: 1000,
credentialIds: [],
hasMore: false,
});
});
test('fails closed on invalid input and malformed database rows', async () => {
const repository = new PostgresApiCredentialPepperReferenceRepository({
async query() {
return { rows: [{ observedAtMs: 'invalid', credentialId: null }] };
},
});
await assert.rejects(() => repository.inspect('legacy-v1'), /unavailable/);
await assert.rejects(() => repository.inspect('legacy-v1', 65));
await assert.rejects(() => repository.inspect('bad key'));
for (const credentialId of [42, null, 'bad credential']) {
const malformedRepository =
new PostgresApiCredentialPepperReferenceRepository({
async query() {
return {
rows: [
{ observedAtMs: 1000, credentialId: 'credential-a' },
{ observedAtMs: 1000, credentialId },
],
};
},
});
await assert.rejects(
() => malformedRepository.inspect('legacy-v1'),
/unavailable/,
);
}
});