53 lines
2.3 KiB
TypeScript
53 lines
2.3 KiB
TypeScript
import { randomUUID } from "node:crypto";
|
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { tmpdir } from "node:os";
|
|
|
|
import { expect, it, vi } from "vitest";
|
|
|
|
import { ManagedStorage } from "../../apps/api/src/managed-storage.js";
|
|
import { WorkerAiCallGate } from "../../apps/worker/src/ai-call-gate.js";
|
|
import { WorkerStorageStatus } from "../../apps/worker/src/storage-status.js";
|
|
import { StructuredJsonlLogger } from "../../apps/worker/src/structured-log.js";
|
|
|
|
it("TDD-WP0-LOG-001 blocks AI before an upstream call when logging becomes unavailable", async () => {
|
|
const root = join(tmpdir(), `dada-wp0-08-worker-${randomUUID()}`);
|
|
mkdirSync(root, { recursive: true });
|
|
const blockedDirectory = join(root, "blocked-log-directory");
|
|
writeFileSync(blockedDirectory, "not-a-directory");
|
|
const databasePath = join(root, "db", "dada.sqlite3");
|
|
const managedStorage = new ManagedStorage({ dataRoot: root, databasePath });
|
|
const workerStorage = new WorkerStorageStatus(databasePath);
|
|
let storageStatus: "active" | "unavailable" = "active";
|
|
const logger = new StructuredJsonlLogger({
|
|
component: "worker",
|
|
directory: blockedDirectory,
|
|
onWriteFailure: () => {
|
|
storageStatus = "unavailable";
|
|
workerStorage.markLogUnavailable();
|
|
},
|
|
});
|
|
const externalCall = vi.fn(async () => ({ provider_request_id: "must-not-exist" }));
|
|
const gate = new WorkerAiCallGate({ getStorageStatus: () => storageStatus, logger });
|
|
|
|
await expect(gate.execute("corr_worker_log_failure", "job_internal", externalCall)).resolves.toEqual({
|
|
reason: "storage_unavailable",
|
|
status: "blocked",
|
|
});
|
|
expect(storageStatus).toBe("unavailable");
|
|
expect(workerStorage.getStatus()).toBe("unavailable");
|
|
expect(managedStorage.getState().storage_status).toBe("unavailable");
|
|
expect(externalCall).not.toHaveBeenCalled();
|
|
|
|
const directory = process.env.DADA_EVIDENCE_DIR_LOG;
|
|
if (directory) {
|
|
mkdirSync(directory, { recursive: true });
|
|
writeFileSync(join(directory, "external-calls.json"), `${JSON.stringify({ calls: 0, reason: "storage_unavailable", status: "passed" }, null, 2)}\n`);
|
|
}
|
|
|
|
const { rm } = await import("node:fs/promises");
|
|
workerStorage.close();
|
|
managedStorage.close();
|
|
await rm(root, { force: true, recursive: true });
|
|
});
|