rag-service/tests/ocr/upload-source-ref.test.ts

55 lines
2.7 KiB
TypeScript

import assert from "node:assert/strict";
import { access } from "node:fs/promises";
import test from "node:test";
import { createApp } from "../../src/app.js";
const logicalSourceRef = "Errores Junio 2026 - OCR verificado.md";
test("multipart upload separates logical source identity from physical filenames", async (context) => {
const inputs: Array<Record<string, unknown>> = [];
const identities = new Map<string, string>();
const activeVersionId = "active-before-upload";
const ingestService = {
async ingest(input: Record<string, unknown>) {
inputs.push(input);
const identity = `${input.sourceId}:${input.sourceRef}`;
const versionId = identities.get(identity) ?? `version-${identities.size + 1}`;
identities.set(identity, versionId);
return { accepted: true, sourceId: input.sourceId, versionId, versionNumber: 2, state: "indexing", phase: "ocr_queued", statusUrl: `/ingestions/${versionId}`, reviewUrl: null, activated: false };
},
async cleanup() { return { deleted: 0 }; }
};
const server = createApp({ ingestService: ingestService as never, startReconciler: false }).listen(0);
context.after(() => server.close());
const address = server.address();
assert.ok(address && typeof address === "object");
const upload = async (filename: string, sourceRef?: string) => {
const form = new FormData();
form.set("file", new Blob(["%PDF-1.4\n%%EOF"], { type: "application/pdf" }), filename);
form.set("sourceId", "facturatech:agente-whatsapp-central:errores-junio-2026:v1");
form.set("activate", "false");
if (sourceRef !== undefined) form.set("sourceRef", sourceRef);
return fetch(`http://127.0.0.1:${address.port}/ingest/upload`, { method: "POST", body: form });
};
const first = await upload("factura-fisica.pdf", ` ${logicalSourceRef} `);
const second = await upload("otra-copia.pdf", logicalSourceRef);
const fallback = await upload("fallback.pdf");
const invalid = await upload("invalid.pdf", " ");
const [firstBody, secondBody] = await Promise.all([first.json(), second.json()]) as Array<{ versionId: string; activated: boolean }>;
assert.equal(first.status, 202);
assert.equal(second.status, 202);
assert.equal(fallback.status, 202);
assert.equal(invalid.status, 400);
assert.equal(firstBody.versionId, secondBody.versionId);
assert.equal(firstBody.activated, false);
assert.deepEqual(inputs.map(({ sourceRef }) => sourceRef), [logicalSourceRef, logicalSourceRef, "fallback.pdf"]);
assert.deepEqual(inputs.map(({ activate }) => activate), [false, false, false]);
assert.equal(activeVersionId, "active-before-upload");
for (const input of inputs) {
assert.notEqual(input.readPath, input.sourceRef);
await assert.rejects(access(String(input.readPath)));
}
});