Skip to content

Commit 108adc1

Browse files
authored
Merge pull request #41 from oslabs-beta/Ahnafkhvn/testing
Added more testing coverage on Navbar
2 parents 82f88ea + d469052 commit 108adc1

File tree

4 files changed

+103
-34
lines changed

4 files changed

+103
-34
lines changed

__tests__/NavBar.test.tsx

Lines changed: 95 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,50 @@ import '@testing-library/jest-dom/extend-expect';
44
import { MemoryRouter } from 'react-router-dom';
55
import { ThemeProvider, createTheme } from '@mui/material/styles';
66
import NavBar from '../app/src/components/top/NavBar';
7-
import navbarDropDown from '../app/src/components/top/navbarDropDown'
7+
import navBarButtons from '../app/src/components/top/NavBarButtons';
88
import * as projectFunctions from '../app/src/helperFunctions/projectGetSaveDel';
99
import { Provider } from 'react-redux';
1010
import { configureStore } from '@reduxjs/toolkit';
1111
import rootReducer from '../app/src/redux/reducers/rootReducer';
1212
import { initialState as appStateInitialState } from '../app/src/redux/reducers/slice/appStateSlice';
1313

14+
15+
16+
// Mock the non-serializable HTMLTypes
17+
const mockHTMLTypes = [
18+
{
19+
id: 11,
20+
tag: 'div',
21+
name: 'Div',
22+
style: {},
23+
placeHolderShort: 'div',
24+
placeHolderLong: '',
25+
framework: 'reactClassic',
26+
nestable: true,
27+
},
28+
{
29+
id: 1000,
30+
tag: 'separator',
31+
name: 'separator',
32+
style: { border: 'none' },
33+
placeHolderShort: '',
34+
placeHolderLong: '',
35+
framework: '',
36+
nestable: true,
37+
},
38+
{
39+
id: 1,
40+
tag: 'img',
41+
name: 'Img',
42+
style: {},
43+
placeHolderShort: 'image',
44+
placeHolderLong: '',
45+
framework: 'reactClassic',
46+
nestable: false,
47+
},
48+
];
49+
50+
1451
// Mocking the theme
1552
const theme = createTheme({
1653
spacing: (value) => `${value}px`,
@@ -36,9 +73,9 @@ jest.mock('file-saver', () => ({
3673
// console.error = jest.fn();
3774
// });
3875

39-
// afterAll(() => {
40-
// console.error = originalError;
41-
// });
76+
afterAll(() => {
77+
jest.resetAllMocks();
78+
});
4279

4380
// Mocking the render
4481
const renderNavBar = (store) => {
@@ -69,6 +106,7 @@ describe('NavBar Component', () => {
69106
...appStateInitialState,
70107
isLoggedIn: true,
71108
name: 'Mock Project Name',
109+
HTMLTypes: mockHTMLTypes,
72110
},
73111
},
74112
});
@@ -98,6 +136,7 @@ describe('NavBar Component', () => {
98136
...appStateInitialState,
99137
isLoggedIn: true,
100138
name: '',
139+
HTMLTypes: mockHTMLTypes,
101140
},
102141
},
103142
});
@@ -144,6 +183,7 @@ describe('NavBar Component', () => {
144183
...appStateInitialState,
145184
isLoggedIn: true,
146185
name: 'Mock Project Name',
186+
HTMLTypes: mockHTMLTypes,
147187
},
148188
},
149189
});
@@ -173,6 +213,7 @@ describe('NavBar Component', () => {
173213
...appStateInitialState,
174214
isLoggedIn: true,
175215
name: 'Mock Project Name',
216+
HTMLTypes: mockHTMLTypes,
176217
},
177218
},
178219
});
@@ -187,43 +228,65 @@ describe('NavBar Component', () => {
187228
const exportButton = getByText('< > Export');
188229
fireEvent.click(exportButton);
189230

190-
231+
// Check if the modal for export options is displayed
191232
await waitFor(() => {
192233
const exportModal = getByText('Click to download in zip file:');
193234
expect(exportModal).toBeInTheDocument();
194235
});
195236

196-
237+
// Simulate clicking the export components
197238
const exportComponentsOption = getByText('Export components');
198239
fireEvent.click(exportComponentsOption);
199240

200241
});
201242

202-
203-
204-
xit('handles dropdown menu correctly', () => {
205-
const store = configureStore({
206-
reducer: rootReducer,
207-
preloadedState: {
208-
appState: {
209-
...appStateInitialState,
210-
isLoggedIn: true,
211-
name: 'Mock Project Name',
243+
test('handles dropdown menu correctly', async () => {
244+
const store = configureStore({
245+
reducer: rootReducer,
246+
preloadedState: {
247+
appState: {
248+
...appStateInitialState,
249+
},
212250
},
213-
},
214-
});
215-
216-
const { getByTestId } = renderNavBar(store);
217-
const moreVertButton = getByTestId('more-vert-button');
218-
219-
220-
expect(moreVertButton).toBeInTheDocument();
221-
222-
223-
fireEvent.click(moreVertButton);
224-
225-
226-
});
227-
251+
});
228252

229-
});
253+
// Render component
254+
const { getByTestId, getByText } = render(
255+
<Provider store={store}>
256+
<MemoryRouter>
257+
<ThemeProvider theme={theme}>
258+
<NavBar />
259+
</ThemeProvider>
260+
</MemoryRouter>
261+
</Provider>
262+
);
263+
264+
// Initially, the dropdown should have the "hideNavDropDown" class
265+
const dropdownMenu = getByTestId('navDropDown');
266+
expect(dropdownMenu).toHaveClass('hideNavDropDown');
267+
268+
// Find and click the button to open the dropdown
269+
const moreVertButton = getByTestId('more-vert-button');
270+
fireEvent.click(moreVertButton);
271+
272+
// After clicking, the dropdown should have the "navDropDown" class
273+
expect(dropdownMenu).toHaveClass('navDropDown');
274+
275+
276+
//clear canvas click
277+
const clearCanvasMenuItem = getByText('Clear Canvas');
278+
fireEvent.click(clearCanvasMenuItem);
279+
expect(dropdownMenu).toHaveClass('navDropDown');
280+
281+
// After clicking "Marketplace", it should remain open
282+
const marketplaceMenuItem = getByText('Marketplace');
283+
fireEvent.click(marketplaceMenuItem);
284+
expect(dropdownMenu).toHaveClass('navDropDown');
285+
286+
// Close the dropdown by clicking the button again
287+
fireEvent.click(moreVertButton);
288+
289+
// After closing, the dropdown should have the "hideNavDropDown" class
290+
expect(dropdownMenu).toHaveClass('hideNavDropDown');
291+
});
292+
});

app/src/components/top/NavBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ const NavBar = () => {
175175
onClick={() => setDropMenu(!dropMenu)}
176176
ref={menuButtonRef}
177177
>
178-
<MoreVertIcon style={{ color: 'white' }} />
178+
<MoreVertIcon style={{ color: 'white' }} data-testid="more-vert-button" />
179179
</Button>
180180
<NavBarButtons
181181
dropMenu={dropMenu}

app/src/components/top/NavBarButtons.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ function navbarDropDown(props) {
332332

333333
return (
334334
// <div ref={dropdownRef} className={showMenu}> dropdownRef making the menu fly off and anchorel messingup
335-
<div ref={ref} className={showMenu}>
335+
<div data-testid="navDropDown" ref={ref} className={showMenu}>
336336
<Link to="/tutorial" style={{ textDecoration: 'none' }} target="_blank">
337337
<button>
338338
Tutorial

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@
259259
"__tests__/spec.ts",
260260
"__tests__/projects.test.ts"
261261
],
262+
"coveragePathIgnorePatterns": [
263+
"server/graphQL"
264+
],
265+
"testPathIgnorePatterns": [
266+
"server/graphQL"
267+
],
262268
"transform": {
263269
"\\.(ts|tsx)$": "ts-jest",
264270
"^.+\\.js?$": "babel-jest"

0 commit comments

Comments
 (0)