ledgerone_backend/test/transactions.controller.spec.ts

88 lines
3.6 KiB
TypeScript

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([]);
});
});