@@ -121,7 +121,11 @@ describe('ThemeToggle Component', () => {
121121
122122 test ( 'renders theme toggle' , ( ) => {
123123 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' ) ;
125129 } ) ;
126130
127131 test ( 'renders with correct text' , ( ) => {
@@ -135,181 +139,186 @@ describe('ThemeToggle Component', () => {
135139 isDark : false ,
136140 toggleTheme : mockToggleTheme ,
137141 } ) ) ;
142+
138143 const { rerender } = render ( < ThemeToggle /> ) ;
139144 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' ) ;
142149
143150 // Rerender in dark mode
144151 ( useTheme as jest . Mock ) . mockImplementation ( ( ) => ( {
145152 isDark : true ,
146153 toggleTheme : mockToggleTheme ,
147154 } ) ) ;
148155 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 ( ) ;
151241 } ) ;
152242} ) ;
153243
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