1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, categories, references } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
import { createTestDb, type TestDb } from '$lib/server/db/test-helper';
import {
loadUnchecked,
loadAll,
toggle,
addOrUncheck,
deleteGrocery,
} from './groceries';
describe('groceries service', () => {
let db: TestDb['db'];
beforeEach(async () => {
db = (await createTestDb()).db;
});
it('loadUnchecked returns only unchecked items', async () => {
const now = new Date().toISOString();
await db.insert(groceries).values([
{ name: 'milk', checked: false, createdAt: now },
{ name: 'bread', checked: true, createdAt: now },
]);
const result = await loadUnchecked(db);
expect(result.items).toHaveLength(1);
expect(result.items[0].name).toBe('milk');
});
it('loadAll returns all items', async () => {
const now = new Date().toISOString();
await db.insert(groceries).values([
{ name: 'milk', checked: false, createdAt: now },
{ name: 'bread', checked: true, createdAt: now },
]);
const result = await loadAll(db);
expect(result.items).toHaveLength(2);
});
it('toggle flips checked state', async () => {
const now = new Date().toISOString();
await db
.insert(groceries)
.values({ name: 'milk', checked: false, createdAt: now });
const [item] = await db.select().from(groceries);
await toggle(item.id, db);
const [updated] = await db
.select()
.from(groceries)
.where(eq(groceries.id, item.id));
expect(updated.checked).toBe(true);
});
it('addOrUncheck creates a new grocery', async () => {
const { item, created } = await addOrUncheck('eggs', null, db);
expect(created).toBe(true);
expect(item.name).toBe('eggs');
const rows = await db.select().from(groceries);
expect(rows).toHaveLength(1);
});
it('addOrUncheck unchecks an existing checked item', async () => {
const now = new Date().toISOString();
await db
.insert(groceries)
.values({ name: 'milk', checked: true, createdAt: now });
const { item, created } = await addOrUncheck('milk', null, db);
expect(created).toBe(false);
expect(item.checked).toBe(false);
const rows = await db.select().from(groceries);
expect(rows).toHaveLength(1);
expect(rows[0].checked).toBe(false);
});
it('deleteGrocery removes the item', async () => {
const now = new Date().toISOString();
await db
.insert(groceries)
.values({ name: 'milk', checked: false, createdAt: now });
const [item] = await db.select().from(groceries);
await deleteGrocery(item.id, db);
const rows = await db.select().from(groceries);
expect(rows).toHaveLength(0);
});
});
|