WIP main worktree changes before merge
This commit is contained in:
@@ -74,11 +74,44 @@ function resetDbSingletons() {
|
||||
const globalState = globalThis as typeof globalThis & {
|
||||
__fiscalSqliteClient?: { close?: () => void };
|
||||
__fiscalDrizzleDb?: unknown;
|
||||
__financialIngestionSchemaStatus?: unknown;
|
||||
};
|
||||
|
||||
globalState.__fiscalSqliteClient?.close?.();
|
||||
globalState.__fiscalSqliteClient = undefined;
|
||||
globalState.__fiscalDrizzleDb = undefined;
|
||||
globalState.__financialIngestionSchemaStatus = undefined;
|
||||
}
|
||||
|
||||
function setFinancialIngestionSchemaStatus(input: {
|
||||
ok: boolean;
|
||||
mode: 'healthy' | 'repaired' | 'drifted' | 'failed';
|
||||
missingIndexes?: string[];
|
||||
duplicateGroups?: number;
|
||||
}) {
|
||||
const globalState = globalThis as typeof globalThis & {
|
||||
__financialIngestionSchemaStatus?: {
|
||||
ok: boolean;
|
||||
mode: 'healthy' | 'repaired' | 'drifted' | 'failed';
|
||||
requestedMode: 'auto' | 'check-only' | 'off';
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
lastCheckedAt: string;
|
||||
repair: null;
|
||||
error: string | null;
|
||||
};
|
||||
};
|
||||
|
||||
globalState.__financialIngestionSchemaStatus = {
|
||||
ok: input.ok,
|
||||
mode: input.mode,
|
||||
requestedMode: 'auto',
|
||||
missingIndexes: input.missingIndexes ?? [],
|
||||
duplicateGroups: input.duplicateGroups ?? 0,
|
||||
lastCheckedAt: new Date().toISOString(),
|
||||
repair: null,
|
||||
error: input.ok ? null : 'schema drift injected by test'
|
||||
};
|
||||
}
|
||||
|
||||
function applySqlMigrations(client: { exec: (query: string) => void }) {
|
||||
@@ -250,6 +283,10 @@ if (process.env.RUN_TASK_WORKFLOW_E2E === '1') {
|
||||
runStatuses.clear();
|
||||
runCounter = 0;
|
||||
workflowBackendHealthy = true;
|
||||
setFinancialIngestionSchemaStatus({
|
||||
ok: true,
|
||||
mode: 'healthy'
|
||||
});
|
||||
});
|
||||
|
||||
it('queues multiple analyze jobs and suppresses duplicate in-flight analyze jobs', async () => {
|
||||
@@ -808,9 +845,100 @@ if (process.env.RUN_TASK_WORKFLOW_E2E === '1') {
|
||||
|
||||
const healthy = await jsonRequest('GET', '/api/health');
|
||||
expect(healthy.response.status).toBe(200);
|
||||
expect((healthy.json as { status: string; workflow: { ok: boolean } }).status).toBe('ok');
|
||||
expect((healthy.json as {
|
||||
status: string;
|
||||
workflow: { ok: boolean };
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).status).toBe('ok');
|
||||
expect((healthy.json as { status: string; workflow: { ok: boolean } }).workflow.ok).toBe(true);
|
||||
expect((healthy.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.ok).toBe(true);
|
||||
expect((healthy.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.mode).toBe('healthy');
|
||||
|
||||
setFinancialIngestionSchemaStatus({
|
||||
ok: false,
|
||||
mode: 'drifted',
|
||||
missingIndexes: ['company_financial_bundle_uidx'],
|
||||
duplicateGroups: 1
|
||||
});
|
||||
const schemaDrifted = await jsonRequest('GET', '/api/health');
|
||||
expect(schemaDrifted.response.status).toBe(503);
|
||||
expect((schemaDrifted.json as {
|
||||
status: string;
|
||||
workflow: { ok: boolean };
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).status).toBe('degraded');
|
||||
expect((schemaDrifted.json as {
|
||||
workflow: { ok: boolean };
|
||||
}).workflow.ok).toBe(true);
|
||||
expect((schemaDrifted.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.ok).toBe(false);
|
||||
expect((schemaDrifted.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
ok: boolean;
|
||||
mode: string;
|
||||
missingIndexes: string[];
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.mode).toBe('drifted');
|
||||
expect((schemaDrifted.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
missingIndexes: string[];
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.missingIndexes).toEqual(['company_financial_bundle_uidx']);
|
||||
expect((schemaDrifted.json as {
|
||||
database: {
|
||||
ingestionSchema: {
|
||||
duplicateGroups: number;
|
||||
};
|
||||
};
|
||||
}).database.ingestionSchema.duplicateGroups).toBe(1);
|
||||
|
||||
setFinancialIngestionSchemaStatus({
|
||||
ok: true,
|
||||
mode: 'healthy'
|
||||
});
|
||||
workflowBackendHealthy = false;
|
||||
const degraded = await jsonRequest('GET', '/api/health');
|
||||
expect(degraded.response.status).toBe(503);
|
||||
|
||||
Reference in New Issue
Block a user