diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-06 00:46:53 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-06 00:46:53 +0200 |
| commit | c915f91fbe8d97201d813c792f4e1fe8c4401e15 (patch) | |
| tree | 7b341e4d7548205776557437bd2245ec59bf0a57 /src/lib/server/services/references.test.ts | |
| parent | f7366834ee41bbb4ac8a9a252224241a884af41b (diff) | |
fix: make grocery and reference ordering deterministic
Every list query lacked a tiebreak, so rows sharing a sort key (same-ms
createdAt inserts, tied or NULL quality scores) came back in unspecified
order and bestRef flipped between loads. Add explicit tiebreaks: items
createdAt desc, id desc (newest first); references qualityScore desc,
id asc (first inserted wins ties). Categories were already total
(order, name unique).
Pin the rules with service tests.
Diffstat (limited to 'src/lib/server/services/references.test.ts')
| -rw-r--r-- | src/lib/server/services/references.test.ts | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/lib/server/services/references.test.ts b/src/lib/server/services/references.test.ts index 49c5c94..bcefbd0 100644 --- a/src/lib/server/services/references.test.ts +++ b/src/lib/server/services/references.test.ts @@ -34,6 +34,25 @@ describe('references service', () => { expect(refs[0].reference).toBe('Brand A'); }); + it('loadForGrocery orders refs by score desc, then insertion', async () => { + const now = Temporal.Now.instant().toString({ + smallestUnit: 'millisecond', + }); + const [g] = await db + .insert(groceries) + .values({ name: 'coffee', checked: false, createdAt: now }) + .returning(); + await db.insert(references).values([ + { groceryId: g.id, reference: 'A' }, + { groceryId: g.id, reference: 'B', qualityScore: 50 }, + { groceryId: g.id, reference: 'C' }, + { groceryId: g.id, reference: 'D', qualityScore: 50 }, + ]); + + const refs = await loadForGrocery(g.id, db); + expect(refs.map((r) => r.reference)).toEqual(['B', 'D', 'A', 'C']); + }); + it('add creates a reference', async () => { const now = Temporal.Now.instant().toString({ smallestUnit: 'millisecond', |
