import { describe, it, expect, vi, beforeEach } from 'vitest' import { setActivePinia, createPinia } from 'pinia' import { useDocumentStore } from './store' vi.mock('./api', () => ({ fetchDocuments: vi.fn(), uploadDocument: vi.fn(), deleteDocument: vi.fn(), })) import * as api from './api' describe('useDocumentStore', () => { beforeEach(() => { setActivePinia(createPinia()) vi.clearAllMocks() }) it('starts with empty state', () => { const store = useDocumentStore() expect(store.documents).toEqual([]) expect(store.selectedId).toBeNull() expect(store.uploading).toBe(false) }) it('load() fetches and sets documents', async () => { const docs = [ { id: '1', filename: 'a.pdf' }, { id: '2', filename: 'b.pdf' }, ] api.fetchDocuments.mockResolvedValue(docs) const store = useDocumentStore() await store.load() expect(store.documents).toEqual(docs) }) it('load() handles errors gracefully', async () => { api.fetchDocuments.mockRejectedValue(new Error('network')) const spy = vi.spyOn(console, 'error').mockImplementation(() => {}) const store = useDocumentStore() await store.load() expect(store.documents).toEqual([]) spy.mockRestore() }) it('upload() adds document to front of list and selects it', async () => { const newDoc = { id: 'new', filename: 'new.pdf' } api.uploadDocument.mockResolvedValue(newDoc) const store = useDocumentStore() store.documents = [{ id: 'old', filename: 'old.pdf' }] const result = await store.upload(new File([], 'new.pdf')) expect(result).toEqual(newDoc) expect(store.documents[0]).toEqual(newDoc) expect(store.selectedId).toBe('new') expect(store.uploading).toBe(false) }) it('upload() sets uploading to true during upload', async () => { let resolveUpload api.uploadDocument.mockImplementation( () => new Promise((r) => { resolveUpload = r }), ) const store = useDocumentStore() const promise = store.upload(new File([], 'test.pdf')) expect(store.uploading).toBe(true) resolveUpload({ id: '1', filename: 'test.pdf' }) await promise expect(store.uploading).toBe(false) }) it('upload() resets uploading on error', async () => { api.uploadDocument.mockRejectedValue(new Error('fail')) vi.spyOn(console, 'error').mockImplementation(() => {}) const store = useDocumentStore() await expect(store.upload(new File([], 'test.pdf'))).rejects.toThrow('fail') expect(store.uploading).toBe(false) }) it('remove() deletes document and clears selection if needed', async () => { api.deleteDocument.mockResolvedValue(null) const store = useDocumentStore() store.documents = [{ id: '1' }, { id: '2' }] store.selectedId = '1' await store.remove('1') expect(store.documents).toEqual([{ id: '2' }]) expect(store.selectedId).toBeNull() }) it('remove() does not clear selection for other documents', async () => { api.deleteDocument.mockResolvedValue(null) const store = useDocumentStore() store.documents = [{ id: '1' }, { id: '2' }] store.selectedId = '2' await store.remove('1') expect(store.selectedId).toBe('2') }) it('select() sets selectedId', () => { const store = useDocumentStore() store.select('42') expect(store.selectedId).toBe('42') }) })