Skip to content

Commit e504dfe

Browse files
committed
Adding some missing tests.
1 parent ca9ed5c commit e504dfe

24 files changed

+2920
-6
lines changed

web-ui/src/components/certifications/EarnedCertificationsTable.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ const EarnedCertificationsTable = ({
9494
});
9595
if (res.error) return;
9696

97-
const certs = res.payload.data;
97+
const certs = res.payload.data ?? [];
9898
setCertifications(certs.sort((c1, c2) => c1.name.localeCompare(c2.name)));
9999

100100
const certMap = certs.reduce((map, cert) => {
@@ -114,7 +114,7 @@ const EarnedCertificationsTable = ({
114114
});
115115
if (res.error) return;
116116

117-
let earned = res.payload.data;
117+
let earned = res.payload.data ?? [];
118118
if (onlyMe) {
119119
earned = earned.filter(cert => cert.memberId === currentUser.id);
120120
}
@@ -512,7 +512,7 @@ const EarnedCertificationsTable = ({
512512
});
513513
if (res.error) return;
514514

515-
const newEarned = res.payload.data;
515+
const newEarned = res.payload.data ?? [];
516516
setEarnedCertifications(earned => {
517517
if (id) {
518518
const index = earned.findIndex(c => c.id === id);

web-ui/src/components/reviews/periods/ReviewPeriods.jsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,8 @@ const ReviewPeriods = ({ onPeriodSelected, mode }) => {
399399
: aName.localeCompare(b.name));
400400
})
401401
.map((period) => (
402-
<div>
402+
<div key={`review-period-card-${period.id}`}>
403403
<ReviewPeriodCard
404-
key={`review-period-card-${period.id}`}
405404
mode={mode}
406405
onSelect={onPeriodClick}
407406
periodId={period.id}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React from 'react';
2+
import VolunteerTables from './VolunteerTables';
3+
import { AppContextProvider } from '../../context/AppContext';
4+
import { BrowserRouter } from 'react-router-dom';
5+
6+
7+
const initialState = {
8+
state: {
9+
userProfile: {
10+
name: 'Mitch Hedberg',
11+
role: ['MEMBER'],
12+
},
13+
},
14+
};
15+
16+
it('renders correctly', () => {
17+
snapshot(
18+
<AppContextProvider value={initialState}>
19+
<BrowserRouter>
20+
<VolunteerTables />
21+
</BrowserRouter>
22+
</AppContextProvider>
23+
);
24+
});
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`renders correctly 1`] = `
4+
<div>
5+
<div
6+
class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root volunteer-activities-card css-bhp9pd-MuiPaper-root-MuiCard-root"
7+
>
8+
<div
9+
class="MuiCardContent-root volunteer-tables css-46bh2p-MuiCardContent-root"
10+
>
11+
<div
12+
class="MuiTabs-root css-1ujnqem-MuiTabs-root"
13+
>
14+
<div
15+
class="MuiTabs-scroller MuiTabs-fixed css-jpln7h-MuiTabs-scroller"
16+
style="overflow: hidden; margin-bottom: 0px;"
17+
>
18+
<div
19+
class="MuiTabs-flexContainer css-heg063-MuiTabs-flexContainer"
20+
role="tablist"
21+
>
22+
<button
23+
aria-controls="full-width-tabpanel-0"
24+
aria-selected="true"
25+
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit MuiTab-fullWidth Mui-selected css-1750il-MuiButtonBase-root-MuiTab-root"
26+
id="full-width-tab-0"
27+
role="tab"
28+
tabindex="0"
29+
type="button"
30+
>
31+
<div
32+
class="MuiBox-root css-70qvj9"
33+
>
34+
<div
35+
class="MuiAvatar-root MuiAvatar-circular MuiAvatar-colorDefault css-19vflyy-MuiAvatar-root"
36+
>
37+
<svg
38+
aria-hidden="true"
39+
class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root"
40+
data-testid="HandshakeIcon"
41+
focusable="false"
42+
viewBox="0 0 24 24"
43+
>
44+
<path
45+
d="M16.48 10.41c-.39.39-1.04.39-1.43 0l-4.47-4.46-7.05 7.04-.66-.63c-1.17-1.17-1.17-3.07 0-4.24l4.24-4.24c1.17-1.17 3.07-1.17 4.24 0L16.48 9c.39.39.39 1.02 0 1.41m.7-2.12c.78.78.78 2.05 0 2.83-1.27 1.27-2.61.22-2.83 0l-3.76-3.76-5.57 5.57c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.42 0l4.62-4.62.71.71-4.62 4.62c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.42 0l4.62-4.62.71.71-4.62 4.62c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0l4.62-4.62.71.71-4.62 4.62c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0l8.32-8.34c1.17-1.17 1.17-3.07 0-4.24l-4.24-4.24c-1.15-1.15-3.01-1.17-4.18-.06z"
46+
/>
47+
</svg>
48+
</div>
49+
<h2
50+
class="MuiTypography-root MuiTypography-h5 css-3f0kcs-MuiTypography-root"
51+
>
52+
Volunteer Orgs
53+
</h2>
54+
</div>
55+
<span
56+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
57+
/>
58+
</button>
59+
<button
60+
aria-controls="full-width-tabpanel-1"
61+
aria-selected="false"
62+
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit MuiTab-fullWidth css-1750il-MuiButtonBase-root-MuiTab-root"
63+
id="full-width-tab-1"
64+
role="tab"
65+
tabindex="-1"
66+
type="button"
67+
>
68+
<div
69+
class="MuiBox-root css-70qvj9"
70+
>
71+
<div
72+
class="MuiAvatar-root MuiAvatar-circular MuiAvatar-colorDefault css-19vflyy-MuiAvatar-root"
73+
>
74+
<svg
75+
aria-hidden="true"
76+
class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root"
77+
data-testid="EventIcon"
78+
focusable="false"
79+
viewBox="0 0 24 24"
80+
>
81+
<path
82+
d="M17 12h-5v5h5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1zm3 18H5V8h14z"
83+
/>
84+
</svg>
85+
</div>
86+
<h2
87+
class="MuiTypography-root MuiTypography-h5 css-3f0kcs-MuiTypography-root"
88+
>
89+
Events
90+
</h2>
91+
</div>
92+
<span
93+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
94+
/>
95+
</button>
96+
</div>
97+
<span
98+
class="MuiTabs-indicator css-11yukd5-MuiTabs-indicator"
99+
style="left: 0px; width: 0px;"
100+
/>
101+
</div>
102+
</div>
103+
<div
104+
aria-labelledby="full-width-tab-0"
105+
id="full-width-tabpanel-0"
106+
role="tabpanel"
107+
>
108+
<div
109+
class="MuiBox-root css-19kzrtu"
110+
>
111+
<div
112+
id="volunteer-relationships"
113+
>
114+
<div
115+
class="row"
116+
>
117+
<table>
118+
<thead>
119+
<tr>
120+
<th
121+
style="cursor: pointer;"
122+
>
123+
Member
124+
🔼
125+
</th>
126+
<th
127+
style="cursor: pointer;"
128+
>
129+
Organization
130+
</th>
131+
<th
132+
style="cursor: pointer;"
133+
>
134+
Start Date
135+
</th>
136+
<th
137+
style="cursor: pointer;"
138+
>
139+
End Date
140+
</th>
141+
<th
142+
class="actions-th"
143+
>
144+
Actions
145+
</th>
146+
</tr>
147+
</thead>
148+
<tbody />
149+
</table>
150+
</div>
151+
<p
152+
class="warning"
153+
>
154+
The administrator may edit organizations to ensure accuracy.
155+
</p>
156+
</div>
157+
</div>
158+
</div>
159+
<div
160+
aria-labelledby="full-width-tab-1"
161+
hidden=""
162+
id="full-width-tabpanel-1"
163+
role="tabpanel"
164+
/>
165+
</div>
166+
</div>
167+
</div>
168+
`;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import CertificationReportPage from './CertificationReportPage';
3+
import { AppContextProvider } from '../context/AppContext';
4+
import { BrowserRouter } from 'react-router-dom';
5+
6+
const userStateWithPermission = {
7+
state: {
8+
userProfile: {
9+
name: 'Mitch Hedberg',
10+
role: ['MEMBER'],
11+
permissions: [{ permission: 'CAN_MANAGE_EARNED_CERTIFICATIONS' }],
12+
}
13+
}
14+
};
15+
16+
it('renders correctly', () => {
17+
snapshot(
18+
<AppContextProvider value={userStateWithPermission}>
19+
<BrowserRouter>
20+
<CertificationReportPage />
21+
</BrowserRouter>
22+
</AppContextProvider>
23+
);
24+
});
25+
26+
it('renders an error if user does not have appropriate permission', () => {
27+
snapshot(
28+
<AppContextProvider>
29+
<BrowserRouter>
30+
<CertificationReportPage />
31+
</BrowserRouter>
32+
</AppContextProvider>
33+
);
34+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from 'react';
2+
import CheckinsReportPage from './CheckinsReportPage';
3+
import { AppContextProvider } from '../context/AppContext';
4+
import { BrowserRouter } from 'react-router-dom';
5+
6+
const userStateWithPermission = {
7+
state: {
8+
userProfile: {
9+
name: 'Mitch Hedberg',
10+
role: ['MEMBER'],
11+
permissions: [{ permission: 'CAN_VIEW_CHECKINS_REPORT' }],
12+
},
13+
terminatedMembers: [],
14+
}
15+
};
16+
17+
it('renders correctly', () => {
18+
snapshot(
19+
<AppContextProvider value={userStateWithPermission}>
20+
<BrowserRouter>
21+
<CheckinsReportPage />
22+
</BrowserRouter>
23+
</AppContextProvider>
24+
);
25+
});
26+
27+
it('renders an error if user does not have appropriate permission', () => {
28+
snapshot(
29+
<AppContextProvider>
30+
<BrowserRouter>
31+
<CheckinsReportPage />
32+
</BrowserRouter>
33+
</AppContextProvider>
34+
);
35+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React from 'react';
2+
import EmailPage from './EmailPage';
3+
import { AppContextProvider } from '../context/AppContext';
4+
import { BrowserRouter } from 'react-router-dom';
5+
6+
window.scrollTo = vi.fn();
7+
8+
const userStateWithPermission = {
9+
state: {
10+
userProfile: {
11+
name: 'Mitch Hedberg',
12+
role: ['MEMBER'],
13+
permissions: [{ permission: 'CAN_SEND_EMAIL' }],
14+
},
15+
terminatedMembers: [],
16+
}
17+
};
18+
19+
it('renders correctly', () => {
20+
snapshot(
21+
<AppContextProvider value={userStateWithPermission}>
22+
<BrowserRouter>
23+
<EmailPage />
24+
</BrowserRouter>
25+
</AppContextProvider>
26+
);
27+
});
28+
29+
it('renders an error if user does not have appropriate permission', () => {
30+
snapshot(
31+
<AppContextProvider>
32+
<BrowserRouter>
33+
<EmailPage />
34+
</BrowserRouter>
35+
</AppContextProvider>
36+
);
37+
});

0 commit comments

Comments
 (0)