over / src /lib /__tests__ /sheets.test.ts
luguog's picture
Deploy mailbox-automation Next.js app
9646e24 verified
Raw
History Blame Contribute Delete
3.21 kB
import { describe, it } from "node:test";
import assert from "node:assert/strict";
import * as fs from "fs";
import * as path from "path";
import * as os from "os";
import { exportToCSV } from "../sheets/writer";
describe("sheets writer", () => {
const tmpDir = path.join(os.tmpdir(), "mailbox-test-" + Date.now());
it("exports valid records to CSV file (success path)", async () => {
const records = [
{
id: "r1",
subject: "Test",
sender: "sender@test.com",
category: "Environmental",
receivedDate: "2026-08-01T00:00:00Z",
processedAt: "2026-08-01T00:01:00Z",
fieldCount: 2,
tableCount: 0,
confidence: 0.9,
extractedData: {
emailId: "r1",
extractedAt: "2026-08-01T00:01:00Z",
fields: [
{ key: "ph", value: "7.8", type: "scientific_value" as const, confidence: 0.9 },
{ key: "temp", value: "22.4", type: "number" as const, unit: "C", confidence: 0.95 },
],
tables: [],
summary: "Test",
category: "Environmental",
confidence: 0.9,
source: "email_body" as const,
},
},
] as any[];
const filepath = await exportToCSV(records, tmpDir);
assert.ok(typeof filepath === "string", "should return a filepath string");
assert.ok(filepath.endsWith(".csv"), "filepath should end with .csv");
assert.ok(fs.existsSync(filepath), "file should exist on disk");
const content = fs.readFileSync(filepath, "utf-8");
assert.ok(content.includes("Test"), "CSV should contain the subject");
assert.ok(content.includes("7.8"), "CSV should contain field values");
fs.unlinkSync(filepath);
});
it("handles values with commas (CSV escaping)", async () => {
const records = [
{
id: "r2",
subject: 'Test, with "quotes"',
sender: "sender@test.com",
category: "Clinical",
receivedDate: "2026-08-01T00:00:00Z",
processedAt: "2026-08-01T00:01:00Z",
fieldCount: 1,
tableCount: 0,
confidence: 0.8,
extractedData: {
emailId: "r2",
extractedAt: "2026-08-01T00:01:00Z",
fields: [{ key: "note", value: 'value with "quotes", and commas', type: "string" as const, confidence: 0.8 }],
tables: [],
summary: "Test",
category: "Clinical",
confidence: 0.8,
source: "email_body" as const,
},
},
] as any[];
const filepath = await exportToCSV(records, tmpDir);
const content = fs.readFileSync(filepath, "utf-8");
assert.ok(content.includes('"'), "should quote values containing special characters");
fs.unlinkSync(filepath);
});
it("handles empty records array (edge case)", async () => {
const filepath = await exportToCSV([], tmpDir);
assert.ok(typeof filepath === "string", "should return a filepath even for empty input");
assert.ok(fs.existsSync(filepath), "file should exist");
fs.unlinkSync(filepath);
});
// Cleanup tmp dir
it("cleanup", () => {
try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {}
assert.ok(true);
});
});