Spaces:
Running
Running
| import { describe, it, expect, vi, beforeEach } from 'vitest' | |
| import { setActivePinia, createPinia } from 'pinia' | |
| import { useAnalysisStore } from '../analysis/store' | |
| vi.mock('../analysis/api', () => ({ | |
| createAnalysis: vi.fn(), | |
| fetchAnalyses: vi.fn().mockResolvedValue([]), | |
| fetchAnalysis: vi.fn(), | |
| deleteAnalysis: vi.fn(), | |
| rechunkAnalysis: vi.fn(), | |
| })) | |
| import * as api from '../analysis/api' | |
| describe('analysis store — chunking', () => { | |
| beforeEach(() => { | |
| setActivePinia(createPinia()) | |
| vi.clearAllMocks() | |
| }) | |
| it('currentChunks parses chunksJson from current analysis', () => { | |
| const store = useAnalysisStore() | |
| const chunks = [ | |
| { | |
| text: 'chunk1', | |
| headings: ['H1'], | |
| sourcePage: 1, | |
| tokenCount: 10, | |
| bboxes: [{ page: 1, bbox: [10, 20, 100, 80] }], | |
| }, | |
| { text: 'chunk2', headings: [], sourcePage: 2, tokenCount: 20, bboxes: [] }, | |
| ] | |
| store.currentAnalysis = { | |
| id: 'j1', | |
| documentId: 'd1', | |
| documentFilename: null, | |
| status: 'COMPLETED', | |
| contentMarkdown: null, | |
| contentHtml: null, | |
| pagesJson: null, | |
| chunksJson: JSON.stringify(chunks), | |
| hasDocumentJson: true, | |
| errorMessage: null, | |
| startedAt: null, | |
| completedAt: null, | |
| createdAt: '2024-01-01', | |
| } | |
| expect(store.currentChunks).toEqual(chunks) | |
| }) | |
| it('currentChunks returns empty array when no chunksJson', () => { | |
| const store = useAnalysisStore() | |
| store.currentAnalysis = { | |
| id: 'j1', | |
| documentId: 'd1', | |
| documentFilename: null, | |
| status: 'COMPLETED', | |
| contentMarkdown: null, | |
| contentHtml: null, | |
| pagesJson: null, | |
| chunksJson: null, | |
| hasDocumentJson: false, | |
| errorMessage: null, | |
| startedAt: null, | |
| completedAt: null, | |
| createdAt: '2024-01-01', | |
| } | |
| expect(store.currentChunks).toEqual([]) | |
| }) | |
| it('rechunk calls API and refreshes analysis', async () => { | |
| const store = useAnalysisStore() | |
| const chunks = [{ text: 'c1', headings: [], sourcePage: 1, tokenCount: 5, bboxes: [] }] | |
| vi.mocked(api.rechunkAnalysis).mockResolvedValue(chunks) | |
| vi.mocked(api.fetchAnalysis).mockResolvedValue({ | |
| id: 'j1', | |
| documentId: 'd1', | |
| documentFilename: null, | |
| status: 'COMPLETED', | |
| contentMarkdown: null, | |
| contentHtml: null, | |
| pagesJson: null, | |
| chunksJson: JSON.stringify(chunks), | |
| hasDocumentJson: true, | |
| errorMessage: null, | |
| startedAt: null, | |
| completedAt: null, | |
| createdAt: '2024-01-01', | |
| }) | |
| store.currentAnalysis = { | |
| id: 'j1', | |
| documentId: 'd1', | |
| documentFilename: null, | |
| status: 'COMPLETED', | |
| contentMarkdown: null, | |
| contentHtml: null, | |
| pagesJson: null, | |
| chunksJson: null, | |
| hasDocumentJson: true, | |
| errorMessage: null, | |
| startedAt: null, | |
| completedAt: null, | |
| createdAt: '2024-01-01', | |
| } | |
| const result = await store.rechunk('j1', { chunker_type: 'hybrid', max_tokens: 256 }) | |
| expect(api.rechunkAnalysis).toHaveBeenCalledWith('j1', { | |
| chunker_type: 'hybrid', | |
| max_tokens: 256, | |
| }) | |
| expect(result).toEqual(chunks) | |
| expect(store.rechunking).toBe(false) | |
| }) | |
| it('run passes chunkingOptions to API', async () => { | |
| const store = useAnalysisStore() | |
| vi.mocked(api.createAnalysis).mockResolvedValue({ | |
| id: 'j1', | |
| documentId: 'd1', | |
| documentFilename: null, | |
| status: 'PENDING', | |
| contentMarkdown: null, | |
| contentHtml: null, | |
| pagesJson: null, | |
| chunksJson: null, | |
| hasDocumentJson: false, | |
| errorMessage: null, | |
| startedAt: null, | |
| completedAt: null, | |
| createdAt: '2024-01-01', | |
| }) | |
| await store.run('d1', null, { chunker_type: 'hierarchical' }) | |
| expect(api.createAnalysis).toHaveBeenCalledWith('d1', null, { | |
| chunker_type: 'hierarchical', | |
| }) | |
| }) | |
| }) | |