/** * Empirical Challenger 1 (Deep Adversarial Stress Suite) — Milestone 4 (R4) * * Comprehensive Stress Testing of: * 1. Responsive Shell & Drawer Transitions (rapid open/close, toggle cycles, body scroll lock invariants) * 2. ESC Key Dismiss & Route Transition Cleanup * 3. KPI Engine Extreme Value Testing (0 receipts, 10,000 receipts, all-unconfirmed, all-flagged, negative amounts) * 4. Multi-tax and zero-tax edge cases, float stability, and accuracy tier bounds */ import { describe, test, it, expect } from "./runner"; import { ProcessedReceipt } from "../../src/lib/schema/receipt"; import { calculateDashboardKPIs, DashboardKPIMetrics } from "../../src/components/dashboard/KPICards"; import { getRouteBreadcrumbs } from "../../src/components/dashboard/TopNav"; import { DASHBOARD_NAV_ITEMS } from "../../src/components/dashboard/Sidebar"; import { resolveReceiptStatusTier } from "../../src/components/dashboard/StatusBadge"; function createEmpiricalReceipt(id: string, overrides: Partial = {}): ProcessedReceipt { return { id, imageHash: `hash-${id}`, originalFileName: `receipt_${id}.jpg`, fileSizeBytes: 100000, previewUrl: `blob:http://localhost/${id}.jpg`, createdAt: "2026-08-15T12:00:00.000Z", updatedAt: "2026-08-15T12:00:00.000Z", status: "ready", documentType: "KASSENBON", receiptNumber: `REC-${id}`, currency: "EUR", merchant: { name: `Merchant ${id}`, address: "München, Deutschland", taxId: "DE123456789", confidence: 0.95, }, date: { isoDate: "2026-08-15", time: "12:00", confidence: 0.95, }, totalAmount: { value: 100.0, confidence: 0.95, }, netAmount: 84.03, taxBreakdown: [ { ratePercent: 19, taxAmount: 15.97, netAmount: 84.03 }, ], lineItems: [ { description: "Item 1", quantity: 1, price: 100.0, taxRate: 19 }, ], suggestedCategory: "Bürobedarf & IT", paymentMethod: "EC_KARTE", validation: { isMathValid: true, isDuplicateSuspected: false, needsUserReview: false, userConfirmed: false, reviewField: "none", reviewReason: null, issues: [], }, ...overrides, }; } describe("Empirical Challenger 1: Responsive Shell, Drawer State & Scroll Lock Invariants", () => { test("CH1-M4.1: 5,000 rapid toggle cycles preserves deterministic boolean state", () => { let isOpen = false; const toggle = () => { isOpen = !isOpen; }; for (let i = 0; i < 5000; i++) { toggle(); } expect(isOpen).toBe(false); toggle(); expect(isOpen).toBe(true); }); test("CH1-M4.2: Body scroll locking simulation maintains clean overflow restoration", () => { // Simulated DOM style target const mockDocumentBody = { style: { overflow: "", }, }; const setDrawerOpen = (open: boolean) => { if (open) { mockDocumentBody.style.overflow = "hidden"; } else { mockDocumentBody.style.overflow = ""; } }; // Initial state expect(mockDocumentBody.style.overflow).toBe(""); // Open drawer -> locked setDrawerOpen(true); expect(mockDocumentBody.style.overflow).toBe("hidden"); // Close drawer -> restored setDrawerOpen(false); expect(mockDocumentBody.style.overflow).toBe(""); // Unmount cleanup simulation setDrawerOpen(true); expect(mockDocumentBody.style.overflow).toBe("hidden"); // Cleanup handler executes on unmount mockDocumentBody.style.overflow = ""; expect(mockDocumentBody.style.overflow).toBe(""); }); test("CH1-M4.3: ESC key listener only closes when open and ignores other keys", () => { let isDrawerOpen = true; const handleKeyDown = (key: string) => { if (key === "Escape" && isDrawerOpen) { isDrawerOpen = false; } }; handleKeyDown("Tab"); expect(isDrawerOpen).toBe(true); handleKeyDown("Enter"); expect(isDrawerOpen).toBe(true); handleKeyDown("Escape"); expect(isDrawerOpen).toBe(false); // Press Escape again while closed handleKeyDown("Escape"); expect(isDrawerOpen).toBe(false); }); test("CH1-M4.4: Route transition automatically dismisses mobile drawer", () => { let isDrawerOpen = true; let currentPathname = "/dashboard"; const onRouteChange = (newPath: string) => { currentPathname = newPath; isDrawerOpen = false; // Triggered by useEffect([pathname]) }; onRouteChange("/dashboard/activity"); expect(currentPathname).toBe("/dashboard/activity"); expect(isDrawerOpen).toBe(false); }); }); describe("Empirical Challenger 1: KPI Edge Cases — Empty, 0, 10k, All-Unconfirmed, All-Flagged & Negative", () => { test("CH1-M4.5: Empty dataset [] yields zero sums and 99.8% baseline optimal accuracy", () => { const kpis = calculateDashboardKPIs([]); expect(kpis.totalScanned).toBe(0); expect(kpis.totalGross).toBe(0); expect(kpis.totalNet).toBe(0); expect(kpis.monthlySpend).toBe(0); expect(kpis.monthlySpendNet).toBe(0); expect(kpis.pendingReviewsCount).toBe(0); expect(kpis.confirmedCount).toBe(0); expect(kpis.averageAccuracy).toBe(99.8); expect(kpis.accuracyTier).toBe("optimal"); expect(kpis.totalVat19).toBe(0); expect(kpis.totalVat7).toBe(0); }); test("CH1-M4.6: Dataset with 10 receipts of 0.00 € total produces 0 sums without NaN", () => { const zeroReceipts = Array.from({ length: 10 }, (_, i) => createEmpiricalReceipt(`zero-${i}`, { totalAmount: { value: 0.0, confidence: 1.0 }, merchant: { name: "Zero", address: null, taxId: null, confidence: 1.0 }, date: { isoDate: "2026-08-15", time: null, confidence: 1.0 }, netAmount: 0.0, taxBreakdown: [], }) ); const kpis = calculateDashboardKPIs(zeroReceipts); expect(kpis.totalScanned).toBe(10); expect(kpis.totalGross).toBe(0.0); expect(kpis.totalNet).toBe(0.0); expect(kpis.averageAccuracy).toBe(100.0); expect(kpis.accuracyTier).toBe("optimal"); }); test("CH1-M4.7: 10,000 receipts dataset calculates in under 30ms without floating point corruption", () => { const now = new Date(); const currentMonthIso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-10`; const largeSet = Array.from({ length: 10000 }, (_, i) => createEmpiricalReceipt(`bulk-${i}`, { date: { isoDate: i % 2 === 0 ? currentMonthIso : "2025-01-01", time: "10:00", confidence: 0.95 }, totalAmount: { value: 50.0, confidence: 0.95 }, netAmount: 42.02, taxBreakdown: [{ ratePercent: 19, taxAmount: 7.98, netAmount: 42.02 }], }) ); const start = performance.now(); const kpis = calculateDashboardKPIs(largeSet); const duration = performance.now() - start; expect(kpis.totalScanned).toBe(10000); expect(kpis.totalGross).toBe(500000.0); // 10,000 * 50 expect(kpis.totalNet).toBeCloseTo(420200.0, 2); expect(kpis.monthlyReceiptsCount).toBe(5000); expect(kpis.monthlySpend).toBe(250000.0); expect(duration).toBeLessThan(100); }); test("CH1-M4.8: All-unconfirmed dataset (all userConfirmed: false)", () => { const unconfirmedSet = Array.from({ length: 50 }, (_, i) => createEmpiricalReceipt(`unconfirmed-${i}`, { validation: { isMathValid: true, isDuplicateSuspected: false, needsUserReview: false, userConfirmed: false, reviewField: "none", reviewReason: null, issues: [{ message: "Math error", field: "taxBreakdown", severity: "error" }], }, }) ); const kpis = calculateDashboardKPIs(unconfirmedSet); expect(kpis.totalScanned).toBe(50); expect(kpis.confirmedCount).toBe(0); expect(kpis.pendingReviewsCount).toBe(0); // status is scanned (ready), not pending review expect(kpis.averageAccuracy).toBeGreaterThanOrEqual(90.0); }); test("CH1-M4.9: All-flagged dataset with math invalidity and low confidence", () => { // 1. Moderate degradation (85% -> medium tier) const flaggedSetMedium = Array.from({ length: 50 }, (_, i) => createEmpiricalReceipt(`flagged-med-${i}`, { merchant: { name: "M", address: null, taxId: null, confidence: 0.95 }, date: { isoDate: "2026-08-15", time: null, confidence: 0.95 }, totalAmount: { value: 100.0, confidence: 0.95 }, validation: { isMathValid: false, isDuplicateSuspected: false, needsUserReview: true, userConfirmed: false, reviewField: "taxBreakdown", reviewReason: "Discrepancy", issues: [{ message: "Math error", field: "taxBreakdown", severity: "error" }], }, }) ); const kpisMed = calculateDashboardKPIs(flaggedSetMedium); expect(kpisMed.totalScanned).toBe(50); expect(kpisMed.pendingReviewsCount).toBe(50); expect(kpisMed.confirmedCount).toBe(0); expect(kpisMed.accuracyTier).toBe("medium"); expect(kpisMed.averageAccuracy).toBe(85.0); // 2. Severe degradation (<= 75% -> low tier) const flaggedSetLow = Array.from({ length: 50 }, (_, i) => createEmpiricalReceipt(`flagged-low-${i}`, { merchant: { name: "M", address: null, taxId: null, confidence: 0.60 }, date: { isoDate: "2026-08-15", time: null, confidence: 0.60 }, totalAmount: { value: 100.0, confidence: 0.60 }, validation: { isMathValid: false, isDuplicateSuspected: false, needsUserReview: true, userConfirmed: false, reviewField: "taxBreakdown", reviewReason: "Discrepancy", issues: [{ message: "Math error", field: "taxBreakdown", severity: "error" }], }, }) ); const kpisLow = calculateDashboardKPIs(flaggedSetLow); expect(kpisLow.totalScanned).toBe(50); expect(kpisLow.pendingReviewsCount).toBe(50); expect(kpisLow.confirmedCount).toBe(0); expect(kpisLow.accuracyTier).toBe("low"); expect(kpisLow.averageAccuracy).toBeLessThan(80.0); }); test("CH1-M4.10: Negative amounts (credit notes / returns) sum correctly and preserve accuracy computation", () => { const mixedAmounts = [ createEmpiricalReceipt("pos-item", { totalAmount: { value: 300.0, confidence: 0.99 }, netAmount: 252.10, taxBreakdown: [{ ratePercent: 19, taxAmount: 47.90, netAmount: 252.10 }], }), createEmpiricalReceipt("neg-return", { totalAmount: { value: -100.0, confidence: 0.99 }, netAmount: -84.03, taxBreakdown: [{ ratePercent: 19, taxAmount: -15.97, netAmount: -84.03 }], }), ]; const kpis = calculateDashboardKPIs(mixedAmounts); expect(kpis.totalScanned).toBe(2); expect(kpis.totalGross).toBe(200.0); // 300 - 100 expect(kpis.totalNet).toBe(168.07); expect(kpis.totalVat19).toBe(31.93); expect(kpis.averageAccuracy).toBeGreaterThanOrEqual(95.0); }); test("CH1-M4.11: Multi-rate VAT mixing (0%, 7%, 19%, and custom rates) aggregates safely", () => { const multiVatReceipts = [ createEmpiricalReceipt("vat-mix", { totalAmount: { value: 250.0, confidence: 1.0 }, netAmount: 220.0, taxBreakdown: [ { ratePercent: 19, taxAmount: 19.0, netAmount: 100.0 }, { ratePercent: 7, taxAmount: 7.0, netAmount: 100.0 }, { ratePercent: 0, taxAmount: 0.0, netAmount: 20.0 }, ], }), ]; const kpis = calculateDashboardKPIs(multiVatReceipts); expect(kpis.totalVat19).toBe(19.0); expect(kpis.totalVat7).toBe(7.0); expect(kpis.totalGross).toBe(250.0); expect(kpis.totalNet).toBe(220.0); }); });