import { TransactionsController } from "../src/transactions/transactions.controller"; describe("TransactionsController", () => { const createController = () => { const service = { list: jest.fn().mockResolvedValue([]), sync: jest.fn().mockResolvedValue({ created: 0 }), summary: jest.fn().mockResolvedValue({ total: "0.00", count: 0 }), updateDerived: jest.fn().mockResolvedValue({}), createManualTransaction: jest.fn().mockResolvedValue({ id: "tx_1" }), previewCsv: jest.fn().mockResolvedValue({ headers: ["Date", "Description", "Amount"] }), importCsvBatch: jest.fn().mockResolvedValue({ totalFiles: 2, imported: 3 }), cashflow: jest.fn().mockResolvedValue([]), merchantInsights: jest.fn().mockResolvedValue([]) }; return { controller: new TransactionsController(service as any), service }; }; it("lists transactions", async () => { const { controller, service } = createController(); const result = await controller.list("user_1"); expect(service.list).toHaveBeenCalledWith( "user_1", expect.objectContaining({ page: 1, limit: 25 }) ); expect(result.data).toEqual([]); }); it("syncs transactions", async () => { const { controller, service } = createController(); const result = await controller.sync("user_1", "2025-01-01", "2025-01-31"); expect(service.sync).toHaveBeenCalledWith("user_1", "2025-01-01", "2025-01-31"); expect(result.data).toEqual({ created: 0 }); }); it("returns summary", async () => { const { controller, service } = createController(); const result = await controller.summary("user_1", "2025-01-01", "2025-01-31"); expect(service.summary).toHaveBeenCalledWith("user_1", "2025-01-01", "2025-01-31"); expect(result.data.total).toBe("0.00"); }); it("creates manual transaction", async () => { const { controller, service } = createController(); const result = await controller.manual("user_1", { date: "2025-01-01", description: "Manual", amount: 10 }); expect(service.createManualTransaction).toHaveBeenCalledWith("user_1", { date: "2025-01-01", description: "Manual", amount: 10 }); expect(result.data.id).toBe("tx_1"); }); it("imports a batch of CSV files", async () => { const { controller, service } = createController(); const files = [{ originalname: "one.csv" }, { originalname: "two.csv" }] as Express.Multer.File[]; const result = await controller.importCsvBatch("user_1", files, "{\"date\":\"Date\"}"); expect(service.importCsvBatch).toHaveBeenCalledWith("user_1", files, { mapping: "{\"date\":\"Date\"}", mappings: undefined }); expect(result.data).toEqual({ totalFiles: 2, imported: 3 }); }); it("previews a CSV file", async () => { const { controller, service } = createController(); const file = { originalname: "preview.csv" } as Express.Multer.File; const result = await controller.previewCsv("user_1", file); expect(service.previewCsv).toHaveBeenCalledWith("user_1", file); expect(result.data.headers).toEqual(["Date", "Description", "Amount"]); }); it("returns cashflow", async () => { const { controller, service } = createController(); const result = await controller.cashflow("user_1", 3); expect(service.cashflow).toHaveBeenCalledWith("user_1", 3); expect(result.data).toEqual([]); }); it("returns merchant insights", async () => { const { controller, service } = createController(); const result = await controller.merchants("user_1", 5); expect(service.merchantInsights).toHaveBeenCalledWith("user_1", 5); expect(result.data).toEqual([]); }); });