aboutsummaryrefslogtreecommitdiff
path: root/src/lib/server/services/references.test.ts
blob: 49c5c9427194348d723a348a5cb1964d5801e958 (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

import { describe, it, expect, beforeEach } from 'vitest';
import { groceries, references } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
import { createTestDb, type TestDb } from '$lib/server/db/test-helper';
import { loadForGrocery, add, deleteReference } from './references';

describe('references service', () => {
	let db: TestDb['db'];

	beforeEach(async () => {
		db = (await createTestDb()).db;
	});

	it('loadForGrocery returns refs for the given grocery', async () => {
		const now = Temporal.Now.instant().toString({
			smallestUnit: 'millisecond',
		});
		const [g1] = await db
			.insert(groceries)
			.values({ name: 'coffee', checked: false, createdAt: now })
			.returning();
		const [g2] = await db
			.insert(groceries)
			.values({ name: 'tea', checked: false, createdAt: now })
			.returning();

		await db.insert(references).values([
			{ groceryId: g1.id, reference: 'Brand A' },
			{ groceryId: g2.id, reference: 'Brand B' },
		]);

		const refs = await loadForGrocery(g1.id, db);
		expect(refs).toHaveLength(1);
		expect(refs[0].reference).toBe('Brand A');
	});

	it('add creates a reference', async () => {
		const now = Temporal.Now.instant().toString({
			smallestUnit: 'millisecond',
		});
		const [g] = await db
			.insert(groceries)
			.values({ name: 'pasta', checked: false, createdAt: now })
			.returning();

		const ref = await add(g.id, 'Barilla', 2.5, '€/kg', 85, db);
		expect(ref.reference).toBe('Barilla');
		expect(ref.price).toBe(2.5);

		const rows = await db
			.select()
			.from(references)
			.where(eq(references.groceryId, g.id));
		expect(rows).toHaveLength(1);
	});

	it('deleteReference removes the ref', async () => {
		const now = Temporal.Now.instant().toString({
			smallestUnit: 'millisecond',
		});
		const [g] = await db
			.insert(groceries)
			.values({ name: 'rice', checked: false, createdAt: now })
			.returning();
		const [ref] = await db
			.insert(references)
			.values({ groceryId: g.id, reference: 'Brand X' })
			.returning();

		await deleteReference(ref.id, db);

		const rows = await db.select().from(references);
		expect(rows).toHaveLength(0);
	});
});