From ea71f7247c3c79d895e321b9c0b2a76debeed82a Mon Sep 17 00:00:00 2001 From: pjmalandrino Date: Fri, 20 Mar 2026 09:42:14 +0100 Subject: [PATCH] Add tests --- document-parser/data/docling_studio.db | Bin 622592 -> 622592 bytes .../src/features/history/navigation.test.js | 195 ++++++++++++++++++ frontend/src/shared/i18n.test.js | 47 +++++ 3 files changed, 242 insertions(+) create mode 100644 frontend/src/features/history/navigation.test.js diff --git a/document-parser/data/docling_studio.db b/document-parser/data/docling_studio.db index 7807faf747d34edda0ebfdd9a45644ff692cdf38..3b36468f97a19cc8076496d70a74825c82f317f9 100644 GIT binary patch literal 622592 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 delta 279 zcmX}mJ5EAT5P;!1AOgnAoP?5|umiSnmH@s$p7K@@?@dT9tzsc1g*_n@cOf(`!>FAh z@z)TGulZ*(nIOmqLH;r4WkqC(5}uz5MU&l>UNt3F#M^0dYuuNfo-q6^y4Lky$#{p7 z9?Oe<(>^rwzxAe}hBM>l#u>yA$5CWl;&`>S?o<5*2g*3ZIWBOCD^yU$HEO7%fhJmL r;|3jc(L)~t3^Bqj?l8s#_n6`VzDN|lC#E{HZf^O}x>#ggeDD7NRW37S diff --git a/frontend/src/features/history/navigation.test.js b/frontend/src/features/history/navigation.test.js new file mode 100644 index 0000000..18bbca1 --- /dev/null +++ b/frontend/src/features/history/navigation.test.js @@ -0,0 +1,195 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { setActivePinia, createPinia } from 'pinia' + +// Mock vue-router +const mockPush = vi.fn() +vi.mock('vue-router', () => ({ + useRouter: () => ({ push: mockPush }), +})) + +vi.mock('./api.js', () => ({ + fetchAnalyses: vi.fn(), + deleteAnalysis: vi.fn(), +})) + +vi.mock('../analysis/api.js', () => ({ + fetchAnalyses: vi.fn(), + fetchAnalysis: vi.fn(), + createAnalysis: vi.fn(), + deleteAnalysis: vi.fn(), +})) + +vi.mock('../document/api.js', () => ({ + fetchDocuments: vi.fn(), + uploadDocument: vi.fn(), + deleteDocument: vi.fn(), + getPreviewUrl: vi.fn(), +})) + +import { useHistoryStore } from './store.js' +import { useAnalysisStore } from '../analysis/store.js' +import { useDocumentStore } from '../document/store.js' + +describe('History → Studio navigation', () => { + beforeEach(() => { + setActivePinia(createPinia()) + vi.clearAllMocks() + }) + + describe('History store provides data for navigation', () => { + it('analyses contain documentId for document selection', async () => { + const { fetchAnalyses } = await import('./api.js') + fetchAnalyses.mockResolvedValue([ + { id: 'a1', documentId: 'd1', documentFilename: 'test.pdf', status: 'COMPLETED' }, + { id: 'a2', documentId: 'd2', documentFilename: 'other.pdf', status: 'FAILED' }, + ]) + + const store = useHistoryStore() + await store.load() + + expect(store.analyses[0].documentId).toBe('d1') + expect(store.analyses[1].documentId).toBe('d2') + }) + }) + + describe('Analysis store select() restores analysis state', () => { + it('select() sets currentAnalysis from fetched data', async () => { + const { fetchAnalysis } = await import('../analysis/api.js') + const analysis = { + id: 'a1', + documentId: 'd1', + status: 'COMPLETED', + contentMarkdown: '# Hello', + pagesJson: '[{"page_number":1}]', + } + fetchAnalysis.mockResolvedValue(analysis) + + const store = useAnalysisStore() + await store.select('a1') + + expect(store.currentAnalysis).toEqual(analysis) + expect(store.currentAnalysis.documentId).toBe('d1') + }) + + it('select() allows document store to select the associated document', async () => { + const { fetchAnalysis } = await import('../analysis/api.js') + fetchAnalysis.mockResolvedValue({ + id: 'a1', + documentId: 'd1', + status: 'COMPLETED', + }) + + const analysisStore = useAnalysisStore() + const docStore = useDocumentStore() + docStore.documents = [ + { id: 'd1', filename: 'test.pdf' }, + { id: 'd2', filename: 'other.pdf' }, + ] + + await analysisStore.select('a1') + docStore.select(analysisStore.currentAnalysis.documentId) + + expect(docStore.selectedId).toBe('d1') + }) + }) + + describe('Navigation intent from history items', () => { + it('completed analysis navigates to studio with analysisId query', () => { + // Simulates what HistoryList.openAnalysis does + const analysis = { id: 'a1', documentId: 'd1', status: 'COMPLETED' } + + mockPush({ name: 'studio', query: { analysisId: analysis.id } }) + + expect(mockPush).toHaveBeenCalledWith({ + name: 'studio', + query: { analysisId: 'a1' }, + }) + }) + + it('pending analysis navigates with same pattern', () => { + const analysis = { id: 'a2', documentId: 'd2', status: 'PENDING' } + + mockPush({ name: 'studio', query: { analysisId: analysis.id } }) + + expect(mockPush).toHaveBeenCalledWith({ + name: 'studio', + query: { analysisId: 'a2' }, + }) + }) + + it('failed analysis navigates with same pattern', () => { + const analysis = { id: 'a3', documentId: 'd3', status: 'FAILED' } + + mockPush({ name: 'studio', query: { analysisId: analysis.id } }) + + expect(mockPush).toHaveBeenCalledWith({ + name: 'studio', + query: { analysisId: 'a3' }, + }) + }) + }) + + describe('Full restore flow (store-level integration)', () => { + it('restores completed analysis: selects analysis + document + verifier mode', async () => { + const { fetchAnalysis } = await import('../analysis/api.js') + fetchAnalysis.mockResolvedValue({ + id: 'a1', + documentId: 'd1', + status: 'COMPLETED', + contentMarkdown: '# Result', + pagesJson: '[{"page_number":1,"width":612,"height":792}]', + }) + + const analysisStore = useAnalysisStore() + const docStore = useDocumentStore() + docStore.documents = [{ id: 'd1', filename: 'test.pdf' }] + + // Simulate what StudioPage.onMounted does with ?analysisId=a1 + await analysisStore.select('a1') + const analysis = analysisStore.currentAnalysis + expect(analysis).not.toBeNull() + + docStore.select(analysis.documentId) + expect(docStore.selectedId).toBe('d1') + + // Mode would be set to 'verifier' since status is COMPLETED + const mode = analysis.status === 'COMPLETED' ? 'verifier' : 'configurer' + expect(mode).toBe('verifier') + }) + + it('restores failed analysis: selects analysis + document, stays in configurer mode', async () => { + const { fetchAnalysis } = await import('../analysis/api.js') + fetchAnalysis.mockResolvedValue({ + id: 'a2', + documentId: 'd2', + status: 'FAILED', + errorMessage: 'parse error', + }) + + const analysisStore = useAnalysisStore() + const docStore = useDocumentStore() + docStore.documents = [{ id: 'd2', filename: 'broken.pdf' }] + + await analysisStore.select('a2') + const analysis = analysisStore.currentAnalysis + + docStore.select(analysis.documentId) + expect(docStore.selectedId).toBe('d2') + + const mode = analysis.status === 'COMPLETED' ? 'verifier' : 'configurer' + expect(mode).toBe('configurer') + }) + + it('handles missing analysis gracefully', async () => { + const { fetchAnalysis } = await import('../analysis/api.js') + fetchAnalysis.mockRejectedValue(new Error('Not found')) + vi.spyOn(console, 'error').mockImplementation(() => {}) + + const analysisStore = useAnalysisStore() + await analysisStore.select('nonexistent') + + // currentAnalysis stays null on error — StudioPage would not proceed + expect(analysisStore.currentAnalysis).toBeNull() + }) + }) +}) diff --git a/frontend/src/shared/i18n.test.js b/frontend/src/shared/i18n.test.js index 97c1426..dcf24b2 100644 --- a/frontend/src/shared/i18n.test.js +++ b/frontend/src/shared/i18n.test.js @@ -59,4 +59,51 @@ describe('useI18n', () => { const { t } = useI18n() expect(t('results.pageOf', { current: 1, total: 5 })).toBe('Page 1 sur 5') }) + + it('has history tab keys in French', () => { + useSettingsStore.mockReturnValue({ locale: 'fr' }) + + const { t } = useI18n() + expect(t('history.tabAnalyses')).toBe('Analyses') + expect(t('history.tabDocuments')).toBe('Documents') + expect(t('history.emptyDocs')).toBe('Aucun document. Importez un document depuis le Studio.') + }) + + it('has history tab keys in English', () => { + useSettingsStore.mockReturnValue({ locale: 'en' }) + + const { t } = useI18n() + expect(t('history.tabAnalyses')).toBe('Analyses') + expect(t('history.tabDocuments')).toBe('Documents') + expect(t('history.emptyDocs')).toBe('No documents yet. Upload a document from the Studio.') + }) + + it('has detailed pipeline option hints in French', () => { + useSettingsStore.mockReturnValue({ locale: 'fr' }) + + const { t } = useI18n() + // Hints should be longer than simple labels + expect(t('config.ocrHint').length).toBeGreaterThan(40) + expect(t('config.tableStructureHint').length).toBeGreaterThan(40) + expect(t('config.codeEnrichmentHint').length).toBeGreaterThan(40) + expect(t('config.formulaEnrichmentHint').length).toBeGreaterThan(40) + expect(t('config.pictureClassificationHint').length).toBeGreaterThan(40) + expect(t('config.pictureDescriptionHint').length).toBeGreaterThan(40) + expect(t('config.generatePictureImagesHint').length).toBeGreaterThan(40) + expect(t('config.generatePageImagesHint').length).toBeGreaterThan(40) + }) + + it('has detailed pipeline option hints in English', () => { + useSettingsStore.mockReturnValue({ locale: 'en' }) + + const { t } = useI18n() + expect(t('config.ocrHint').length).toBeGreaterThan(40) + expect(t('config.tableStructureHint').length).toBeGreaterThan(40) + expect(t('config.codeEnrichmentHint').length).toBeGreaterThan(40) + expect(t('config.formulaEnrichmentHint').length).toBeGreaterThan(40) + expect(t('config.pictureClassificationHint').length).toBeGreaterThan(40) + expect(t('config.pictureDescriptionHint').length).toBeGreaterThan(40) + expect(t('config.generatePictureImagesHint').length).toBeGreaterThan(40) + expect(t('config.generatePageImagesHint').length).toBeGreaterThan(40) + }) })