-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathReviewMenuItem.test.tsx
More file actions
131 lines (108 loc) · 4.64 KB
/
Copy pathReviewMenuItem.test.tsx
File metadata and controls
131 lines (108 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { page } from 'resources';
import { mockedAppletId, mockedFullSubjectId1 } from 'shared/mock';
import { variables } from 'shared/styles';
import { renderWithProviders } from 'shared/utils/renderWithProviders';
import { ReviewMenuItem } from './ReviewMenuItem';
import { ReviewMenuItemProps } from './ReviewMenuItem.types';
const preselectedAnswerId = 'answer-id-3';
const routeWithAnswerId = `/dashboard/${mockedAppletId}/participants/${mockedFullSubjectId1}/dataviz/responses?answerId=${preselectedAnswerId}`;
const routeWithoutAnswerId = `/dashboard/${mockedAppletId}/participants/${mockedFullSubjectId1}/dataviz/responses`;
const routePath = page.appletParticipantDataReview;
const preselectedAnswer = {
createdAt: '2023-12-15T22:20:30.150182',
endDatetime: '2023-12-15T22:20:30.150182',
answerId: preselectedAnswerId,
};
const latestAnswer = {
createdAt: '2023-12-15T23:20:36.150182',
endDatetime: '2023-12-15T23:29:36.150182',
answerId: 'answer-id-2',
};
const firstAnswer = {
createdAt: '2023-12-15T21:20:30.150182',
answerId: 'answer-id-1',
};
const mockedActivity = {
id: '1',
name: 'Activity 123',
lastAnswerDate: '2023-12-15T23:29:36.150182',
answerDates: [firstAnswer, latestAnswer, preselectedAnswer],
};
const mockedOnSelectItem = vi.fn();
const mockedOnSelectAnswer = vi.fn();
const dataTestid = 'review-menu-item';
const renderComponent = (route: string, props?: Partial<ReviewMenuItemProps>) =>
renderWithProviders(
<ReviewMenuItem
item={mockedActivity}
isSelected={false}
selectedAnswer={null}
onSelectItem={mockedOnSelectItem}
onSelectAnswer={mockedOnSelectAnswer}
data-testid={dataTestid}
{...props}
/>,
{
preloadedState: {},
route,
routePath,
},
);
describe('Review Menu Item component', () => {
afterEach(() => {
vi.restoreAllMocks();
});
test('renders and functions correctly when an answer ID is not present in the route', async () => {
renderComponent(routeWithoutAnswerId);
const activityHeader = screen.getByTestId(`${dataTestid}-select`);
expect(screen.getByText('Activity 123')).toBeInTheDocument();
expect(activityHeader.querySelector('.svg-navigate-down')).toBeInTheDocument();
expect(screen.queryByTestId(`${dataTestid}-completion-wrapper`)).not.toBeInTheDocument();
await userEvent.click(activityHeader);
expect(mockedOnSelectItem).toHaveBeenCalledWith(mockedActivity);
expect(mockedOnSelectAnswer).toHaveBeenNthCalledWith(1, { answer: null });
expect(activityHeader.querySelector('.svg-navigate-up')).toBeInTheDocument();
expect(screen.getByTestId(`${dataTestid}-completion-wrapper`)).toBeInTheDocument();
const timestamps = screen.queryAllByTestId(/review-menu-item-completion-time-\d+$/);
expect(timestamps).toHaveLength(3);
const timestamp3 = screen.getByTestId(`${dataTestid}-completion-time-2`);
expect(timestamp3).toBeInTheDocument();
expect(timestamp3).toHaveTextContent('23:29:36');
await userEvent.click(timestamp3);
expect(mockedOnSelectAnswer).toHaveBeenNthCalledWith(2, {
answer: latestAnswer,
});
});
test('renders and functions correctly when an answer ID is present in the route and no answer is selected', async () => {
renderComponent(routeWithAnswerId);
expect(mockedOnSelectAnswer).toHaveBeenCalledWith({
answer: preselectedAnswer,
isRouteCreated: true,
});
expect(mockedOnSelectItem).toHaveBeenCalledWith(mockedActivity);
await waitFor(() => {
const activityHeader = screen.getByTestId(`${dataTestid}-select`);
expect(activityHeader.querySelector('.svg-navigate-up')).toBeInTheDocument();
expect(screen.getByTestId(`${dataTestid}-completion-wrapper`)).toBeInTheDocument();
});
});
test('renders and functions correctly when an answer ID is present in the route and an answer is already selected', async () => {
renderComponent(routeWithAnswerId, { isSelected: true, selectedAnswer: latestAnswer });
await waitFor(() => {
expect(mockedOnSelectAnswer).toHaveBeenCalledWith({
answer: preselectedAnswer,
isRouteCreated: true,
});
});
expect(mockedOnSelectItem).toHaveBeenCalledWith(mockedActivity);
});
test('renders with already selected activity', async () => {
renderComponent(routeWithoutAnswerId, { isSelected: true });
expect(screen.getByTestId(`${dataTestid}-item`)).toHaveStyle({
backgroundColor: variables.palette.surface2,
});
expect(screen.queryByTestId(`${dataTestid}-completion-wrapper`)).not.toBeInTheDocument();
});
});