From 96e4cc06f1f813d1056bd987f53e31be13821e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Mon, 18 May 2026 13:01:23 +0200 Subject: [PATCH] test(medications-intake-route): align mocks with v1.4.39 coverage-probe shape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QA F-H-01 (v1.4.39) tightened `hasMedicationComplianceCoverage` to a `$queryRaw` aggregate; the route test mocks were still calling `prisma.medicationComplianceRollup.findFirst`. Switch the mocks to the new probe shape — `{ rolled_days, event_days }` — and add a `$executeRaw` mock for the atomic upsert path that QA F-H-02 introduced. The covered-vs-coverage-miss cases pin the rollup-tier and live-fallback branches under the new probe semantics. --- .../intake/__tests__/route.test.ts | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/app/api/medications/intake/__tests__/route.test.ts b/src/app/api/medications/intake/__tests__/route.test.ts index de3d2de96..9542c8977 100644 --- a/src/app/api/medications/intake/__tests__/route.test.ts +++ b/src/app/api/medications/intake/__tests__/route.test.ts @@ -16,6 +16,9 @@ vi.mock("@/lib/db", () => ({ deleteMany: vi.fn(), }, $transaction: vi.fn(), + // v1.4.39 QA F-H-01 — coverage probe + atomic upsert use raw SQL. + $queryRaw: vi.fn(), + $executeRaw: vi.fn().mockResolvedValue(0), }, })); @@ -71,6 +74,13 @@ beforeEach(() => { vi.mocked(prisma.medicationComplianceRollup.findMany).mockResolvedValue( [] as never, ); + // v1.4.39 QA F-H-01 — the coverage probe is now a single `$queryRaw` + // aggregate returning `{ rolled_days, event_days }`. Default to + // "zero rollups, zero events" (covered/trivial-empty) so tests that + // don't care about coverage land on the rollup path. + vi.mocked(prisma.$queryRaw).mockResolvedValue([ + { rolled_days: BigInt(0), event_days: BigInt(0) }, + ] as never); }); describe("GET /api/medications/intake", () => { @@ -192,12 +202,12 @@ describe("POST /api/medications/intake", () => { describe("v1.4.39 W-MED — compliance rollup read swap", () => { it("reads the rollup tier when coverage is present", async () => { vi.mocked(getSession).mockResolvedValue(SESSION_OK as never); - // Coverage probe returns "at least one row" so the route reads - // from the rollup tier rather than falling back to the live - // aggregator. - vi.mocked(prisma.medicationComplianceRollup.findFirst).mockResolvedValue({ - day: "2026-05-18", - } as never); + // QA F-H-01 (v1.4.39): coverage probe returns + // `{ rolled_days >= event_days }` so the route lands on the + // rollup tier. Match the trailing-7-day window. + vi.mocked(prisma.$queryRaw).mockResolvedValue([ + { rolled_days: BigInt(7), event_days: BigInt(7) }, + ] as never); vi.mocked(prisma.medicationComplianceRollup.findMany).mockResolvedValue([ { day: "2026-05-18", scheduled: 3, taken: 2, skipped: 1 }, ] as never); @@ -221,9 +231,11 @@ describe("v1.4.39 W-MED — compliance rollup read swap", () => { it("falls back to the live aggregator on coverage miss", async () => { vi.mocked(getSession).mockResolvedValue(SESSION_OK as never); - vi.mocked(prisma.medicationComplianceRollup.findFirst).mockResolvedValue( - null, - ); + // QA F-H-01 (v1.4.39): partial coverage — events present but + // rollups missing — forces fall-through to the live aggregator. + vi.mocked(prisma.$queryRaw).mockResolvedValue([ + { rolled_days: BigInt(0), event_days: BigInt(7) }, + ] as never); vi.mocked(prisma.medicationIntakeEvent.findMany).mockResolvedValue([ { scheduledFor: new Date(),