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 './test-helper'; describe('groceries add', () => { let db: TestDb['db']; beforeEach(async () => { db = (await createTestDb()).db; }); async function addItem(name: string, categoryId?: number | null) { const existing = await db .select() .from(groceries) .where(eq(groceries.name, name)) .limit(1); if (existing.length > 0) { await db .update(groceries) .set({ checked: false, categoryId: categoryId ?? existing[0].categoryId, }) .where(eq(groceries.id, existing[0].id)); } else { await db.insert(groceries).values({ name, categoryId, createdAt: Temporal.Now.instant().toString({ smallestUnit: 'millisecond', }), }); } } it('creates a new item when name is new', async () => { await addItem('milk'); const items = await db.select().from(groceries); expect(items).toHaveLength(1); expect(items[0].name).toBe('milk'); expect(items[0].checked).toBe(false); }); it('unchecks an existing checked item instead of creating duplicate', async () => { const now = Temporal.Now.instant().toString({ smallestUnit: 'millisecond', }); await db .insert(groceries) .values({ name: 'milk', checked: true, createdAt: now }); await addItem('milk'); const items = await db.select().from(groceries); expect(items).toHaveLength(1); expect(items[0].checked).toBe(false); }); it('keeps an unchecked item unchanged (already on list)', async () => { const now = Temporal.Now.instant().toString({ smallestUnit: 'millisecond', }); await db .insert(groceries) .values({ name: 'milk', checked: false, createdAt: now }); await addItem('milk'); const items = await db.select().from(groceries); expect(items).toHaveLength(1); expect(items[0].checked).toBe(false); }); });