Files
qinglong/packages/ql3-cluster-postgres/test/securityAuditRepository.test.cjs

78 lines
2.1 KiB
JavaScript

const assert = require('node:assert/strict');
const { test } = require('node:test');
const {
SecurityAuditUnavailableError,
} = require('@qinglong/runtime-core/security-audit');
const {
PostgresSecurityAuditRepository,
} = require('@qinglong/cluster-postgres/runtime');
function record(overrides = {}) {
return {
eventId: '123e4567-e89b-42d3-a456-426614174000',
requestId: 'request-1',
operationId: 'run.create',
projectId: 'default',
subject: { type: 'user', id: 'usr_primary' },
authenticationId: 'api_credential:primary:1',
outcome: 'allowed',
reasons: ['role_grant'],
fence: { projectVersion: 2, bindingVersion: 3 },
occurredAtMs: 1000,
...overrides,
};
}
test('inserts one normalized low-sensitive audit fact without reading it back', async () => {
const calls = [];
const repository = new PostgresSecurityAuditRepository({
async query(sql, values) {
calls.push({ sql, values });
return { rows: [] };
},
});
await repository.record(record());
assert.equal(calls.length, 1);
assert.match(calls[0].sql, /^INSERT INTO "ql3"\."security_audit_events"/);
assert.deepEqual(calls[0].values, [
'123e4567-e89b-42d3-a456-426614174000',
'request-1',
'run.create',
'default',
'user',
'usr_primary',
'api_credential:primary:1',
'allowed',
'["role_grant"]',
2,
3,
1000,
]);
assert.equal(JSON.stringify(calls).includes('secret'), false);
});
test('maps invalid facts and database failures to low-sensitive unavailable', async () => {
let calls = 0;
const invalid = new PostgresSecurityAuditRepository({
async query() {
calls += 1;
return { rows: [] };
},
});
await assert.rejects(
invalid.record(record({ reasons: ['driver password leaked'] })),
SecurityAuditUnavailableError,
);
assert.equal(calls, 0);
const unavailable = new PostgresSecurityAuditRepository({
async query() {
throw new Error('driver detail');
},
});
await assert.rejects(
unavailable.record(record()),
SecurityAuditUnavailableError,
);
});