import { beforeEach, describe, expect, it } from "bun:test"; import { createCategory } from "../../src/server/services/category.service.ts"; import { createItem } from "../../src/server/services/item.service.ts"; import { getCategoryTotals, getGlobalTotals, } from "../../src/server/services/totals.service.ts"; import { createTestDb } from "../helpers/db.ts"; describe("Totals Service", () => { let db: any; let userId: number; beforeEach(async () => { ({ db, userId } = await createTestDb()); }); describe("getCategoryTotals", () => { it("returns weight sum, cost sum, item count per category", async () => { const shelter = await createCategory(db, userId, { name: "Shelter", icon: "tent", }); await createItem(db, userId, { name: "Tent", weightGrams: 1200, priceCents: 35000, categoryId: shelter?.id, }); await createItem(db, userId, { name: "Tarp", weightGrams: 300, priceCents: 8000, categoryId: shelter?.id, }); const totals = await getCategoryTotals(db, userId); expect(totals).toHaveLength(1); // Only Shelter has items expect(totals[0].categoryName).toBe("Shelter"); expect(totals[0].totalWeight).toBe(1500); expect(totals[0].totalCost).toBe(43000); expect(totals[0].itemCount).toBe(2); }); it("excludes empty categories (no items)", async () => { await createCategory(db, userId, { name: "Shelter", icon: "tent" }); // No items added const totals = await getCategoryTotals(db, userId); expect(totals).toHaveLength(0); }); }); describe("getGlobalTotals", () => { it("returns overall weight, cost, count", async () => { await createItem(db, userId, { name: "Tent", weightGrams: 1200, priceCents: 35000, categoryId: 1, }); await createItem(db, userId, { name: "Spork", weightGrams: 20, priceCents: 500, categoryId: 1, }); const totals = await getGlobalTotals(db, userId); expect(totals).toBeDefined(); expect(totals?.totalWeight).toBe(1220); expect(totals?.totalCost).toBe(35500); expect(totals?.itemCount).toBe(2); }); it("returns zeros when no items exist", async () => { const totals = await getGlobalTotals(db, userId); expect(totals).toBeDefined(); expect(totals?.totalWeight).toBe(0); expect(totals?.totalCost).toBe(0); expect(totals?.itemCount).toBe(0); }); }); });