@@ -3,12 +3,36 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
33import DatasetAnalysisPage from '@/app/explore/[id]/page'
44
55// Mock Next.js navigation
6+ const mockPush = jest . fn ( )
7+ const mockBack = jest . fn ( )
8+
69jest . mock ( 'next/navigation' , ( ) => ( {
710 useParams : ( ) => ( { id : 'test-dataset-id' } ) ,
811 useRouter : ( ) => ( {
9- push : jest . fn ( ) ,
10- back : jest . fn ( ) ,
12+ push : mockPush ,
13+ back : mockBack ,
1114 } ) ,
15+ usePathname : ( ) => '/explore/test-dataset-id' ,
16+ } ) )
17+
18+ // Mock WorkflowContext with proper state
19+ jest . mock ( '@/lib/contexts/WorkflowContext' , ( ) => ( {
20+ WorkflowProvider : ( { children } : { children : React . ReactNode } ) => < div > { children } </ div > ,
21+ useWorkflow : ( ) => ( {
22+ state : {
23+ currentStage : 'DATA_PROFILING' ,
24+ completedStages : new Set ( [ 'DATA_LOADING' ] ) ,
25+ stageData : { } ,
26+ datasetId : 'test-dataset-id'
27+ } ,
28+ canAccessStage : ( ) => true ,
29+ completeStage : jest . fn ( ) ,
30+ setCurrentStage : jest . fn ( ) ,
31+ setDatasetId : jest . fn ( ) ,
32+ resetWorkflow : jest . fn ( ) ,
33+ loadWorkflow : jest . fn ( ) ,
34+ saveWorkflow : jest . fn ( )
35+ } )
1236} ) )
1337
1438// Mock components
@@ -91,8 +115,22 @@ const mockUnprocessedDataset = {
91115 processed_at : null
92116}
93117
118+ // Helper to render component (WorkflowProvider is mocked above)
119+ const renderWithWorkflow = ( component : React . ReactElement , datasetId ?: string ) => {
120+ return render ( component )
121+ }
122+
94123describe ( 'DatasetAnalysisPage' , ( ) => {
95124 beforeEach ( ( ) => {
125+ // Mock localStorage
126+ const localStorageMock = {
127+ getItem : jest . fn ( ) ,
128+ setItem : jest . fn ( ) ,
129+ removeItem : jest . fn ( ) ,
130+ clear : jest . fn ( ) ,
131+ }
132+ global . localStorage = localStorageMock as any
133+
96134 // Reset fetch mock
97135 fetch . mockReset ( )
98136 fetch . mockResolvedValue ( {
@@ -106,13 +144,13 @@ describe('DatasetAnalysisPage', () => {
106144 } )
107145
108146 it ( 'renders loading state initially' , ( ) => {
109- render ( < DatasetAnalysisPage /> )
147+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
110148 expect ( screen . getByText ( 'Loading dataset...' ) ) . toBeInTheDocument ( )
111149 } )
112150
113151 it ( 'renders processed dataset correctly' , async ( ) => {
114- render ( < DatasetAnalysisPage /> )
115-
152+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
153+
116154 await waitFor ( ( ) => {
117155 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
118156 } , { timeout : 3000 } )
@@ -130,8 +168,8 @@ describe('DatasetAnalysisPage', () => {
130168 json : jest . fn ( ) . mockResolvedValue ( mockUnprocessedDataset ) ,
131169 } )
132170
133- render ( < DatasetAnalysisPage /> )
134-
171+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
172+
135173 await waitFor ( ( ) => {
136174 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
137175 } , { timeout : 3000 } )
@@ -142,8 +180,8 @@ describe('DatasetAnalysisPage', () => {
142180 } )
143181
144182 it ( 'renders all tab sections for processed datasets' , async ( ) => {
145- render ( < DatasetAnalysisPage /> )
146-
183+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
184+
147185 await waitFor ( ( ) => {
148186 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
149187 } , { timeout : 3000 } )
@@ -157,7 +195,7 @@ describe('DatasetAnalysisPage', () => {
157195 } )
158196
159197 it ( 'switches between tabs correctly' , async ( ) => {
160- render ( < DatasetAnalysisPage /> )
198+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
161199
162200 await waitFor ( ( ) => {
163201 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
@@ -198,8 +236,8 @@ describe('DatasetAnalysisPage', () => {
198236 json : jest . fn ( ) . mockResolvedValue ( exportResponse ) ,
199237 } )
200238
201- render ( < DatasetAnalysisPage /> )
202-
239+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
240+
203241 await waitFor ( ( ) => {
204242 expect ( screen . getByText ( 'Export Data' ) ) . toBeInTheDocument ( )
205243 } )
@@ -234,7 +272,7 @@ describe('DatasetAnalysisPage', () => {
234272 json : jest . fn ( ) . mockResolvedValue ( mockProcessedDataset ) ,
235273 } )
236274
237- render ( < DatasetAnalysisPage /> )
275+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
238276
239277 await waitFor ( ( ) => {
240278 expect ( screen . getByText ( 'Processing...' ) ) . toBeInTheDocument ( )
@@ -259,7 +297,7 @@ describe('DatasetAnalysisPage', () => {
259297 it ( 'handles API errors gracefully' , async ( ) => {
260298 fetch . mockRejectedValueOnce ( new Error ( 'API Error' ) )
261299
262- render ( < DatasetAnalysisPage /> )
300+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
263301
264302 await waitFor ( ( ) => {
265303 expect ( screen . getByText ( 'API Error' ) ) . toBeInTheDocument ( )
@@ -274,15 +312,15 @@ describe('DatasetAnalysisPage', () => {
274312 status : 404 ,
275313 } )
276314
277- render ( < DatasetAnalysisPage /> )
315+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
278316
279317 await waitFor ( ( ) => {
280318 expect ( screen . getByText ( 'Failed to fetch dataset' ) ) . toBeInTheDocument ( )
281319 } )
282320 } )
283321
284322 it ( 'displays back navigation' , async ( ) => {
285- render ( < DatasetAnalysisPage /> )
323+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
286324
287325 await waitFor ( ( ) => {
288326 expect ( screen . getByText ( 'Back' ) ) . toBeInTheDocument ( )
@@ -293,7 +331,7 @@ describe('DatasetAnalysisPage', () => {
293331 } )
294332
295333 it ( 'shows processing timestamp when available' , async ( ) => {
296- render ( < DatasetAnalysisPage /> )
334+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
297335
298336 await waitFor ( ( ) => {
299337 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
@@ -308,7 +346,7 @@ describe('DatasetAnalysisPage', () => {
308346 json : jest . fn ( ) . mockResolvedValue ( mockUnprocessedDataset ) ,
309347 } )
310348
311- render ( < DatasetAnalysisPage /> )
349+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
312350
313351 await waitFor ( ( ) => {
314352 expect ( screen . getByText ( 'Export Data' ) ) . toBeInTheDocument ( )
@@ -329,7 +367,7 @@ describe('DatasetAnalysisPage', () => {
329367 json : jest . fn ( ) . mockResolvedValue ( datasetWithoutSchema ) ,
330368 } )
331369
332- render ( < DatasetAnalysisPage /> )
370+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
333371
334372 await waitFor ( ( ) => {
335373 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
@@ -350,7 +388,7 @@ describe('DatasetAnalysisPage', () => {
350388 json : jest . fn ( ) . mockResolvedValue ( datasetWithoutStats ) ,
351389 } )
352390
353- render ( < DatasetAnalysisPage /> )
391+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
354392
355393 await waitFor ( ( ) => {
356394 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
@@ -371,7 +409,7 @@ describe('DatasetAnalysisPage', () => {
371409 json : jest . fn ( ) . mockResolvedValue ( datasetWithoutQuality ) ,
372410 } )
373411
374- render ( < DatasetAnalysisPage /> )
412+ renderWithWorkflow ( < DatasetAnalysisPage /> , 'test-dataset-id' )
375413
376414 await waitFor ( ( ) => {
377415 expect ( screen . getByText ( 'test-dataset.csv' ) ) . toBeInTheDocument ( )
0 commit comments