richie-education 2.25.0-b2.dev148 → 2.25.0-b2.dev152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/js/contexts/JoanieApiContext/index.spec.tsx +1 -1
- package/js/contexts/SessionContext/JoanieSessionProvider.spec.tsx +44 -37
- package/js/contexts/SessionContext/index.spec.tsx +42 -21
- package/js/contexts/SessionContext/no-authentication.spec.tsx +3 -2
- package/js/hooks/useCourseSearchParams/index.spec.tsx +0 -1
- package/js/hooks/useUnionResource/index.spec.tsx +11 -9
- package/js/utils/test/render.tsx +5 -1
- package/js/utils/test/wrappers/BaseAppWrapper.tsx +5 -8
- package/js/utils/test/wrappers/BaseJoanieAppWrapper.tsx +4 -7
- package/js/utils/test/wrappers/IntlWrapper.tsx +4 -2
- package/js/utils/test/wrappers/PresentationalAppWrapper.tsx +1 -1
- package/js/utils/test/wrappers/ReactQueryAppWrapper.tsx +16 -0
- package/js/widgets/Dashboard/components/DashboardAvatar/index.spec.tsx +8 -5
- package/js/widgets/Dashboard/components/DashboardBox/index.spec.tsx +3 -1
- package/js/widgets/Dashboard/components/DashboardItem/Certificate/index.spec.tsx +19 -39
- package/js/widgets/Dashboard/components/DashboardItem/CertificateStatus/index.spec.tsx +14 -12
- package/js/widgets/Dashboard/components/DashboardItem/Contract/index.spec.tsx +5 -43
- package/js/widgets/Dashboard/components/DashboardItem/CourseEnrolling/index.spec.tsx +16 -15
- package/js/widgets/Dashboard/components/DashboardItem/Enrollment/DashboardItemEnrollment.spec.tsx +8 -18
- package/js/widgets/Dashboard/components/DashboardItem/Enrollment/ProductCertificateFooter/index.spec.tsx +19 -51
- package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrder.spec.tsx +40 -70
- package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrderContract.spec.tsx +31 -32
- package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateLearnerMessage/index.spec.tsx +19 -31
- package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateTeacherMessage/index.spec.tsx +26 -37
- package/js/widgets/Dashboard/components/DashboardItem/index.spec.tsx +28 -23
- package/js/widgets/Dashboard/components/DashboardLayoutRoute/index.spec.tsx +53 -51
- package/js/widgets/Dashboard/components/DashboardSidebar/components/ContractNavLink/index.spec.tsx +24 -49
- package/js/widgets/Dashboard/components/DashboardSidebar/components/MenuNavLink/index.spec.tsx +5 -14
- package/js/widgets/Dashboard/components/ProtectedOutlet/AuthenticatedOutlet.spec.tsx +62 -54
- package/js/widgets/Dashboard/components/ProtectedOutlet/ProtectedOutlet.spec.tsx +67 -42
- package/js/widgets/Dashboard/components/RouterButton/index.spec.tsx +12 -14
- package/js/widgets/Dashboard/components/TeacherDashboardOrganizationSidebar/index.spec.tsx +14 -39
- package/js/widgets/Dashboard/hooks/useDashboardRouter/index.spec.tsx +2 -4
- package/js/widgets/Dashboard/hooks/useEnroll/index.spec.tsx +7 -28
- package/js/widgets/Dashboard/hooks/useRouteInfo/index.spec.tsx +25 -33
- package/js/widgets/Dashboard/index.spec.tsx +49 -43
- package/js/widgets/LanguageSelector/index.spec.tsx +7 -7
- package/js/widgets/LtiConsumer/index.spec.tsx +46 -48
- package/js/widgets/RootSearchSuggestField/index.spec.tsx +8 -6
- package/js/widgets/Search/components/PaginateCourseSearch/index.spec.tsx +10 -3
- package/js/widgets/Search/components/SearchFilterGroup/index.spec.tsx +5 -3
- package/js/widgets/Search/components/SearchFilterGroupModal/index.spec.tsx +8 -4
- package/js/widgets/Search/components/SearchFilterValueLeaf/index.spec.tsx +7 -3
- package/js/widgets/Search/components/SearchFilterValueParent/index.spec.tsx +12 -7
- package/js/widgets/Search/components/SearchFiltersPane/index.spec.tsx +5 -1
- package/js/widgets/Search/hooks/useCourseSearch/index.spec.tsx +4 -12
- package/js/widgets/Search/hooks/useFilterValue/index.spec.tsx +0 -2
- package/js/widgets/Search/index.spec.tsx +14 -6
- package/js/widgets/SearchSuggestField/index.spec.tsx +14 -1
- package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseProductCertificateItem/index.spec.tsx +16 -31
- package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseProductCourseRuns/index.spec.tsx +46 -72
- package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/components/CourseRunItem/index.spec.tsx +5 -2
- package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.spec.tsx +147 -162
- package/js/widgets/SyllabusCourseRunsList/components/CourseRunEnrollment/CourseRunUnenrollmentButton/index.spec.tsx +6 -4
- package/js/widgets/SyllabusCourseRunsList/components/CourseRunEnrollment/index.joanie.spec.tsx +22 -99
- package/js/widgets/SyllabusCourseRunsList/components/CourseRunEnrollment/index.openedx.spec.tsx +27 -83
- package/js/widgets/SyllabusCourseRunsList/components/CourseRunItem/index.spec.tsx +4 -1
- package/js/widgets/SyllabusCourseRunsList/components/CourseRunItemWithEnrollment/index.spec.tsx +28 -35
- package/js/widgets/SyllabusCourseRunsList/components/CourseWishButton/hooks/useCourseWish/index.spec.tsx +9 -28
- package/js/widgets/SyllabusCourseRunsList/components/CourseWishButton/index.login.spec.tsx +23 -48
- package/js/widgets/SyllabusCourseRunsList/components/CourseWishButton/index.logout.spec.tsx +20 -29
- package/js/widgets/SyllabusCourseRunsList/components/SyllabusSimpleCourseRunsList/index.spec.tsx +9 -4
- package/js/widgets/SyllabusCourseRunsList/hooks/useCourseEnrollment/index.spec.tsx +8 -10
- package/js/widgets/SyllabusCourseRunsList/index.spec.tsx +28 -39
- package/js/widgets/UserLogin/components/UserMenu/index.spec.tsx +9 -6
- package/js/widgets/UserLogin/index.not.isJoanieEnabled.spec.tsx +21 -32
- package/js/widgets/UserLogin/index.spec.tsx +15 -37
- package/js/widgets/index.spec.tsx +12 -17
- package/package.json +1 -1
|
@@ -5,17 +5,12 @@ import {
|
|
|
5
5
|
getByText,
|
|
6
6
|
queryByRole,
|
|
7
7
|
queryByText,
|
|
8
|
-
render,
|
|
9
8
|
screen,
|
|
10
9
|
waitFor,
|
|
11
10
|
within,
|
|
12
11
|
} from '@testing-library/react';
|
|
13
|
-
import { IntlProvider } from 'react-intl';
|
|
14
12
|
import { faker } from '@faker-js/faker';
|
|
15
|
-
import { QueryClientProvider } from '@tanstack/react-query';
|
|
16
|
-
import { PropsWithChildren } from 'react';
|
|
17
13
|
import fetchMock from 'fetch-mock';
|
|
18
|
-
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
|
|
19
14
|
import { userEvent } from '@storybook/testing-library';
|
|
20
15
|
import { DEFAULT_DATE_FORMAT } from 'hooks/useDateFormat';
|
|
21
16
|
import {
|
|
@@ -31,8 +26,6 @@ import {
|
|
|
31
26
|
TargetCourseFactory,
|
|
32
27
|
} from 'utils/test/factories/joanie';
|
|
33
28
|
import { Certificate, CourseLight, CourseRun, CredentialOrder, OrderState } from 'types/Joanie';
|
|
34
|
-
import { createTestQueryClient } from 'utils/test/createTestQueryClient';
|
|
35
|
-
import { SessionProvider } from 'contexts/SessionContext';
|
|
36
29
|
import { resolveAll } from 'utils/resolveAll';
|
|
37
30
|
import { confirm } from 'utils/indirection/window';
|
|
38
31
|
import { Priority } from 'types';
|
|
@@ -43,6 +36,9 @@ import { Deferred } from 'utils/test/deferred';
|
|
|
43
36
|
import { expectBreadcrumbsToEqualParts } from 'utils/test/expectBreadcrumbsToEqualParts';
|
|
44
37
|
import { mockCourseProductWithOrder } from 'utils/test/mockCourseProductWithOrder';
|
|
45
38
|
import { HttpStatusCode } from 'utils/errors/HttpError';
|
|
39
|
+
import { setupJoanieSession } from 'utils/test/wrappers/JoanieAppWrapper';
|
|
40
|
+
import { render } from 'utils/test/render';
|
|
41
|
+
import { BaseJoanieAppWrapper } from 'utils/test/wrappers/BaseJoanieAppWrapper';
|
|
46
42
|
import { LearnerDashboardPaths } from '../../../utils/learnerRouteMessages';
|
|
47
43
|
import { DashboardTest } from '../../DashboardTest';
|
|
48
44
|
import { DashboardItemOrder } from './DashboardItemOrder';
|
|
@@ -60,43 +56,12 @@ jest.mock('utils/indirection/window', () => ({
|
|
|
60
56
|
}));
|
|
61
57
|
|
|
62
58
|
describe('<DashboardItemOrder/>', () => {
|
|
63
|
-
|
|
64
|
-
const router = createMemoryRouter([{ index: true, element: children }]);
|
|
65
|
-
return (
|
|
66
|
-
<QueryClientProvider client={createTestQueryClient({ user: true })}>
|
|
67
|
-
<IntlProvider locale="en">
|
|
68
|
-
<SessionProvider>
|
|
69
|
-
<RouterProvider router={router} />
|
|
70
|
-
</SessionProvider>
|
|
71
|
-
</IntlProvider>
|
|
72
|
-
</QueryClientProvider>
|
|
73
|
-
);
|
|
74
|
-
};
|
|
75
|
-
const WrapperWithDashboard = (route: string) => {
|
|
76
|
-
return (
|
|
77
|
-
<QueryClientProvider client={createTestQueryClient({ user: true })}>
|
|
78
|
-
<IntlProvider locale="en">
|
|
79
|
-
<SessionProvider>
|
|
80
|
-
<DashboardTest initialRoute={route} />
|
|
81
|
-
</SessionProvider>
|
|
82
|
-
</IntlProvider>
|
|
83
|
-
</QueryClientProvider>
|
|
84
|
-
);
|
|
85
|
-
};
|
|
59
|
+
setupJoanieSession();
|
|
86
60
|
|
|
87
61
|
beforeEach(() => {
|
|
88
|
-
fetchMock.get('https://joanie.endpoint/api/v1.0/addresses/', []);
|
|
89
|
-
fetchMock.get('https://joanie.endpoint/api/v1.0/credit-cards/', []);
|
|
90
|
-
fetchMock.get('https://joanie.endpoint/api/v1.0/orders/', []);
|
|
91
62
|
fetchMock.get('https://joanie.endpoint/api/v1.0/enrollments/', []);
|
|
92
63
|
});
|
|
93
64
|
|
|
94
|
-
afterEach(() => {
|
|
95
|
-
jest.restoreAllMocks();
|
|
96
|
-
jest.clearAllMocks();
|
|
97
|
-
fetchMock.restore();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
65
|
/**
|
|
101
66
|
* Global
|
|
102
67
|
*/
|
|
@@ -106,7 +71,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
106
71
|
order.target_courses = [];
|
|
107
72
|
const { product } = mockCourseProductWithOrder(order);
|
|
108
73
|
|
|
109
|
-
render(<DashboardItemOrder order={order}
|
|
74
|
+
render(<DashboardItemOrder order={order} />);
|
|
110
75
|
|
|
111
76
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
112
77
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -134,7 +99,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
134
99
|
deferred.promise,
|
|
135
100
|
);
|
|
136
101
|
|
|
137
|
-
render(<DashboardItemOrder order={order} showCertificate={true}
|
|
102
|
+
render(<DashboardItemOrder order={order} showCertificate={true} />);
|
|
138
103
|
|
|
139
104
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
140
105
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -153,7 +118,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
153
118
|
order.target_courses = [];
|
|
154
119
|
const { product } = mockCourseProductWithOrder(order);
|
|
155
120
|
|
|
156
|
-
render(<DashboardItemOrder order={order}
|
|
121
|
+
render(<DashboardItemOrder order={order} />);
|
|
157
122
|
|
|
158
123
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
159
124
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -167,7 +132,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
167
132
|
order.target_courses = [];
|
|
168
133
|
const { product } = mockCourseProductWithOrder(order);
|
|
169
134
|
|
|
170
|
-
render(<DashboardItemOrder order={order}
|
|
135
|
+
render(<DashboardItemOrder order={order} />);
|
|
171
136
|
|
|
172
137
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
173
138
|
const moreButton = screen.getByRole('combobox', {
|
|
@@ -190,7 +155,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
190
155
|
order.target_courses = [];
|
|
191
156
|
const { product } = mockCourseProductWithOrder(order);
|
|
192
157
|
|
|
193
|
-
render(<DashboardItemOrder order={order}
|
|
158
|
+
render(<DashboardItemOrder order={order} />);
|
|
194
159
|
|
|
195
160
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
196
161
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -202,7 +167,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
202
167
|
const order: CredentialOrder = CredentialOrderFactory().one();
|
|
203
168
|
const { product } = mockCourseProductWithOrder(order);
|
|
204
169
|
|
|
205
|
-
render(<DashboardItemOrder order={order}
|
|
170
|
+
render(<DashboardItemOrder order={order} />);
|
|
206
171
|
|
|
207
172
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
208
173
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -226,7 +191,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
226
191
|
|
|
227
192
|
const { product } = mockCourseProductWithOrder(order);
|
|
228
193
|
|
|
229
|
-
render(<DashboardItemOrder order={order}
|
|
194
|
+
render(<DashboardItemOrder order={order} />);
|
|
230
195
|
|
|
231
196
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
232
197
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -255,7 +220,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
255
220
|
|
|
256
221
|
const { product } = mockCourseProductWithOrder(order);
|
|
257
222
|
|
|
258
|
-
render(<DashboardItemOrder order={order}
|
|
223
|
+
render(<DashboardItemOrder order={order} />);
|
|
259
224
|
|
|
260
225
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
261
226
|
screen.getByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -276,9 +241,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
276
241
|
order.target_courses = [];
|
|
277
242
|
const { product } = mockCourseProductWithOrder(order);
|
|
278
243
|
|
|
279
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
280
|
-
wrapper,
|
|
281
|
-
});
|
|
244
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
282
245
|
|
|
283
246
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
284
247
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -305,9 +268,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
305
268
|
|
|
306
269
|
const { product } = mockCourseProductWithOrder(order);
|
|
307
270
|
|
|
308
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
309
|
-
wrapper,
|
|
310
|
-
});
|
|
271
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
311
272
|
|
|
312
273
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
313
274
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -382,7 +343,11 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
382
343
|
}).many(1),
|
|
383
344
|
};
|
|
384
345
|
|
|
385
|
-
render(
|
|
346
|
+
render(
|
|
347
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
348
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
349
|
+
);
|
|
350
|
+
|
|
386
351
|
// Wait for the order to be rendered.
|
|
387
352
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
388
353
|
|
|
@@ -456,7 +421,11 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
456
421
|
body: 'Internal Server Error',
|
|
457
422
|
});
|
|
458
423
|
|
|
459
|
-
render(
|
|
424
|
+
render(
|
|
425
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
426
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
427
|
+
);
|
|
428
|
+
|
|
460
429
|
// Wait for the order to be rendered.
|
|
461
430
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
462
431
|
|
|
@@ -526,7 +495,10 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
526
495
|
target_enrollments: EnrollmentFactory({ course_run: newEnrolledCourseRun }).many(1),
|
|
527
496
|
};
|
|
528
497
|
|
|
529
|
-
render(
|
|
498
|
+
render(
|
|
499
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
500
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
501
|
+
);
|
|
530
502
|
|
|
531
503
|
// Wait for the order to be rendered.
|
|
532
504
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
@@ -624,7 +596,10 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
624
596
|
const courseRun = order.target_courses[0].course_runs[0];
|
|
625
597
|
const newEnrolledCourseRun = order.target_courses[0].course_runs[1];
|
|
626
598
|
|
|
627
|
-
render(
|
|
599
|
+
render(
|
|
600
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
601
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
602
|
+
);
|
|
628
603
|
|
|
629
604
|
// Wait for the order to be rendered.
|
|
630
605
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
@@ -715,7 +690,10 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
715
690
|
],
|
|
716
691
|
};
|
|
717
692
|
|
|
718
|
-
render(
|
|
693
|
+
render(
|
|
694
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
695
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
696
|
+
);
|
|
719
697
|
|
|
720
698
|
// Wait for the order to be rendered.
|
|
721
699
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
@@ -779,9 +757,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
779
757
|
}).one();
|
|
780
758
|
const { product } = mockCourseProductWithOrder(order);
|
|
781
759
|
|
|
782
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
783
|
-
wrapper,
|
|
784
|
-
});
|
|
760
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
785
761
|
|
|
786
762
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
787
763
|
|
|
@@ -816,9 +792,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
816
792
|
|
|
817
793
|
const { product } = mockCourseProductWithOrder(order);
|
|
818
794
|
|
|
819
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
820
|
-
wrapper,
|
|
821
|
-
});
|
|
795
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
822
796
|
|
|
823
797
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
824
798
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -846,9 +820,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
846
820
|
|
|
847
821
|
const { product } = mockCourseProductWithOrder(order);
|
|
848
822
|
|
|
849
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
850
|
-
wrapper,
|
|
851
|
-
});
|
|
823
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
852
824
|
|
|
853
825
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
854
826
|
await screen.findByText('Ref. ' + (order.course as CourseLight).code);
|
|
@@ -864,9 +836,7 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
864
836
|
const order: CredentialOrder = CredentialOrderFactory().one();
|
|
865
837
|
const { product } = mockCourseProductWithOrder(order);
|
|
866
838
|
|
|
867
|
-
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false}
|
|
868
|
-
wrapper,
|
|
869
|
-
});
|
|
839
|
+
render(<DashboardItemOrder order={order} writable={true} showDetailsButton={false} />);
|
|
870
840
|
|
|
871
841
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
872
842
|
|
package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrderContract.spec.tsx
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { QueryClientProvider } from '@tanstack/react-query';
|
|
2
|
-
import { IntlProvider } from 'react-intl';
|
|
3
1
|
import fetchMock from 'fetch-mock';
|
|
4
2
|
import { faker } from '@faker-js/faker';
|
|
5
|
-
import {
|
|
3
|
+
import { screen } from '@testing-library/react';
|
|
6
4
|
import { RichieContextFactory as mockRichieContextFactory } from 'utils/test/factories/richie';
|
|
7
|
-
import { createTestQueryClient } from 'utils/test/createTestQueryClient';
|
|
8
|
-
import { SessionProvider } from 'contexts/SessionContext';
|
|
9
5
|
import { DashboardTest } from 'widgets/Dashboard/components/DashboardTest';
|
|
10
6
|
import { CourseLight } from 'types/Joanie';
|
|
11
7
|
import {
|
|
@@ -17,6 +13,9 @@ import {
|
|
|
17
13
|
import { mockCourseProductWithOrder } from 'utils/test/mockCourseProductWithOrder';
|
|
18
14
|
import { LearnerDashboardPaths } from 'widgets/Dashboard/utils/learnerRouteMessages';
|
|
19
15
|
import { expectBannerError } from 'utils/test/expectBanner';
|
|
16
|
+
import { setupJoanieSession } from 'utils/test/wrappers/JoanieAppWrapper';
|
|
17
|
+
import { render } from 'utils/test/render';
|
|
18
|
+
import { BaseJoanieAppWrapper } from 'utils/test/wrappers/BaseJoanieAppWrapper';
|
|
20
19
|
|
|
21
20
|
jest.mock('utils/context', () => ({
|
|
22
21
|
__esModule: true,
|
|
@@ -43,21 +42,8 @@ jest.mock('settings', () => ({
|
|
|
43
42
|
}));
|
|
44
43
|
|
|
45
44
|
describe('<DashboardItemOrder/> Contract', () => {
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<QueryClientProvider client={createTestQueryClient({ user: true })}>
|
|
49
|
-
<IntlProvider locale="en">
|
|
50
|
-
<SessionProvider>
|
|
51
|
-
<DashboardTest initialRoute={route} />
|
|
52
|
-
</SessionProvider>
|
|
53
|
-
</IntlProvider>
|
|
54
|
-
</QueryClientProvider>
|
|
55
|
-
);
|
|
56
|
-
};
|
|
57
|
-
|
|
45
|
+
setupJoanieSession();
|
|
58
46
|
beforeEach(() => {
|
|
59
|
-
fetchMock.get('https://joanie.endpoint/api/v1.0/addresses/', []);
|
|
60
|
-
fetchMock.get('https://joanie.endpoint/api/v1.0/credit-cards/', []);
|
|
61
47
|
fetchMock.get(
|
|
62
48
|
'begin:https://joanie.endpoint/api/v1.0/enrollments/',
|
|
63
49
|
{ results: [], next: null, previous: null, count: null },
|
|
@@ -66,12 +52,6 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
66
52
|
fetchMock.get('https://joanie.endpoint/api/v1.0/me', []);
|
|
67
53
|
});
|
|
68
54
|
|
|
69
|
-
afterEach(() => {
|
|
70
|
-
jest.restoreAllMocks();
|
|
71
|
-
jest.clearAllMocks();
|
|
72
|
-
fetchMock.restore();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
55
|
describe('non writable', () => {
|
|
76
56
|
it('renders a non-writable order without contract attribute', async () => {
|
|
77
57
|
const order = CredentialOrderFactory({
|
|
@@ -89,7 +69,9 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
89
69
|
|
|
90
70
|
const { product } = mockCourseProductWithOrder(order);
|
|
91
71
|
|
|
92
|
-
render(
|
|
72
|
+
render(<DashboardTest initialRoute={LearnerDashboardPaths.COURSES} />, {
|
|
73
|
+
wrapper: BaseJoanieAppWrapper,
|
|
74
|
+
});
|
|
93
75
|
|
|
94
76
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
95
77
|
|
|
@@ -121,7 +103,9 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
121
103
|
|
|
122
104
|
const { product } = mockCourseProductWithOrder(order);
|
|
123
105
|
|
|
124
|
-
render(
|
|
106
|
+
render(<DashboardTest initialRoute={LearnerDashboardPaths.COURSES} />, {
|
|
107
|
+
wrapper: BaseJoanieAppWrapper,
|
|
108
|
+
});
|
|
125
109
|
|
|
126
110
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
127
111
|
|
|
@@ -153,7 +137,9 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
153
137
|
|
|
154
138
|
const { product } = mockCourseProductWithOrder(order);
|
|
155
139
|
|
|
156
|
-
render(
|
|
140
|
+
render(<DashboardTest initialRoute={LearnerDashboardPaths.COURSES} />, {
|
|
141
|
+
wrapper: BaseJoanieAppWrapper,
|
|
142
|
+
});
|
|
157
143
|
|
|
158
144
|
await screen.findByRole('heading', { level: 5, name: product.title });
|
|
159
145
|
|
|
@@ -186,7 +172,11 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
186
172
|
{ overwriteRoutes: true },
|
|
187
173
|
);
|
|
188
174
|
|
|
189
|
-
render(
|
|
175
|
+
render(
|
|
176
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
177
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
178
|
+
);
|
|
179
|
+
|
|
190
180
|
expect(
|
|
191
181
|
await screen.findByRole('heading', { level: 5, name: product.title }),
|
|
192
182
|
).toBeInTheDocument();
|
|
@@ -208,7 +198,10 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
208
198
|
{ overwriteRoutes: true },
|
|
209
199
|
);
|
|
210
200
|
|
|
211
|
-
render(
|
|
201
|
+
render(
|
|
202
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
203
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
204
|
+
);
|
|
212
205
|
expect(
|
|
213
206
|
await screen.findByRole('heading', { level: 5, name: product.title }),
|
|
214
207
|
).toBeInTheDocument();
|
|
@@ -246,7 +239,10 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
246
239
|
{ overwriteRoutes: true },
|
|
247
240
|
);
|
|
248
241
|
|
|
249
|
-
render(
|
|
242
|
+
render(
|
|
243
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
244
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
245
|
+
);
|
|
250
246
|
|
|
251
247
|
expect(
|
|
252
248
|
await screen.findByRole('heading', { level: 5, name: product.title }),
|
|
@@ -292,7 +288,10 @@ describe('<DashboardItemOrder/> Contract', () => {
|
|
|
292
288
|
}/download/`;
|
|
293
289
|
fetchMock.get(DOWNLOAD_URL, 'contract content');
|
|
294
290
|
|
|
295
|
-
render(
|
|
291
|
+
render(
|
|
292
|
+
<DashboardTest initialRoute={LearnerDashboardPaths.ORDER.replace(':orderId', order.id)} />,
|
|
293
|
+
{ wrapper: BaseJoanieAppWrapper },
|
|
294
|
+
);
|
|
296
295
|
expect(await screen.findByRole('button', { name: 'Download' })).toBeInTheDocument();
|
|
297
296
|
});
|
|
298
297
|
});
|
package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateLearnerMessage/index.spec.tsx
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import React, { PropsWithChildren } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { createIntl } from 'react-intl';
|
|
4
4
|
import {
|
|
5
5
|
ContractDefinitionFactory,
|
|
6
6
|
ContractFactory,
|
|
7
7
|
CredentialOrderFactory,
|
|
8
8
|
} from 'utils/test/factories/joanie';
|
|
9
9
|
import { OrderState } from 'types/Joanie';
|
|
10
|
+
import { render } from 'utils/test/render';
|
|
11
|
+
import { IntlWrapper } from 'utils/test/wrappers/IntlWrapper';
|
|
10
12
|
import OrderStateLearnerMessage, { messages } from '.';
|
|
11
13
|
|
|
12
14
|
const intl = createIntl({ locale: 'en' });
|
|
13
15
|
|
|
14
16
|
describe('<DashboardItemOrder/>', () => {
|
|
15
|
-
const Wrapper = ({ children }: PropsWithChildren) => (
|
|
16
|
-
<IntlProvider locale="en">{children}</IntlProvider>
|
|
17
|
-
);
|
|
18
|
-
|
|
19
17
|
it.each([
|
|
20
18
|
[OrderState.DRAFT, 'Draft'],
|
|
21
19
|
[OrderState.SUBMITTED, 'Submitted'],
|
|
@@ -25,11 +23,9 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
25
23
|
'should display message from order state: %s when order have no contract',
|
|
26
24
|
(state, expectedMessage) => {
|
|
27
25
|
const order = CredentialOrderFactory({ state }).one();
|
|
28
|
-
render(
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
</Wrapper>,
|
|
32
|
-
);
|
|
26
|
+
render(<OrderStateLearnerMessage order={order} />, {
|
|
27
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
28
|
+
});
|
|
33
29
|
expect(screen.getByText(expectedMessage)).toBeInTheDocument();
|
|
34
30
|
},
|
|
35
31
|
);
|
|
@@ -46,11 +42,9 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
46
42
|
state,
|
|
47
43
|
contract: ContractFactory().one(),
|
|
48
44
|
}).one();
|
|
49
|
-
render(
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
</Wrapper>,
|
|
53
|
-
);
|
|
45
|
+
render(<OrderStateLearnerMessage order={orderWithContract} />, {
|
|
46
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
47
|
+
});
|
|
54
48
|
expect(screen.getByText(expectedMessage)).toBeInTheDocument();
|
|
55
49
|
},
|
|
56
50
|
);
|
|
@@ -63,11 +57,9 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
63
57
|
|
|
64
58
|
const contractDefinition = ContractDefinitionFactory().one();
|
|
65
59
|
|
|
66
|
-
render(
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
</Wrapper>,
|
|
70
|
-
);
|
|
60
|
+
render(<OrderStateLearnerMessage order={order} contractDefinition={contractDefinition} />, {
|
|
61
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
62
|
+
});
|
|
71
63
|
expect(screen.getByText('Signature required')).toBeInTheDocument();
|
|
72
64
|
});
|
|
73
65
|
|
|
@@ -77,11 +69,9 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
77
69
|
contract: ContractFactory({ student_signed_on: new Date().toISOString() }).one(),
|
|
78
70
|
certificate_id: undefined,
|
|
79
71
|
}).one();
|
|
80
|
-
render(
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
</Wrapper>,
|
|
84
|
-
);
|
|
72
|
+
render(<OrderStateLearnerMessage order={order} />, {
|
|
73
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
74
|
+
});
|
|
85
75
|
expect(
|
|
86
76
|
screen.getByText(intl.formatMessage(messages.statusOnGoing), {
|
|
87
77
|
exact: false,
|
|
@@ -98,11 +88,9 @@ describe('<DashboardItemOrder/>', () => {
|
|
|
98
88
|
}).one(),
|
|
99
89
|
certificate_id: 'FAKE_CERTIFICATE_ID',
|
|
100
90
|
}).one();
|
|
101
|
-
render(
|
|
102
|
-
<
|
|
103
|
-
|
|
104
|
-
</Wrapper>,
|
|
105
|
-
);
|
|
91
|
+
render(<OrderStateLearnerMessage order={order} />, {
|
|
92
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
93
|
+
});
|
|
106
94
|
expect(
|
|
107
95
|
screen.getByText(intl.formatMessage(messages.statusCompleted), {
|
|
108
96
|
exact: false,
|
package/js/widgets/Dashboard/components/DashboardItem/Order/OrderStateTeacherMessage/index.spec.tsx
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import React, { PropsWithChildren } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { createIntl } from 'react-intl';
|
|
4
4
|
import {
|
|
5
5
|
ContractDefinitionFactory,
|
|
6
6
|
ContractFactory,
|
|
7
7
|
CredentialOrderFactory,
|
|
8
8
|
} from 'utils/test/factories/joanie';
|
|
9
9
|
import { OrderState } from 'types/Joanie';
|
|
10
|
+
import { render } from 'utils/test/render';
|
|
11
|
+
import { IntlWrapper } from 'utils/test/wrappers/IntlWrapper';
|
|
10
12
|
import OrderStateTeacherMessage, { messages } from '.';
|
|
11
13
|
|
|
12
14
|
const intl = createIntl({ locale: 'en' });
|
|
13
15
|
|
|
14
16
|
describe('<OrderStateTeacherMessage/>', () => {
|
|
15
|
-
const Wrapper = ({ children }: PropsWithChildren) => (
|
|
16
|
-
<IntlProvider locale="en">{children}</IntlProvider>
|
|
17
|
-
);
|
|
18
|
-
|
|
19
17
|
it.each([
|
|
20
18
|
[OrderState.DRAFT, 'Pending'],
|
|
21
19
|
[OrderState.SUBMITTED, 'Pending'],
|
|
@@ -25,11 +23,9 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
25
23
|
'should display message from order state: %s when order have no contract',
|
|
26
24
|
(state, expectedMessage) => {
|
|
27
25
|
const order = CredentialOrderFactory({ state }).one();
|
|
28
|
-
render(
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
</Wrapper>,
|
|
32
|
-
);
|
|
26
|
+
render(<OrderStateTeacherMessage order={order} />, {
|
|
27
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
28
|
+
});
|
|
33
29
|
expect(screen.getByText(expectedMessage)).toBeInTheDocument();
|
|
34
30
|
},
|
|
35
31
|
);
|
|
@@ -47,12 +43,13 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
47
43
|
contract: ContractFactory().one(),
|
|
48
44
|
}).one();
|
|
49
45
|
render(
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
<OrderStateTeacherMessage
|
|
47
|
+
order={orderWithContract}
|
|
48
|
+
contractDefinition={ContractDefinitionFactory().one()}
|
|
49
|
+
/>,
|
|
50
|
+
{
|
|
51
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
52
|
+
},
|
|
56
53
|
);
|
|
57
54
|
expect(screen.getByText(expectedMessage)).toBeInTheDocument();
|
|
58
55
|
},
|
|
@@ -66,11 +63,9 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
66
63
|
|
|
67
64
|
const contractDefinition = ContractDefinitionFactory().one();
|
|
68
65
|
|
|
69
|
-
render(
|
|
70
|
-
<
|
|
71
|
-
|
|
72
|
-
</Wrapper>,
|
|
73
|
-
);
|
|
66
|
+
render(<OrderStateTeacherMessage order={order} contractDefinition={contractDefinition} />, {
|
|
67
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
68
|
+
});
|
|
74
69
|
expect(screen.getByText("Pending for learner's signature")).toBeInTheDocument();
|
|
75
70
|
});
|
|
76
71
|
|
|
@@ -83,11 +78,9 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
83
78
|
}).one();
|
|
84
79
|
const contractDefinition = ContractDefinitionFactory().one();
|
|
85
80
|
|
|
86
|
-
render(
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
</Wrapper>,
|
|
90
|
-
);
|
|
81
|
+
render(<OrderStateTeacherMessage order={order} contractDefinition={contractDefinition} />, {
|
|
82
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
83
|
+
});
|
|
91
84
|
expect(screen.getByText('To be signed')).toBeInTheDocument();
|
|
92
85
|
});
|
|
93
86
|
|
|
@@ -96,11 +89,9 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
96
89
|
state: OrderState.VALIDATED,
|
|
97
90
|
certificate_id: undefined,
|
|
98
91
|
}).one();
|
|
99
|
-
render(
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
</Wrapper>,
|
|
103
|
-
);
|
|
92
|
+
render(<OrderStateTeacherMessage order={order} />, {
|
|
93
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
94
|
+
});
|
|
104
95
|
expect(
|
|
105
96
|
screen.getByText(intl.formatMessage(messages.statusOnGoing), {
|
|
106
97
|
exact: false,
|
|
@@ -113,11 +104,9 @@ describe('<OrderStateTeacherMessage/>', () => {
|
|
|
113
104
|
state: OrderState.VALIDATED,
|
|
114
105
|
certificate_id: 'FAKE_CERTIFICATE_ID',
|
|
115
106
|
}).one();
|
|
116
|
-
render(
|
|
117
|
-
<
|
|
118
|
-
|
|
119
|
-
</Wrapper>,
|
|
120
|
-
);
|
|
107
|
+
render(<OrderStateTeacherMessage order={order} />, {
|
|
108
|
+
wrapper: ({ children }: PropsWithChildren) => <IntlWrapper>{children}</IntlWrapper>,
|
|
109
|
+
});
|
|
121
110
|
expect(
|
|
122
111
|
screen.getByText(intl.formatMessage(messages.statusCompleted), {
|
|
123
112
|
exact: false,
|