import { describe, it, expect, vi, beforeEach } from 'vitest' import type { SupabaseClient } from '@supabase/supabase-js' vi.mock('../categories', () => ({ countUnbookedTransactions: vi.fn().mockResolvedValue(4), countUnbookedSkattekontoRows: vi.fn().mockResolvedValue(7), countInboxDocuments: vi.fn().mockResolvedValue(6), countSuggestedMatches: vi.fn().mockResolvedValue(2), countSupplierInvoicesAwaitingApproval: vi.fn().mockResolvedValue(1), countVerifikatMissingDocument: vi.fn().mockResolvedValue(3), countOverdueInvoices: vi.fn().mockResolvedValue(5), countDeadlinesNeedingAction: vi.fn().mockResolvedValue(1), countPendingOperations: vi.fn().mockResolvedValue(2), countReconciliationDue: vi.fn().mockResolvedValue(1), countExpensePayoutsDue: vi.fn().mockResolvedValue(2), countSkattekontoPaymentDue: vi.fn().mockResolvedValue(1), })) import { getWorklistCounts } from '../aggregate' const supabase = {} as SupabaseClient beforeEach(() => { vi.clearAllMocks() }) describe('getWorklistCounts', () => { it('aggregates every category', async () => { const { counts } = await getWorklistCounts(supabase, 'company-1') expect(counts).toEqual({ book_transaction: 4, book_skattekonto: 7, inbox_document: 6, suggested_match: 2, supplier_invoice_approval: 1, verifikat_missing_document: 3, overdue_invoice: 5, deadline_action: 1, pending_operations: 2, reconciliation_due: 1, expense_payout: 2, skattekonto_payment_due: 1, }) }) it('takes the suggested-match count from a caller-supplied list instead of rescanning', async () => { const { countSuggestedMatches } = await import('../categories') const matches = [{ transactionId: 't1' }, { transactionId: 't2' }, { transactionId: 't3' }] as never[] const { counts } = await getWorklistCounts(supabase, 'company-1', { suggestedMatches: Promise.resolve(matches), }) expect(counts.suggested_match).toBe(3) expect(countSuggestedMatches).not.toHaveBeenCalled() }) it('takes the expense-payout count from a caller-supplied list instead of rescanning', async () => { const { countExpensePayoutsDue } = await import('../categories') const people = [{ key: 'owner:Anna' }, { key: 'emp-1' }, { key: 'emp-2' }] as never[] const { counts } = await getWorklistCounts(supabase, 'company-1', { expensePayoutsDue: Promise.resolve(people), }) expect(counts.expense_payout).toBe(3) expect(countExpensePayoutsDue).not.toHaveBeenCalled() }) it('takes the skattekonto payment count from a caller-supplied value instead of rescanning', async () => { const { countSkattekontoPaymentDue } = await import('../categories') const due = { due: '2026-09-12', amount: 1000 } as never const withDue = await getWorklistCounts(supabase, 'company-1', { skattekontoPaymentDue: Promise.resolve(due), }) expect(withDue.counts.skattekonto_payment_due).toBe(1) // null is a value ("nothing to pay in"), not an absent option. const without = await getWorklistCounts(supabase, 'company-1', { skattekontoPaymentDue: null }) expect(without.counts.skattekonto_payment_due).toBe(0) expect(countSkattekontoPaymentDue).not.toHaveBeenCalled() }) it('excludes suggested_match from the total (subset of book_transaction)', async () => { const { total } = await getWorklistCounts(supabase, 'company-1') // 4 + 7 + 6 + 1 + 3 + 5 + 1 + 2 + 1 + 2 (people owed for utlägg) + 1 // (skattekonto payment), without the 2 suggested matches. expect(total).toBe(33) }) })