import { vi } from 'vitest'; type WhereClause = { equals: ReturnType>> }>>; }; type FilterClause = { first: ReturnType>>; }; export type TableMock = { toArray: ReturnType>>; add: ReturnType>>; update: ReturnType], Promise>>; where: ReturnType>>; filter: ReturnType boolean], FilterClause>>; count: ReturnType>>; }; const createWhere = (): WhereClause => ({ equals: vi.fn<[T], { first: ReturnType>> }>().mockReturnValue({ first: vi.fn<[], Promise>().mockResolvedValue(undefined), }), }); export const makeTableMock = (items: T[] = []): TableMock => ({ toArray: vi.fn<[], Promise>().mockResolvedValue([...items]), add: vi.fn<[T], Promise>().mockResolvedValue(undefined), update: vi.fn<[string, Partial], Promise>().mockResolvedValue(undefined), where: vi.fn<[keyof T], WhereClause>().mockImplementation(() => createWhere()), filter: vi .fn<[(item: T) => boolean], FilterClause>() .mockReturnValue({ first: vi.fn<[], Promise>().mockResolvedValue(undefined) }), count: vi.fn<[], Promise>().mockResolvedValue(0), }); type MockDbOverrides = { products: unknown[]; categories: unknown[]; pickLists: unknown[]; pickItems: unknown[]; importExportLogs: unknown[]; }; type TransactionMock = ReturnType>>; type MockDb = { products: TableMock; categories: TableMock; pickLists: TableMock; pickItems: TableMock; importExportLogs: TableMock; transaction: TransactionMock; open: ReturnType>>; }; export const makeMockDb = (overrides: Partial = {}): MockDb => { const products = makeTableMock(overrides.products ?? []); const categories = makeTableMock(overrides.categories ?? []); const pickLists = makeTableMock(overrides.pickLists ?? []); const pickItems = makeTableMock(overrides.pickItems ?? []); const importExportLogs = makeTableMock(overrides.importExportLogs ?? []); const transaction = vi.fn<[string, ...unknown[]], Promise>().mockImplementation( async (_mode, ...args) => { const cb = args[args.length - 1]; if (typeof cb === 'function') { return cb(); } return undefined; }, ); const open = vi.fn<[], Promise>().mockResolvedValue(undefined); return { products, categories, pickLists, pickItems, importExportLogs, transaction, open, }; };