richie-education 3.1.3-dev15 → 3.1.3-dev17

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.
Files changed (73) hide show
  1. package/js/api/joanie.ts +8 -8
  2. package/js/components/ContractFrame/OrganizationContractFrame.spec.tsx +12 -11
  3. package/js/components/ContractFrame/OrganizationContractFrame.tsx +4 -4
  4. package/js/components/CourseGlimpse/utils.ts +28 -22
  5. package/js/components/CourseGlimpseList/utils.ts +2 -2
  6. package/js/components/PurchaseButton/index.tsx +3 -3
  7. package/js/components/SaleTunnel/GenericSaleTunnel.tsx +3 -3
  8. package/js/components/SaleTunnel/SaleTunnelInformation/index.tsx +2 -2
  9. package/js/components/SaleTunnel/index.full-process.spec.tsx +3 -3
  10. package/js/components/SaleTunnel/index.spec.tsx +5 -5
  11. package/js/components/SaleTunnel/index.tsx +2 -2
  12. package/js/components/TeacherDashboardCourseList/index.spec.tsx +3 -3
  13. package/js/components/TeacherDashboardCourseList/index.tsx +2 -2
  14. package/js/hooks/useContractArchive/index.ts +3 -3
  15. package/js/hooks/useCourseProductUnion/index.spec.tsx +16 -16
  16. package/js/hooks/useCourseProductUnion/index.ts +7 -7
  17. package/js/hooks/useCourseProducts.ts +4 -4
  18. package/js/hooks/useDefaultOrganizationId/index.tsx +4 -4
  19. package/js/hooks/useOffering/index.ts +32 -0
  20. package/js/hooks/useTeacherCoursesSearch/index.tsx +4 -4
  21. package/js/hooks/useTeacherPendingContractsCount/index.ts +4 -4
  22. package/js/pages/DashboardCourses/index.spec.tsx +17 -14
  23. package/js/pages/TeacherDashboardContractsLayout/TeacherDashboardContracts/index.spec.tsx +11 -8
  24. package/js/pages/TeacherDashboardContractsLayout/TeacherDashboardContracts/index.tsx +6 -3
  25. package/js/pages/TeacherDashboardContractsLayout/components/BulkDownloadContractButton/index.spec.tsx +11 -11
  26. package/js/pages/TeacherDashboardContractsLayout/components/BulkDownloadContractButton/index.timer.spec.tsx +10 -10
  27. package/js/pages/TeacherDashboardContractsLayout/components/BulkDownloadContractButton/index.tsx +4 -4
  28. package/js/pages/TeacherDashboardContractsLayout/components/ContractActionsBar/index.spec.tsx +5 -5
  29. package/js/pages/TeacherDashboardContractsLayout/components/ContractActionsBar/index.tsx +8 -8
  30. package/js/pages/TeacherDashboardContractsLayout/components/SignOrganizationContractButton/index.spec.tsx +6 -6
  31. package/js/pages/TeacherDashboardContractsLayout/components/SignOrganizationContractButton/index.tsx +4 -4
  32. package/js/pages/TeacherDashboardContractsLayout/hooks/useCheckContractArchiveExists/index.spec.tsx +7 -7
  33. package/js/pages/TeacherDashboardContractsLayout/hooks/useCheckContractArchiveExists/index.tsx +5 -5
  34. package/js/pages/TeacherDashboardContractsLayout/hooks/useDownloadContractArchive/contractArchiveLocalStorage.spec.ts +21 -21
  35. package/js/pages/TeacherDashboardContractsLayout/hooks/useDownloadContractArchive/contractArchiveLocalStorage.ts +19 -13
  36. package/js/pages/TeacherDashboardContractsLayout/hooks/useDownloadContractArchive/index.spec.tsx +11 -11
  37. package/js/pages/TeacherDashboardContractsLayout/hooks/useDownloadContractArchive/index.tsx +6 -6
  38. package/js/pages/TeacherDashboardContractsLayout/hooks/useHasContractToDownload/index.tsx +6 -3
  39. package/js/pages/TeacherDashboardContractsLayout/hooks/useTeacherContractFilters/index.spec.tsx +16 -16
  40. package/js/pages/TeacherDashboardContractsLayout/hooks/useTeacherContractFilters/index.tsx +4 -4
  41. package/js/pages/TeacherDashboardContractsLayout/hooks/useTeacherContractsToSign.tsx +7 -4
  42. package/js/pages/TeacherDashboardCourseLearnersLayout/hooks/useCourseLearnersFilters/index.spec.tsx +21 -21
  43. package/js/pages/TeacherDashboardCourseLearnersLayout/hooks/useCourseLearnersFilters/index.ts +5 -5
  44. package/js/pages/TeacherDashboardCourseLearnersLayout/index.spec.tsx +55 -55
  45. package/js/pages/TeacherDashboardCourseLearnersLayout/index.tsx +1 -1
  46. package/js/pages/TeacherDashboardCoursesLoader/index.spec.tsx +11 -11
  47. package/js/pages/TeacherDashboardOrganizationCourseLoader/index.spec.tsx +11 -11
  48. package/js/pages/TeacherDashboardTraining/TeacherDashboardTrainingLoader.tsx +7 -7
  49. package/js/pages/TeacherDashboardTraining/index.spec.tsx +25 -25
  50. package/js/pages/TeacherDashboardTraining/index.tsx +16 -12
  51. package/js/types/Joanie.ts +21 -19
  52. package/js/utils/test/factories/joanie.ts +3 -3
  53. package/js/utils/test/mockCourseProductWithOrder.ts +4 -4
  54. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/DashboardItemEnrollment.tsx +1 -1
  55. package/js/widgets/Dashboard/components/DashboardItem/Enrollment/ProductCertificateFooter/index.spec.tsx +1 -1
  56. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrder.tsx +3 -3
  57. package/js/widgets/Dashboard/components/DashboardItem/Order/DashboardItemOrderContract.useUnionResource.cache.spec.tsx +1 -1
  58. package/js/widgets/Dashboard/components/DashboardItem/Order/Installment/index.tsx +4 -4
  59. package/js/widgets/Dashboard/components/DashboardItem/stories.mock.ts +1 -1
  60. package/js/widgets/Dashboard/components/DashboardSidebar/components/ContractNavLink/index.spec.tsx +23 -23
  61. package/js/widgets/Dashboard/components/DashboardSidebar/components/ContractNavLink/index.tsx +4 -4
  62. package/js/widgets/Dashboard/components/TeacherDashboardCourseSidebar/index.spec.tsx +20 -17
  63. package/js/widgets/Dashboard/components/TeacherDashboardCourseSidebar/index.tsx +22 -16
  64. package/js/widgets/Dashboard/components/TeacherDashboardCourseSidebar/utils.ts +4 -4
  65. package/js/widgets/Dashboard/components/TeacherDashboardOrganizationSidebar/index.tsx +3 -3
  66. package/js/widgets/Dashboard/utils/teacherDashboardPaths.tsx +4 -4
  67. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/CourseProductItemFooter/index.tsx +14 -10
  68. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.spec.tsx +87 -63
  69. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.stories.tsx +2 -2
  70. package/js/widgets/SyllabusCourseRunsList/components/CourseProductItem/index.tsx +24 -20
  71. package/js/widgets/SyllabusCourseRunsList/index.spec.tsx +8 -8
  72. package/package.json +1 -1
  73. package/js/hooks/useOffer/index.ts +0 -32
@@ -1,7 +1,7 @@
1
1
  import fetchMock from 'fetch-mock';
2
2
  import { renderHook, waitFor, act } from '@testing-library/react';
3
3
  import { RichieContextFactory as mockRichieContextFactory } from 'utils/test/factories/richie';
4
- import { OfferFactory, OrganizationFactory } from 'utils/test/factories/joanie';
4
+ import { OfferingFactory, OrganizationFactory } from 'utils/test/factories/joanie';
5
5
  import { JoanieAppWrapper, setupJoanieSession } from 'utils/test/wrappers/JoanieAppWrapper';
6
6
  import useCourseLearnersFilters from '.';
7
7
 
@@ -32,12 +32,12 @@ describe('useCourseLearnersFilters', () => {
32
32
  expect(result.current.initialFilters).toStrictEqual({
33
33
  organization_id: undefined,
34
34
  course_id: undefined,
35
- offer_id: undefined,
35
+ offering_id: undefined,
36
36
  });
37
37
  expect(result.current.filters).toStrictEqual({
38
38
  organization_id: undefined,
39
39
  course_id: undefined,
40
- offer_id: undefined,
40
+ offering_id: undefined,
41
41
  });
42
42
  });
43
43
  });
@@ -46,7 +46,7 @@ describe('useCourseLearnersFilters', () => {
46
46
  const defaultOrganization = OrganizationFactory().one();
47
47
  const filteredOrganization = OrganizationFactory({ id: 'filtered' }).one();
48
48
  const routeOrganization = OrganizationFactory({ id: 'route' }).one();
49
- const routeOffer = OfferFactory().one();
49
+ const routeOffering = OfferingFactory().one();
50
50
  // fetching user's organizations to initialize default organizationId.
51
51
  fetchMock.get('https://joanie.endpoint/api/v1.0/organizations/', [
52
52
  defaultOrganization,
@@ -56,9 +56,9 @@ describe('useCourseLearnersFilters', () => {
56
56
  wrapper: ({ children }) => (
57
57
  <JoanieAppWrapper
58
58
  routerOptions={{
59
- path: '/:organizationId/:courseId/:offerId',
59
+ path: '/:organizationId/:courseId/:offeringId',
60
60
  initialEntries: [
61
- `/${routeOrganization.id}/${routeOffer.course.id}/${routeOffer.id}?organization_id=${filteredOrganization.id}`,
61
+ `/${routeOrganization.id}/${routeOffering.course.id}/${routeOffering.id}?organization_id=${filteredOrganization.id}`,
62
62
  ],
63
63
  }}
64
64
  >
@@ -70,13 +70,13 @@ describe('useCourseLearnersFilters', () => {
70
70
  await waitFor(() => {
71
71
  expect(result.current.initialFilters).toStrictEqual({
72
72
  organization_id: routeOrganization.id,
73
- course_id: routeOffer.course.id,
74
- offer_id: routeOffer.id,
73
+ course_id: routeOffering.course.id,
74
+ offering_id: routeOffering.id,
75
75
  });
76
76
  expect(result.current.filters).toStrictEqual({
77
77
  organization_id: routeOrganization.id,
78
- course_id: routeOffer.course.id,
79
- offer_id: routeOffer.id,
78
+ course_id: routeOffering.course.id,
79
+ offering_id: routeOffering.id,
80
80
  });
81
81
  });
82
82
  });
@@ -84,7 +84,7 @@ describe('useCourseLearnersFilters', () => {
84
84
  it("should use organizationId from query parameters when it's not in route params", async () => {
85
85
  const defaultOrganization = OrganizationFactory().one();
86
86
  const filteredOrganization = OrganizationFactory({ id: 'filtered' }).one();
87
- const routeOffer = OfferFactory({ id: 'route' }).one();
87
+ const routeOffering = OfferingFactory({ id: 'route' }).one();
88
88
  // fetching user's organizations to initialize default organizationId.
89
89
  fetchMock.get('https://joanie.endpoint/api/v1.0/organizations/', [
90
90
  defaultOrganization,
@@ -94,9 +94,9 @@ describe('useCourseLearnersFilters', () => {
94
94
  wrapper: ({ children }) => (
95
95
  <JoanieAppWrapper
96
96
  routerOptions={{
97
- path: '/:courseId/:offerId',
97
+ path: '/:courseId/:offeringId',
98
98
  initialEntries: [
99
- `/${routeOffer.course.id}/${routeOffer.id}/?organization_id=${filteredOrganization.id}`,
99
+ `/${routeOffering.course.id}/${routeOffering.id}/?organization_id=${filteredOrganization.id}`,
100
100
  ],
101
101
  }}
102
102
  >
@@ -108,13 +108,13 @@ describe('useCourseLearnersFilters', () => {
108
108
  await waitFor(() => {
109
109
  expect(result.current.initialFilters).toStrictEqual({
110
110
  organization_id: filteredOrganization.id,
111
- course_id: routeOffer.course.id,
112
- offer_id: routeOffer.id,
111
+ course_id: routeOffering.course.id,
112
+ offering_id: routeOffering.id,
113
113
  });
114
114
  expect(result.current.filters).toStrictEqual({
115
115
  organization_id: filteredOrganization.id,
116
- course_id: routeOffer.course.id,
117
- offer_id: routeOffer.id,
116
+ course_id: routeOffering.course.id,
117
+ offering_id: routeOffering.id,
118
118
  });
119
119
  });
120
120
  });
@@ -122,7 +122,7 @@ describe('useCourseLearnersFilters', () => {
122
122
  it('setFilters should update filter state', async () => {
123
123
  const defaultOrganization = OrganizationFactory({ id: 'all' }).one();
124
124
  const routeOrganization = OrganizationFactory({ id: 'route' }).one();
125
- const routeOffer = OfferFactory().one();
125
+ const routeOffering = OfferingFactory().one();
126
126
  // fetching user's organizations to initialize default organizationId.
127
127
  fetchMock.get('https://joanie.endpoint/api/v1.0/organizations/', [defaultOrganization]);
128
128
  const { result } = renderHook(useCourseLearnersFilters, {
@@ -136,7 +136,7 @@ describe('useCourseLearnersFilters', () => {
136
136
  const expectedInitialFilters = {
137
137
  organization_id: defaultOrganization.id,
138
138
  course_id: undefined,
139
- offer_id: undefined,
139
+ offering_id: undefined,
140
140
  };
141
141
  await waitFor(() => {
142
142
  expect(result.current.initialFilters).toStrictEqual(expectedInitialFilters);
@@ -144,8 +144,8 @@ describe('useCourseLearnersFilters', () => {
144
144
 
145
145
  const newFilters = {
146
146
  organization_id: routeOrganization.id,
147
- course_id: routeOffer.course.id,
148
- offer_id: routeOffer.id,
147
+ course_id: routeOffering.course.id,
148
+ offering_id: routeOffering.id,
149
149
  };
150
150
  act(() => {
151
151
  result.current.setFilters(newFilters);
@@ -1,22 +1,22 @@
1
1
  import { useEffect, useMemo, useState } from 'react';
2
2
  import { useParams, useSearchParams } from 'react-router';
3
3
  import useDefaultOrganizationId from 'hooks/useDefaultOrganizationId';
4
- import { CourseListItem, CourseOrderResourceQuery, Offer, Organization } from 'types/Joanie';
4
+ import { CourseListItem, CourseOrderResourceQuery, Offering, Organization } from 'types/Joanie';
5
5
 
6
6
  export type CourseLearnersParams = {
7
7
  courseId: CourseListItem['id'];
8
- offerId?: Offer['id'];
8
+ offeringId?: Offering['id'];
9
9
  organizationId?: Organization['id'];
10
10
  };
11
11
 
12
12
  const useCourseLearnersFilters = () => {
13
- const { courseId, offerId } = useParams<CourseLearnersParams>();
13
+ const { courseId, offeringId } = useParams<CourseLearnersParams>();
14
14
  const [searchParams] = useSearchParams();
15
15
  const searchFilters: CourseOrderResourceQuery = useMemo(() => {
16
16
  return {
17
17
  course_id: courseId,
18
18
  organization_id: searchParams.get('organization_id') || undefined,
19
- offer_id: searchParams.get('offer_id') || undefined,
19
+ offering_id: searchParams.get('offering_id') || undefined,
20
20
  };
21
21
  }, Array.from(searchParams.entries()));
22
22
 
@@ -27,7 +27,7 @@ const useCourseLearnersFilters = () => {
27
27
  return {
28
28
  ...searchFilters,
29
29
  organization_id: defaultOrganizationId,
30
- offer_id: offerId,
30
+ offering_id: offeringId,
31
31
  };
32
32
  }, [defaultOrganizationId]);
33
33
  const [filters, setFilters] = useState<CourseOrderResourceQuery>(initialFilters);
@@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event';
4
4
  import queryString from 'query-string';
5
5
  import { RichieContextFactory as mockRichieContextFactory } from 'utils/test/factories/richie';
6
6
  import {
7
- OfferFactory,
7
+ OfferingFactory,
8
8
  NestedCourseOrderFactory,
9
9
  OrganizationFactory,
10
10
  } from 'utils/test/factories/joanie';
@@ -49,44 +49,44 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
49
49
  organizationFilterShouldBeDisplayed: true,
50
50
  },
51
51
  ])('$expectedLabel', async ({ nbOrganization, organizationFilterShouldBeDisplayed }) => {
52
- const offer = OfferFactory().one();
52
+ const offering = OfferingFactory().one();
53
53
  const organizationList = OrganizationFactory().many(nbOrganization);
54
54
  fetchMock.get(
55
- `https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`,
55
+ `https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`,
56
56
  organizationList,
57
57
  );
58
58
 
59
59
  // Course sidebar query
60
- fetchMock.get(`https://joanie.endpoint/api/v1.0/offers/${offer.id}/`, {});
60
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/offerings/${offering.id}/`, {});
61
61
 
62
62
  // First request before finding default organizationId
63
63
  const courseOrderListQueryParams = {
64
- offer_id: offer.id,
64
+ offering_id: offering.id,
65
65
  page: 1,
66
66
  page_size: PER_PAGE.courseLearnerList,
67
67
  };
68
68
  fetchMock.get(
69
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
69
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
70
70
  [],
71
71
  );
72
72
 
73
73
  if (organizationList.length > 0) {
74
74
  // Course sidebar query
75
75
  fetchMock.get(
76
- `https://joanie.endpoint/api/v1.0/organizations/${organizationList[0].id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
76
+ `https://joanie.endpoint/api/v1.0/organizations/${organizationList[0].id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
77
77
  [],
78
78
  );
79
79
 
80
80
  // Second request when default organizationId is fetched
81
81
  fetchMock.get(
82
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify({ organization_id: organizationList[0].id, ...courseOrderListQueryParams }, { sort: false })}`,
82
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify({ organization_id: organizationList[0].id, ...courseOrderListQueryParams }, { sort: false })}`,
83
83
  [],
84
84
  );
85
85
  }
86
86
  render(<TeacherDashboardCourseLearnersLayout />, {
87
87
  routerOptions: {
88
- path: '/:courseId/:offerId',
89
- initialEntries: [`/${offer.course.id}/${offer.id}`],
88
+ path: '/:courseId/:offeringId',
89
+ initialEntries: [`/${offering.course.id}/${offering.id}`],
90
90
  },
91
91
  });
92
92
 
@@ -109,42 +109,42 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
109
109
  });
110
110
 
111
111
  it('should call onFiltersChange on organization filter change', async () => {
112
- const offer = OfferFactory().one();
112
+ const offering = OfferingFactory().one();
113
113
  const defaultOrganization = OrganizationFactory().one();
114
114
  const otherOrganization = OrganizationFactory().one();
115
115
  const organizationList = [defaultOrganization, otherOrganization];
116
116
 
117
117
  // Course sidebar queries
118
118
  fetchMock.get(
119
- `https://joanie.endpoint/api/v1.0/organizations/${defaultOrganization.id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
119
+ `https://joanie.endpoint/api/v1.0/organizations/${defaultOrganization.id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
120
120
  [],
121
121
  );
122
- fetchMock.get(`https://joanie.endpoint/api/v1.0/offers/${offer.id}/`, {});
122
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/offerings/${offering.id}/`, {});
123
123
 
124
124
  fetchMock.get(
125
- `https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`,
125
+ `https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`,
126
126
  organizationList,
127
127
  );
128
128
  // First request before finding default organizationId
129
129
  const courseOrderListQueryParams = {
130
- offer_id: offer.id,
130
+ offering_id: offering.id,
131
131
  page: 1,
132
132
  page_size: PER_PAGE.courseLearnerList,
133
133
  };
134
134
  fetchMock.get(
135
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
135
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
136
136
  [],
137
137
  );
138
138
  // Second request when default organizationId is fetched
139
139
  fetchMock.get(
140
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify({ organization_id: defaultOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
140
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify({ organization_id: defaultOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
141
141
  [],
142
142
  );
143
143
 
144
144
  render(<TeacherDashboardCourseLearnersLayout />, {
145
145
  routerOptions: {
146
- path: '/:courseId/:offerId',
147
- initialEntries: [`/${offer.course.id}/${offer.id}`],
146
+ path: '/:courseId/:offeringId',
147
+ initialEntries: [`/${offering.course.id}/${offering.id}`],
148
148
  },
149
149
  });
150
150
 
@@ -158,57 +158,57 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
158
158
  const optionToSelect = screen.getByRole('option', { name: organizationList[1].title });
159
159
 
160
160
  fetchMock.get(
161
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify({ organization_id: otherOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
161
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify({ organization_id: otherOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
162
162
  [],
163
163
  );
164
164
  await user.click(optionToSelect);
165
165
  // onload default value is undefine and is onFiltersChange called once
166
166
  expect(
167
167
  fetchMock.called(
168
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify({ organization_id: otherOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
168
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify({ organization_id: otherOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
169
169
  ),
170
170
  ).toBe(true);
171
171
  });
172
172
 
173
- it('should render a list of course learners for a offer', async () => {
173
+ it('should render a list of course learners for an offering', async () => {
174
174
  const defaultOrganization = OrganizationFactory().one();
175
175
  const otherOrganization = OrganizationFactory().one();
176
176
  const organizationList = [defaultOrganization, otherOrganization];
177
- const offer = OfferFactory().one();
177
+ const offering = OfferingFactory().one();
178
178
  const courseOrderList = NestedCourseOrderFactory().many(3);
179
179
 
180
180
  // Course sidebar queries
181
181
  fetchMock.get(
182
- `https://joanie.endpoint/api/v1.0/organizations/${defaultOrganization.id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
182
+ `https://joanie.endpoint/api/v1.0/organizations/${defaultOrganization.id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
183
183
  [],
184
184
  );
185
- fetchMock.get(`https://joanie.endpoint/api/v1.0/offers/${offer.id}/`, {});
185
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/offerings/${offering.id}/`, {});
186
186
 
187
187
  fetchMock.get(
188
- `https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`,
188
+ `https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`,
189
189
  organizationList,
190
190
  );
191
191
 
192
192
  // First request before finding default organizationId
193
193
  const courseOrderListQueryParams = {
194
- offer_id: offer.id,
194
+ offering_id: offering.id,
195
195
  page: 1,
196
196
  page_size: PER_PAGE.courseLearnerList,
197
197
  };
198
198
  fetchMock.get(
199
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
199
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
200
200
  courseOrderList,
201
201
  );
202
202
  // Second request when default organizationId is fetched
203
203
  fetchMock.get(
204
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify({ organization_id: defaultOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
204
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify({ organization_id: defaultOrganization.id, ...courseOrderListQueryParams }, { sort: false })}`,
205
205
  courseOrderList,
206
206
  );
207
207
 
208
208
  render(<TeacherDashboardCourseLearnersLayout />, {
209
209
  routerOptions: {
210
- path: '/:courseId/:offerId',
211
- initialEntries: [`/${offer.course.id}/${offer.id}`],
210
+ path: '/:courseId/:offeringId',
211
+ initialEntries: [`/${offering.course.id}/${offering.id}`],
212
212
  },
213
213
  });
214
214
 
@@ -230,39 +230,39 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
230
230
 
231
231
  it('should render a list of course learners for an organization', async () => {
232
232
  const organization = OrganizationFactory().one();
233
- const offer = OfferFactory().one();
233
+ const offering = OfferingFactory().one();
234
234
  const courseOrderList = NestedCourseOrderFactory().many(3);
235
235
 
236
236
  // Course sidebar queries
237
237
  fetchMock.get(
238
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
238
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
239
239
  [],
240
240
  );
241
241
  fetchMock.get(
242
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offers/${offer.id}/`,
242
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offerings/${offering.id}/`,
243
243
  {},
244
244
  );
245
245
 
246
246
  // before default organization's fetched, we query all organization to decide if we should display organization filter or not.
247
- fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`, [
247
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`, [
248
248
  organization,
249
249
  ]);
250
250
 
251
251
  const courseOrderListQueryParams = {
252
252
  organization_id: organization.id,
253
- offer_id: offer.id,
253
+ offering_id: offering.id,
254
254
  page: 1,
255
255
  page_size: PER_PAGE.courseLearnerList,
256
256
  };
257
257
  fetchMock.get(
258
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
258
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
259
259
  courseOrderList,
260
260
  );
261
261
 
262
262
  render(<TeacherDashboardCourseLearnersLayout />, {
263
263
  routerOptions: {
264
- path: '/:organizationId/:courseId/:offerId',
265
- initialEntries: [`/${organization.id}/${offer.course.id}/${offer.id}`],
264
+ path: '/:organizationId/:courseId/:offeringId',
265
+ initialEntries: [`/${organization.id}/${offering.course.id}/${offering.id}`],
266
266
  },
267
267
  });
268
268
 
@@ -282,38 +282,38 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
282
282
 
283
283
  it('should render an empty table if there are no course learners', async () => {
284
284
  const organization = OrganizationFactory().one();
285
- const offer = OfferFactory().one();
285
+ const offering = OfferingFactory().one();
286
286
 
287
287
  // Course sidebar queries
288
288
  fetchMock.get(
289
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
289
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
290
290
  [],
291
291
  );
292
292
  fetchMock.get(
293
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offers/${offer.id}/`,
293
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offerings/${offering.id}/`,
294
294
  {},
295
295
  );
296
296
 
297
297
  // before default organization's fetched, we query all organization to decide if we should display organization filter or not.
298
- fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`, [
298
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`, [
299
299
  organization,
300
300
  ]);
301
301
 
302
302
  const courseOrderListQueryParams = {
303
303
  organization_id: organization.id,
304
- offer_id: offer.id,
304
+ offering_id: offering.id,
305
305
  page: 1,
306
306
  page_size: PER_PAGE.courseLearnerList,
307
307
  };
308
308
  fetchMock.get(
309
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
309
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
310
310
  [],
311
311
  );
312
312
 
313
313
  render(<TeacherDashboardCourseLearnersLayout />, {
314
314
  routerOptions: {
315
- path: '/:organizationId/:courseId/:offerId',
316
- initialEntries: [`/${organization.id}/${offer.course.id}/${offer.id}`],
315
+ path: '/:organizationId/:courseId/:offeringId',
316
+ initialEntries: [`/${organization.id}/${offering.course.id}/${offering.id}`],
317
317
  },
318
318
  });
319
319
 
@@ -326,38 +326,38 @@ describe('pages/TeacherDashboardCourseLearnersLayout', () => {
326
326
 
327
327
  it('should render an error banner if an error occured during course learners fetching', async () => {
328
328
  const organization = OrganizationFactory().one();
329
- const offer = OfferFactory().one();
329
+ const offering = OfferingFactory().one();
330
330
 
331
331
  // Course sidebar queries
332
332
  fetchMock.get(
333
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offer_id=${offer.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
333
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/contracts/?offering_id=${offering.id}&signature_state=half_signed&page=1&page_size=${PER_PAGE.teacherContractList}`,
334
334
  [],
335
335
  );
336
336
  fetchMock.get(
337
- `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offers/${offer.id}/`,
337
+ `https://joanie.endpoint/api/v1.0/organizations/${organization.id}/offerings/${offering.id}/`,
338
338
  {},
339
339
  );
340
340
 
341
341
  // before default organization's fetched, we query all organization to decide if we should display organization filter or not.
342
- fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offer_id=${offer.id}`, [
342
+ fetchMock.get(`https://joanie.endpoint/api/v1.0/organizations/?offering_id=${offering.id}`, [
343
343
  organization,
344
344
  ]);
345
345
 
346
346
  const courseOrderListQueryParams = {
347
347
  organization_id: organization.id,
348
- offer_id: offer.id,
348
+ offering_id: offering.id,
349
349
  page: 1,
350
350
  page_size: PER_PAGE.courseLearnerList,
351
351
  };
352
352
  fetchMock.get(
353
- `https://joanie.endpoint/api/v1.0/courses/${offer.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
353
+ `https://joanie.endpoint/api/v1.0/courses/${offering.course.id}/orders/?${queryString.stringify(courseOrderListQueryParams, { sort: false })}`,
354
354
  new Response('', { status: HttpStatusCode.NOT_FOUND }),
355
355
  );
356
356
 
357
357
  render(<TeacherDashboardCourseLearnersLayout />, {
358
358
  routerOptions: {
359
- path: '/:organizationId/:courseId/:offerId',
360
- initialEntries: [`/${organization.id}/${offer.course.id}/${offer.id}`],
359
+ path: '/:organizationId/:courseId/:offeringId',
360
+ initialEntries: [`/${organization.id}/${offering.course.id}/${offering.id}`],
361
361
  },
362
362
  });
363
363
 
@@ -65,7 +65,7 @@ export const TeacherDashboardCourseLearnersLayout = () => {
65
65
  const {
66
66
  items: organizations,
67
67
  states: { isFetched: isOrganizationFetched },
68
- } = useOrganizations({ offer_id: filters.offer_id });
68
+ } = useOrganizations({ offering_id: filters.offering_id });
69
69
  const {
70
70
  items: courseOrders,
71
71
  meta,
@@ -2,7 +2,7 @@ import { screen, waitFor } from '@testing-library/react';
2
2
  import fetchMock from 'fetch-mock';
3
3
  import userEvent from '@testing-library/user-event';
4
4
  import { RichieContextFactory as mockRichieContextFactory } from 'utils/test/factories/richie';
5
- import { CourseListItemFactory, OfferFactory } from 'utils/test/factories/joanie';
5
+ import { CourseListItemFactory, OfferingFactory } from 'utils/test/factories/joanie';
6
6
  import { expectNoSpinner } from 'utils/test/expectSpinner';
7
7
  import { mockPaginatedResponse } from 'utils/test/mockPaginatedResponse';
8
8
  import { PER_PAGE } from 'settings';
@@ -48,19 +48,19 @@ describe('components/TeacherDashboardCoursesLoader', () => {
48
48
  mockPaginatedResponse(CourseListItemFactory().many(15), 15, false),
49
49
  );
50
50
  fetchMock.get(
51
- `https://joanie.endpoint/api/v1.0/offers/?product_type=credential&page=1&page_size=${perPage}`,
52
- mockPaginatedResponse(OfferFactory().many(15), 15, false),
51
+ `https://joanie.endpoint/api/v1.0/offerings/?product_type=credential&page=1&page_size=${perPage}`,
52
+ mockPaginatedResponse(OfferingFactory().many(15), 15, false),
53
53
  );
54
54
 
55
55
  render(<TeacherDashboardCoursesLoader />);
56
56
  await expectNoSpinner('Loading courses...');
57
57
 
58
58
  nbApiCalls += 1; // course api call
59
- nbApiCalls += 1; // offers api call
59
+ nbApiCalls += 1; // offerings api call
60
60
  const calledUrls = fetchMock.calls().map((call) => call[0]);
61
61
  expect(calledUrls).toHaveLength(nbApiCalls);
62
62
  expect(calledUrls).toContain(
63
- `https://joanie.endpoint/api/v1.0/offers/?product_type=credential&page=1&page_size=${perPage}`,
63
+ `https://joanie.endpoint/api/v1.0/offerings/?product_type=credential&page=1&page_size=${perPage}`,
64
64
  );
65
65
 
66
66
  // section titles
@@ -80,8 +80,8 @@ describe('components/TeacherDashboardCoursesLoader', () => {
80
80
  mockPaginatedResponse(CourseListItemFactory().many(15), 15, false),
81
81
  );
82
82
  fetchMock.get(
83
- `https://joanie.endpoint/api/v1.0/offers/?product_type=credential&page=1&page_size=${perPage}`,
84
- mockPaginatedResponse(OfferFactory().many(15), 15, false),
83
+ `https://joanie.endpoint/api/v1.0/offerings/?product_type=credential&page=1&page_size=${perPage}`,
84
+ mockPaginatedResponse(OfferingFactory().many(15), 15, false),
85
85
  );
86
86
 
87
87
  render(<TeacherDashboardCoursesLoader />);
@@ -93,22 +93,22 @@ describe('components/TeacherDashboardCoursesLoader', () => {
93
93
  mockPaginatedResponse(CourseListItemFactory().many(5), 5, false),
94
94
  );
95
95
  fetchMock.get(
96
- `https://joanie.endpoint/api/v1.0/offers/?query=text+query&product_type=credential&page=1&page_size=${perPage}`,
97
- mockPaginatedResponse(OfferFactory().many(5), 5, false),
96
+ `https://joanie.endpoint/api/v1.0/offerings/?query=text+query&product_type=credential&page=1&page_size=${perPage}`,
97
+ mockPaginatedResponse(OfferingFactory().many(5), 5, false),
98
98
  );
99
99
  const user = userEvent.setup();
100
100
  await user.type(screen.getByRole('textbox', { name: /Search/ }), 'text query');
101
101
  await user.click(screen.getByRole('button', { name: /Search/ }));
102
102
 
103
103
  nbApiCalls = 1; // course api call
104
- nbApiCalls += 1; // offers api call
104
+ nbApiCalls += 1; // offerings api call
105
105
  const calledUrls = fetchMock.calls().map((call) => call[0]);
106
106
  expect(calledUrls).toHaveLength(nbApiCalls);
107
107
  expect(calledUrls).toContain(
108
108
  `https://joanie.endpoint/api/v1.0/courses/?query=text+query&has_listed_course_runs=true&page=1&page_size=${perPage}`,
109
109
  );
110
110
  expect(calledUrls).toContain(
111
- `https://joanie.endpoint/api/v1.0/offers/?query=text+query&product_type=credential&page=1&page_size=${perPage}`,
111
+ `https://joanie.endpoint/api/v1.0/offerings/?query=text+query&product_type=credential&page=1&page_size=${perPage}`,
112
112
  );
113
113
 
114
114
  await waitFor(() => {