import { test } from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import sharp from "sharp"; import { openDb } from "../src/db.js"; import { loadConfig, type AppConfig } from "../src/config.js"; import { ingestUpload, IngestError } from "../src/media/ingest.js"; function tmpCfg(): AppConfig { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "vilmal-test-")); const cfg = loadConfig({ dataDir: dir, dbPath: path.join(dir, "t.db"), env: "test" }); cfg.mediaDir = path.join(dir, "media"); cfg.originalsDir = path.join(cfg.mediaDir, "originals"); cfg.derivedDir = path.join(cfg.mediaDir, "derived"); fs.mkdirSync(cfg.originalsDir, { recursive: true }); fs.mkdirSync(cfg.derivedDir, { recursive: true }); return cfg; } async function testImage(w = 800, h = 600): Promise { return sharp({ create: { width: w, height: h, channels: 3, background: { r: 120, g: 100, b: 80 } } }) .jpeg() .toBuffer(); } test("ingest: prawdziwy MIME, wymiary, miniatura, deduplikacja sha256", async () => { const cfg = tmpCfg(); const db = openDb(":memory:"); const img = await testImage(); const first = await ingestUpload(db, cfg, { buffer: img, originalName: "hall-1.jpg", role: "product_reference" }); assert.equal(first.mime, "image/jpeg"); assert.equal(first.width, 800); assert.equal(first.height, 600); assert.ok(first.thumbPath); assert.equal(first.duplicate, false); assert.ok(fs.existsSync(path.join(cfg.originalsDir, first.path))); const second = await ingestUpload(db, cfg, { buffer: img, originalName: "kopia.jpg", role: "product_reference" }); assert.equal(second.duplicate, true); assert.equal(second.id, first.id); // ten sam rekord, nie powstaje drugi const count = (db.prepare("SELECT COUNT(*) AS c FROM source_assets").get() as { c: number }).c; assert.equal(count, 1); }); test("ingest: odrzuca nie-obrazowe bajty i przesadnie duże wymiary", async () => { const cfg = tmpCfg(); const db = openDb(":memory:"); await assert.rejects( () => ingestUpload(db, cfg, { buffer: Buffer.from("to nie jest obraz"), originalName: "x.jpg", role: "product_reference" }), IngestError ); const huge = await testImage(13000, 10); await assert.rejects( () => ingestUpload(db, cfg, { buffer: huge, originalName: "huge.jpg", role: "product_reference" }), (e: unknown) => e instanceof IngestError && e.statusCode === 413 ); });