You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mail-yubao/tests/unit/email-fixture-extract.test.ts

83 lines
3.2 KiB

import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { enableTestModeEnv, disableTestModeEnv } from "@/services/test/test-mode-env";
import { loadAllEmailFixtures } from "@/services/test/email-fixture-library";
import { evaluateEmailFixture } from "@/services/test/evaluate-email-fixture";
import type { EmailFixtureExpected } from "@/services/test/email-fixture-library";
import type { FixtureExtractActual } from "@/services/test/evaluate-email-fixture";
function assertExpected(id: string, actual: FixtureExtractActual, expected: EmailFixtureExpected) {
expect(actual.pull, `${id} pull`).toBe(expected.pull !== false);
if (expected.pipeline_mail_type) {
expect(actual.pipeline_mail_type, `${id} pipeline_mail_type`).toBe(
expected.pipeline_mail_type,
);
} else {
expect(actual.mail_type, `${id} mail_type`).toBe(expected.mail_type);
}
expect(actual.status, `${id} status`).toBe(expected.status);
if (expected.last_error === "missing_columns") {
expect(actual.last_error, `${id} last_error`).toMatch(/^missing_columns/);
} else {
expect(actual.last_error, `${id} last_error`).toBe(expected.last_error);
}
if (expected.container_no) {
expect(actual.container_no, `${id} container_no`).toBe(expected.container_no);
}
if (
expected.selected_attachment &&
/\.(xlsx|xls|csv)$/i.test(expected.selected_attachment)
) {
expect(actual.selected_attachment, `${id} selected_attachment`).toBe(
expected.selected_attachment,
);
}
if (expected.selected_attachment === null) {
expect(actual.selected_attachment, `${id} selected_attachment`).toBeNull();
}
if (expected.shipment_count != null) {
expect(actual.shipment_count, `${id} shipment_count`).toBe(expected.shipment_count);
}
if (expected.valid_shipment_count != null) {
expect(actual.valid_shipment_count, `${id} valid_shipment_count`).toBe(
expected.valid_shipment_count,
);
}
if (expected.missing_columns) {
expect(actual.missing_columns, `${id} missing_columns`).toBe(true);
}
if (expected.shipments) {
for (let i = 0; i < expected.shipments.length; i++) {
const exp = expected.shipments[i];
const row = actual.shipments[i];
expect(row, `${id} shipment[${i}]`).toBeTruthy();
if (exp.F_FBACode != null) expect(row.F_FBACode, id).toBe(exp.F_FBACode);
if (exp.F_Transporter != null) {
expect(row.F_Transporter, id).toBe(exp.F_Transporter);
}
if (exp.F_CTNS != null) expect(row.F_CTNS, id).toBe(exp.F_CTNS);
if (exp.row_status) expect(row.row_status, id).toBe(exp.row_status);
if (exp.F_Expected_DeliveryDateB === null) {
expect(row.F_Expected_DeliveryDateB ?? null, id).toBeNull();
}
}
}
}
describe("parse extract vs fixture expected.json", () => {
beforeAll(() => {
enableTestModeEnv();
});
afterAll(() => {
disableTestModeEnv();
});
it("runs every fixture and matches expected.json", async () => {
const all = await loadAllEmailFixtures();
expect(all.length).toBeGreaterThanOrEqual(15);
for (const f of all) {
const actual = await evaluateEmailFixture(f);
assertExpected(f.id, actual, f.expected);
}
});
});