import { describe, it, expect, vi, beforeEach, beforeAll, afterAll, afterEach } from 'vitest'; import { __setMocked, persistentWritable } from './persistentStore'; import { get } from 'svelte/store'; describe('persistentWritable', () => { let _storage: Record = {}; const storageMock = { setItem: vi.fn(), getItem: vi.fn() }; beforeEach(() => { vi.resetAllMocks(); vi.stubGlobal('localStorage', storageMock); _storage = {}; storageMock.setItem.mockImplementation((key: string, value: string) => { _storage[key] = value; }); storageMock.getItem.mockImplementation((key: string) => { const res = _storage[key]; if (res) { return res; } return null; }); }); describe('in browser', () => { beforeAll(() => { __setMocked(true); }); afterAll(() => { __setMocked(false); }); it('should not create multiple stores', () => { const firstStore = persistentWritable('browser-multiple', 0); const secondStore = persistentWritable('browser-multiple', 1); expect(firstStore).toStrictEqual(secondStore); expect(get(secondStore)).toEqual(0); expect(storageMock.getItem).toHaveBeenCalledOnce(); expect(storageMock.getItem.mock.calls[0]).toEqual(['browser-multiple']); expect(storageMock.setItem).toHaveBeenCalledTimes(0); }); it('should update localStorage', () => { const store = persistentWritable('browser-update', 'foo'); expect(storageMock.getItem).toHaveBeenCalledOnce(); store.set('bar'); expect(storageMock.setItem.mock.calls[0]).toEqual(['browser-update', '"bar"']); expect(_storage['browser-update']).toEqual('"bar"'); }); it('should initialize from localStorage', () => { _storage['browser-existing'] = '"bar"'; const store = persistentWritable('browser-existing', 'foo'); expect(get(store)).toEqual('bar'); }); }); describe('in server', () => { beforeAll(() => { __setMocked(false); }); afterEach(() => { expect(storageMock.setItem).toHaveBeenCalledTimes(0); expect(storageMock.getItem).toHaveBeenCalledTimes(0); }); it('should not create multiple stores', () => { const firstStore = persistentWritable('server-multiple', 0); const secondStore = persistentWritable('server-multiple', 0); expect(firstStore).toStrictEqual(secondStore); expect(get(secondStore)).toEqual(0); }); it('should not update localStorage', () => { const store = persistentWritable('server-update', 'foo'); store.set('foobar'); expect(get(store)).toEqual('foobar'); }); }); });