mirror of
https://github.com/Hestia-Homes/assessment-model.git
synced 2026-06-08 11:37:25 +00:00
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { updatePibiRequest, PIBI_ORDERED_TEXT_PROP } from "./updatePibiRequest";
|
|
import type { RunUpdatePibiTx, SyncMeasuresField } from "./updatePibiRequest";
|
|
|
|
function makeDeps(overrides?: {
|
|
txResult?: { allMeasureNames: string[] };
|
|
txError?: Error;
|
|
syncResult?: { ok: true } | { ok: false; error: string };
|
|
}) {
|
|
const txResult = overrides?.txResult ?? { allMeasureNames: ["CWI", "ASHP"] };
|
|
|
|
const runUpdateTx: RunUpdatePibiTx = vi.fn(async () => {
|
|
if (overrides?.txError) throw overrides.txError;
|
|
return txResult;
|
|
});
|
|
|
|
const syncMeasuresField: SyncMeasuresField = vi.fn(async () => {
|
|
return overrides?.syncResult ?? ({ ok: true } as const);
|
|
});
|
|
|
|
return { runUpdateTx, syncMeasuresField };
|
|
}
|
|
|
|
describe("updatePibiRequest — happy path", () => {
|
|
it("updates row, re-syncs all deal measures to HubSpot", async () => {
|
|
const completedAt = new Date("2026-05-10T12:00:00Z");
|
|
const deps = makeDeps({
|
|
txResult: { allMeasureNames: ["CWI", "ASHP"] },
|
|
});
|
|
|
|
const result = await updatePibiRequest({
|
|
id: 7n,
|
|
dealId: "deal-1",
|
|
updates: { completedAt },
|
|
deps,
|
|
});
|
|
|
|
expect(result).toEqual({ ok: true, hubspotSync: "ok" });
|
|
|
|
expect(deps.runUpdateTx).toHaveBeenCalledWith({
|
|
id: 7n,
|
|
dealId: "deal-1",
|
|
updates: { completedAt },
|
|
});
|
|
|
|
expect(deps.syncMeasuresField).toHaveBeenCalledWith({
|
|
hubspotDealId: "deal-1",
|
|
propName: PIBI_ORDERED_TEXT_PROP,
|
|
measureNames: ["CWI", "ASHP"],
|
|
});
|
|
});
|
|
|
|
it("can update measureName, orderedAt, and completedAt", async () => {
|
|
const orderedAt = new Date("2026-05-01T09:00:00Z");
|
|
const deps = makeDeps();
|
|
|
|
await updatePibiRequest({
|
|
id: 3n,
|
|
dealId: "deal-2",
|
|
updates: { measureName: "EWI", orderedAt },
|
|
deps,
|
|
});
|
|
|
|
expect(deps.runUpdateTx).toHaveBeenCalledWith({
|
|
id: 3n,
|
|
dealId: "deal-2",
|
|
updates: { measureName: "EWI", orderedAt },
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("updatePibiRequest — DB failure", () => {
|
|
it("returns ok=false, skips HubSpot when tx throws", async () => {
|
|
const deps = makeDeps({ txError: new Error("row not found") });
|
|
|
|
const result = await updatePibiRequest({
|
|
id: 99n,
|
|
dealId: "deal-x",
|
|
updates: { completedAt: new Date() },
|
|
deps,
|
|
});
|
|
|
|
expect(result).toEqual({ ok: false, error: "row not found" });
|
|
expect(deps.syncMeasuresField).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe("updatePibiRequest — HubSpot failure", () => {
|
|
it("returns ok=true with hubspotSync=failed", async () => {
|
|
const deps = makeDeps({
|
|
syncResult: { ok: false, error: "hubspot timeout" },
|
|
});
|
|
|
|
const result = await updatePibiRequest({
|
|
id: 5n,
|
|
dealId: "deal-h",
|
|
updates: { completedAt: new Date() },
|
|
deps,
|
|
});
|
|
|
|
expect(result).toMatchObject({
|
|
ok: true,
|
|
hubspotSync: "failed",
|
|
hubspotError: "hubspot timeout",
|
|
});
|
|
});
|
|
});
|