import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { setUserDefine } = vi.hoisted(() => ({ setUserDefine: vi.fn().mockResolvedValue({ success: true }), })) vi.mock('@/lib/utils/api-common', () => ({ setUserDefine })) beforeEach(() => { vi.resetModules() setUserDefine.mockClear() const storage = new Map() vi.stubGlobal('localStorage', { getItem: (key: string) => storage.get(key) ?? null, setItem: (key: string, value: string) => storage.set(key, value), removeItem: (key: string) => storage.delete(key), }) vi.stubGlobal('window', { localStorage }) }) afterEach(() => vi.unstubAllGlobals()) const image = 'data:image/jpeg;base64,YWJj' describe('local-only artwork', () => { it('keeps Zhang Leping artwork locally and excludes even short data URLs from sync', async () => { const { useZhanglepingStore, saveZhanglepingStore, applyZhanglepingPersistedState } = await import('./zhanglepingStore') useZhanglepingStore.getState().setDrawArtwork(image, 'caption') await saveZhanglepingStore() const payload = JSON.parse(setUserDefine.mock.calls[0]![2]) expect(payload).not.toHaveProperty('drawArtworkDataUrl') expect(payload.drawArtworkCaption).toBe('caption') expect(payload.hasDrawArtwork).toBe(true) applyZhanglepingPersistedState(payload) expect(useZhanglepingStore.getState().drawArtworkDataUrl).toBe(image) expect(JSON.parse(localStorage.getItem('zhangleping-storage')!).state.drawArtworkDataUrl).toBe( image ) }) it('keeps Nie Er previews locally while syncing other work fields', async () => { const { useNieerStore, saveNieerStore, applyNieerPersistedState } = await import('./nieerStore') useNieerStore.getState().setReflectionWork(6, { previewImageDataUrl: image, paradeId: '1' }) await saveNieerStore() const payload = JSON.parse(setUserDefine.mock.calls[0]![2]) expect(payload.reflectionWorks[6]).not.toHaveProperty('previewImageDataUrl') expect(payload.reflectionWorks[6].paradeId).toBe('1') expect(useNieerStore.getState().reflectionWorks[6]?.previewImageDataUrl).toBe(image) applyNieerPersistedState(payload) expect(useNieerStore.getState().reflectionWorks[6]?.previewImageDataUrl).toBe(image) expect( JSON.parse(localStorage.getItem('nieer-storage')!).state.reflectionWorks[6] .previewImageDataUrl ).toBe(image) }) it('does not restore legacy remote images over local images', async () => { const { useZhanglepingStore, applyZhanglepingPersistedState } = await import('./zhanglepingStore') const { useNieerStore, applyNieerPersistedState } = await import('./nieerStore') useZhanglepingStore.getState().setDrawArtwork(image, 'caption') useNieerStore.getState().setReflectionWork(6, { previewImageDataUrl: image }) applyZhanglepingPersistedState({ drawArtworkDataUrl: 'remote' }) applyNieerPersistedState({ reflectionWorks: { 6: { previewImageDataUrl: 'remote' } } }) expect(useZhanglepingStore.getState().drawArtworkDataUrl).toBe(image) expect(useNieerStore.getState().reflectionWorks[6]?.previewImageDataUrl).toBe(image) }) })