@licklist/design 0.62.3-dev.1 → 0.62.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 (141) 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/EditEventForm/EditEventForm.d.ts +1 -3
  4. package/dist/events/edit-event-modal/component/EditEventForm/EditEventForm.d.ts.map +1 -1
  5. package/dist/events/edit-event-modal/component/EditEventForm/EditEventForm.js +1 -1
  6. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.d.ts +1 -3
  7. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.d.ts.map +1 -1
  8. package/dist/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.js +1 -1
  9. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.d.ts +1 -3
  10. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.d.ts.map +1 -1
  11. package/dist/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.js +1 -1
  12. package/dist/iframe/payment/order-items-table/utils/paymentSummary.js +1 -1
  13. package/dist/iframe/ryft/RyftPaymentForm.d.ts.map +1 -1
  14. package/dist/iframe/ryft/RyftPaymentForm.js +1 -1
  15. package/dist/iframe/ryft/utils/ryft-form.d.ts.map +1 -1
  16. package/dist/iframe/ryft/utils/ryft-form.js +1 -1
  17. package/dist/product-set/control/DateAndRecurrenceInput.d.ts +1 -1
  18. package/dist/product-set/control/DateAndRecurrenceInput.d.ts.map +1 -1
  19. package/dist/product-set/control/DateAndRecurrenceInput.js +1 -1
  20. package/dist/product-set/control/DateInput.d.ts.map +1 -1
  21. package/dist/product-set/control/DateInput.js +1 -1
  22. package/dist/product-set/control/ProductSetControl.d.ts +1 -1
  23. package/dist/product-set/control/ProductSetControl.d.ts.map +1 -1
  24. package/dist/product-set/form/ProductSetForm.d.ts +1 -4
  25. package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
  26. package/dist/product-set/hooks/useSortableTreeFunctions.d.ts.map +1 -1
  27. package/dist/product-set/product/ProductControl.d.ts.map +1 -1
  28. package/dist/product-set/product/ProductControl.js +1 -1
  29. package/dist/product-set/product/fixed-duration-fields/FixedDurationOptions.d.ts.map +1 -1
  30. package/dist/provider/working-hours-input/WorkingHoursInputDescription.d.ts.map +1 -1
  31. package/dist/provider/working-hours-input/WorkingHoursInputDescription.js +1 -1
  32. package/dist/recurring-date-picker-input/RecurrenceAndFrequencyInput.d.ts.map +1 -1
  33. package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts +1 -3
  34. package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts.map +1 -1
  35. package/dist/recurring-date-picker-input/RecurringDatePickerInput.js +1 -1
  36. package/dist/recurring-date-picker-input/utils.d.ts +0 -12
  37. package/dist/recurring-date-picker-input/utils.d.ts.map +1 -1
  38. package/dist/recurring-date-picker-input/utils.js +1 -1
  39. package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
  40. package/dist/sales/booking/results/components/ResultCard.js +1 -1
  41. package/dist/sales/coupon/control/CouponFormControl.d.ts +1 -2
  42. package/dist/sales/coupon/control/CouponFormControl.d.ts.map +1 -1
  43. package/dist/sales/coupon/control/CouponFormControl.js +1 -1
  44. package/dist/sales/coupon/form/CouponFrom.d.ts +2 -2
  45. package/dist/sales/coupon/form/CouponFrom.d.ts.map +1 -1
  46. package/dist/setting/admin/AdminSettingForm.d.ts +2 -2
  47. package/dist/setting/admin/AdminSettingForm.d.ts.map +1 -1
  48. package/dist/setting/dashboard/DashboardSettingForm.d.ts +0 -1
  49. package/dist/setting/dashboard/DashboardSettingForm.d.ts.map +1 -1
  50. package/dist/setting/dashboard/DashboardSettingForm.js +1 -1
  51. package/dist/styles/ryft-payment-form/RyftPaymentForm.scss +113 -99
  52. package/dist/styles/sales/BookingResults.scss +1 -1
  53. package/dist/typeahead/Typeahead.d.ts +1 -2
  54. package/dist/typeahead/Typeahead.d.ts.map +1 -1
  55. package/dist/typeahead/Typeahead.js +1 -1
  56. package/dist/zone/form/ZoneForm.d.ts +2 -2
  57. package/dist/zone/form/ZoneForm.d.ts.map +1 -1
  58. package/dist/zone/form/ZoneForm.js +1 -1
  59. package/dist/zone/form/components/ZoneControl.d.ts +2 -2
  60. package/dist/zone/form/components/ZoneControl.d.ts.map +1 -1
  61. package/dist/zone/form/components/ZoneControl.js +1 -1
  62. package/dist/zone/form/components/ZoneRecurrencesControl.d.ts +4 -4
  63. package/dist/zone/form/components/ZoneRecurrencesControl.d.ts.map +1 -1
  64. package/dist/zone/form/components/ZoneRecurrencesControl.js +1 -1
  65. package/dist/zone/form/utils/dates.d.ts.map +1 -1
  66. package/jest.config.js +29 -0
  67. package/package.json +35 -10
  68. package/src/date-time-button/DateTimeButton.stories.tsx +1 -2
  69. package/src/date-time-button/DateTimeButton.tsx +5 -7
  70. package/src/events/edit-event-modal/component/EditEventForm/EditEventForm.tsx +0 -4
  71. package/src/events/edit-event-modal/component/SelectEventProductSet/SelectEventProductSet.tsx +8 -10
  72. package/src/events/edit-event-modal/component/SelectEventProductSet/component/EditEventProductSet.tsx +0 -4
  73. package/src/iframe/payment/order-items-table/utils/paymentSummary.tsx +6 -6
  74. package/src/iframe/ryft/RyftPaymentForm.tsx +4 -12
  75. package/src/iframe/ryft/utils/ryft-form.ts +4 -8
  76. package/src/product-set/control/DateAndRecurrenceInput.tsx +2 -3
  77. package/src/product-set/control/DateInput.tsx +4 -2
  78. package/src/product-set/control/ProductSetControl.tsx +1 -1
  79. package/src/product-set/form/ProductCategoriesControl.tsx +1 -1
  80. package/src/product-set/form/ProductSetForm.tsx +1 -5
  81. package/src/product-set/hooks/useSortableTreeFunctions.ts +0 -2
  82. package/src/product-set/product/ProductControl.tsx +38 -38
  83. package/src/product-set/product/fixed-duration-fields/FixedDurationOptions.tsx +2 -0
  84. package/src/provider/working-hours-input/WorkingHoursInputDescription.tsx +18 -4
  85. package/src/recurring-date-picker-input/RecurrenceAndFrequencyInput.tsx +1 -0
  86. package/src/recurring-date-picker-input/RecurringDatePickerInput.tsx +1 -11
  87. package/src/recurring-date-picker-input/utils.ts +0 -77
  88. package/src/sales/booking/results/BookingResults.stories.tsx +2 -3
  89. package/src/sales/booking/results/components/ResultCard.tsx +5 -2
  90. package/src/sales/coupon/control/CouponFormControl.tsx +50 -29
  91. package/src/sales/coupon/form/CouponFrom.tsx +15 -5
  92. package/src/setting/admin/AdminSettingForm.tsx +2 -2
  93. package/src/setting/dashboard/DashboardSettingForm.tsx +0 -13
  94. package/src/sortable-tree/SortableTreeItem.tsx +1 -1
  95. package/src/static/switch/BooleanSwitch.tsx +1 -1
  96. package/src/styles/ryft-payment-form/RyftPaymentForm.scss +113 -99
  97. package/src/styles/sales/BookingResults.scss +1 -1
  98. package/src/typeahead/Typeahead.tsx +3 -16
  99. package/src/zone/form/ZoneForm.tsx +2 -3
  100. package/src/zone/form/components/ZoneControl.tsx +3 -3
  101. package/src/zone/form/components/ZoneRecurrencesControl.tsx +5 -7
  102. package/src/zone/form/utils/dates.ts +10 -9
  103. package/tests/Auth/Authorizer.test.tsx +194 -0
  104. package/tests/Auth/Layout/UserNavDropDown.test.tsx +43 -0
  105. package/tests/Auth/Layout/UserNavDropDownToggle.test.tsx +33 -0
  106. package/tests/Auth/Login/LoginComponent.test.tsx +246 -0
  107. package/tests/Auth/Login/LoginFormComponent.test.tsx +182 -0
  108. package/tests/Auth/Register/RegisterComponent.test.tsx +285 -0
  109. package/tests/Auth/Register/RegisterFormComponent.test.tsx +170 -0
  110. package/tests/Auth/Settings/Dashboard/IpInput.test.tsx +130 -0
  111. package/tests/Auth/Social/SocialCallbackComponent.test.tsx +133 -0
  112. package/tests/Auth/Social/SocialFormComponent.test.tsx +118 -0
  113. package/tests/FileUpload/FileUpload.test.tsx +42 -0
  114. package/tests/Notification/EmailTemplate.test.tsx +82 -0
  115. package/tests/ProductSet/ProductSetPopover.test.tsx +40 -0
  116. package/tests/Report/Report.test.tsx +48 -0
  117. package/tests/Sales/Coupon.test.tsx +51 -0
  118. package/tests/Sales/SalesAndVIews.test.tsx +63 -0
  119. package/tests/SnippetTemplates/SnippetTemplates.test.tsx +56 -0
  120. package/tests/Table/FilterHelperComponent.test.tsx +88 -0
  121. package/tests/Table/PaginationHelperComponent.test.tsx +109 -0
  122. package/tests/Table/PerPageHelperComponent.test.tsx +34 -0
  123. package/tests/Table/TableHelperComponent.test.tsx +295 -0
  124. package/tests/TipTapEditor/TipTapEditor.test.tsx +28 -0
  125. package/tests/__mock__/hooks/useAuthApi.ts +13 -0
  126. package/tests/__mock__/hooks/useAuthMock.ts +13 -0
  127. package/tests/__mock__/hooks/useFormMock.ts +27 -0
  128. package/tests/__mock__/hooks/useNotificationMock.ts +13 -0
  129. package/tests/__mock__/hooks/useQueryMock.ts +16 -0
  130. package/tests/__mock__/hooks/useSocialApiMock.ts +20 -0
  131. package/tests/__mock__/hooks/useTranslationMock.ts +17 -0
  132. package/tests/__mock__/hooks/useUserApiMock.ts +18 -0
  133. package/tests/__mock__/hooks/useUserMock.ts +13 -0
  134. package/tests/__mock__/styleMock.js +1 -0
  135. package/tests/__mock__/windowMock.ts +5 -0
  136. package/tests/packages/react-query.tsx +28 -0
  137. package/tests/setupTests.ts +10 -0
  138. package/dist/sales/coupon/utils/index.d.ts +0 -7
  139. package/dist/sales/coupon/utils/index.d.ts.map +0 -1
  140. package/dist/sales/coupon/utils/index.js +0 -1
  141. package/src/sales/coupon/utils/index.ts +0 -13
@@ -47,127 +47,141 @@
47
47
  margin-left: 0.5rem;
48
48
  }
49
49
 
50
+ .ryft-payment-form {
51
+ .submit-button-wrapper {
52
+ margin: -1rem 0 1rem;
53
+
54
+ button {
55
+ width: 100%;
56
+ }
57
+ }
58
+ #mobile-pay-divider-container {
59
+ display: flex;
60
+ position: relative;
61
+ margin-bottom: 1rem;
62
+ #mobile-pay-divider-text {
63
+ margin-right: 1rem;
64
+ font-size: 0.875rem;
65
+ font-weight: 600;
66
+ }
67
+ #mobile-pay-divider {
68
+ width: 100%;
69
+ border-bottom: 1px #dfdfdf solid;
70
+ margin-bottom: 0.6rem;
71
+ }
72
+ }
73
+
74
+ #card-title-container {
75
+ height: auto;
76
+ border: none;
77
+ margin-bottom: 0.5rem;
78
+ text-align: left;
79
+ :first-child {
80
+ font-size: 1rem;
81
+ font-weight: 600;
82
+ margin-bottom: 1rem;
83
+ }
84
+
85
+ .form-label {
86
+ margin-bottom: 0.5rem;
87
+ }
88
+ }
89
+ .mobile-pay-title {
90
+ display: block;
91
+ font-weight: 600;
92
+ font-size: 1rem;
93
+ color: black;
94
+ padding: 0;
95
+ font-style: normal;
96
+ font-family: inherit;
97
+ margin-bottom: 1rem;
98
+ }
99
+ }
50
100
  .form {
51
101
  .input {
52
102
  border: 2px solid #525252 !important;
53
103
  }
54
104
  }
55
105
 
56
- @include media-breakpoint-down(sm) {
57
- .left-block-container {
58
- max-height: 100%;
59
- overflow: visible;
106
+ .ryft-payment-form {
107
+ @include media-breakpoint-up(md) {
108
+ .submit-button-wrapper {
109
+ max-width: 15.5rem;
110
+ }
111
+ }
112
+
113
+ // it's style for Google and Apple pay container, for unknown reasons we can't move this html elements with appendChild or replaceChild
114
+ .ryft-pay-grid {
115
+ width: 100%;
116
+ max-width: 15.5rem;
117
+ margin-bottom: 1rem;
118
+ }
119
+ .ryft-pay-apple-pay-button {
120
+ border-radius: 0.25rem;
60
121
  }
61
122
  }
62
- }
63
123
 
124
+ .divider {
125
+ display: none !important;
126
+ }
127
+ }
64
128
  @include media-breakpoint-down(sm) {
65
- flex-direction: column-reverse;
66
- overflow: scroll;
129
+ .left-block-container {
130
+ max-height: 100%;
131
+ overflow: visible;
132
+ }
133
+ }
134
+ }
67
135
 
68
- @include media-breakpoint-down(sm) {
69
- .left-block {
70
- min-height: 100%;
71
- }
72
- .right-block {
73
- margin: 0 auto;
74
- width: 100%;
75
- .children-wrapper {
76
- .accordion {
77
- .collapse {
78
- overflow: visible;
79
- overflow-x: unset;
80
- scrollbar-width: unset;
81
- }
136
+ @include media-breakpoint-down(sm) {
137
+ flex-direction: column-reverse;
138
+ overflow: scroll;
139
+
140
+ @include media-breakpoint-down(sm) {
141
+ .left-block {
142
+ min-height: 100%;
143
+ }
144
+ .right-block {
145
+ margin: 0 auto;
146
+ width: 100%;
147
+ .children-wrapper {
148
+ .accordion {
149
+ .collapse {
150
+ overflow: visible;
151
+ overflow-x: unset;
152
+ scrollbar-width: unset;
82
153
  }
83
154
  }
84
155
  }
85
156
  }
86
157
  }
87
158
  }
88
- ::-webkit-scrollbar {
89
- display: none;
90
- scrollbar-width: none;
91
- }
92
159
  }
93
- }
94
-
95
- #ryft-threeDSMethodIframe {
96
- display: none;
97
- }
98
-
99
- .ryft-payment-form {
100
- .submit-button-wrapper {
101
- margin: -1rem 0 1rem;
102
-
103
- button {
104
- width: 100%;
105
- }
106
- }
107
- #mobile-pay-divider-container {
108
- display: flex;
109
- position: relative;
110
- margin-bottom: 1rem;
111
- #mobile-pay-divider-text {
112
- margin-right: 1rem;
113
- font-size: 0.875rem;
114
- font-weight: 600;
115
- }
116
- #mobile-pay-divider {
117
- width: 100%;
118
- border-bottom: 1px #dfdfdf solid;
119
- margin-bottom: 0.6rem;
120
- }
121
- }
122
-
123
- #card-title-container {
124
- height: auto;
125
- border: none;
126
- margin-bottom: 0.5rem;
127
- text-align: left;
128
- :first-child {
129
- font-size: 1rem;
130
- font-weight: 600;
131
- margin-bottom: 1rem;
132
- }
133
-
134
- .form-label {
135
- margin-bottom: 0.5rem;
136
- }
137
- }
138
- .mobile-pay-title {
139
- display: block;
140
- font-weight: 600;
141
- font-size: 1rem;
142
- color: black;
143
- padding: 0;
144
- font-style: normal;
145
- font-family: inherit;
146
- margin-bottom: 1rem;
160
+ ::-webkit-scrollbar {
161
+ display: none;
162
+ scrollbar-width: none;
147
163
  }
148
164
  }
149
165
 
150
- @include media-breakpoint-up(md) {
151
- .ryft-payment-form,
152
- .iframe-payment-form {
153
- position: relative;
154
- max-height: 300px !important;
155
- .submit-button-wrapper {
156
- max-width: 15.5rem;
166
+ @include media-breakpoint-down(md) {
167
+ .payment_link {
168
+ .page-body {
169
+ .left-block {
170
+ .left-block-container {
171
+ .ryft-payment-form {
172
+ position: relative;
173
+ max-height: 300px !important;
174
+ .ryft-pay-grid {
175
+ width: 100%;
176
+ max-width: 100%;
177
+ }
178
+ }
179
+ }
180
+ }
157
181
  }
158
182
  }
183
+ }
159
184
 
160
- // it's style for Google and Apple pay container, for unknown reasons we can't move this html elements with appendChild or replaceChild
161
- .ryft-pay-grid {
162
- width: 100%;
163
- max-width: 15.5rem;
164
- margin-bottom: 1rem;
165
- }
166
- .ryft-pay-apple-pay-button {
167
- border-radius: 0.25rem;
168
- }
169
-
170
- .divider {
171
- display: none !important;
172
- }
185
+ #ryft-threeDSMethodIframe {
186
+ display: none;
173
187
  }
@@ -5,7 +5,7 @@
5
5
  flex-wrap: wrap;
6
6
 
7
7
  .result-card {
8
- height: 14rem;
8
+ height: 14.25rem;
9
9
  border: 1px solid $gray-400;
10
10
  max-width: calc(50% - 0.75rem);
11
11
  flex: 0 0 calc(50% - 0.75rem);
@@ -16,7 +16,6 @@ export interface TypeaheadProps {
16
16
  isMultipleChoise?: boolean;
17
17
  noOptionsMessage: string;
18
18
  isInvalid?: boolean;
19
- isCouponForm?: boolean;
20
19
  }
21
20
 
22
21
  function Typeahead({
@@ -25,25 +24,13 @@ function Typeahead({
25
24
  isRequired = false,
26
25
  isMultipleChoise,
27
26
  name = "",
28
- isCouponForm = false,
29
27
  noOptionsMessage = "",
30
28
  isInvalid,
31
29
  }: TypeaheadProps) {
32
30
  const { control } = useFormContext();
33
31
 
34
- const getStyle = (): CSSObjectWithLabel => {
35
- const couponFormStyle = isCouponForm
36
- ? {
37
- borderRadius: "1rem",
38
- minHeight: "3rem",
39
- }
40
- : {};
41
- return isInvalid
42
- ? { borderColor: "red", ...couponFormStyle }
43
- : {
44
- ...couponFormStyle,
45
- };
46
- };
32
+ const getErrorStyle = (): CSSObjectWithLabel =>
33
+ isInvalid ? { borderColor: "red" } : {};
47
34
 
48
35
  return (
49
36
  <>
@@ -59,7 +46,7 @@ function Typeahead({
59
46
  styles={{
60
47
  control: (base) => ({
61
48
  ...base,
62
- ...getStyle(),
49
+ ...getErrorStyle(),
63
50
  }),
64
51
  }}
65
52
  onChange={(value) => {
@@ -13,7 +13,7 @@ export type ZoneFormProps = {
13
13
  onSubmit: (values: Partial<Zone>) => void;
14
14
  serverErrors?: ServerError;
15
15
  isLoading?: boolean;
16
- workHours: WorkHour[] | undefined;
16
+ workHours?: WorkHour[];
17
17
  };
18
18
 
19
19
  export type ZoneFormValues = Partial<Zone> & {
@@ -25,7 +25,6 @@ export const ZoneForm = ({
25
25
  onSubmit,
26
26
  serverErrors,
27
27
  isLoading = false,
28
- workHours,
29
28
  }: ZoneFormProps) => {
30
29
  const { t } = useTranslation("Design");
31
30
  const form = useForm<ZoneFormValues>({
@@ -55,7 +54,7 @@ export const ZoneForm = ({
55
54
  return (
56
55
  <FormProvider {...form}>
57
56
  <Form onSubmit={handleSubmit(onFormSubmit)}>
58
- <ZoneControl isLoading={isLoading} workHours={workHours} />
57
+ <ZoneControl isLoading={isLoading} />
59
58
  <Row>
60
59
  <Col md={6} sm={12} />
61
60
  <Col
@@ -11,15 +11,15 @@ import { GameDurationControl } from "./GameDurationControl";
11
11
 
12
12
  export type ZoneControlProps = {
13
13
  isLoading: boolean;
14
- workHours: WorkHour[] | undefined;
14
+ workHours?: WorkHour[];
15
15
  };
16
16
 
17
- export const ZoneControl = ({ isLoading, workHours }: ZoneControlProps) => {
17
+ export const ZoneControl = ({ isLoading }: ZoneControlProps) => {
18
18
  return (
19
19
  <Row>
20
20
  <Col md={6} sm={12} className="pr-5">
21
21
  <NameControl isLoading={isLoading} />
22
- <ZoneRecurrencesControl workHours={workHours} />
22
+ <ZoneRecurrencesControl />
23
23
  <hr />
24
24
  <Row>
25
25
  <Col md={6} sm={6}>
@@ -25,13 +25,12 @@ export interface DateAndRecurrenceInputValues {
25
25
  zoneRecurrences?: Partial<ZoneRecurrence>[];
26
26
  }
27
27
 
28
- type ZoneRecurrenceControlProps = {
29
- workHours: WorkHour[] | undefined;
28
+ export type ZoneRecurrenceControlProps = {
29
+ workHours?: WorkHour[];
30
+ isLoading?: boolean;
30
31
  };
31
32
 
32
- export const ZoneRecurrencesControl = ({
33
- workHours,
34
- }: ZoneRecurrenceControlProps) => {
33
+ export const ZoneRecurrencesControl = () => {
35
34
  const {
36
35
  control,
37
36
  register,
@@ -70,7 +69,7 @@ export const ZoneRecurrencesControl = ({
70
69
  clearEditState();
71
70
  });
72
71
 
73
- const popoverId = useId();
72
+ const popoverId = useId()!;
74
73
 
75
74
  const { t } = useTranslation(["Design", "Validation"]);
76
75
 
@@ -167,7 +166,6 @@ export const ZoneRecurrencesControl = ({
167
166
  onChange={handleRecurringDateChange}
168
167
  onDelete={handleDelete}
169
168
  setInitialStartDateAfterSelect
170
- workHours={workHours}
171
169
  />
172
170
  </Popover.Content>
173
171
  </Popover>
@@ -53,17 +53,18 @@ export const getCheckboxesByWorkHours = (workHours?: WorkHour[]) => {
53
53
  if (!workHours || !workHours.length)
54
54
  return getTimeCheckboxRanges(DEFAULT_START_DAY_TIME, DEFAULT_END_DAY_TIME);
55
55
 
56
- const providerWorkHoursByWeek = workHours.reduce<
57
- { start: string; end: string }[]
58
- >((workHoursNextArray, currentWorkHour) => {
59
- const { start, end } = currentWorkHour;
56
+ const providerWorkHoursByWeek = workHours.reduce(
57
+ (workHoursNextArray: { start: string; end: string }[], currentWorkHour) => {
58
+ const { start, end } = currentWorkHour;
60
59
 
61
- if (start && end) {
62
- return [...workHoursNextArray, { start, end }];
63
- }
60
+ if (start && end) {
61
+ return [...workHoursNextArray, { start, end }];
62
+ }
64
63
 
65
- return workHoursNextArray;
66
- }, []);
64
+ return workHoursNextArray;
65
+ },
66
+ []
67
+ );
67
68
 
68
69
  // If venue has filled only 1 work day from wee
69
70
  // For another days we use default 00:00 and 23:59
@@ -0,0 +1,194 @@
1
+ import RouteService from "@licklist/plugins/dist/services/Route/RouteService";
2
+ import { mount, shallow } from "enzyme";
3
+ import * as React from "react";
4
+ import { act } from "react-dom/test-utils";
5
+ import { QueryClientProvider } from "react-query";
6
+ import { Authorizer } from "../../src/auth/Authorizer";
7
+ import useAuthMock from "../__mock__/hooks/useAuthMock";
8
+ import useUserMock from "../__mock__/hooks/useUserMock";
9
+ import useAuthApi from "../__mock__/hooks/useAuthApi";
10
+ import { queryClient } from "../packages/react-query";
11
+
12
+ jest.mock("react-i18next", () => ({
13
+ Trans: jest.fn().mockReturnValue("test"),
14
+ useTranslation: () => ({
15
+ t: jest.fn((arg) => arg),
16
+ }),
17
+ }));
18
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useAuth");
19
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useUser");
20
+ jest.mock("@licklist/plugins/dist/hooks/Api/useAuthApi");
21
+
22
+ const DEFAULT_PROFILE_RESPONSE = {
23
+ useProfile: () => ({
24
+ isLoading: false,
25
+ isFetching: false,
26
+ isError: false,
27
+ data: { access_token: "test" },
28
+ }),
29
+ };
30
+
31
+ const DEFAULT_PROFILE_LOADING_RESPONSE = {
32
+ useProfile: () => ({
33
+ isLoading: true,
34
+ isFetching: false,
35
+ isError: false,
36
+ data: { access_token: "test" },
37
+ }),
38
+ };
39
+
40
+ describe("Authorizer", () => {
41
+ it("should be rendered without issues", () => {
42
+ useAuthMock({
43
+ secrets: null,
44
+ });
45
+ useUserMock({
46
+ profile: null,
47
+ });
48
+ useAuthApi(DEFAULT_PROFILE_LOADING_RESPONSE);
49
+
50
+ const component = shallow(
51
+ <QueryClientProvider client={queryClient}>
52
+ <Authorizer />
53
+ </QueryClientProvider>
54
+ );
55
+
56
+ expect(component.exists()).toBeTruthy();
57
+ });
58
+
59
+ it("should render children if authorized", () => {
60
+ let component: any;
61
+
62
+ useAuthMock({
63
+ secrets: "not-null",
64
+ });
65
+ useUserMock({
66
+ profile: "not-null",
67
+ });
68
+ useAuthApi(DEFAULT_PROFILE_LOADING_RESPONSE);
69
+
70
+ RouteService.getCurrentPage = jest.fn();
71
+ RouteService.getCurrentRoute = jest.fn();
72
+ RouteService.cleanRedirect = jest.fn();
73
+
74
+ act(() => {
75
+ component = mount(
76
+ <QueryClientProvider client={queryClient}>
77
+ <Authorizer>
78
+ <p>test</p>
79
+ </Authorizer>
80
+ </QueryClientProvider>
81
+ );
82
+ });
83
+
84
+ component.update();
85
+
86
+ expect(RouteService.getCurrentPage).toHaveBeenCalledTimes(0);
87
+ expect(RouteService.getCurrentRoute).toHaveBeenCalledTimes(0);
88
+ expect(RouteService.cleanRedirect).toHaveBeenCalledTimes(0);
89
+ expect(component.exists()).toBeTruthy();
90
+ expect(component.find("BlockLoader").exists()).toBeTruthy();
91
+ });
92
+
93
+ it("should render children if current page is login", () => {
94
+ let component: any;
95
+
96
+ useAuthMock({
97
+ secrets: null,
98
+ });
99
+ useUserMock({
100
+ profile: null,
101
+ });
102
+ useAuthApi(DEFAULT_PROFILE_LOADING_RESPONSE);
103
+
104
+ RouteService.getCurrentPage = jest.fn().mockReturnValue("/login");
105
+ RouteService.getCurrentRoute = jest.fn();
106
+ RouteService.cleanRedirect = jest.fn();
107
+
108
+ act(() => {
109
+ component = mount(
110
+ <QueryClientProvider client={queryClient}>
111
+ <Authorizer>
112
+ <p>test</p>
113
+ </Authorizer>
114
+ </QueryClientProvider>
115
+ );
116
+ });
117
+
118
+ component.update();
119
+
120
+ expect(RouteService.getCurrentPage).toHaveBeenCalledTimes(0);
121
+ expect(RouteService.getCurrentRoute).toHaveBeenCalledTimes(0);
122
+ expect(RouteService.cleanRedirect).toHaveBeenCalledTimes(0);
123
+ expect(component.exists()).toBeTruthy();
124
+ expect(component.find("BlockLoader").exists()).toBeTruthy();
125
+ });
126
+
127
+ it("should NOT render children if profile is loading or fetching", () => {
128
+ let component: any;
129
+
130
+ useAuthMock({
131
+ secrets: null,
132
+ });
133
+ useUserMock({
134
+ profile: null,
135
+ });
136
+ useAuthApi(DEFAULT_PROFILE_LOADING_RESPONSE);
137
+
138
+ RouteService.getCurrentPage = jest.fn();
139
+ RouteService.getCurrentRoute = jest.fn();
140
+ RouteService.cleanRedirect = jest.fn();
141
+
142
+ act(() => {
143
+ component = mount(
144
+ <QueryClientProvider client={queryClient}>
145
+ <Authorizer>
146
+ <p>test</p>
147
+ </Authorizer>
148
+ </QueryClientProvider>
149
+ );
150
+ });
151
+
152
+ component.update();
153
+
154
+ expect(RouteService.getCurrentPage).toHaveBeenCalledTimes(0);
155
+ expect(RouteService.getCurrentRoute).toHaveBeenCalledTimes(0);
156
+ expect(RouteService.cleanRedirect).toHaveBeenCalledTimes(0);
157
+ expect(component.exists()).toBeTruthy();
158
+ expect(component.find("BlockLoader").exists()).toBeTruthy();
159
+ });
160
+
161
+ it("should NOT render children if unauthorized and current page is not login", () => {
162
+ let component: any;
163
+
164
+ useAuthMock({
165
+ secrets: null,
166
+ });
167
+ useUserMock({
168
+ profile: null,
169
+ });
170
+ useAuthApi(DEFAULT_PROFILE_RESPONSE);
171
+
172
+ RouteService.getCurrentPage = jest.fn();
173
+ RouteService.getCurrentRoute = jest.fn();
174
+ RouteService.cleanRedirect = jest.fn();
175
+
176
+ act(() => {
177
+ component = mount(
178
+ <QueryClientProvider client={queryClient}>
179
+ <Authorizer>
180
+ <p>test</p>
181
+ </Authorizer>
182
+ </QueryClientProvider>
183
+ );
184
+ });
185
+
186
+ component.update();
187
+
188
+ expect(RouteService.getCurrentPage).toHaveBeenCalledTimes(3);
189
+ expect(RouteService.getCurrentRoute).toHaveBeenCalledTimes(1);
190
+ expect(RouteService.cleanRedirect).toHaveBeenCalledTimes(1);
191
+ expect(component.exists()).toBeTruthy();
192
+ expect(component.find("BlockLoader").exists()).toBeTruthy();
193
+ });
194
+ });
@@ -0,0 +1,43 @@
1
+ import RouteService from "@licklist/plugins/dist/services/Route/RouteService";
2
+ import { mount, shallow } from "enzyme";
3
+ import * as React from "react";
4
+ import useTranslationMock from "../../__mock__/hooks/useTranslationMock";
5
+ import useUserMock from "../../__mock__/hooks/useUserMock";
6
+ import { UserNavDropDown } from "../../../src/auth/Layout/UserNavDropDown";
7
+
8
+ jest.mock("react-i18next");
9
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useUser");
10
+
11
+ describe("UserNavDropDown", () => {
12
+ it("should be rendered without issues", () => {
13
+ useTranslationMock({
14
+ t: jest.fn(),
15
+ });
16
+ useUserMock({
17
+ profile: null,
18
+ });
19
+
20
+ const component = shallow(<UserNavDropDown />);
21
+
22
+ expect(component.exists()).toBeTruthy();
23
+ });
24
+
25
+ it("should logout on click", () => {
26
+ useTranslationMock({
27
+ t: jest.fn(),
28
+ });
29
+ useUserMock({
30
+ logout: jest.fn(),
31
+ });
32
+
33
+ RouteService.redirectTo = jest.fn();
34
+
35
+ const component = mount(<UserNavDropDown />);
36
+
37
+ expect(component.exists()).toBeTruthy();
38
+
39
+ component.children().prop("onClick")();
40
+
41
+ expect(RouteService.redirectTo).toHaveBeenCalledTimes(1);
42
+ });
43
+ });
@@ -0,0 +1,33 @@
1
+ import { IUser } from "@licklist/plugins/dist/types/context/user/IUser";
2
+ import { shallow } from "enzyme";
3
+ import * as React from "react";
4
+ import { UserNavDropDownToggle } from "../../../src/auth/Layout/UserNavDropDownToggle";
5
+ import useTranslationMock from "../../__mock__/hooks/useTranslationMock";
6
+
7
+ jest.mock("react-i18next");
8
+ jest.mock("@licklist/plugins/dist/context/user/hooks/useUser");
9
+
10
+ const user: IUser = {
11
+ id: 1,
12
+ first_name: "first_name",
13
+ last_name: "last_name",
14
+ email: "email",
15
+ user_roles: [],
16
+ user_detail: {
17
+ postcode: "",
18
+ birthday: "",
19
+ phone: "",
20
+ },
21
+ };
22
+
23
+ describe("UserNavDropDownToggle", () => {
24
+ it("should be rendered without issues", () => {
25
+ useTranslationMock({
26
+ t: jest.fn(),
27
+ });
28
+
29
+ const component = shallow(<UserNavDropDownToggle user={user} />);
30
+
31
+ expect(component.exists()).toBeTruthy();
32
+ });
33
+ });