aboutsummaryrefslogtreecommitdiff
path: root/src/lib/server/services/groceries.test.ts
blob: a704b57d6f44458c5a633c5eab7f2ac638a8ff6c (plain) (blame)
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);
	});
});