import { describe, it, expect, vi, beforeEach } from "vitest"; import prisma from "@/lib/prisma.server"; import { generateInvoiceNumber } from "@/lib/invoice-number.server"; // Mock the Prisma client vi.mock("@/lib/prisma.server", () => ({ default: { company: { update: vi.fn(), }, }, })); describe("invoice-number.server.ts", () => { beforeEach(() => { vi.clearAllMocks(); }); it("should generate invoice number with year and sequence", async () => { const mockCompany = { invoicePrefix: "RE", invoiceSequence: 5, // Already incremented by Prisma }; (prisma.company.update as any).mockResolvedValue(mockCompany); const result = await generateInvoiceNumber("company-123"); // invoiceSequence is already 5 (after increment), so we expect 005 expect(result).toBe("RE-2026-005"); expect(prisma.company.update).toHaveBeenCalledWith({ where: { id: "company-123" }, data: { invoiceSequence: { increment: 1 } }, select: { invoicePrefix: true, invoiceSequence: true }, }); }); it("should pad sequence with zeros", async () => { const mockCompany = { invoicePrefix: "RG", invoiceSequence: 2, // Already incremented by Prisma }; (prisma.company.update as any).mockResolvedValue(mockCompany); const result = await generateInvoiceNumber("company-456"); expect(result).toBe("RG-2026-002"); }); it("should handle custom prefix", async () => { const mockCompany = { invoicePrefix: "INV", invoiceSequence: 10, // Already incremented by Prisma }; (prisma.company.update as any).mockResolvedValue(mockCompany); const result = await generateInvoiceNumber("company-789"); expect(result).toBe("INV-2026-010"); }); });