over / src /lib /__tests__ /commitment.test.ts
luguog's picture
Deploy mailbox-automation Next.js app
9646e24 verified
Raw
History Blame Contribute Delete
5.37 kB
import { test, before, after } from "node:test";
import assert from "node:assert";
import fs from "node:fs";
import path from "node:path";
import { detectCommitments } from "../commitment/detector";
import {
upsertCommitmentByEmailId,
listCommitments,
loadMetrics,
recordAcceptanceOutcome,
} from "../commitment/store";
import { executeCommitment } from "../commitment/executor";
import { CommitmentContract, ProcessedEmailRecord } from "@/types";
const dataDir = path.join(process.cwd(), "data");
const commitmentsFile = path.join(dataDir, "commitments.json");
const metricsFile = path.join(dataDir, "commitment-metrics.json");
let commitmentsBackup: string | null = null;
let metricsBackup: string | null = null;
let commitmentsExisted = false;
let metricsExisted = false;
before(() => {
commitmentsExisted = fs.existsSync(commitmentsFile);
metricsExisted = fs.existsSync(metricsFile);
if (commitmentsExisted) {
commitmentsBackup = fs.readFileSync(commitmentsFile, "utf-8");
}
if (metricsExisted) {
metricsBackup = fs.readFileSync(metricsFile, "utf-8");
}
});
after(() => {
try {
if (commitmentsExisted) {
fs.mkdirSync(dataDir, { recursive: true });
fs.writeFileSync(commitmentsFile, commitmentsBackup ?? "", "utf-8");
} else if (fs.existsSync(commitmentsFile)) {
fs.unlinkSync(commitmentsFile);
}
} catch {
// ignore
}
try {
if (metricsExisted) {
fs.mkdirSync(dataDir, { recursive: true });
fs.writeFileSync(metricsFile, metricsBackup ?? "", "utf-8");
} else if (fs.existsSync(metricsFile)) {
fs.unlinkSync(metricsFile);
}
} catch {
// ignore
}
});
test("detectCommitments extracts a commitment contract", () => {
const emailId = `test-email-${Date.now()}`;
const record: ProcessedEmailRecord = {
id: "rec-1",
emailId,
subject: "Need territory report by Friday",
sender: "Sarah Martinez, Regional Manager",
senderEmail: "sarah.martinez@example.com",
receivedDate: new Date().toISOString(),
processedAt: new Date().toISOString(),
category: "report",
confidence: 0.9,
fieldCount: 0,
tableCount: 0,
extractedData: {
emailId,
extractedAt: new Date().toISOString(),
fields: [],
tables: [],
summary: "Please prepare the territory analysis report by Friday.",
category: "report",
confidence: 0.9,
source: "email_body",
},
};
const commitments = detectCommitments([record]);
assert.equal(commitments.length, 1);
assert.equal(commitments[0].emailId, emailId);
assert.equal(commitments[0].requesterEmail, "sarah.martinez@example.com");
});
test("upsertCommitmentByEmailId is idempotent", () => {
const emailId = `test-email-${Date.now()}-idempotent`;
const contract: CommitmentContract = {
id: "",
emailId,
emailSubject: "Test subject",
requester: "Requester",
requesterEmail: "req@example.com",
recipientRole: "field_representative",
authorityVerified: true,
requestedOutcome: "Prepare territory report",
deadline: new Date().toISOString(),
mandatoryOutputs: ["Written report"],
inferredOutputs: [],
permittedTools: ["internal_report_writer"],
externalSendAllowed: false,
autonomyClass: 1,
completionProbability: 0.9,
dependencies: [],
assumptions: [],
status: "detected",
auditEvents: [],
detectedAt: new Date().toISOString(),
};
const first = upsertCommitmentByEmailId(contract);
const second = upsertCommitmentByEmailId(contract);
assert.equal(first.id, second.id);
const all = listCommitments().filter((c) => c.emailId === emailId);
assert.equal(all.length, 1);
});
test("executeCommitment completes class-1 work and stages class-2 work", () => {
const emailId = `test-email-${Date.now()}-exec`;
const metrics = loadMetrics();
const base: CommitmentContract = {
id: "",
emailId,
emailSubject: "Execution request",
requester: "Requester",
requesterEmail: "req@example.com",
recipientRole: "field_representative",
authorityVerified: true,
requestedOutcome: "Prepare territory report",
deadline: new Date().toISOString(),
mandatoryOutputs: ["Written report"],
inferredOutputs: ["Executive summary"],
permittedTools: ["internal_report_writer"],
externalSendAllowed: false,
autonomyClass: 1,
completionProbability: 0.9,
dependencies: [],
assumptions: [],
status: "detected",
auditEvents: [],
detectedAt: new Date().toISOString(),
};
const done = executeCommitment(base, metrics);
assert.equal(done.contract.status, "completed");
assert.ok((done.contract.deliverables?.length ?? 0) >= 2);
assert.ok(done.contract.confidenceBreakdown);
assert.ok(done.contract.completionProbability >= 0 && done.contract.completionProbability <= 1);
const staged = executeCommitment({ ...base, autonomyClass: 2 }, metrics);
assert.equal(staged.contract.status, "awaiting_approval");
});
test("recordAcceptanceOutcome updates acceptance metric", () => {
const before = loadMetrics();
const after = recordAcceptanceOutcome({ acceptedWithoutRevision: true });
assert.equal(after.acceptedWithoutRevision.total, before.acceptedWithoutRevision.total + 1);
assert.equal(after.acceptedWithoutRevision.success, before.acceptedWithoutRevision.success + 1);
});