@griddo/ax 1.69.8 → 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 (160) hide show
  1. package/config/jest/componentsMock.js +0 -26
  2. package/package.json +4 -3
  3. package/src/Style/index.tsx +1 -1
  4. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
  5. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
  6. package/src/__tests__/components/FieldContainer/FieldContainer.test.tsx +82 -0
  7. package/src/__tests__/components/Fields/AnalyticsField/AnalyticsField.test.tsx +1 -1
  8. package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +1 -15
  9. package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +1 -16
  10. package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +8 -17
  11. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +4 -16
  12. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +2 -20
  13. package/src/__tests__/components/Fields/CheckField/CheckField.test.tsx +6 -6
  14. package/src/__tests__/components/Fields/CheckGroup/CheckGroup.test.tsx +15 -15
  15. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +7 -16
  16. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +2 -23
  17. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +11 -31
  18. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +15 -21
  19. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +6 -25
  20. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
  21. package/src/__tests__/components/Fields/ConditionalField/ConditionalField.test.tsx +1 -1
  22. package/src/__tests__/components/Fields/DateField/DateField.test.tsx +1 -1
  23. package/src/__tests__/components/Fields/FieldGroup/FieldGroup.test.tsx +1 -1
  24. package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +1 -1
  25. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +3 -3
  26. package/src/__tests__/components/Fields/HeadingField/HeadingField.test.tsx +6 -6
  27. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +2 -8
  28. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
  29. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +2 -16
  30. package/src/__tests__/components/Fields/MultiCheckSelectGroup/MultiCheckSelectGroup.test.tsx +2 -2
  31. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +2 -7
  32. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +2 -15
  33. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +2 -12
  34. package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +171 -19
  35. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +2 -13
  36. package/src/__tests__/components/Fields/Select/Select.test.tsx +3 -23
  37. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +2 -15
  38. package/src/__tests__/components/Fields/TagField/TagField.test.tsx +4 -4
  39. package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +1 -1
  40. package/src/__tests__/components/Fields/TextField/TextField.test.tsx +6 -6
  41. package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +142 -0
  42. package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +100 -0
  43. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +2 -10
  44. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +152 -0
  45. package/src/__tests__/components/Fields/UniqueCheck/UniqueCheck.test.tsx +3 -3
  46. package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +4 -4
  47. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +2 -14
  48. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +6 -20
  49. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +3 -29
  50. package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.test.tsx +1 -1
  51. package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +149 -0
  52. package/src/__tests__/components/TableFilters/CategoryFilter/CategoryFilter.test.tsx +241 -0
  53. package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +131 -0
  54. package/src/__tests__/components/TableFilters/DateFilter/DateFilter.test.tsx +148 -0
  55. package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +265 -0
  56. package/src/__tests__/components/TableFilters/NameFilter/NameFilter.test.tsx +197 -0
  57. package/src/__tests__/components/TableFilters/SiteFilter/SiteFilter.test.tsx +317 -0
  58. package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +197 -0
  59. package/src/__tests__/components/TableFilters/TranslationsFilter/TranslationsFilter.test.tsx +157 -0
  60. package/src/__tests__/components/TableFilters/TypeFilter/TypeFilter.test.tsx +164 -0
  61. package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
  62. package/src/__tests__/components/Tabs/Tabs.test.tsx +205 -0
  63. package/src/__tests__/components/Tag/Tag.test.tsx +140 -0
  64. package/src/__tests__/components/Toast/Toast.test.tsx +102 -0
  65. package/src/api/navigation.tsx +1 -1
  66. package/src/components/Browser/index.tsx +1 -1
  67. package/src/components/Button/index.tsx +3 -3
  68. package/src/components/ConfigPanel/NavigationForm/Field/index.tsx +14 -3
  69. package/src/components/ElementsTooltip/index.tsx +10 -9
  70. package/src/components/EmptyState/index.tsx +2 -2
  71. package/src/components/FieldContainer/index.tsx +3 -3
  72. package/src/components/Fields/ArrayFieldGroup/index.tsx +1 -1
  73. package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
  74. package/src/components/Fields/AsyncSelect/index.tsx +1 -1
  75. package/src/components/Fields/CheckField/index.tsx +3 -3
  76. package/src/components/Fields/CheckGroup/index.tsx +2 -2
  77. package/src/components/Fields/ComponentContainer/index.tsx +7 -6
  78. package/src/components/Fields/ComponentContainer/style.tsx +2 -2
  79. package/src/components/Fields/HeadingField/index.tsx +1 -1
  80. package/src/components/Fields/HiddenField/index.tsx +1 -1
  81. package/src/components/Fields/ImageField/index.tsx +10 -5
  82. package/src/components/Fields/MultiCheckSelect/index.tsx +3 -3
  83. package/src/components/Fields/NumberField/index.tsx +2 -1
  84. package/src/components/Fields/ReferenceField/ItemList/Item/index.tsx +5 -7
  85. package/src/components/Fields/ReferenceField/ItemList/Item/style.tsx +2 -2
  86. package/src/components/Fields/ReferenceField/ItemList/index.tsx +1 -1
  87. package/src/components/Fields/RichText/index.tsx +10 -6
  88. package/src/components/Fields/Select/index.tsx +2 -2
  89. package/src/components/Fields/SliderField/index.tsx +1 -1
  90. package/src/components/Fields/TextField/index.tsx +2 -7
  91. package/src/components/Fields/TimeField/HourInput/index.tsx +103 -0
  92. package/src/components/Fields/TimeField/HourInput/style.tsx +19 -0
  93. package/src/components/Fields/TimeField/HourInput/utils.tsx +35 -0
  94. package/src/components/Fields/TimeField/index.tsx +57 -0
  95. package/src/components/Fields/TimeField/style.tsx +37 -0
  96. package/src/components/Fields/index.tsx +2 -0
  97. package/src/components/FieldsBehavior/index.tsx +1 -1
  98. package/src/components/FloatingMenu/index.tsx +2 -2
  99. package/src/components/Gallery/GalleryFilters/Type/index.tsx +50 -0
  100. package/src/components/Gallery/GalleryFilters/Type/style.tsx +39 -0
  101. package/src/components/Gallery/GalleryPanel/DetailPanel/index.tsx +2 -1
  102. package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/style.tsx +3 -3
  103. package/src/components/Gallery/hooks.tsx +10 -4
  104. package/src/components/Gallery/index.tsx +2 -0
  105. package/src/components/Icon/index.tsx +1 -1
  106. package/src/components/IconAction/index.tsx +1 -1
  107. package/src/components/Lists/index.tsx +1 -1
  108. package/src/components/Loading/index.tsx +1 -1
  109. package/src/components/Pagination/index.tsx +1 -1
  110. package/src/components/SideModal/SideModalOption/index.tsx +4 -2
  111. package/src/components/SideModal/index.tsx +1 -1
  112. package/src/components/TableFilters/CategoryFilter/index.tsx +2 -2
  113. package/src/components/TableFilters/CategoryFilter/style.tsx +1 -10
  114. package/src/components/TableFilters/CustomizeFilters/index.tsx +2 -3
  115. package/src/components/TableFilters/DateFilter/index.tsx +4 -4
  116. package/src/components/TableFilters/LiveFilter/index.tsx +1 -1
  117. package/src/components/TableFilters/LiveFilter/style.tsx +2 -10
  118. package/src/components/TableFilters/NameFilter/index.tsx +4 -4
  119. package/src/components/TableFilters/SiteFilter/index.tsx +16 -13
  120. package/src/components/TableFilters/SiteFilter/style.tsx +1 -10
  121. package/src/components/TableFilters/StatusFilter/index.tsx +3 -3
  122. package/src/components/TableFilters/TranslationsFilter/index.tsx +4 -7
  123. package/src/components/TableFilters/TranslationsFilter/style.tsx +1 -10
  124. package/src/components/TableFilters/TypeFilter/index.tsx +2 -2
  125. package/src/components/TableFilters/TypeFilter/style.tsx +1 -10
  126. package/src/components/TableList/index.tsx +6 -6
  127. package/src/components/TableList/style.tsx +1 -1
  128. package/src/components/Tabs/index.tsx +19 -7
  129. package/src/components/Tag/index.tsx +6 -6
  130. package/src/components/Toast/index.tsx +4 -4
  131. package/src/components/Tooltip/index.tsx +5 -3
  132. package/src/components/index.tsx +2 -0
  133. package/src/containers/Navigation/Defaults/actions.tsx +10 -5
  134. package/src/containers/Navigation/Defaults/utils.tsx +13 -4
  135. package/src/containers/Sites/actions.tsx +7 -0
  136. package/src/containers/Sites/constants.tsx +1 -0
  137. package/src/containers/Sites/interfaces.tsx +6 -0
  138. package/src/containers/Sites/reducer.tsx +4 -0
  139. package/src/containers/StructuredData/actions.tsx +21 -8
  140. package/src/containers/StructuredData/constants.tsx +2 -0
  141. package/src/containers/StructuredData/interfaces.tsx +7 -1
  142. package/src/containers/StructuredData/reducer.tsx +5 -1
  143. package/src/helpers/fields.tsx +2 -2
  144. package/src/helpers/index.tsx +3 -0
  145. package/src/helpers/parseTheme.js +456 -0
  146. package/src/helpers/schemas.tsx +2 -2
  147. package/src/hooks/forms.tsx +2 -1
  148. package/src/modules/App/Routing/NavMenu/index.tsx +9 -1
  149. package/src/modules/Content/BulkHeader/TableHeader/index.tsx +1 -1
  150. package/src/modules/Content/hooks.tsx +19 -12
  151. package/src/modules/Content/index.tsx +23 -14
  152. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +3 -0
  153. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/index.tsx +3 -1
  154. package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +16 -18
  155. package/src/modules/Navigation/Defaults/DefaultsEditor/utils.tsx +37 -0
  156. package/src/modules/StructuredData/Form/ConnectedField/index.tsx +3 -2
  157. package/src/modules/StructuredData/Form/index.tsx +22 -17
  158. package/src/modules/StructuredData/StructuredDataList/hooks.tsx +30 -20
  159. package/src/modules/StructuredData/StructuredDataList/index.tsx +24 -14
  160. package/src/types/index.tsx +8 -7
@@ -0,0 +1,164 @@
1
+ import * as React from "react";
2
+ import { ThemeProvider } from "styled-components";
3
+ import { CalledWithMock, mock } from "jest-mock-extended";
4
+
5
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
6
+ import TypeFilter, { ITypeFilterProps } from "@ax/components/TableFilters/TypeFilter";
7
+ import globalTheme from "@ax/themes/theme.json";
8
+ import { parseTheme } from "@ax/helpers";
9
+
10
+ afterEach(cleanup);
11
+
12
+ const defaultProps = mock<ITypeFilterProps>();
13
+ describe("TypeFilter component rendering", () => {
14
+ it("should render type filter", () => {
15
+ defaultProps.filters = [
16
+ {
17
+ name: "all",
18
+ value: "all",
19
+ title: "All content",
20
+ },
21
+ {
22
+ name: "unique",
23
+ value: "unique",
24
+ title: "Basic templates",
25
+ },
26
+ {
27
+ name: "structuredData",
28
+ value: "structuredData",
29
+ title: "Content types",
30
+ },
31
+ ];
32
+ defaultProps.pointer = "type";
33
+ defaultProps.filterItems = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
34
+
35
+ render(
36
+ <ThemeProvider theme={parseTheme(globalTheme)}>
37
+ <TypeFilter {...defaultProps} />
38
+ </ThemeProvider>
39
+ );
40
+
41
+ const typeFilter = screen.getByTestId("floating-menu");
42
+ expect(typeFilter).toBeTruthy();
43
+ expect(typeFilter.textContent).toEqual("Types");
44
+ });
45
+ });
46
+
47
+ describe("TypeFilter events", () => {
48
+ it("should render check group on click", () => {
49
+ defaultProps.filters = [
50
+ {
51
+ name: "all",
52
+ value: "all",
53
+ title: "All content",
54
+ },
55
+ {
56
+ name: "unique",
57
+ value: "unique",
58
+ title: "Basic templates",
59
+ },
60
+ {
61
+ name: "structuredData",
62
+ value: "structuredData",
63
+ title: "Content types",
64
+ },
65
+ ];
66
+ defaultProps.pointer = "type";
67
+ defaultProps.filterItems = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
68
+
69
+ render(
70
+ <ThemeProvider theme={parseTheme(globalTheme)}>
71
+ <TypeFilter {...defaultProps} />
72
+ </ThemeProvider>
73
+ );
74
+
75
+ const typeFilterButton = screen.getByTestId("floating-menu-button");
76
+ expect(typeFilterButton).toBeTruthy();
77
+ fireEvent.click(typeFilterButton);
78
+ const floatingMenu = screen.getByTestId("floating-menu");
79
+ expect(floatingMenu).toBeTruthy();
80
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
81
+ expect(checkGroupFieldGroup).toBeTruthy();
82
+ const checkFieldLabels = screen.getAllByTestId("check-field-label");
83
+ expect(checkFieldLabels).toHaveLength(3);
84
+ });
85
+
86
+ it("should check option on click", () => {
87
+ defaultProps.filters = [
88
+ {
89
+ name: "all",
90
+ value: "all",
91
+ title: "All content",
92
+ },
93
+ {
94
+ name: "unique",
95
+ value: "unique",
96
+ title: "Basic templates",
97
+ },
98
+ {
99
+ name: "structuredData",
100
+ value: "structuredData",
101
+ title: "Content types",
102
+ },
103
+ ];
104
+ defaultProps.pointer = "type";
105
+ const onChangeMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
106
+ defaultProps.filterItems = onChangeMock;
107
+
108
+ render(
109
+ <ThemeProvider theme={parseTheme(globalTheme)}>
110
+ <TypeFilter {...defaultProps} />
111
+ </ThemeProvider>
112
+ );
113
+
114
+ const typeFilterButton = screen.getByTestId("floating-menu-button");
115
+ expect(typeFilterButton).toBeTruthy();
116
+ fireEvent.click(typeFilterButton);
117
+ const floatingMenu = screen.getByTestId("floating-menu");
118
+ expect(floatingMenu).toBeTruthy();
119
+ const checkGroupFieldGroup = screen.getByTestId("check-group-field-group");
120
+ expect(checkGroupFieldGroup).toBeTruthy();
121
+ const checkFieldInputs = screen.getAllByTestId<HTMLInputElement>("check-field-input");
122
+ expect(checkFieldInputs).toHaveLength(3);
123
+ fireEvent.change(checkFieldInputs[1], { target: { checked: true, value: "unique" } });
124
+ expect(checkFieldInputs[1].checked).toBe(true);
125
+ });
126
+
127
+ it("should call filterItems action on change", async () => {
128
+ defaultProps.filters = [
129
+ {
130
+ name: "all",
131
+ value: "all",
132
+ title: "All content",
133
+ },
134
+ {
135
+ name: "unique",
136
+ value: "unique",
137
+ title: "Basic templates",
138
+ },
139
+ {
140
+ name: "structuredData",
141
+ value: "structuredData",
142
+ title: "Content types",
143
+ },
144
+ ];
145
+ defaultProps.pointer = "type";
146
+ const onChangeMock = jest.fn() as CalledWithMock<void, [pointer: string, filter: string]>;
147
+ defaultProps.filterItems = onChangeMock;
148
+
149
+ render(
150
+ <ThemeProvider theme={parseTheme(globalTheme)}>
151
+ <TypeFilter {...defaultProps} />
152
+ </ThemeProvider>
153
+ );
154
+
155
+ const typeFilterButton = screen.getByTestId("floating-menu-button");
156
+
157
+ expect(typeFilterButton).toBeTruthy();
158
+ fireEvent.click(typeFilterButton);
159
+ const checkFieldInputs = screen.queryAllByTestId("check-field-input");
160
+ fireEvent.click(checkFieldInputs[1]);
161
+ expect(onChangeMock).toHaveBeenCalledTimes(1);
162
+ expect(onChangeMock).toBeCalledWith("type", "unique");
163
+ });
164
+ });
@@ -0,0 +1,119 @@
1
+ import * as React from "react";
2
+ import { ThemeProvider } from "styled-components";
3
+ import { parseTheme } from "@ax/helpers";
4
+ import { mock } from "jest-mock-extended";
5
+ import configureStore from "redux-mock-store";
6
+
7
+ import globalTheme from "@ax/themes/theme.json";
8
+ import TableList, { ITableListProps } from "@ax/components/TableList";
9
+ import { render, cleanup, screen } from "../../../../config/jest/test-utils";
10
+
11
+ afterEach(() => {
12
+ cleanup();
13
+ jest.resetAllMocks();
14
+ });
15
+
16
+ const initialStore = {
17
+ app: {
18
+ isLoading: false,
19
+ },
20
+ };
21
+
22
+ const mockStore = configureStore();
23
+ const defaultProps = mock<ITableListProps>();
24
+ const setPage = jest.fn();
25
+
26
+ const pagination = { currPage: 1, itemsPerPage: 50, setPage: setPage, totalItems: 3 };
27
+
28
+ describe("TableList", () => {
29
+ it("should render the component", async () => {
30
+ defaultProps.pagination = pagination;
31
+ const initialState = { ...initialStore, ...defaultProps };
32
+ const store = mockStore(initialStore);
33
+
34
+ render(
35
+ <ThemeProvider theme={parseTheme(globalTheme)}>
36
+ <TableList {...initialState} />
37
+ </ThemeProvider>,
38
+ { store }
39
+ );
40
+
41
+ const tableList = screen.getByTestId("table-list");
42
+
43
+ expect(tableList).toBeTruthy();
44
+ });
45
+
46
+ it("should have sticky style when header is fixed", async () => {
47
+ defaultProps.pagination = pagination;
48
+ defaultProps.hasFixedHeader = true;
49
+ const initialState = { ...initialStore, ...defaultProps };
50
+ const store = mockStore(initialStore);
51
+
52
+ render(
53
+ <ThemeProvider theme={parseTheme(globalTheme)}>
54
+ <TableList {...initialState} />
55
+ </ThemeProvider>,
56
+ { store }
57
+ );
58
+
59
+ const tableListHeader = screen.getByTestId("table-list-header");
60
+ expect(tableListHeader).toBeTruthy();
61
+ const styles = getComputedStyle(tableListHeader);
62
+ expect(styles.position).toEqual("sticky");
63
+ });
64
+
65
+ it("should display loader if it's loading", async () => {
66
+ defaultProps.pagination = pagination;
67
+ defaultProps.hasFixedHeader = true;
68
+ const initialState = { ...initialStore, ...defaultProps };
69
+ const store = mockStore({ app: { isLoading: true } });
70
+
71
+ render(
72
+ <ThemeProvider theme={parseTheme(globalTheme)}>
73
+ <TableList {...initialState} />
74
+ </ThemeProvider>,
75
+ { store }
76
+ );
77
+
78
+ const loader = screen.getByTestId("loading-wrapper");
79
+ const tableBody = screen.queryByTestId("table-body");
80
+ expect(loader).toBeTruthy();
81
+ expect(tableBody).toBeFalsy();
82
+ });
83
+
84
+ it("should display table body if isLoading is false", async () => {
85
+ defaultProps.pagination = pagination;
86
+ defaultProps.hasFixedHeader = true;
87
+ const store = mockStore(initialStore);
88
+ const initialState = { ...initialStore, ...defaultProps };
89
+
90
+ render(
91
+ <ThemeProvider theme={parseTheme(globalTheme)}>
92
+ <TableList {...initialState} />
93
+ </ThemeProvider>,
94
+ { store }
95
+ );
96
+
97
+ const loader = screen.queryByTestId("loading-wrapper");
98
+ const tableBody = screen.getByTestId("table-body");
99
+ expect(tableBody).toBeTruthy();
100
+ expect(loader).toBeFalsy();
101
+ });
102
+
103
+ it("should display paginator when totalItems is greater than itemsPerPage", async () => {
104
+ defaultProps.pagination = { currPage: 1, itemsPerPage: 50, setPage: setPage, totalItems: 60 };
105
+ defaultProps.hasFixedHeader = true;
106
+ const store = mockStore(initialStore);
107
+ const initialState = { ...initialStore, ...defaultProps };
108
+
109
+ render(
110
+ <ThemeProvider theme={parseTheme(globalTheme)}>
111
+ <TableList {...initialState} />
112
+ </ThemeProvider>,
113
+ { store }
114
+ );
115
+
116
+ const pagination = screen.getByTestId("table-body");
117
+ expect(pagination).toBeTruthy();
118
+ });
119
+ });
@@ -0,0 +1,205 @@
1
+ import * as React from "react";
2
+ import Tabs, { ITabsProps } from "@ax/components/Tabs";
3
+ import { ThemeProvider } from "styled-components";
4
+ import { parseTheme } from "@ax/helpers";
5
+ import globalTheme from "@ax/themes/theme.json";
6
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
7
+ import { mock } from "jest-mock-extended";
8
+ import "jest-styled-components";
9
+
10
+ afterEach(cleanup);
11
+
12
+ const defaultProps = mock<ITabsProps>();
13
+
14
+ describe("Tabs component rendering", () => {
15
+ it("should render tabs", () => {
16
+ defaultProps.tabs = ["tab1", "tab2"];
17
+ defaultProps.active = "tab1";
18
+ const setSelectedTabAction = jest.fn();
19
+ defaultProps.setSelectedTab = setSelectedTabAction;
20
+
21
+ render(
22
+ <ThemeProvider theme={parseTheme(globalTheme)}>
23
+ <Tabs {...defaultProps} />
24
+ </ThemeProvider>
25
+ );
26
+
27
+ const tabsRow = screen.getByTestId("tabs-row");
28
+ const tabs = screen.getAllByTestId("tab");
29
+
30
+ expect(tabsRow).toBeTruthy();
31
+ expect(tabs.length).toEqual(2);
32
+ });
33
+
34
+ it("should render an empty tabs row when no tabs or icons", () => {
35
+ defaultProps.tabs = undefined;
36
+ defaultProps.icons = undefined;
37
+ defaultProps.active = "tab1";
38
+ const setSelectedTabAction = jest.fn();
39
+ defaultProps.setSelectedTab = setSelectedTabAction;
40
+
41
+ render(
42
+ <ThemeProvider theme={parseTheme(globalTheme)}>
43
+ <Tabs {...defaultProps} />
44
+ </ThemeProvider>
45
+ );
46
+
47
+ const emptyTabsRow = screen.getByTestId("empty-tabs-row");
48
+
49
+ expect(emptyTabsRow).toBeTruthy();
50
+ });
51
+
52
+ it("should call set selected tab action on click", async () => {
53
+ defaultProps.tabs = ["tab1", "tab2"];
54
+ defaultProps.active = "tab1";
55
+ const setSelectedTabAction = jest.fn();
56
+ defaultProps.setSelectedTab = setSelectedTabAction;
57
+
58
+ render(
59
+ <ThemeProvider theme={parseTheme(globalTheme)}>
60
+ <Tabs {...defaultProps} />
61
+ </ThemeProvider>
62
+ );
63
+ const tabs = screen.getAllByTestId("tab");
64
+ fireEvent.click(tabs[1]);
65
+ expect(setSelectedTabAction).toBeCalled();
66
+ });
67
+
68
+ it("should render tabs row with icons if icons available", async () => {
69
+ defaultProps.tabs = undefined;
70
+ defaultProps.icons = [
71
+ { name: "edit", text: "Edit mode" },
72
+ { name: "view", text: "Preview mode" },
73
+ ];
74
+
75
+ render(
76
+ <ThemeProvider theme={parseTheme(globalTheme)}>
77
+ <Tabs {...defaultProps} />
78
+ </ThemeProvider>
79
+ );
80
+
81
+ const iconTabsRow = screen.getByTestId("icons-tabs-row");
82
+ expect(iconTabsRow).toBeTruthy();
83
+ });
84
+
85
+ it("should render tabs row with icons if icons available", async () => {
86
+ defaultProps.tabs = undefined;
87
+ defaultProps.icons = [
88
+ { name: "edit", text: "Edit mode" },
89
+ { name: "view", text: "Preview mode" },
90
+ ];
91
+
92
+ render(
93
+ <ThemeProvider theme={parseTheme(globalTheme)}>
94
+ <Tabs {...defaultProps} />
95
+ </ThemeProvider>
96
+ );
97
+
98
+ const iconTabsRow = screen.getByTestId("icons-tabs-row");
99
+ const tabs = screen.getAllByTestId("icon-tab");
100
+ expect(iconTabsRow).toBeTruthy();
101
+ expect(tabs.length).toEqual(2);
102
+ });
103
+
104
+ it("should render tooltip with icon's text", async () => {
105
+ defaultProps.tabs = undefined;
106
+ defaultProps.icons = [
107
+ { name: "edit", text: "Edit mode" },
108
+ { name: "view", text: "Preview mode" },
109
+ ];
110
+
111
+ render(
112
+ <ThemeProvider theme={parseTheme(globalTheme)}>
113
+ <Tabs {...defaultProps} />
114
+ </ThemeProvider>
115
+ );
116
+
117
+ const tooltips = screen.getAllByTestId("tooltip-component");
118
+ expect(tooltips[0]).toBeTruthy();
119
+ expect(tooltips[0].textContent).toBe("Edit mode");
120
+ expect(tooltips[1]).toBeTruthy();
121
+ expect(tooltips[1].textContent).toBe("Preview mode");
122
+ });
123
+
124
+ it("should not display icon if doesn't exist", async () => {
125
+ defaultProps.icons = [
126
+ { name: "failed-icon", text: "Edit mode" },
127
+ { name: "view", text: "Preview mode" },
128
+ ];
129
+ defaultProps.active = "edit";
130
+ const setSelectedTabAction = jest.fn();
131
+ defaultProps.setSelectedTab = setSelectedTabAction;
132
+
133
+ render(
134
+ <ThemeProvider theme={parseTheme(globalTheme)}>
135
+ <Tabs {...defaultProps} />
136
+ </ThemeProvider>
137
+ );
138
+ const tooltips = screen.getAllByTestId("tooltip-component");
139
+ expect(tooltips[0]).toBeTruthy();
140
+ expect(tooltips[1]).toBeTruthy();
141
+ const tooltipIcons = screen.getAllByTestId("icon-component");
142
+ expect(tooltipIcons.length).toEqual(1);
143
+ });
144
+ });
145
+
146
+ describe("Tabs component events", () => {
147
+ it("should set tab as active on click", async () => {
148
+ defaultProps.tabs = ["tab1", "tab2"];
149
+ defaultProps.active = "tab1";
150
+ const setSelectedTabAction = jest.fn();
151
+ defaultProps.setSelectedTab = setSelectedTabAction;
152
+
153
+ render(
154
+ <ThemeProvider theme={parseTheme(globalTheme)}>
155
+ <Tabs {...defaultProps} />
156
+ </ThemeProvider>
157
+ );
158
+ const tabs = screen.getAllByTestId("tab");
159
+ fireEvent.click(tabs[1]);
160
+ expect(setSelectedTabAction).toBeCalled();
161
+ expect(tabs[0]).toHaveStyleRule("cursor", "initial");
162
+ expect(tabs[1]).toHaveStyleRule("cursor", "pointer");
163
+ });
164
+
165
+ it("should call set selected tab action on click icon tab", async () => {
166
+ defaultProps.tabs = undefined;
167
+ defaultProps.icons = [
168
+ { name: "edit", text: "Edit mode" },
169
+ { name: "view", text: "Preview mode" },
170
+ ];
171
+ defaultProps.active = "edit";
172
+ const setSelectedTabAction = jest.fn();
173
+ defaultProps.setSelectedTab = setSelectedTabAction;
174
+
175
+ render(
176
+ <ThemeProvider theme={parseTheme(globalTheme)}>
177
+ <Tabs {...defaultProps} />
178
+ </ThemeProvider>
179
+ );
180
+ const tabs = screen.getAllByTestId("icon-tab");
181
+ fireEvent.click(tabs[1]);
182
+ expect(setSelectedTabAction).toBeCalled();
183
+ });
184
+
185
+ it("should set icon tab as active on click", async () => {
186
+ defaultProps.icons = [
187
+ { name: "edit", text: "Edit mode" },
188
+ { name: "view", text: "Preview mode" },
189
+ ];
190
+ defaultProps.active = "edit";
191
+ const setSelectedTabAction = jest.fn();
192
+ defaultProps.setSelectedTab = setSelectedTabAction;
193
+
194
+ render(
195
+ <ThemeProvider theme={parseTheme(globalTheme)}>
196
+ <Tabs {...defaultProps} />
197
+ </ThemeProvider>
198
+ );
199
+ const tabs = screen.getAllByTestId("icon-tab");
200
+ fireEvent.click(tabs[1]);
201
+ expect(setSelectedTabAction).toBeCalled();
202
+ expect(tabs[0]).toHaveStyleRule("cursor", "initial");
203
+ expect(tabs[1]).toHaveStyleRule("cursor", "pointer");
204
+ });
205
+ });
@@ -0,0 +1,140 @@
1
+ import * as React from "react";
2
+
3
+ import { ThemeProvider } from "styled-components";
4
+ import { mock } from "jest-mock-extended";
5
+
6
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
7
+ import { parseTheme } from "@ax/helpers";
8
+
9
+ import globalTheme from "@ax/themes/theme.json";
10
+ import Tag, { ITagProps } from "@ax/components/Tag";
11
+
12
+ afterEach(cleanup);
13
+
14
+ const defaultProps = mock<ITagProps>();
15
+
16
+ describe("Tag component rendering", () => {
17
+ it("should render status tag when type is defined as 'status'", () => {
18
+ defaultProps.type = "status";
19
+ defaultProps.text = "Modules";
20
+
21
+ render(
22
+ <ThemeProvider theme={parseTheme(globalTheme)}>
23
+ <Tag {...defaultProps} />
24
+ </ThemeProvider>
25
+ );
26
+
27
+ const tagStatus = screen.getByTestId("tag-status");
28
+ expect(tagStatus).toBeTruthy();
29
+ });
30
+
31
+ it("should render fixed tag when type is defined as 'fixed'", () => {
32
+ defaultProps.type = "fixed";
33
+ defaultProps.text = "Modules";
34
+
35
+ render(
36
+ <ThemeProvider theme={parseTheme(globalTheme)}>
37
+ <Tag {...defaultProps} />
38
+ </ThemeProvider>
39
+ );
40
+
41
+ const tagFixed = screen.getByTestId("tag-fixed");
42
+ expect(tagFixed).toBeTruthy();
43
+ });
44
+
45
+ it("should render square tag when type is defined as 'square'", () => {
46
+ defaultProps.type = "square";
47
+ defaultProps.text = "Modules";
48
+
49
+ render(
50
+ <ThemeProvider theme={parseTheme(globalTheme)}>
51
+ <Tag {...defaultProps} />
52
+ </ThemeProvider>
53
+ );
54
+
55
+ const tagSquare = screen.getByTestId("tag-square");
56
+ expect(tagSquare).toBeTruthy();
57
+ });
58
+
59
+ it("should render fixed tag when type is not defined", () => {
60
+ defaultProps.text = "Modules";
61
+ defaultProps.type = undefined;
62
+
63
+ render(
64
+ <ThemeProvider theme={parseTheme(globalTheme)}>
65
+ <Tag {...defaultProps} />
66
+ </ThemeProvider>
67
+ );
68
+
69
+ const tagFixed = screen.getByTestId("tag-fixed");
70
+ expect(tagFixed).toBeTruthy();
71
+ });
72
+
73
+ it("should render text", () => {
74
+ defaultProps.type = "fixed";
75
+ defaultProps.text = "Modules";
76
+
77
+ render(
78
+ <ThemeProvider theme={parseTheme(globalTheme)}>
79
+ <Tag {...defaultProps} />
80
+ </ThemeProvider>
81
+ );
82
+
83
+ const tagFixedTitle = screen.getByTestId("tag-fixed-title");
84
+ expect(tagFixedTitle).toBeTruthy();
85
+ expect(tagFixedTitle.textContent).toEqual("Modules");
86
+ });
87
+
88
+ it("should render delete icon when onDeleteAction is defined", () => {
89
+ defaultProps.type = "fixed";
90
+ defaultProps.text = "Modules";
91
+ const deleteAction = jest.fn();
92
+ defaultProps.onDeleteAction = deleteAction;
93
+
94
+ render(
95
+ <ThemeProvider theme={parseTheme(globalTheme)}>
96
+ <Tag {...defaultProps} />
97
+ </ThemeProvider>
98
+ );
99
+
100
+ const deleteIconWrapper = screen.getByTestId("delete-icon-wrapper");
101
+ expect(deleteIconWrapper).toBeTruthy();
102
+ });
103
+ });
104
+
105
+ describe("Tag component events", () => {
106
+ it("should called deleteAction when click delete button", () => {
107
+ defaultProps.type = "fixed";
108
+ defaultProps.text = "Modules";
109
+ const deleteAction = jest.fn();
110
+ defaultProps.onDeleteAction = deleteAction;
111
+
112
+ render(
113
+ <ThemeProvider theme={parseTheme(globalTheme)}>
114
+ <Tag {...defaultProps} />
115
+ </ThemeProvider>
116
+ );
117
+
118
+ const deleteIconWrapper = screen.getByTestId("delete-icon-wrapper");
119
+ expect(deleteIconWrapper).toBeTruthy();
120
+ fireEvent.click(deleteIconWrapper);
121
+ expect(deleteAction).toBeCalled();
122
+ });
123
+
124
+ it("should set background color when color is defined", () => {
125
+ defaultProps.type = "fixed";
126
+ defaultProps.text = "Modules";
127
+ defaultProps.color = "rgba(80, 87, 255, 0.16)";
128
+
129
+ render(
130
+ <ThemeProvider theme={parseTheme(globalTheme)}>
131
+ <Tag {...defaultProps} />
132
+ </ThemeProvider>
133
+ );
134
+
135
+ const tagFixed = screen.getByTestId("tag-fixed");
136
+ expect(tagFixed).toBeTruthy();
137
+ const styles = getComputedStyle(tagFixed);
138
+ expect(styles.backgroundColor).toEqual("rgba(80, 87, 255, 0.16)");
139
+ });
140
+ });