krona-staff/tests/unit/outbox.test.ts
Ochenstarik b289dd6d63 fix(database): make live PostgreSQL workflows valid
Route every transactional outbox write through one complete event-envelope helper so occurred_at is always populated. Separate employee position and profession lookup parameters to avoid PostgreSQL 42P08, and add unit plus live-database regression coverage.
2026-09-26 15:28:05 +07:00

56 lines
2.1 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { insertOutboxEvent } from '../../src/core/outbox.js';
import { parseUlid } from '../../src/core/ids.js';
describe('transactional outbox helper', () => {
it('writes a complete platform event envelope with an occurrence time', async () => {
const query = vi.fn(async (...args: [string, readonly unknown[] | undefined]) => {
void args;
return { rows: [], rowCount: 1 };
});
const tenantId = parseUlid('01J0000000000000000000000A');
const actorId = parseUlid('01J0000000000000000000001A');
const subjectId = parseUlid('01J0000000000000000000002A');
const correlationId = parseUlid('01J0000000000000000000003A');
await insertOutboxEvent({ query } as never, {
tenantId,
eventType: 'staff.test.created',
subjectType: 'TestSubject',
subjectId,
actorType: 'user',
actorId,
payload: { state: 'created' },
correlationId,
});
expect(query).toHaveBeenCalledOnce();
const [sql, parameters] = query.mock.calls[0] as unknown as [string, unknown[]];
expect(sql).toContain('causation_id, occurred_at');
expect(parameters[8]).toBe('{"state":"created"}');
expect(parameters[11]).toMatch(/^\d{4}-\d{2}-\d{2}T/);
});
it('preserves a source occurrence time for imported or terminal events', async () => {
const query = vi.fn(async (...args: [string, readonly unknown[] | undefined]) => {
void args;
return { rows: [], rowCount: 1 };
});
const occurredAt = '2026-09-24T01:00:00.000Z';
await insertOutboxEvent({ query } as never, {
tenantId: parseUlid('01J0000000000000000000000A'),
eventType: 'attendance.clock.in',
subjectType: 'Employee',
subjectId: parseUlid('01J0000000000000000000002A'),
actorType: 'service',
actorId: parseUlid('01J0000000000000000000001A'),
payload: { source: 'terminal' },
correlationId: parseUlid('01J0000000000000000000003A'),
occurredAt,
});
const parameters = query.mock.calls[0]?.[1] as readonly unknown[];
expect(parameters[11]).toBe(occurredAt);
});
});