import { describe, it, expect, beforeEach } from 'vitest'; import { drizzle } from 'drizzle-orm/libsql'; import { createClient } from '@libsql/client'; import { groceries, categories } from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; describe('groceries add', () => { const client = createClient({ url: ':memory:' }); const db = drizzle(client, { schema: { groceries, categories } }); beforeEach(async () => { await db.run(`DROP TABLE IF EXISTS groceries`); await db.run(`DROP TABLE IF EXISTS categories`); await db.run(`CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL )`); await db.run(`CREATE TABLE groceries ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, checked INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL, category_id INTEGER REFERENCES categories(id) )`); }); 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: new Date().toISOString(), }); } } 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 = new Date().toISOString(); 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 = new Date().toISOString(); 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); }); });