@@ -121,7 +121,11 @@ describe('ThemeToggle Component', () => {
121
121
122
122
test ( 'renders theme toggle' , ( ) => {
123
123
render ( < ThemeToggle /> ) ;
124
- expect ( screen . getByTestId ( 'mock-theme-toggle' ) ) . toBeInTheDocument ( ) ;
124
+
125
+ // Check if mock theme toggle exists
126
+ const themeToggle = screen . getByTestId ( 'mock-theme-toggle' ) ;
127
+ expect ( themeToggle ) . toBeInTheDocument ( ) ;
128
+ expect ( themeToggle ) . toHaveTextContent ( 'Theme Toggle' ) ;
125
129
} ) ;
126
130
127
131
test ( 'renders with correct text' , ( ) => {
@@ -135,181 +139,186 @@ describe('ThemeToggle Component', () => {
135
139
isDark : false ,
136
140
toggleTheme : mockToggleTheme ,
137
141
} ) ) ;
142
+
138
143
const { rerender } = render ( < ThemeToggle /> ) ;
139
144
const toggle = screen . getByTestId ( 'mock-theme-toggle' ) ;
140
- expect ( toggle ) . toHaveClass ( 'theme-toggle' ) ;
141
- expect ( toggle ) . not . toHaveClass ( 'dark' ) ;
145
+ expect ( toggle ) . toBeInTheDocument ( ) ;
146
+
147
+ // Since isDark is false, verify the content
148
+ expect ( toggle ) . toHaveTextContent ( 'Theme Toggle' ) ;
142
149
143
150
// Rerender in dark mode
144
151
( useTheme as jest . Mock ) . mockImplementation ( ( ) => ( {
145
152
isDark : true ,
146
153
toggleTheme : mockToggleTheme ,
147
154
} ) ) ;
148
155
rerender ( < ThemeToggle /> ) ;
149
- expect ( toggle ) . toHaveClass ( 'theme-toggle' ) ;
150
- expect ( toggle ) . toHaveClass ( 'dark' ) ;
156
+
157
+ // Verify it's still rendered with the same content in dark mode
158
+ expect ( toggle ) . toBeInTheDocument ( ) ;
159
+ expect ( toggle ) . toHaveTextContent ( 'Theme Toggle' ) ;
160
+ } ) ;
161
+ } ) ;
162
+
163
+ // ProvConContainer Component Tests
164
+ describe ( 'ProvConContainer Component' , ( ) => {
165
+ const mockSnapshot = {
166
+ componentData : {
167
+ context : {
168
+ theme : { dark : true } ,
169
+ user : { id : 1 , name : 'Test' } ,
170
+ } ,
171
+ hooksState : {
172
+ useState : [ { value : 'test' } ] ,
173
+ } ,
174
+ } ,
175
+ children : [
176
+ {
177
+ name : 'ThemeProvider' ,
178
+ componentData : {
179
+ context : { theme : 'dark' } ,
180
+ } ,
181
+ children : [ ] ,
182
+ } ,
183
+ ] ,
184
+ } ;
185
+
186
+ test ( 'renders empty state message when no providers/consumers found' , ( ) => {
187
+ render ( < ProvConContainer currentSnapshot = { { } } /> ) ;
188
+ expect ( screen . getByText ( / N o p r o v i d e r s o r c o n s u m e r s f o u n d / ) ) . toBeInTheDocument ( ) ;
189
+ } ) ;
190
+
191
+ test ( 'renders context data correctly' , ( ) => {
192
+ render ( < ProvConContainer currentSnapshot = { mockSnapshot } /> ) ;
193
+
194
+ // Use getAllByText to get all theme spans and verify at least one exists
195
+ const themeElements = screen . getAllByText ( ( content , element ) => {
196
+ return element ?. tagName . toLowerCase ( ) === 'span' && element ?. textContent === 'theme:' ;
197
+ } ) ;
198
+ expect ( themeElements . length ) . toBeGreaterThan ( 0 ) ;
199
+
200
+ // Do the same for user spans
201
+ const userElements = screen . getAllByText ( ( content , element ) => {
202
+ return element ?. tagName . toLowerCase ( ) === 'span' && element ?. textContent === 'user:' ;
203
+ } ) ;
204
+ expect ( userElements . length ) . toBeGreaterThan ( 0 ) ;
205
+ } ) ;
206
+
207
+ test ( 'renders provider components correctly' , ( ) => {
208
+ render ( < ProvConContainer currentSnapshot = { mockSnapshot } /> ) ;
209
+
210
+ // Get all theme elements and use the first one to find its parent
211
+ const themeElements = screen . getAllByText ( ( content , element ) => {
212
+ return element ?. tagName . toLowerCase ( ) === 'span' && element ?. textContent === 'theme:' ;
213
+ } ) ;
214
+ const parentElement = themeElements [ 0 ] . closest ( 'div' ) ;
215
+
216
+ expect ( parentElement ) . toBeInTheDocument ( ) ;
217
+ } ) ;
218
+
219
+ test ( 'correctly parses stringified JSON values' , ( ) => {
220
+ const snapshotWithStringifiedJSON = {
221
+ componentData : {
222
+ context : {
223
+ data : JSON . stringify ( { key : 'value' } ) ,
224
+ } ,
225
+ } ,
226
+ } ;
227
+ render ( < ProvConContainer currentSnapshot = { snapshotWithStringifiedJSON } /> ) ;
228
+
229
+ // Look for the key-value pair in the rendered structure
230
+ expect (
231
+ screen . getByText ( ( content , element ) => {
232
+ return element ?. tagName . toLowerCase ( ) === 'span' && element ?. textContent === 'key:' ;
233
+ } ) ,
234
+ ) . toBeInTheDocument ( ) ;
235
+
236
+ expect (
237
+ screen . getByText ( ( content , element ) => {
238
+ return element ?. tagName . toLowerCase ( ) === 'span' && element ?. textContent === '"value"' ;
239
+ } ) ,
240
+ ) . toBeInTheDocument ( ) ;
151
241
} ) ;
152
242
} ) ;
153
243
154
- // // ProvConContainer Component Tests
155
- // describe('ProvConContainer Component', () => {
156
- // const mockSnapshot = {
157
- // componentData: {
158
- // context: {
159
- // theme: { dark: true },
160
- // user: { id: 1, name: 'Test' },
161
- // },
162
- // hooksState: {
163
- // useState: [{ value: 'test' }],
164
- // },
165
- // },
166
- // children: [
167
- // {
168
- // name: 'ThemeProvider',
169
- // componentData: {
170
- // context: { theme: 'dark' },
171
- // },
172
- // children: [],
173
- // },
174
- // ],
175
- // };
176
-
177
- // test('renders empty state message when no providers/consumers found', () => {
178
- // render(<ProvConContainer currentSnapshot={{}} />);
179
- // expect(screen.getByText(/No providers or consumers found/)).toBeInTheDocument();
180
- // });
181
-
182
- // test('renders context data correctly', () => {
183
- // render(<ProvConContainer currentSnapshot={mockSnapshot} />);
184
-
185
- // // Use getAllByText to get all theme spans and verify at least one exists
186
- // const themeElements = screen.getAllByText((content, element) => {
187
- // return element?.tagName.toLowerCase() === 'span' && element?.textContent === 'theme:';
188
- // });
189
- // expect(themeElements.length).toBeGreaterThan(0);
190
-
191
- // // Do the same for user spans
192
- // const userElements = screen.getAllByText((content, element) => {
193
- // return element?.tagName.toLowerCase() === 'span' && element?.textContent === 'user:';
194
- // });
195
- // expect(userElements.length).toBeGreaterThan(0);
196
- // });
197
-
198
- // test('renders provider components correctly', () => {
199
- // render(<ProvConContainer currentSnapshot={mockSnapshot} />);
200
-
201
- // // Get all theme elements and use the first one to find its parent
202
- // const themeElements = screen.getAllByText((content, element) => {
203
- // return element?.tagName.toLowerCase() === 'span' && element?.textContent === 'theme:';
204
- // });
205
- // const parentElement = themeElements[0].closest('div');
206
-
207
- // expect(parentElement).toBeInTheDocument();
208
- // });
209
-
210
- // test('correctly parses stringified JSON values', () => {
211
- // const snapshotWithStringifiedJSON = {
212
- // componentData: {
213
- // context: {
214
- // data: JSON.stringify({ key: 'value' }),
215
- // },
216
- // },
217
- // };
218
- // render(<ProvConContainer currentSnapshot={snapshotWithStringifiedJSON} />);
219
-
220
- // // Look for the key-value pair in the rendered structure
221
- // expect(
222
- // screen.getByText((content, element) => {
223
- // return element?.tagName.toLowerCase() === 'span' && element?.textContent === 'key:';
224
- // }),
225
- // ).toBeInTheDocument();
226
-
227
- // expect(
228
- // screen.getByText((content, element) => {
229
- // return element?.tagName.toLowerCase() === 'span' && element?.textContent === '"value"';
230
- // }),
231
- // ).toBeInTheDocument();
232
- // });
233
- // });
234
-
235
- // // Clear Button Tests
236
- // describe('Clear Button', () => {
237
- // // Create mock store
238
- // const mockStore = configureStore({
239
- // reducer: {
240
- // main: mainSlice.reducer,
241
- // },
242
- // preloadedState: {
243
- // main: {
244
- // port: null,
245
- // currentTab: 0,
246
- // currentTitle: 'No Target',
247
- // tabs: {
248
- // 0: {
249
- // currLocation: {
250
- // index: 0,
251
- // stateSnapshot: {
252
- // children: [],
253
- // route: {
254
- // url: '/test',
255
- // },
256
- // },
257
- // },
258
- // hierarchy: {
259
- // index: 0,
260
- // stateSnapshot: {
261
- // children: [],
262
- // route: {
263
- // url: '/test',
264
- // },
265
- // },
266
- // children: [],
267
- // },
268
- // sliderIndex: 0,
269
- // viewIndex: 0,
270
- // snapshots: [],
271
- // playing: false,
272
- // intervalId: null,
273
- // mode: { paused: false },
274
- // status: {
275
- // reactDevToolsInstalled: true,
276
- // targetPageisaReactApp: true,
277
- // },
278
- // },
279
- // },
280
- // currentTabInApp: null,
281
- // connectionStatus: true,
282
- // connectRequested: true,
283
- // },
284
- // },
285
- // });
286
-
287
- // // @ts -ignore
288
- // const useDispatchMock = useDispatch as jest.Mock;
289
- // const dummyDispatch = jest.fn();
290
-
291
- // beforeEach(() => {
292
- // useDispatchMock.mockReturnValue(dummyDispatch);
293
- // dummyDispatch.mockClear();
294
- // });
295
-
296
- // test('renders clear button with correct text', () => {
297
- // render(
298
- // <Provider store={mockStore}>
299
- // <ActionContainer snapshots={[]} />
300
- // </Provider>,
301
- // );
302
- // expect(screen.getByText('Clear')).toBeInTheDocument();
303
- // });
304
-
305
- // test('dispatches both emptySnapshots and changeSlider actions when clicked', () => {
306
- // render(
307
- // <Provider store={mockStore}>
308
- // <ActionContainer snapshots={[]} />
309
- // </Provider>,
310
- // );
311
- // fireEvent.click(screen.getByText('Clear'));
312
- // expect(dummyDispatch).toHaveBeenCalledWith(emptySnapshots());
313
- // expect(dummyDispatch).toHaveBeenCalledWith(changeSlider(0));
314
- // });
315
- // });
244
+ // Clear Button Tests
245
+ describe ( 'Clear Button' , ( ) => {
246
+ // Create mock store
247
+ const mockStore = configureStore ( {
248
+ reducer : {
249
+ main : mainSlice . reducer ,
250
+ } ,
251
+ preloadedState : {
252
+ main : {
253
+ port : null ,
254
+ currentTab : 0 ,
255
+ currentTitle : 'No Target' ,
256
+ tabs : {
257
+ 0 : {
258
+ currLocation : {
259
+ index : 0 ,
260
+ stateSnapshot : {
261
+ children : [ ] ,
262
+ route : {
263
+ url : '/test' ,
264
+ } ,
265
+ } ,
266
+ } ,
267
+ hierarchy : {
268
+ index : 0 ,
269
+ stateSnapshot : {
270
+ children : [ ] ,
271
+ route : {
272
+ url : '/test' ,
273
+ } ,
274
+ } ,
275
+ children : [ ] ,
276
+ } ,
277
+ sliderIndex : 0 ,
278
+ viewIndex : 0 ,
279
+ snapshots : [ ] ,
280
+ playing : false ,
281
+ intervalId : null ,
282
+ mode : { paused : false } ,
283
+ status : {
284
+ reactDevToolsInstalled : true ,
285
+ targetPageisaReactApp : true ,
286
+ } ,
287
+ } ,
288
+ } ,
289
+ currentTabInApp : null ,
290
+ connectionStatus : true ,
291
+ connectRequested : true ,
292
+ } ,
293
+ } ,
294
+ } ) ;
295
+
296
+ // @ts -ignore
297
+ const useDispatchMock = useDispatch as jest . Mock ;
298
+ const dummyDispatch = jest . fn ( ) ;
299
+
300
+ beforeEach ( ( ) => {
301
+ useDispatchMock . mockReturnValue ( dummyDispatch ) ;
302
+ dummyDispatch . mockClear ( ) ;
303
+ } ) ;
304
+
305
+ test ( 'renders clear button with correct text' , ( ) => {
306
+ render (
307
+ < Provider store = { mockStore } >
308
+ < ActionContainer snapshots = { [ ] } />
309
+ </ Provider > ,
310
+ ) ;
311
+ expect ( screen . getByText ( 'Clear' ) ) . toBeInTheDocument ( ) ;
312
+ } ) ;
313
+
314
+ test ( 'dispatches both emptySnapshots and changeSlider actions when clicked' , ( ) => {
315
+ render (
316
+ < Provider store = { mockStore } >
317
+ < ActionContainer snapshots = { [ ] } />
318
+ </ Provider > ,
319
+ ) ;
320
+ fireEvent . click ( screen . getByText ( 'Clear' ) ) ;
321
+ expect ( dummyDispatch ) . toHaveBeenCalledWith ( emptySnapshots ( ) ) ;
322
+ expect ( dummyDispatch ) . toHaveBeenCalledWith ( changeSlider ( 0 ) ) ;
323
+ } ) ;
324
+ } ) ;
0 commit comments