import { vi } from "vitest"; import type { CoaManagementQueries, FinancialAccountingCommands, FinancialAccountingQueries, ItemManagementQueries, OrganizationQueries, } from "../module"; import { baseJournalEntry, baseOperatingPeriod } from "./fixtures"; export type ItemManagementQueryItem = Awaited< ReturnType >["value"]["item"]; export function mockItemManagementQueries( item: ItemManagementQueryItem, ): Pick { return { getItem: () => Promise.resolve({ ok: true, value: { item } }), }; } export type OrganizationQuerySite = Awaited< ReturnType >["value"]["site"]; export function mockOrganizationQueries( site: OrganizationQuerySite, ): Pick { return { getSite: () => Promise.resolve({ ok: true, value: { site } }), }; } export type OrganizationQueryCompany = Awaited< ReturnType >["value"]["company"]; export function mockOrganizationCompanyQueries( company: OrganizationQueryCompany, ): Pick { return { getCompany: () => Promise.resolve({ ok: true, value: { company } }), }; } export type ListAccountsOutput = Extract< Awaited>, { ok: true } >["value"]; export type CoaAccount = ListAccountsOutput["items"][number]; // An unspecified value rejects, so an unexpected call fails loudly instead of // returning a silent default. export function mockCoaManagementQueries(values?: { listAccounts?: ListAccountsOutput }) { return { listAccounts: vi.fn(() => values?.listAccounts !== undefined ? Promise.resolve({ ok: true as const, value: values.listAccounts }) : Promise.reject(new Error("listAccounts is not stubbed")), ) as unknown as CoaManagementQueries["listAccounts"], }; } export type FinancialAccountingPeriod = NonNullable< Awaited>["value"]["accountingPeriod"] >; export type FinancialAccountingJournalEntry = Extract< Awaited>, { ok: true } >["value"]["journalEntry"]; export function mockFinancialAccountingCommands() { return { createJournalEntry: vi.fn(() => Promise.resolve({ ok: true as const, value: { journalEntry: baseJournalEntry } }), ) as unknown as FinancialAccountingCommands["createJournalEntry"], postJournalEntry: vi.fn(() => Promise.resolve({ ok: true as const, value: { journalEntry: baseJournalEntry } }), ) as unknown as FinancialAccountingCommands["postJournalEntry"], }; } export function mockFinancialAccountingQueries( period: FinancialAccountingPeriod | null = baseOperatingPeriod, ) { return { getPeriodByDate: vi.fn(() => Promise.resolve({ ok: true as const, value: { accountingPeriod: period } }), ) as unknown as FinancialAccountingQueries["getPeriodByDate"], }; }