import { describe, expect, it } from 'vitest'; import { readVisitedPots, recordVisitedPot } from './visitedPots'; function createMockStorage(): Storage { const store = new Map(); return { getItem: (key: string) => store.get(key) ?? null, setItem: (key: string, value: string) => void store.set(key, value), removeItem: (key: string) => void store.delete(key), clear: () => store.clear(), key: () => null, get length() { return store.size; }, }; } describe('visited pots storage', () => { it('returns an empty list when nothing is stored', () => { expect(readVisitedPots(createMockStorage())).toEqual([]); }); it('records a visited pot', () => { const storage = createMockStorage(); recordVisitedPot(storage, { slug: 'abc', name: 'Lisbon Trip', currency: 'EUR', }); expect(readVisitedPots(storage)).toEqual([ expect.objectContaining({ slug: 'abc', name: 'Lisbon Trip', currency: 'EUR', }), ]); }); it('moves a re-visited pot to the front instead of duplicating it', () => { const storage = createMockStorage(); recordVisitedPot(storage, { slug: 'abc', name: 'Lisbon Trip', currency: 'EUR', }); recordVisitedPot(storage, { slug: 'def', name: 'Ski Weekend', currency: 'CHF', }); recordVisitedPot(storage, { slug: 'abc', name: 'Lisbon Trip', currency: 'EUR', }); const pots = readVisitedPots(storage); expect(pots).toHaveLength(2); expect(pots[0]?.slug).toBe('abc'); }); it('updates the stored name and currency on revisit', () => { const storage = createMockStorage(); recordVisitedPot(storage, { slug: 'abc', name: 'Old Name', currency: 'EUR', }); recordVisitedPot(storage, { slug: 'abc', name: 'New Name', currency: 'USD', }); expect(readVisitedPots(storage)).toEqual([ expect.objectContaining({ slug: 'abc', name: 'New Name', currency: 'USD', }), ]); }); it('ignores malformed JSON', () => { const storage = createMockStorage(); storage.setItem('stb:visited-pots', '{not json'); expect(readVisitedPots(storage)).toEqual([]); }); it('caps the list at 20 entries, keeping the most recent', () => { const storage = createMockStorage(); for (let i = 0; i < 25; i++) { recordVisitedPot(storage, { slug: `pot-${i}`, name: `Pot ${i}`, currency: 'EUR', }); } const pots = readVisitedPots(storage); expect(pots).toHaveLength(20); expect(pots[0]?.slug).toBe('pot-24'); expect(pots.some((p) => p.slug === 'pot-0')).toBe(false); }); });