import { describe, it, expect, beforeEach } from 'vitest'; import { groceries, categories } from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; import { createTestDb, type TestDb } from '$lib/server/db/test-helper'; import { loadAll, add, deleteCategory } from './categories'; describe('categories service', () => { let db: TestDb['db']; beforeEach(async () => { db = (await createTestDb()).db; }); it('loadAll returns categories sorted by name', async () => { await db.insert(categories).values([{ name: 'Zebra' }, { name: 'Apple' }]); const result = await loadAll(db); expect(result.map((c) => c.name)).toEqual(['Apple', 'Zebra']); }); it('add creates a category', async () => { const cat = await add('Beverages', db); expect(cat.name).toBe('Beverages'); const rows = await db.select().from(categories); expect(rows).toHaveLength(1); }); it('deleteCategory removes the category and nullifies grocery categoryId', async () => { const [cat] = await db .insert(categories) .values({ name: 'Dairy' }) .returning(); const now = Temporal.Now.instant().toString({ smallestUnit: 'millisecond', }); await db.insert(groceries).values({ name: 'milk', checked: false, createdAt: now, categoryId: cat.id, }); await deleteCategory(cat.id, db); const catRows = await db.select().from(categories); expect(catRows).toHaveLength(0); const [item] = await db.select().from(groceries); expect(item.categoryId).toBeNull(); }); });