@licklist/design 0.63.3-dev.3 → 0.63.3

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 (140) hide show
  1. package/bitbucket-pipelines.yml +8 -0
  2. package/dist/date-time-button/DateTimeButton.js +1 -1
  3. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.d.ts.map +1 -1
  4. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.js +1 -1
  5. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.d.ts.map +1 -1
  6. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +1 -1
  7. package/dist/iframe/payment/order-items-table/utils/paymentSummary.d.ts.map +1 -1
  8. package/dist/iframe/ryft/RyftPaymentForm.d.ts +1 -4
  9. package/dist/iframe/ryft/RyftPaymentForm.d.ts.map +1 -1
  10. package/dist/iframe/ryft/RyftPaymentForm.js +1 -1
  11. package/dist/iframe/ryft/utils/ryft-form.d.ts +2 -5
  12. package/dist/iframe/ryft/utils/ryft-form.d.ts.map +1 -1
  13. package/dist/iframe/ryft/utils/ryft-form.js +1 -1
  14. package/dist/product-set/control/DateAndRecurrenceInput.d.ts +1 -1
  15. package/dist/product-set/control/DateAndRecurrenceInput.d.ts.map +1 -1
  16. package/dist/product-set/control/DateAndRecurrenceInput.js +1 -1
  17. package/dist/product-set/control/DateInput.js +1 -1
  18. package/dist/product-set/control/ProductSetControl.d.ts +2 -3
  19. package/dist/product-set/control/ProductSetControl.d.ts.map +1 -1
  20. package/dist/product-set/control/ProductSetControl.js +1 -1
  21. package/dist/product-set/form/ProductCategoriesControl.d.ts +1 -3
  22. package/dist/product-set/form/ProductCategoriesControl.d.ts.map +1 -1
  23. package/dist/product-set/form/ProductCategoriesControl.js +1 -1
  24. package/dist/product-set/form/ProductSetForm.d.ts +2 -6
  25. package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
  26. package/dist/product-set/form/ProductSetForm.js +1 -1
  27. package/dist/product-set/form/ProductsControl.d.ts +1 -3
  28. package/dist/product-set/form/ProductsControl.d.ts.map +1 -1
  29. package/dist/product-set/form/ProductsControl.js +1 -1
  30. package/dist/product-set/form/StepsControl.d.ts +1 -3
  31. package/dist/product-set/form/StepsControl.d.ts.map +1 -1
  32. package/dist/product-set/form/StepsControl.js +1 -1
  33. package/dist/product-set/product/ProductControl.d.ts +0 -1
  34. package/dist/product-set/product/ProductControl.d.ts.map +1 -1
  35. package/dist/product-set/product/ProductControl.js +1 -1
  36. package/dist/product-set/step/StepControl.d.ts +1 -2
  37. package/dist/product-set/step/StepControl.d.ts.map +1 -1
  38. package/dist/product-set/step/StepControl.js +1 -1
  39. package/dist/provider/working-hours-input/WorkingHoursInputDescription.d.ts.map +1 -1
  40. package/dist/provider/working-hours-input/WorkingHoursInputDescription.js +1 -1
  41. package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.d.ts.map +1 -1
  42. package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.js +1 -1
  43. package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts +1 -3
  44. package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts.map +1 -1
  45. package/dist/recurring-date-picker-input/RecurringDatePickerInput.js +1 -1
  46. package/dist/recurring-date-picker-input/utils.d.ts +0 -5
  47. package/dist/recurring-date-picker-input/utils.d.ts.map +1 -1
  48. package/dist/recurring-date-picker-input/utils.js +1 -1
  49. package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
  50. package/dist/setting/admin/AdminSettingForm.d.ts +2 -2
  51. package/dist/setting/admin/AdminSettingForm.d.ts.map +1 -1
  52. package/dist/sortable-tree/SortableTreeItem.d.ts +2 -1
  53. package/dist/sortable-tree/SortableTreeItem.d.ts.map +1 -1
  54. package/dist/sortable-tree/SortableTreeItem.js +1 -1
  55. package/dist/styles/date-time-button/DateTimeButton.scss +0 -1
  56. package/dist/styles/iframe-page/PageBody.scss +1 -0
  57. package/dist/styles/ryft-payment-form/RyftPaymentForm.scss +0 -8
  58. package/dist/styles/sales/BookingResults.scss +1 -1
  59. package/dist/styles/zones/ZoneForm.scss +1 -2
  60. package/dist/zone/form/ZoneForm.d.ts +2 -2
  61. package/dist/zone/form/ZoneForm.d.ts.map +1 -1
  62. package/dist/zone/form/ZoneForm.js +1 -1
  63. package/dist/zone/form/components/ZoneControl.d.ts +2 -2
  64. package/dist/zone/form/components/ZoneControl.d.ts.map +1 -1
  65. package/dist/zone/form/components/ZoneControl.js +1 -1
  66. package/dist/zone/form/components/ZoneRecurrencesControl.d.ts +4 -4
  67. package/dist/zone/form/components/ZoneRecurrencesControl.d.ts.map +1 -1
  68. package/dist/zone/form/components/ZoneRecurrencesControl.js +1 -1
  69. package/dist/zone/form/utils/dates.d.ts.map +1 -1
  70. package/jest.config.js +29 -0
  71. package/package.json +39 -14
  72. package/src/date-time-button/DateTimeButton.stories.tsx +1 -2
  73. package/src/date-time-button/DateTimeButton.tsx +5 -7
  74. package/src/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.tsx +9 -14
  75. package/src/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.tsx +0 -2
  76. package/src/iframe/payment/order-items-table/utils/paymentSummary.tsx +0 -1
  77. package/src/iframe/ryft/RyftPaymentForm.tsx +2 -11
  78. package/src/iframe/ryft/utils/ryft-form.ts +4 -23
  79. package/src/product-set/control/DateAndRecurrenceInput.tsx +4 -3
  80. package/src/product-set/control/DateInput.tsx +2 -2
  81. package/src/product-set/control/ProductSetControl.tsx +4 -11
  82. package/src/product-set/form/ProductCategoriesControl.tsx +4 -15
  83. package/src/product-set/form/ProductSetForm.tsx +2 -13
  84. package/src/product-set/form/ProductsControl.tsx +77 -93
  85. package/src/product-set/form/StepsControl.tsx +7 -15
  86. package/src/product-set/product/ProductControl.tsx +5 -8
  87. package/src/product-set/step/StepControl.tsx +3 -4
  88. package/src/provider/working-hours-input/WorkingHoursInputDescription.tsx +18 -4
  89. package/src/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.tsx +21 -40
  90. package/src/recurring-date-picker-input/RecurringDatePickerInput.stories.tsx +7 -13
  91. package/src/recurring-date-picker-input/RecurringDatePickerInput.tsx +1 -12
  92. package/src/recurring-date-picker-input/utils.ts +1 -90
  93. package/src/sales/booking/results/components/ResultCard.tsx +3 -0
  94. package/src/setting/admin/AdminSettingForm.tsx +2 -2
  95. package/src/sortable-tree/SortableTreeItem.tsx +3 -0
  96. package/src/static/switch/BooleanSwitch.tsx +1 -1
  97. package/src/styles/date-time-button/DateTimeButton.scss +0 -1
  98. package/src/styles/iframe-page/PageBody.scss +1 -0
  99. package/src/styles/ryft-payment-form/RyftPaymentForm.scss +0 -8
  100. package/src/styles/sales/BookingResults.scss +1 -1
  101. package/src/styles/zones/ZoneForm.scss +1 -2
  102. package/src/zone/form/ZoneForm.tsx +2 -3
  103. package/src/zone/form/components/ZoneControl.tsx +3 -3
  104. package/src/zone/form/components/ZoneRecurrencesControl.tsx +5 -7
  105. package/src/zone/form/utils/dates.ts +10 -9
  106. package/tests/Auth/Authorizer.test.tsx +194 -0
  107. package/tests/Auth/Layout/UserNavDropDown.test.tsx +43 -0
  108. package/tests/Auth/Layout/UserNavDropDownToggle.test.tsx +33 -0
  109. package/tests/Auth/Login/LoginComponent.test.tsx +246 -0
  110. package/tests/Auth/Login/LoginFormComponent.test.tsx +182 -0
  111. package/tests/Auth/Register/RegisterComponent.test.tsx +285 -0
  112. package/tests/Auth/Register/RegisterFormComponent.test.tsx +170 -0
  113. package/tests/Auth/Settings/Dashboard/IpInput.test.tsx +130 -0
  114. package/tests/Auth/Social/SocialCallbackComponent.test.tsx +133 -0
  115. package/tests/Auth/Social/SocialFormComponent.test.tsx +118 -0
  116. package/tests/FileUpload/FileUpload.test.tsx +42 -0
  117. package/tests/Notification/EmailTemplate.test.tsx +82 -0
  118. package/tests/ProductSet/ProductSetPopover.test.tsx +40 -0
  119. package/tests/Report/Report.test.tsx +48 -0
  120. package/tests/Sales/Coupon.test.tsx +51 -0
  121. package/tests/Sales/SalesAndVIews.test.tsx +63 -0
  122. package/tests/SnippetTemplates/SnippetTemplates.test.tsx +56 -0
  123. package/tests/Table/FilterHelperComponent.test.tsx +88 -0
  124. package/tests/Table/PaginationHelperComponent.test.tsx +109 -0
  125. package/tests/Table/PerPageHelperComponent.test.tsx +34 -0
  126. package/tests/Table/TableHelperComponent.test.tsx +295 -0
  127. package/tests/TipTapEditor/TipTapEditor.test.tsx +28 -0
  128. package/tests/__mock__/hooks/useAuthApi.ts +13 -0
  129. package/tests/__mock__/hooks/useAuthMock.ts +13 -0
  130. package/tests/__mock__/hooks/useFormMock.ts +27 -0
  131. package/tests/__mock__/hooks/useNotificationMock.ts +13 -0
  132. package/tests/__mock__/hooks/useQueryMock.ts +16 -0
  133. package/tests/__mock__/hooks/useSocialApiMock.ts +20 -0
  134. package/tests/__mock__/hooks/useTranslationMock.ts +17 -0
  135. package/tests/__mock__/hooks/useUserApiMock.ts +18 -0
  136. package/tests/__mock__/hooks/useUserMock.ts +13 -0
  137. package/tests/__mock__/styleMock.js +1 -0
  138. package/tests/__mock__/windowMock.ts +5 -0
  139. package/tests/packages/react-query.tsx +28 -0
  140. package/tests/setupTests.ts +10 -0
@@ -0,0 +1,246 @@
1
+ import RouteService from "@licklist/plugins/dist/services/Route/RouteService";
2
+ import { UserLoginRequest } from "@licklist/plugins/dist/types/Request/UserLoginRequest";
3
+ import { mount, shallow } from "enzyme";
4
+ import * as React from "react";
5
+ import { act } from "react-dom/test-utils";
6
+ import { MemoryRouter } from "react-router-dom";
7
+ import { LoginComponent, LoginFormComponent } from "../../../src/auth/Login";
8
+ import useAuthMock from "../../__mock__/hooks/useAuthMock";
9
+ import useFormMock from "../../__mock__/hooks/useFormMock";
10
+ import useNotificationMock from "../../__mock__/hooks/useNotificationMock";
11
+ import useTranslationMock from "../../__mock__/hooks/useTranslationMock";
12
+ import useUserApiMock from "../../__mock__/hooks/useUserApiMock";
13
+ import useUserMock from "../../__mock__/hooks/useUserMock";
14
+
15
+ jest.mock("react-i18next", () => ({
16
+ Trans: jest.fn().mockReturnValue("test"),
17
+ useTranslation: jest.fn(),
18
+ }));
19
+ jest.mock("react-hook-form");
20
+ jest.mock("@licklist/plugins/dist/context/app/hooks/useNotification");
21
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useAuth");
22
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useUser");
23
+ jest.mock("@licklist/plugins/dist/hooks/Api/useUserApi");
24
+
25
+ beforeEach(() => {
26
+ useTranslationMock();
27
+ useNotificationMock({
28
+ danger: jest.fn(),
29
+ success: jest.fn(),
30
+ });
31
+ useAuthMock({
32
+ setSecrets: jest.fn(),
33
+ });
34
+ useUserMock({
35
+ login: jest.fn(),
36
+ clearInvitation: jest.fn(),
37
+ });
38
+ useFormMock();
39
+ });
40
+
41
+ afterAll(() => {
42
+ jest.resetAllMocks();
43
+ });
44
+
45
+ describe("LoginComponent", () => {
46
+ it("should be rendered without issues", () => {
47
+ const component = shallow(
48
+ <MemoryRouter initialEntries={["/"]}>
49
+ <LoginComponent />
50
+ </MemoryRouter>
51
+ );
52
+
53
+ expect(component.exists()).toBeTruthy();
54
+ });
55
+
56
+ it("should show danger notification if login did not succeed", async () => {
57
+ let component: any;
58
+
59
+ const notificationDangerMock = jest.fn();
60
+ const notificationSuccessMock = jest.fn();
61
+ const loginMock = jest.fn(() => Promise.reject(new Error("danger")));
62
+ const profileMock = jest.fn();
63
+
64
+ useNotificationMock({
65
+ danger: notificationDangerMock,
66
+ success: notificationSuccessMock,
67
+ });
68
+ useUserApiMock({
69
+ login: loginMock,
70
+ profile: profileMock,
71
+ });
72
+
73
+ RouteService.redirectTo = jest.fn();
74
+
75
+ act(() => {
76
+ component = mount(
77
+ <MemoryRouter>
78
+ <LoginComponent />
79
+ </MemoryRouter>
80
+ );
81
+ });
82
+
83
+ await act(async () => {
84
+ const credentials: UserLoginRequest = {
85
+ email: "email",
86
+ password: "password",
87
+ };
88
+
89
+ await component.find(LoginFormComponent).prop("onSubmit")(credentials);
90
+ });
91
+
92
+ component.update();
93
+
94
+ expect(component.exists()).toBeTruthy();
95
+ expect(loginMock).toHaveBeenCalledTimes(1);
96
+ expect(notificationDangerMock).toHaveBeenCalledTimes(1);
97
+ expect(profileMock).toHaveBeenCalledTimes(0);
98
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(0);
99
+ });
100
+
101
+ it("should show danger notification if profile did not succeed", async () => {
102
+ let component: any;
103
+
104
+ const loginResponse = {
105
+ access_token: "access_token",
106
+ refresh_token: "refresh_token",
107
+ token_type: "token_type",
108
+ expires_in: null,
109
+ };
110
+
111
+ const notificationDangerMock = jest.fn();
112
+ const notificationSuccessMock = jest.fn();
113
+ const loginMock = jest.fn(() => Promise.resolve(loginResponse));
114
+ const profileMock = jest.fn(() => Promise.reject(new Error("danger")));
115
+ const setAuthorizationTokenMock = jest.fn();
116
+ const setSecretsMock = jest.fn();
117
+
118
+ useNotificationMock({
119
+ danger: notificationDangerMock,
120
+ success: notificationSuccessMock,
121
+ });
122
+ useUserApiMock({
123
+ login: loginMock,
124
+ profile: profileMock,
125
+ setAuthorizationToken: setAuthorizationTokenMock,
126
+ });
127
+ useAuthMock({
128
+ setSecrets: setSecretsMock,
129
+ });
130
+
131
+ RouteService.redirectTo = jest.fn();
132
+
133
+ act(() => {
134
+ component = mount(
135
+ <MemoryRouter>
136
+ <LoginComponent />
137
+ </MemoryRouter>
138
+ );
139
+ });
140
+
141
+ await act(async () => {
142
+ const credentials: UserLoginRequest = {
143
+ email: "email",
144
+ password: "password",
145
+ };
146
+
147
+ await component.find(LoginFormComponent).prop("onSubmit")(credentials);
148
+ });
149
+
150
+ component.update();
151
+
152
+ expect(component.exists()).toBeTruthy();
153
+ expect(loginMock).toHaveBeenCalledTimes(1);
154
+ expect(setSecretsMock).toHaveBeenCalledTimes(1);
155
+ expect(setSecretsMock).toHaveBeenCalledWith(loginResponse);
156
+ expect(setAuthorizationTokenMock).toHaveBeenCalledTimes(1);
157
+ expect(setAuthorizationTokenMock).toHaveBeenCalledWith(
158
+ loginResponse.access_token
159
+ );
160
+ expect(profileMock).toHaveBeenCalledTimes(1);
161
+ expect(notificationDangerMock).toHaveBeenCalledTimes(1);
162
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(0);
163
+ });
164
+
165
+ it("should show success notification if login and profile did succeed", async () => {
166
+ let component: any;
167
+
168
+ const loginResponse = {
169
+ access_token: "access_token",
170
+ refresh_token: "refresh_token",
171
+ token_type: "token_type",
172
+ expires_in: null,
173
+ };
174
+ const profileResponse = {
175
+ id: 1,
176
+ first_name: "first_name",
177
+ last_name: "last_name",
178
+ email: "email",
179
+ role: null,
180
+ };
181
+
182
+ const notificationDangerMock = jest.fn();
183
+ const notificationSuccessMock = jest.fn();
184
+ const loginMock = jest.fn(() => Promise.resolve(loginResponse));
185
+ const profileMock = jest.fn(() =>
186
+ Promise.resolve({
187
+ data: profileResponse,
188
+ })
189
+ );
190
+ const setAuthorizationTokenMock = jest.fn();
191
+ const setSecretsMock = jest.fn();
192
+ const userLoginMock = jest.fn();
193
+
194
+ useNotificationMock({
195
+ danger: notificationDangerMock,
196
+ success: notificationSuccessMock,
197
+ });
198
+ useUserApiMock({
199
+ login: loginMock,
200
+ profile: profileMock,
201
+ setAuthorizationToken: setAuthorizationTokenMock,
202
+ });
203
+ useAuthMock({
204
+ setSecrets: setSecretsMock,
205
+ });
206
+ useUserMock({
207
+ login: userLoginMock,
208
+ });
209
+
210
+ RouteService.redirectTo = jest.fn();
211
+
212
+ act(() => {
213
+ component = mount(
214
+ <MemoryRouter>
215
+ <LoginComponent />
216
+ </MemoryRouter>
217
+ );
218
+ });
219
+
220
+ await act(async () => {
221
+ const credentials: UserLoginRequest = {
222
+ email: "email",
223
+ password: "password",
224
+ };
225
+
226
+ await component.find(LoginFormComponent).prop("onSubmit")(credentials);
227
+ });
228
+
229
+ component.update();
230
+
231
+ expect(component.exists()).toBeTruthy();
232
+ expect(loginMock).toHaveBeenCalledTimes(1);
233
+ expect(setSecretsMock).toHaveBeenCalledTimes(1);
234
+ expect(setSecretsMock).toHaveBeenCalledWith(loginResponse);
235
+ expect(setAuthorizationTokenMock).toHaveBeenCalledTimes(1);
236
+ expect(setAuthorizationTokenMock).toHaveBeenCalledWith(
237
+ loginResponse.access_token
238
+ );
239
+ expect(profileMock).toHaveBeenCalledTimes(1);
240
+ expect(userLoginMock).toHaveBeenCalledTimes(1);
241
+ expect(userLoginMock).toHaveBeenCalledWith(profileResponse);
242
+ expect(notificationDangerMock).toHaveBeenCalledTimes(0);
243
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(1);
244
+ expect(RouteService.redirectTo).toHaveBeenCalledTimes(1);
245
+ });
246
+ });
@@ -0,0 +1,182 @@
1
+ /* eslint-disable testing-library/no-unnecessary-act */
2
+ /* eslint-disable testing-library/no-node-access */
3
+ /* eslint-disable testing-library/no-container */
4
+ import { mount, shallow } from "enzyme";
5
+ import * as React from "react";
6
+ import { act } from "react-dom/test-utils";
7
+ import { fireEvent, render } from "@testing-library/react";
8
+ import { LoginFormComponent } from "../../../src/auth/Login/LoginFormComponent";
9
+ import useFormMock from "../../__mock__/hooks/useFormMock";
10
+ import useTranslationMock from "../../__mock__/hooks/useTranslationMock";
11
+
12
+ jest.mock("react-i18next", () => ({
13
+ Trans: jest.fn().mockReturnValue("test"),
14
+ useTranslation: jest.fn(),
15
+ }));
16
+ jest.mock("react-hook-form");
17
+ jest.mock("@licklist/plugins/dist/context/app/hooks/useNotification");
18
+
19
+ beforeEach(() => {
20
+ useTranslationMock();
21
+ useFormMock();
22
+ });
23
+
24
+ afterAll(() => {
25
+ jest.resetAllMocks();
26
+ });
27
+
28
+ describe("LoginFormComponent", () => {
29
+ it("should be rendered without issues", () => {
30
+ const component = shallow(
31
+ <LoginFormComponent
32
+ isLoading={false}
33
+ setIsLoading={() => false}
34
+ invitation={null}
35
+ />
36
+ );
37
+
38
+ expect(component.exists()).toBeTruthy();
39
+ });
40
+
41
+ it("should be disabled if it is loading", () => {
42
+ const component = mount(
43
+ <LoginFormComponent
44
+ isLoading
45
+ setIsLoading={() => false}
46
+ invitation={null}
47
+ />
48
+ );
49
+
50
+ expect(component.exists()).toBeTruthy();
51
+ expect(
52
+ component.find({ name: "email" }).at(0).prop("disabled")
53
+ ).toBeTruthy();
54
+ expect(
55
+ component.find({ name: "password" }).at(0).prop("disabled")
56
+ ).toBeTruthy();
57
+ });
58
+
59
+ it("should be disabled if invitation exist", () => {
60
+ const component = mount(
61
+ <LoginFormComponent
62
+ isLoading={false}
63
+ setIsLoading={() => false}
64
+ invitation={{
65
+ email: "test@test.test",
66
+ user_exists: false,
67
+ invitation_hash: "test",
68
+ }}
69
+ />
70
+ );
71
+
72
+ expect(component.exists()).toBeTruthy();
73
+ expect(
74
+ component.find({ name: "email" }).at(0).prop("disabled")
75
+ ).toBeTruthy();
76
+ expect(
77
+ component.find({ name: "password" }).at(0).prop("disabled")
78
+ ).toBeFalsy();
79
+ });
80
+
81
+ it("should set value on input change", () => {
82
+ const setValueMock = jest.fn();
83
+
84
+ useFormMock({
85
+ setValue: setValueMock,
86
+ });
87
+
88
+ const component = mount(
89
+ <LoginFormComponent
90
+ isLoading={false}
91
+ setIsLoading={() => false}
92
+ invitation={null}
93
+ />
94
+ );
95
+
96
+ const emailEvent = {
97
+ currentTarget: {
98
+ name: "email",
99
+ value: "test",
100
+ },
101
+ };
102
+
103
+ const passwordEvent = {
104
+ currentTarget: {
105
+ name: "password",
106
+ value: "test",
107
+ },
108
+ };
109
+
110
+ act(() => {
111
+ component.find({ name: "email" }).at(1).prop("onChange")(emailEvent);
112
+ });
113
+
114
+ expect(setValueMock).toHaveBeenCalledTimes(1);
115
+ expect(setValueMock).toHaveBeenCalledWith(
116
+ emailEvent.currentTarget.name,
117
+ emailEvent.currentTarget.value
118
+ );
119
+
120
+ act(() => {
121
+ component.find({ name: "password" }).at(1).prop("onChange")(
122
+ passwordEvent
123
+ );
124
+ });
125
+
126
+ expect(setValueMock).toHaveBeenCalledTimes(2);
127
+ expect(setValueMock).toHaveBeenLastCalledWith(
128
+ passwordEvent.currentTarget.name,
129
+ passwordEvent.currentTarget.value
130
+ );
131
+ });
132
+
133
+ it("should handle submit action", async () => {
134
+ const onSubmitMock = jest.fn();
135
+ const handleSubmitMock = jest
136
+ .fn()
137
+ .mockImplementation(
138
+ (callback: (e: any) => void) => (e: any) => callback(e)
139
+ );
140
+
141
+ useFormMock({
142
+ handleSubmit: handleSubmitMock,
143
+ });
144
+
145
+ const { container } = render(
146
+ <LoginFormComponent
147
+ isLoading={false}
148
+ setIsLoading={() => false}
149
+ onSubmit={onSubmitMock}
150
+ invitation={null}
151
+ />
152
+ );
153
+
154
+ const emailEvent = {
155
+ currentTarget: {
156
+ name: "email",
157
+ value: "email",
158
+ },
159
+ };
160
+
161
+ const passwordEvent = {
162
+ currentTarget: {
163
+ name: "password",
164
+ value: "password",
165
+ },
166
+ };
167
+
168
+ const email = container.querySelector('input[name="email"]');
169
+ const password = container.querySelector('input[name="password"]');
170
+ const submit = container.querySelector('button[type="submit"]');
171
+
172
+ fireEvent.input(email!, emailEvent);
173
+ fireEvent.input(password!, passwordEvent);
174
+
175
+ await act(async () => {
176
+ fireEvent.submit(submit!);
177
+ });
178
+
179
+ expect(handleSubmitMock).toHaveBeenCalledTimes(1);
180
+ expect(onSubmitMock).toHaveBeenCalledTimes(1);
181
+ });
182
+ });
@@ -0,0 +1,285 @@
1
+ /* eslint-disable prefer-promise-reject-errors */
2
+ import RouteService from "@licklist/plugins/dist/services/Route/RouteService";
3
+ import { UserRegisterRequest } from "@licklist/plugins/dist/types/Request/UserRegisterRequest";
4
+ import { mount, shallow } from "enzyme";
5
+ import * as React from "react";
6
+ import { act } from "react-dom/test-utils";
7
+ import { MemoryRouter } from "react-router-dom";
8
+ import {
9
+ RegisterComponent,
10
+ RegisterFormComponent,
11
+ } from "../../../src/auth/Register";
12
+ import useAuthMock from "../../__mock__/hooks/useAuthMock";
13
+ import useNotificationMock from "../../__mock__/hooks/useNotificationMock";
14
+ import useTranslationMock from "../../__mock__/hooks/useTranslationMock";
15
+ import useUserApiMock from "../../__mock__/hooks/useUserApiMock";
16
+ import useUserMock from "../../__mock__/hooks/useUserMock";
17
+
18
+ jest.mock("moment", () => () => ({
19
+ year: jest.fn().mockReturnThis(),
20
+ month: jest.fn().mockReturnThis(),
21
+ date: jest.fn().mockReturnThis(),
22
+ diff: jest.fn().mockReturnThis(),
23
+ format: "format",
24
+ }));
25
+ jest.mock("react-i18next", () => ({
26
+ Trans: jest.fn().mockReturnValue("test"),
27
+ useTranslation: jest.fn(),
28
+ }));
29
+ jest.mock("react-hook-form", () => ({
30
+ Controller: () => "controller",
31
+ useForm: () => ({
32
+ register: jest.fn(),
33
+ handleSubmit: (callback: (e: any) => void) => (e: any) => callback(e),
34
+ formState: {
35
+ errors: jest.fn(),
36
+ dirtyFields: {
37
+ has: jest.fn(),
38
+ },
39
+ },
40
+ setValue: jest.fn(),
41
+ getValues: jest.fn(),
42
+ control: jest.fn(),
43
+ watch: jest.fn(),
44
+ }),
45
+ }));
46
+ jest.mock("@licklist/plugins/dist/context/app/hooks/useNotification");
47
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useAuth");
48
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useUser");
49
+ jest.mock("@licklist/plugins/dist/hooks/Api/useUserApi");
50
+
51
+ beforeEach(() => {
52
+ useTranslationMock();
53
+ useNotificationMock({
54
+ danger: jest.fn(),
55
+ success: jest.fn(),
56
+ });
57
+ useAuthMock({
58
+ setSecrets: jest.fn(),
59
+ });
60
+ useUserMock({
61
+ login: jest.fn(),
62
+ });
63
+ });
64
+
65
+ afterAll(() => {
66
+ jest.resetAllMocks();
67
+ });
68
+
69
+ describe("RegisterComponent", () => {
70
+ it("should be rendered without issues", () => {
71
+ const component = shallow(
72
+ <MemoryRouter initialEntries={["/"]}>
73
+ <RegisterComponent />
74
+ </MemoryRouter>
75
+ );
76
+
77
+ expect(component.exists()).toBeTruthy();
78
+ });
79
+
80
+ it("should show danger notification if register did not succeed", async () => {
81
+ let component: any;
82
+
83
+ const notificationDangerMock = jest.fn();
84
+ const notificationSuccessMock = jest.fn();
85
+ const registerMock = jest.fn(() =>
86
+ Promise.reject({
87
+ config: "",
88
+ request: "",
89
+ response: {
90
+ data: { errors: ["Something went wrong"] },
91
+ },
92
+ } as any)
93
+ );
94
+ const profileMock = jest.fn();
95
+
96
+ useNotificationMock({
97
+ danger: notificationDangerMock,
98
+ success: notificationSuccessMock,
99
+ });
100
+ useUserApiMock({
101
+ register: registerMock,
102
+ profile: profileMock,
103
+ });
104
+
105
+ RouteService.redirectTo = jest.fn();
106
+
107
+ act(() => {
108
+ component = mount(
109
+ <MemoryRouter>
110
+ <RegisterComponent />
111
+ </MemoryRouter>
112
+ );
113
+ });
114
+
115
+ await act(async () => {
116
+ const credentials: UserRegisterRequest = {
117
+ email: "email",
118
+ password: "password",
119
+ first_name: "first_name",
120
+ last_name: "last_name",
121
+ };
122
+
123
+ await component.find(RegisterFormComponent).prop("onSubmit")(credentials);
124
+ });
125
+
126
+ component.update();
127
+
128
+ expect(component.exists()).toBeTruthy();
129
+ expect(registerMock).toHaveBeenCalledTimes(1);
130
+ expect(notificationDangerMock).toHaveBeenCalledTimes(0);
131
+ expect(profileMock).toHaveBeenCalledTimes(0);
132
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(0);
133
+ });
134
+
135
+ it("should show danger notification if profile did not succeed", async () => {
136
+ let component: any;
137
+
138
+ const registerResponse = {
139
+ access_token: "access_token",
140
+ refresh_token: "refresh_token",
141
+ token_type: "token_type",
142
+ expires_in: null,
143
+ };
144
+
145
+ const notificationDangerMock = jest.fn();
146
+ const notificationSuccessMock = jest.fn();
147
+ const registerMock = jest.fn(() => Promise.resolve(registerResponse));
148
+ const profileMock = jest.fn(() => Promise.reject(new Error("danger")));
149
+ const setAuthorizationTokenMock = jest.fn();
150
+ const setSecretsMock = jest.fn();
151
+
152
+ useNotificationMock({
153
+ danger: notificationDangerMock,
154
+ success: notificationSuccessMock,
155
+ });
156
+ useUserApiMock({
157
+ register: registerMock,
158
+ profile: profileMock,
159
+ setAuthorizationToken: setAuthorizationTokenMock,
160
+ });
161
+ useAuthMock({
162
+ setSecrets: setSecretsMock,
163
+ });
164
+
165
+ RouteService.redirectTo = jest.fn();
166
+
167
+ act(() => {
168
+ component = mount(
169
+ <MemoryRouter>
170
+ <RegisterComponent />
171
+ </MemoryRouter>
172
+ );
173
+ });
174
+
175
+ await act(async () => {
176
+ const credentials: UserRegisterRequest = {
177
+ email: "email",
178
+ password: "password",
179
+ first_name: "first_name",
180
+ last_name: "last_name",
181
+ };
182
+
183
+ await component.find(RegisterFormComponent).prop("onSubmit")(credentials);
184
+ });
185
+
186
+ component.update();
187
+
188
+ expect(component.exists()).toBeTruthy();
189
+ expect(registerMock).toHaveBeenCalledTimes(1);
190
+ expect(setSecretsMock).toHaveBeenCalledTimes(1);
191
+ expect(setSecretsMock).toHaveBeenCalledWith(registerResponse);
192
+ expect(setAuthorizationTokenMock).toHaveBeenCalledTimes(1);
193
+ expect(setAuthorizationTokenMock).toHaveBeenCalledWith(
194
+ registerResponse.access_token
195
+ );
196
+ expect(profileMock).toHaveBeenCalledTimes(1);
197
+ expect(notificationDangerMock).toHaveBeenCalledTimes(1);
198
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(0);
199
+ });
200
+
201
+ it("should show success notification if register and profile did succeed", async () => {
202
+ let component: any;
203
+
204
+ const registerResponse = {
205
+ access_token: "access_token",
206
+ refresh_token: "refresh_token",
207
+ token_type: "token_type",
208
+ expires_in: null,
209
+ };
210
+ const profileResponse = {
211
+ id: 1,
212
+ first_name: "first_name",
213
+ last_name: "last_name",
214
+ email: "email",
215
+ role: null,
216
+ };
217
+
218
+ const notificationDangerMock = jest.fn();
219
+ const notificationSuccessMock = jest.fn();
220
+ const registerMock = jest.fn(() => Promise.resolve(registerResponse));
221
+ const profileMock = jest.fn(() =>
222
+ Promise.resolve({
223
+ error: false,
224
+ message: profileResponse,
225
+ })
226
+ );
227
+ const setAuthorizationTokenMock = jest.fn();
228
+ const setSecretsMock = jest.fn();
229
+ const userLoginMock = jest.fn();
230
+
231
+ useNotificationMock({
232
+ danger: notificationDangerMock,
233
+ success: notificationSuccessMock,
234
+ });
235
+ useUserApiMock({
236
+ register: registerMock,
237
+ profile: profileMock,
238
+ setAuthorizationToken: setAuthorizationTokenMock,
239
+ });
240
+ useAuthMock({
241
+ setSecrets: setSecretsMock,
242
+ });
243
+ useUserMock({
244
+ login: userLoginMock,
245
+ });
246
+
247
+ RouteService.redirectTo = jest.fn();
248
+
249
+ act(() => {
250
+ component = mount(
251
+ <MemoryRouter>
252
+ <RegisterComponent />
253
+ </MemoryRouter>
254
+ );
255
+ });
256
+
257
+ await act(async () => {
258
+ const credentials: UserRegisterRequest = {
259
+ email: "email",
260
+ password: "password",
261
+ first_name: "first_name",
262
+ last_name: "last_name",
263
+ };
264
+
265
+ await component.find(RegisterFormComponent).prop("onSubmit")(credentials);
266
+ });
267
+
268
+ component.update();
269
+
270
+ expect(component.exists()).toBeTruthy();
271
+ expect(registerMock).toHaveBeenCalledTimes(1);
272
+ expect(setSecretsMock).toHaveBeenCalledTimes(1);
273
+ expect(setSecretsMock).toHaveBeenCalledWith(registerResponse);
274
+ expect(setAuthorizationTokenMock).toHaveBeenCalledTimes(1);
275
+ expect(setAuthorizationTokenMock).toHaveBeenCalledWith(
276
+ registerResponse.access_token
277
+ );
278
+ expect(profileMock).toHaveBeenCalledTimes(1);
279
+ expect(userLoginMock).toHaveBeenCalledTimes(1);
280
+ expect(userLoginMock).toHaveBeenCalledWith(profileResponse);
281
+ expect(notificationDangerMock).toHaveBeenCalledTimes(0);
282
+ expect(notificationSuccessMock).toHaveBeenCalledTimes(1);
283
+ expect(RouteService.redirectTo).toHaveBeenCalledTimes(1);
284
+ });
285
+ });