diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-07 19:17:14 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-07 19:17:14 +0200 |
| commit | 66939bab93cdcb9b7732c45d7bc3b99b6951fe15 (patch) | |
| tree | ec6bc1631464410f8735da49e02e99abff0f3863 /src/lib/server/services/references.test.ts | |
| parent | 6e5dcdb53cea4c3f082d01c937fe5fc1d580c45b (diff) | |
feat: promote a reference as the primary shown in lists
Add an is_primary flag to references; the promoted ref sorts first on the item page and is the one shown under the item in the list and catalog. Item page gets a star toggle per reference.
Diffstat (limited to 'src/lib/server/services/references.test.ts')
| -rw-r--r-- | src/lib/server/services/references.test.ts | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/lib/server/services/references.test.ts b/src/lib/server/services/references.test.ts index bcefbd0..fa3fc97 100644 --- a/src/lib/server/services/references.test.ts +++ b/src/lib/server/services/references.test.ts @@ -2,7 +2,7 @@ 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'; +import { loadForGrocery, add, promote, deleteReference } from './references'; describe('references service', () => { let db: TestDb['db']; @@ -73,6 +73,39 @@ describe('references service', () => { expect(rows).toHaveLength(1); }); + it('promote puts the ref first and clears any sibling primary', async () => { + const now = Temporal.Now.instant().toString({ + smallestUnit: 'millisecond', + }); + const [g] = await db + .insert(groceries) + .values({ name: 'coffee', checked: false, createdAt: now }) + .returning(); + const [a] = await db + .insert(references) + .values({ groceryId: g.id, reference: 'A', qualityScore: 90 }) + .returning(); + const [b] = await db + .insert(references) + .values({ groceryId: g.id, reference: 'B' }) + .returning(); + + await promote(b.id, db); + let refs = await loadForGrocery(g.id, db); + expect(refs.map((r) => r.reference)).toEqual(['B', 'A']); + + await promote(a.id, db); + refs = await loadForGrocery(g.id, db); + expect(refs.map((r) => r.reference)).toEqual(['A', 'B']); + + const rows = await db + .select() + .from(references) + .where(eq(references.groceryId, g.id)); + expect(rows.filter((r) => r.isPrimary)).toHaveLength(1); + expect(rows.find((r) => r.id === a.id)?.isPrimary).toBe(true); + }); + it('deleteReference removes the ref', async () => { const now = Temporal.Now.instant().toString({ smallestUnit: 'millisecond', |
