@griddo/ax 1.71.0 → 1.72.0

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 (90) hide show
  1. package/package.json +2 -2
  2. package/src/Style/index.tsx +1 -1
  3. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +1 -1
  4. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +1 -1
  5. package/src/__tests__/components/FieldContainer/FieldContainer.test.tsx +82 -0
  6. package/src/__tests__/components/Fields/AnalyticsField/AnalyticsField.test.tsx +1 -1
  7. package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +1 -1
  8. package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +1 -1
  9. package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +2 -2
  10. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +3 -3
  11. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +1 -1
  12. package/src/__tests__/components/Fields/CheckField/CheckField.test.tsx +6 -6
  13. package/src/__tests__/components/Fields/CheckGroup/CheckGroup.test.tsx +15 -15
  14. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +6 -6
  15. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +1 -1
  16. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +7 -7
  17. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +9 -9
  18. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +5 -5
  19. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +1 -1
  20. package/src/__tests__/components/Fields/ConditionalField/ConditionalField.test.tsx +1 -1
  21. package/src/__tests__/components/Fields/DateField/DateField.test.tsx +1 -1
  22. package/src/__tests__/components/Fields/FieldGroup/FieldGroup.test.tsx +1 -1
  23. package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +1 -1
  24. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +3 -3
  25. package/src/__tests__/components/Fields/HeadingField/HeadingField.test.tsx +6 -6
  26. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +1 -1
  27. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +3 -3
  28. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +1 -1
  29. package/src/__tests__/components/Fields/MultiCheckSelectGroup/MultiCheckSelectGroup.test.tsx +2 -2
  30. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +1 -1
  31. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +1 -1
  32. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +1 -1
  33. package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +96 -8
  34. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +1 -1
  35. package/src/__tests__/components/Fields/Select/Select.test.tsx +2 -2
  36. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +1 -1
  37. package/src/__tests__/components/Fields/TagField/TagField.test.tsx +1 -1
  38. package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +1 -1
  39. package/src/__tests__/components/Fields/TextField/TextField.test.tsx +6 -6
  40. package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +1 -1
  41. package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +1 -1
  42. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +1 -1
  43. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +3 -2
  44. package/src/__tests__/components/Fields/UniqueCheck/UniqueCheck.test.tsx +3 -3
  45. package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +4 -4
  46. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +1 -1
  47. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +3 -3
  48. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +1 -1
  49. package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.test.tsx +1 -1
  50. package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +149 -0
  51. package/src/__tests__/components/TableFilters/CategoryFilter/CategoryFilter.test.tsx +241 -0
  52. package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +131 -0
  53. package/src/__tests__/components/TableFilters/DateFilter/DateFilter.test.tsx +148 -0
  54. package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +265 -0
  55. package/src/__tests__/components/TableFilters/NameFilter/NameFilter.test.tsx +197 -0
  56. package/src/__tests__/components/TableFilters/SiteFilter/SiteFilter.test.tsx +317 -0
  57. package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +197 -0
  58. package/src/__tests__/components/TableFilters/TranslationsFilter/TranslationsFilter.test.tsx +157 -0
  59. package/src/__tests__/components/TableFilters/TypeFilter/TypeFilter.test.tsx +164 -0
  60. package/src/__tests__/components/TableList/TableList.test.tsx +2 -2
  61. package/src/__tests__/components/Tabs/Tabs.test.tsx +36 -33
  62. package/src/__tests__/components/Tag/Tag.test.tsx +4 -2
  63. package/src/__tests__/components/Toast/Toast.test.tsx +4 -2
  64. package/src/components/FieldContainer/index.tsx +3 -3
  65. package/src/components/Fields/CheckField/index.tsx +3 -3
  66. package/src/components/Fields/CheckGroup/index.tsx +2 -2
  67. package/src/components/Fields/HeadingField/index.tsx +1 -1
  68. package/src/components/Fields/Select/index.tsx +1 -1
  69. package/src/components/Fields/TextField/index.tsx +2 -7
  70. package/src/components/FieldsBehavior/index.tsx +1 -1
  71. package/src/components/FloatingMenu/index.tsx +1 -1
  72. package/src/components/IconAction/index.tsx +1 -1
  73. package/src/components/Lists/index.tsx +1 -1
  74. package/src/components/TableFilters/CategoryFilter/index.tsx +2 -2
  75. package/src/components/TableFilters/CategoryFilter/style.tsx +1 -10
  76. package/src/components/TableFilters/CustomizeFilters/index.tsx +2 -3
  77. package/src/components/TableFilters/DateFilter/index.tsx +4 -4
  78. package/src/components/TableFilters/LiveFilter/index.tsx +1 -1
  79. package/src/components/TableFilters/LiveFilter/style.tsx +2 -10
  80. package/src/components/TableFilters/NameFilter/index.tsx +4 -4
  81. package/src/components/TableFilters/SiteFilter/index.tsx +16 -13
  82. package/src/components/TableFilters/SiteFilter/style.tsx +1 -10
  83. package/src/components/TableFilters/StatusFilter/index.tsx +3 -3
  84. package/src/components/TableFilters/TranslationsFilter/index.tsx +4 -7
  85. package/src/components/TableFilters/TranslationsFilter/style.tsx +1 -10
  86. package/src/components/TableFilters/TypeFilter/index.tsx +2 -2
  87. package/src/components/TableFilters/TypeFilter/style.tsx +1 -10
  88. package/src/components/Tooltip/index.tsx +1 -1
  89. package/src/helpers/index.tsx +3 -0
  90. package/src/helpers/parseTheme.js +456 -0
@@ -0,0 +1,317 @@
1
+ import * as React from "react";
2
+ import axios from "axios";
3
+ import { ThemeProvider } from "styled-components";
4
+ import { CalledWithMock, mock } from "jest-mock-extended";
5
+ import { render, screen, cleanup, act, fireEvent } from "@testing-library/react";
6
+ import { parseTheme } from "@ax/helpers";
7
+
8
+ import SiteFilter, { ISiteFilterProps } from "@ax/components/TableFilters/SiteFilter";
9
+ import globalTheme from "@ax/themes/theme.json";
10
+
11
+ afterEach(cleanup);
12
+ jest.mock("axios");
13
+ const mockedAxios = axios as jest.MockedFunction<typeof axios>;
14
+ const defaultProps = mock<ISiteFilterProps>();
15
+
16
+ describe("SiteFilter component rendering", () => {
17
+ it("should render site filter with label", async () => {
18
+ defaultProps.value = { order: "", filterSites: "noFilter" };
19
+ defaultProps.pointer = "filterSites";
20
+ defaultProps.center = true;
21
+ defaultProps.label = "Site";
22
+ defaultProps.selectAllOption = "noFilter";
23
+ defaultProps.filters = [
24
+ {
25
+ name: "all",
26
+ value: "all",
27
+ title: "All",
28
+ },
29
+ ];
30
+ const filterItems = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
31
+
32
+ defaultProps.filterItems = filterItems;
33
+ const data = {
34
+ data: [
35
+ { value: 1, label: "Site 1" },
36
+ { value: 2, label: "Site 2" },
37
+ { value: 3, label: "Site 3" },
38
+ { value: 4, label: "Site 4" },
39
+ { value: 5, label: "Site 5" },
40
+ ],
41
+ status: 200,
42
+ statusText: "Ok",
43
+ headers: {},
44
+ config: {},
45
+ };
46
+
47
+ mockedAxios.mockResolvedValue(data);
48
+
49
+ await act(async () => {
50
+ render(
51
+ <ThemeProvider theme={parseTheme(globalTheme)}>
52
+ <SiteFilter {...defaultProps} />
53
+ </ThemeProvider>
54
+ );
55
+ });
56
+
57
+ const siteFilter = screen.getByTestId("floating-menu");
58
+ expect(siteFilter).toBeTruthy();
59
+ expect(siteFilter.textContent).toEqual("Site");
60
+ });
61
+
62
+ it("should render the component with no options", async () => {
63
+ defaultProps.value = { order: "", filterSites: "noFilter" };
64
+ defaultProps.pointer = "filterSites";
65
+ defaultProps.center = true;
66
+ defaultProps.label = "Site";
67
+ defaultProps.selectAllOption = "noFilter";
68
+ defaultProps.filters = [
69
+ {
70
+ name: "all",
71
+ value: "all",
72
+ title: "All",
73
+ },
74
+ ];
75
+ const filterItems = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
76
+
77
+ defaultProps.filterItems = filterItems;
78
+
79
+ const data = {
80
+ data: [],
81
+ status: 500,
82
+ statusText: "Internal Server Error",
83
+ headers: {},
84
+ config: {},
85
+ };
86
+
87
+ mockedAxios.mockResolvedValue(data);
88
+
89
+ await act(async () => {
90
+ render(
91
+ <ThemeProvider theme={parseTheme(globalTheme)}>
92
+ <SiteFilter {...defaultProps} />
93
+ </ThemeProvider>
94
+ );
95
+ });
96
+
97
+ const siteFilterButton = screen.getByTestId("floating-menu-button");
98
+ expect(siteFilterButton).toBeTruthy();
99
+ fireEvent.click(siteFilterButton);
100
+ const floatingMenu = screen.getByTestId("floating-menu");
101
+ expect(floatingMenu).toBeTruthy();
102
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
103
+ expect(checkGroupFieldGroup).toBeTruthy();
104
+ const checkFieldInputs = screen.getAllByTestId<HTMLInputElement>("check-field-input");
105
+ expect(checkFieldInputs).toHaveLength(1);
106
+ });
107
+ });
108
+
109
+ describe("SiteFilter events", () => {
110
+ it("should render check group on click", async () => {
111
+ defaultProps.value = { order: "", filterSites: "noFilter" };
112
+ defaultProps.pointer = "filterSites";
113
+ defaultProps.center = true;
114
+ defaultProps.label = "Site";
115
+ defaultProps.selectAllOption = "noFilter";
116
+ defaultProps.filters = [
117
+ {
118
+ name: "all",
119
+ value: "all",
120
+ title: "All",
121
+ },
122
+ ];
123
+ const filterItemsMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
124
+
125
+ defaultProps.filterItems = filterItemsMock;
126
+ const data = {
127
+ data: [
128
+ { value: 1, label: "Site 1" },
129
+ { value: 2, label: "Site 2" },
130
+ { value: 3, label: "Site 3" },
131
+ { value: 4, label: "Site 4" },
132
+ { value: 5, label: "Site 5" },
133
+ ],
134
+ status: 200,
135
+ statusText: "Ok",
136
+ headers: {},
137
+ config: {},
138
+ };
139
+ mockedAxios.mockResolvedValue(data);
140
+
141
+ await act(async () => {
142
+ render(
143
+ <ThemeProvider theme={parseTheme(globalTheme)}>
144
+ <SiteFilter {...defaultProps} />
145
+ </ThemeProvider>
146
+ );
147
+ });
148
+
149
+ const siteFilterButton = screen.getByTestId("floating-menu-button");
150
+ expect(siteFilterButton).toBeTruthy();
151
+ fireEvent.click(siteFilterButton);
152
+ const floatingMenu = screen.getByTestId("floating-menu");
153
+ expect(floatingMenu).toBeTruthy();
154
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
155
+ expect(checkGroupFieldGroup).toBeTruthy();
156
+ const checkFieldLabels = screen.getAllByTestId("check-field-label");
157
+ expect(checkFieldLabels).toHaveLength(6);
158
+ });
159
+
160
+ it("should check option on click", async () => {
161
+ defaultProps.value = { order: "", filterSites: "noFilter" };
162
+ defaultProps.pointer = "filterSites";
163
+ defaultProps.center = true;
164
+ defaultProps.label = "Site";
165
+ defaultProps.selectAllOption = "noFilter";
166
+ defaultProps.filters = [
167
+ {
168
+ name: "all",
169
+ value: "all",
170
+ title: "All",
171
+ },
172
+ ];
173
+ const filterItemsMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
174
+
175
+ defaultProps.filterItems = filterItemsMock;
176
+ const data = {
177
+ data: [
178
+ { value: 1, label: "Site 1" },
179
+ { value: 2, label: "Site 2" },
180
+ { value: 3, label: "Site 3" },
181
+ { value: 4, label: "Site 4" },
182
+ { value: 5, label: "Site 5" },
183
+ ],
184
+ status: 200,
185
+ statusText: "Ok",
186
+ headers: {},
187
+ config: {},
188
+ };
189
+
190
+ mockedAxios.mockResolvedValue(data);
191
+
192
+ await act(async () => {
193
+ render(
194
+ <ThemeProvider theme={parseTheme(globalTheme)}>
195
+ <SiteFilter {...defaultProps} />
196
+ </ThemeProvider>
197
+ );
198
+ });
199
+
200
+ const siteFilterButton = screen.getByTestId("floating-menu-button");
201
+ expect(siteFilterButton).toBeTruthy();
202
+ fireEvent.click(siteFilterButton);
203
+ const floatingMenu = screen.getByTestId("floating-menu");
204
+ expect(floatingMenu).toBeTruthy();
205
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
206
+ expect(checkGroupFieldGroup).toBeTruthy();
207
+ const checkFieldInputs = screen.getAllByTestId<HTMLInputElement>("check-field-input");
208
+ expect(checkFieldInputs).toHaveLength(6);
209
+ fireEvent.click(checkFieldInputs[1]);
210
+ expect(checkFieldInputs[1].checked).toBe(true);
211
+ });
212
+
213
+ it("should uncheck checked option on click", async () => {
214
+ defaultProps.value = { order: "", filterSites: "noFilter" };
215
+ defaultProps.pointer = "filterSites";
216
+ defaultProps.center = true;
217
+ defaultProps.label = "Site";
218
+ defaultProps.selectAllOption = "noFilter";
219
+ defaultProps.filters = [
220
+ {
221
+ name: "all",
222
+ value: "all",
223
+ title: "All",
224
+ },
225
+ ];
226
+ const filterItemsMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
227
+
228
+ defaultProps.filterItems = filterItemsMock;
229
+ const data = {
230
+ data: [
231
+ { value: 1, label: "Site 1" },
232
+ { value: 2, label: "Site 2" },
233
+ { value: 3, label: "Site 3" },
234
+ { value: 4, label: "Site 4" },
235
+ { value: 5, label: "Site 5" },
236
+ ],
237
+ status: 200,
238
+ statusText: "Ok",
239
+ headers: {},
240
+ config: {},
241
+ };
242
+
243
+ mockedAxios.mockResolvedValue(data);
244
+
245
+ await act(async () => {
246
+ render(
247
+ <ThemeProvider theme={parseTheme(globalTheme)}>
248
+ <SiteFilter {...defaultProps} />
249
+ </ThemeProvider>
250
+ );
251
+ });
252
+
253
+ const siteFilterButton = screen.getByTestId("floating-menu-button");
254
+ expect(siteFilterButton).toBeTruthy();
255
+ fireEvent.click(siteFilterButton);
256
+ const floatingMenu = screen.getByTestId("floating-menu");
257
+ expect(floatingMenu).toBeTruthy();
258
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
259
+ expect(checkGroupFieldGroup).toBeTruthy();
260
+ const checkFieldInputs = screen.getAllByTestId<HTMLInputElement>("check-field-input");
261
+ expect(checkFieldInputs).toHaveLength(6);
262
+ fireEvent.click(checkFieldInputs[1]);
263
+ expect(checkFieldInputs[1].checked).toBe(true);
264
+ fireEvent.click(checkFieldInputs[1]);
265
+ expect(checkFieldInputs[1].checked).toBe(false);
266
+ });
267
+
268
+ it("should call filterItems action on change", async () => {
269
+ defaultProps.value = { order: "", filterSites: "noFilter" };
270
+ defaultProps.pointer = "filterSites";
271
+ defaultProps.center = true;
272
+ defaultProps.label = "Site";
273
+ defaultProps.selectAllOption = "noFilter";
274
+ defaultProps.filters = [
275
+ {
276
+ name: "all",
277
+ value: "all",
278
+ title: "All",
279
+ },
280
+ ];
281
+ const filterItemsMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
282
+
283
+ defaultProps.filterItems = filterItemsMock;
284
+ const data = {
285
+ data: [
286
+ { value: 1, label: "Site 1" },
287
+ { value: 2, label: "Site 2" },
288
+ { value: 3, label: "Site 3" },
289
+ { value: 4, label: "Site 4" },
290
+ { value: 5, label: "Site 5" },
291
+ ],
292
+ status: 200,
293
+ statusText: "Ok",
294
+ headers: {},
295
+ config: {},
296
+ };
297
+
298
+ mockedAxios.mockResolvedValue(data);
299
+
300
+ await act(async () => {
301
+ render(
302
+ <ThemeProvider theme={parseTheme(globalTheme)}>
303
+ <SiteFilter {...defaultProps} />
304
+ </ThemeProvider>
305
+ );
306
+ });
307
+
308
+ const siteFilterButton = screen.getByTestId("floating-menu-button");
309
+
310
+ expect(siteFilterButton).toBeTruthy();
311
+ fireEvent.click(siteFilterButton);
312
+ const checkFieldInputs = screen.queryAllByTestId("check-field-input");
313
+ fireEvent.click(checkFieldInputs[1]);
314
+ expect(filterItemsMock).toHaveBeenCalledTimes(1);
315
+ expect(filterItemsMock).toBeCalledWith("filterSites", "1");
316
+ });
317
+ });
@@ -0,0 +1,197 @@
1
+ import * as React from "react";
2
+
3
+ import { ThemeProvider } from "styled-components";
4
+ import { CalledWithMock, mock } from "jest-mock-extended";
5
+
6
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
7
+
8
+ import { parseTheme } from "@ax/helpers";
9
+
10
+ import globalTheme from "@ax/themes/theme.json";
11
+ import StatusFilter, { IStatusFilterProps } from "@ax/components/TableFilters/StatusFilter";
12
+
13
+ afterEach(cleanup);
14
+ const defaultProps = mock<IStatusFilterProps>();
15
+ describe("StatusFilter component rendering", () => {
16
+ it("should render date filter", () => {
17
+ const onClickMock = jest.fn() as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
18
+ ((orderPointer: string, isAscendent: boolean) => any);
19
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false, sortedByTitle: false, sortedByURL: false };
20
+ defaultProps.sortItems = onClickMock;
21
+ defaultProps.isStructuredData = false;
22
+
23
+ render(
24
+ <ThemeProvider theme={parseTheme(globalTheme)}>
25
+ <StatusFilter {...defaultProps} />
26
+ </ThemeProvider>
27
+ );
28
+
29
+ const statusFilter = screen.getByTestId("status-filter-header");
30
+ expect(statusFilter).toBeTruthy();
31
+ expect(statusFilter.textContent).toEqual("Status");
32
+ });
33
+
34
+ it("should render interactive arrow if not filter selected", () => {
35
+ const onClickMock = jest.fn() as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
36
+ ((orderPointer: string, isAscendent: boolean) => any);
37
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false, sortedByTitle: false, sortedByURL: false };
38
+ defaultProps.sortItems = onClickMock;
39
+ defaultProps.isStructuredData = false;
40
+
41
+ render(
42
+ <ThemeProvider theme={parseTheme(globalTheme)}>
43
+ <StatusFilter {...defaultProps} />
44
+ </ThemeProvider>
45
+ );
46
+
47
+ const interactiveArrow = screen.queryByTestId("status-filter-interactive-arrow");
48
+ expect(interactiveArrow).toBeTruthy();
49
+ });
50
+
51
+ it("should render FullArrowUp icon if is filtered by most recent", () => {
52
+ const onClickMock = jest.fn() as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
53
+ ((orderPointer: string, isAscendent: boolean) => any);
54
+ defaultProps.sortedState = { isAscending: false, sortedByDate: true, sortedByTitle: false, sortedByURL: false };
55
+ defaultProps.sortItems = onClickMock;
56
+ defaultProps.isStructuredData = false;
57
+
58
+ render(
59
+ <ThemeProvider theme={parseTheme(globalTheme)}>
60
+ <StatusFilter {...defaultProps} />
61
+ </ThemeProvider>
62
+ );
63
+
64
+ const arrowIcon = screen.getByTestId("icon-component");
65
+ expect(arrowIcon).toBeTruthy();
66
+ });
67
+ });
68
+
69
+ describe("StatusFilter events", () => {
70
+ it("should render check group on click", () => {
71
+ const onClickMock = jest.fn();
72
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false };
73
+ defaultProps.sortItems = onClickMock as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
74
+ ((orderPointer: string, isAscendent: boolean) => any);
75
+ render(
76
+ <ThemeProvider theme={parseTheme(globalTheme)}>
77
+ <StatusFilter {...defaultProps} />
78
+ </ThemeProvider>
79
+ );
80
+
81
+ const statusFilterButton = screen.getByTestId("floating-menu-button");
82
+ expect(statusFilterButton).toBeTruthy();
83
+ fireEvent.click(statusFilterButton);
84
+ const floatingMenu = screen.getByTestId("floating-menu");
85
+ expect(floatingMenu).toBeTruthy();
86
+ const listItems = screen.getAllByTestId("list-item");
87
+ expect(listItems).toHaveLength(2);
88
+ });
89
+
90
+ it("should call sortItems function with 'modified, true' as param when it's not structured data and is ascending", async () => {
91
+ const onClickMock = jest.fn();
92
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false };
93
+ defaultProps.sortItems = onClickMock as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
94
+ ((orderPointer: string, isAscendent: boolean) => any);
95
+ render(
96
+ <ThemeProvider theme={parseTheme(globalTheme)}>
97
+ <StatusFilter {...defaultProps} />
98
+ </ThemeProvider>
99
+ );
100
+
101
+ const statusFilterButton = screen.getByTestId("floating-menu-button");
102
+
103
+ expect(statusFilterButton).toBeTruthy();
104
+ fireEvent.click(statusFilterButton);
105
+ const listItems = screen.getAllByTestId("list-item");
106
+ expect(listItems).toHaveLength(2);
107
+ expect(listItems[0].textContent).toEqual("Most recent");
108
+ expect(listItems[1].textContent).toEqual("Oldest");
109
+
110
+ fireEvent.click(listItems[1]);
111
+ expect(onClickMock).toHaveBeenCalledTimes(1);
112
+ const isAscending = true;
113
+ expect(onClickMock).toBeCalledWith("modified", isAscending);
114
+ });
115
+
116
+ it("should call sortItems function with 'date, true' as param when it's not structured data and is asceding", async () => {
117
+ const onClickMock = jest.fn();
118
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false };
119
+ defaultProps.sortItems = onClickMock as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
120
+ ((orderPointer: string, isAscendent: boolean) => any);
121
+ defaultProps.isStructuredData = true;
122
+
123
+ render(
124
+ <ThemeProvider theme={parseTheme(globalTheme)}>
125
+ <StatusFilter {...defaultProps} />
126
+ </ThemeProvider>
127
+ );
128
+
129
+ const statusFilterButton = screen.getByTestId("floating-menu-button");
130
+
131
+ expect(statusFilterButton).toBeTruthy();
132
+ fireEvent.click(statusFilterButton);
133
+ const listItems = screen.getAllByTestId("list-item");
134
+ expect(listItems).toHaveLength(2);
135
+ expect(listItems[0].textContent).toEqual("Most recent");
136
+ expect(listItems[1].textContent).toEqual("Oldest");
137
+
138
+ fireEvent.click(listItems[1]);
139
+ expect(onClickMock).toHaveBeenCalledTimes(1);
140
+ expect(onClickMock).toBeCalledWith("date", true);
141
+ });
142
+
143
+ it("should call sortItems function with 'modified, false' as param when it's not structured data and is not ascending", async () => {
144
+ const onClickMock = jest.fn();
145
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false };
146
+ defaultProps.sortItems = onClickMock as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
147
+ ((orderPointer: string, isAscendent: boolean) => any);
148
+ defaultProps.isStructuredData = false;
149
+
150
+ render(
151
+ <ThemeProvider theme={parseTheme(globalTheme)}>
152
+ <StatusFilter {...defaultProps} />
153
+ </ThemeProvider>
154
+ );
155
+
156
+ const statusFilterButton = screen.getByTestId("floating-menu-button");
157
+
158
+ expect(statusFilterButton).toBeTruthy();
159
+ fireEvent.click(statusFilterButton);
160
+ const listItems = screen.getAllByTestId("list-item");
161
+ expect(listItems).toHaveLength(2);
162
+ expect(listItems[0].textContent).toEqual("Most recent");
163
+ expect(listItems[1].textContent).toEqual("Oldest");
164
+
165
+ fireEvent.click(listItems[0]);
166
+ expect(onClickMock).toHaveBeenCalledTimes(1);
167
+ const isAscending = false;
168
+ expect(onClickMock).toBeCalledWith("modified", isAscending);
169
+ });
170
+
171
+ it("should call sortItems function with 'date, false' as param when it's not structured data and is not asceding", async () => {
172
+ const onClickMock = jest.fn();
173
+ defaultProps.sortedState = { isAscending: false, sortedByDate: false };
174
+ defaultProps.sortItems = onClickMock as CalledWithMock<any, [orderPointer: string, isAscendent: boolean]> &
175
+ ((orderPointer: string, isAscendent: boolean) => any);
176
+ defaultProps.isStructuredData = true;
177
+
178
+ render(
179
+ <ThemeProvider theme={parseTheme(globalTheme)}>
180
+ <StatusFilter {...defaultProps} />
181
+ </ThemeProvider>
182
+ );
183
+
184
+ const statusFilterButton = screen.getByTestId("floating-menu-button");
185
+
186
+ expect(statusFilterButton).toBeTruthy();
187
+ fireEvent.click(statusFilterButton);
188
+ const listItems = screen.getAllByTestId("list-item");
189
+ expect(listItems).toHaveLength(2);
190
+ expect(listItems[0].textContent).toEqual("Most recent");
191
+ expect(listItems[1].textContent).toEqual("Oldest");
192
+
193
+ fireEvent.click(listItems[0]);
194
+ expect(onClickMock).toHaveBeenCalledTimes(1);
195
+ expect(onClickMock).toBeCalledWith("date", false);
196
+ });
197
+ });
@@ -0,0 +1,157 @@
1
+ import * as React from "react";
2
+
3
+ import { ThemeProvider } from "styled-components";
4
+ import { CalledWithMock, mock } from "jest-mock-extended";
5
+
6
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
7
+
8
+ import { parseTheme } from "@ax/helpers";
9
+
10
+ import globalTheme from "@ax/themes/theme.json";
11
+ import TranslationsFilter, { ITranslationsFilterProps } from "@ax/components/TableFilters/TranslationsFilter";
12
+
13
+ afterEach(cleanup);
14
+ const defaultProps = mock<ITranslationsFilterProps>();
15
+ describe("TranslationsFilter component rendering", () => {
16
+ it("should render name filter", () => {
17
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
18
+ ((pointer: string, filter: string) => void);
19
+ defaultProps.value = "all";
20
+ defaultProps.filterItems = onClickMock;
21
+
22
+ render(
23
+ <ThemeProvider theme={parseTheme(globalTheme)}>
24
+ <TranslationsFilter {...defaultProps} />
25
+ </ThemeProvider>
26
+ );
27
+
28
+ const translationFilter = screen.getByTestId("translation-filter-header");
29
+ expect(translationFilter).toBeTruthy();
30
+ expect(translationFilter.textContent).toEqual("Trans.");
31
+ });
32
+
33
+ it("should render icon's wrapper", () => {
34
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
35
+ ((pointer: string, filter: string) => void);
36
+ defaultProps.value = "all";
37
+ defaultProps.filterItems = onClickMock;
38
+ render(
39
+ <ThemeProvider theme={parseTheme(globalTheme)}>
40
+ <TranslationsFilter {...defaultProps} />
41
+ </ThemeProvider>
42
+ );
43
+
44
+ const interactiveArrow = screen.getByTestId("translation-filter-icons-wrapper");
45
+ expect(interactiveArrow).toBeTruthy();
46
+ });
47
+
48
+ it("should render options", async () => {
49
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
50
+ ((pointer: string, filter: string) => void);
51
+ defaultProps.value = "all";
52
+ defaultProps.filterItems = onClickMock;
53
+ render(
54
+ <ThemeProvider theme={parseTheme(globalTheme)}>
55
+ <TranslationsFilter {...defaultProps} />
56
+ </ThemeProvider>
57
+ );
58
+
59
+ const translationFilterButton = screen.getByTestId("floating-menu-button");
60
+
61
+ expect(translationFilterButton).toBeTruthy();
62
+ fireEvent.click(translationFilterButton);
63
+ const checksFieldLabels = screen.getAllByTestId("check-field-label");
64
+
65
+ expect(checksFieldLabels).toHaveLength(2);
66
+ expect(checksFieldLabels[0].textContent).toEqual("All");
67
+ expect(checksFieldLabels[1].textContent).toEqual("Not translated content");
68
+ });
69
+ });
70
+
71
+ describe("TranslationsFilter events", () => {
72
+ it("should render check group on click", () => {
73
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
74
+ ((pointer: string, filter: string) => void);
75
+ defaultProps.value = "all";
76
+ defaultProps.filterItems = onClickMock;
77
+ render(
78
+ <ThemeProvider theme={parseTheme(globalTheme)}>
79
+ <TranslationsFilter {...defaultProps} />
80
+ </ThemeProvider>
81
+ );
82
+
83
+ const translationFilterButton = screen.getByTestId("floating-menu-button");
84
+ expect(translationFilterButton).toBeTruthy();
85
+ fireEvent.click(translationFilterButton);
86
+ const floatingMenu = screen.getByTestId("floating-menu");
87
+ expect(floatingMenu).toBeTruthy();
88
+ const checkInputs = screen.getAllByTestId("check-field-input");
89
+ expect(checkInputs).toHaveLength(2);
90
+ });
91
+
92
+ it("should call filterItems with 'all' on click 'All' option", async () => {
93
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
94
+ ((pointer: string, filter: string) => void);
95
+ defaultProps.value = "all";
96
+ defaultProps.filterItems = onClickMock;
97
+ render(
98
+ <ThemeProvider theme={parseTheme(globalTheme)}>
99
+ <TranslationsFilter {...defaultProps} />
100
+ </ThemeProvider>
101
+ );
102
+
103
+ const translationFilterButton = screen.getByTestId("floating-menu-button");
104
+
105
+ expect(translationFilterButton).toBeTruthy();
106
+ fireEvent.click(translationFilterButton);
107
+ const checksFieldInputs = screen.getAllByTestId("check-field-input");
108
+
109
+ fireEvent.click(checksFieldInputs[0]);
110
+ expect(onClickMock).toHaveBeenCalledTimes(1);
111
+ expect(onClickMock).toBeCalledWith("translated", "all");
112
+ });
113
+
114
+ it("should call filterItems with 'no' on click 'Not translated content' option", async () => {
115
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
116
+ ((pointer: string, filter: string) => void);
117
+ defaultProps.value = "all";
118
+ defaultProps.filterItems = onClickMock;
119
+ render(
120
+ <ThemeProvider theme={parseTheme(globalTheme)}>
121
+ <TranslationsFilter {...defaultProps} />
122
+ </ThemeProvider>
123
+ );
124
+
125
+ const translationFilterButton = screen.getByTestId("floating-menu-button");
126
+
127
+ expect(translationFilterButton).toBeTruthy();
128
+ fireEvent.click(translationFilterButton);
129
+ const checksFieldInputs = screen.getAllByTestId("check-field-input");
130
+
131
+ fireEvent.click(checksFieldInputs[1]);
132
+ expect(onClickMock).toHaveBeenCalledTimes(1);
133
+ expect(onClickMock).toBeCalledWith("translated", "no");
134
+ });
135
+
136
+ it("should close floating menu when option is checked", async () => {
137
+ const onClickMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]> &
138
+ ((pointer: string, filter: string) => void);
139
+ defaultProps.value = "all";
140
+ defaultProps.filterItems = onClickMock;
141
+ render(
142
+ <ThemeProvider theme={parseTheme(globalTheme)}>
143
+ <TranslationsFilter {...defaultProps} />
144
+ </ThemeProvider>
145
+ );
146
+
147
+ const translationFilterButton = screen.getByTestId("floating-menu-button");
148
+
149
+ expect(translationFilterButton).toBeTruthy();
150
+ fireEvent.click(translationFilterButton);
151
+ const checksFieldInputs = screen.getAllByTestId("check-field-input");
152
+ fireEvent.click(checksFieldInputs[1]);
153
+ expect(onClickMock).toHaveBeenCalledTimes(1);
154
+ const checksWrapper = screen.queryByTestId("translation-filter-checks-wrapper");
155
+ expect(checksWrapper).toBeFalsy();
156
+ });
157
+ });