@truedat/core 7.5.7 → 7.5.10

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 (277) hide show
  1. package/package.json +34 -68
  2. package/src/__tests__/routesTree.spec.js +108 -0
  3. package/src/api/queries.js +10 -0
  4. package/src/api.js +3 -0
  5. package/src/components/AddMemberForm.js +10 -10
  6. package/src/components/AddResourceMember.js +0 -2
  7. package/src/components/AdminMenu.js +0 -1
  8. package/src/components/AiMenu.js +0 -1
  9. package/src/components/Alert.js +1 -1
  10. package/src/components/AlertExporter.js +0 -1
  11. package/src/components/ArrayDecorator.js +0 -1
  12. package/src/components/Authorized.js +2 -2
  13. package/src/components/AvailableFilters.js +1 -2
  14. package/src/components/CSVFileModal.js +1 -1
  15. package/src/components/CardGroupsAccordion.js +1 -1
  16. package/src/components/CatalogMenu.js +1 -2
  17. package/src/components/CommentRow.js +7 -8
  18. package/src/components/Comments.js +3 -4
  19. package/src/components/CommentsForm.js +2 -2
  20. package/src/components/ConfirmModal.js +0 -1
  21. package/src/components/CursorPagination.js +1 -2
  22. package/src/components/DashboardMenu.js +0 -1
  23. package/src/components/Date.js +0 -1
  24. package/src/components/DateFilter.js +1 -1
  25. package/src/components/DateRangeFilter.js +1 -1
  26. package/src/components/DateTime.js +0 -1
  27. package/src/components/DescriptionInput.js +1 -1
  28. package/src/components/DomainSelector.js +2 -3
  29. package/src/components/DropdownMenuItem.js +0 -1
  30. package/src/components/ErrorBoundary.js +8 -7
  31. package/src/components/FieldLabel.js +0 -1
  32. package/src/components/FilterDropdown.js +3 -3
  33. package/src/components/FilterItem.js +0 -1
  34. package/src/components/FilterMultilevelDropdown.js +1 -1
  35. package/src/components/GenericCrumbs.js +3 -4
  36. package/src/components/GlossaryMenu.js +24 -31
  37. package/src/components/GrantMenu.js +0 -1
  38. package/src/components/GroupActions.js +15 -15
  39. package/src/components/Hierarchy.js +7 -10
  40. package/src/components/HierarchyFilterDropdown.js +1 -2
  41. package/src/components/HierarchyNodeFinder.js +4 -4
  42. package/src/components/HierarchySelector.js +1 -2
  43. package/src/components/HistoryBackButton.js +6 -6
  44. package/src/components/IngestMenu.js +0 -1
  45. package/src/components/LanguagesTabs.js +4 -4
  46. package/src/components/LineageMenu.js +0 -1
  47. package/src/components/Loading.js +1 -2
  48. package/src/components/MembersMenu.js +0 -1
  49. package/src/components/ModalSaveFilter.js +1 -1
  50. package/src/components/NodeOpenActions.js +0 -1
  51. package/src/components/OptionGroup.js +1 -2
  52. package/src/components/OptionModal.js +0 -1
  53. package/src/components/Pagination.js +0 -1
  54. package/src/components/QualityMenu.js +0 -1
  55. package/src/components/QxMenu.js +0 -1
  56. package/src/components/Redirector.js +3 -3
  57. package/src/components/ResourceMember.js +1 -2
  58. package/src/components/ResourceMembers.js +3 -3
  59. package/src/components/ResourceMembersActions.js +1 -2
  60. package/src/components/RichTextEditor.js +7 -8
  61. package/src/components/RouteListener.js +11 -32
  62. package/src/components/SafeLink.js +0 -1
  63. package/src/components/ScrollToTop.js +13 -16
  64. package/src/components/SearchFilterDropdown.js +1 -1
  65. package/src/components/SearchInput.js +3 -3
  66. package/src/components/SearchMenu.js +0 -1
  67. package/src/components/SelectedFilters.js +1 -2
  68. package/src/components/SideMenu.js +0 -1
  69. package/src/components/SidebarToggle.js +2 -2
  70. package/src/components/StructureFilterItem.js +0 -1
  71. package/src/components/Submenu.js +8 -7
  72. package/src/components/SystemsLoader.js +27 -0
  73. package/src/components/TaxonomyMenu.js +0 -1
  74. package/src/components/TemplateSelector.js +1 -1
  75. package/src/components/TemplatesLoader.js +24 -0
  76. package/src/components/TreeSelector.js +4 -4
  77. package/src/components/Unauthorized.js +0 -1
  78. package/src/components/UploadModal.js +152 -176
  79. package/src/components/UserFilter.js +0 -2
  80. package/src/components/UserFilters.js +0 -2
  81. package/src/components/__tests__/AddMemberForm.spec.js +26 -38
  82. package/src/components/__tests__/AddResourceMember.spec.js +0 -1
  83. package/src/components/__tests__/AdminMenu.spec.js +0 -1
  84. package/src/components/__tests__/Alert.spec.js +17 -21
  85. package/src/components/__tests__/AvailableFilters.spec.js +19 -14
  86. package/src/components/__tests__/CardGroupsAccordion.spec.js +24 -15
  87. package/src/components/__tests__/CatalogMenu.spec.js +27 -45
  88. package/src/components/__tests__/CommentsLoader.spec.js +17 -14
  89. package/src/components/__tests__/CursorPagination.spec.js +0 -1
  90. package/src/components/__tests__/DashboardMenu.spec.js +0 -1
  91. package/src/components/__tests__/DateFilter.spec.js +6 -28
  92. package/src/components/__tests__/DateTime.spec.js +0 -1
  93. package/src/components/__tests__/DomainSelector.spec.js +4 -4
  94. package/src/components/__tests__/DropdownMenuItem.spec.js +0 -1
  95. package/src/components/__tests__/FilterDropdown.spec.js +28 -27
  96. package/src/components/__tests__/FilterItem.spec.js +19 -20
  97. package/src/components/__tests__/FilterMultilevelDropdown.spec.js +16 -16
  98. package/src/components/__tests__/FiltersLoader.spec.js +25 -20
  99. package/src/components/__tests__/GenericCrumbs.spec.js +0 -1
  100. package/src/components/__tests__/GlossaryMenu.spec.js +0 -1
  101. package/src/components/__tests__/GrantMenu.spec.js +0 -1
  102. package/src/components/__tests__/GroupActions.spec.js +0 -1
  103. package/src/components/__tests__/Hierarchy.spec.js +0 -1
  104. package/src/components/__tests__/HierarchyFilterDropdown.spec.js +16 -14
  105. package/src/components/__tests__/HierarchyNodeFinder.spec.js +0 -1
  106. package/src/components/__tests__/HierarchySelector.spec.js +28 -35
  107. package/src/components/__tests__/HistoryBackButton.spec.js +23 -23
  108. package/src/components/__tests__/IngestMenu.spec.js +0 -1
  109. package/src/components/__tests__/LineageMenu.spec.js +0 -1
  110. package/src/components/__tests__/Loading.spec.js +4 -5
  111. package/src/components/__tests__/MembersMenu.spec.js +0 -1
  112. package/src/components/__tests__/ModalSaveFilter.spec.js +0 -1
  113. package/src/components/__tests__/OptionGroup.spec.js +5 -7
  114. package/src/components/__tests__/Pagination.spec.js +22 -16
  115. package/src/components/__tests__/QualityMenu.spec.js +0 -1
  116. package/src/components/__tests__/Redirector.spec.js +5 -10
  117. package/src/components/__tests__/ResourceMembers.spec.js +36 -27
  118. package/src/components/__tests__/ResourceMembersAction.spec.js +1 -2
  119. package/src/components/__tests__/RouteListener.spec.js +25 -26
  120. package/src/components/__tests__/SafeLink.spec.js +0 -1
  121. package/src/components/__tests__/SearchDateFilter.spec.js +0 -1
  122. package/src/components/__tests__/SearchFilterDropdown.spec.js +32 -24
  123. package/src/components/__tests__/SearchInput.spec.js +5 -5
  124. package/src/components/__tests__/SearchMenu.spec.js +0 -1
  125. package/src/components/__tests__/SelectedFilters.spec.js +50 -47
  126. package/src/components/__tests__/SideMenu.spec.js +5 -8
  127. package/src/components/__tests__/StructureFilterItem.spec.js +13 -11
  128. package/src/components/__tests__/Submenu.spec.js +0 -1
  129. package/src/components/__tests__/SystemsLoader.spec.js +40 -0
  130. package/src/components/__tests__/TaxonomyMenu.spec.js +0 -1
  131. package/src/components/__tests__/TemplateSelector.spec.js +27 -29
  132. package/src/components/__tests__/TemplatesLoader.spec.js +30 -0
  133. package/src/components/__tests__/TreeSelector.spec.js +110 -83
  134. package/src/components/__tests__/UploadModal.spec.js +171 -0
  135. package/src/components/__tests__/UserFilters.spec.js +44 -37
  136. package/src/components/__tests__/__snapshots__/AddMemberForm.spec.js.snap +1 -0
  137. package/src/components/__tests__/__snapshots__/AddResourceMember.spec.js.snap +10 -9
  138. package/src/components/__tests__/__snapshots__/AdminMenu.spec.js.snap +22 -11
  139. package/src/components/__tests__/__snapshots__/Alert.spec.js.snap +29 -17
  140. package/src/components/__tests__/__snapshots__/AvailableFilters.spec.js.snap +1 -1
  141. package/src/components/__tests__/__snapshots__/CatalogMenu.spec.js.snap +18 -8
  142. package/src/components/__tests__/__snapshots__/CursorPagination.spec.js.snap +3 -0
  143. package/src/components/__tests__/__snapshots__/DateFilter.spec.js.snap +165 -107
  144. package/src/components/__tests__/__snapshots__/DomainSelector.spec.js.snap +1 -1
  145. package/src/components/__tests__/__snapshots__/FilterItem.spec.js.snap +13 -20
  146. package/src/components/__tests__/__snapshots__/GlossaryMenu.spec.js.snap +8 -0
  147. package/src/components/__tests__/__snapshots__/GrantMenu.spec.js.snap +14 -7
  148. package/src/components/__tests__/__snapshots__/GroupActions.spec.js.snap +0 -1
  149. package/src/components/__tests__/__snapshots__/Hierarchy.spec.js.snap +0 -1
  150. package/src/components/__tests__/__snapshots__/HierarchySelector.spec.js.snap +1 -1
  151. package/src/components/__tests__/__snapshots__/HistoryBackButton.spec.js.snap +10 -20
  152. package/src/components/__tests__/__snapshots__/IngestMenu.spec.js.snap +3 -1
  153. package/src/components/__tests__/__snapshots__/LineageMenu.spec.js.snap +6 -3
  154. package/src/components/__tests__/__snapshots__/Loading.spec.js.snap +5 -4
  155. package/src/components/__tests__/__snapshots__/MembersMenu.spec.js.snap +6 -3
  156. package/src/components/__tests__/__snapshots__/OptionGroup.spec.js.snap +38 -28
  157. package/src/components/__tests__/__snapshots__/Pagination.spec.js.snap +213 -64
  158. package/src/components/__tests__/__snapshots__/QualityMenu.spec.js.snap +14 -8
  159. package/src/components/__tests__/__snapshots__/ResourceMembers.spec.js.snap +1 -0
  160. package/src/components/__tests__/__snapshots__/ResourceMembersAction.spec.js.snap +2 -1
  161. package/src/components/__tests__/__snapshots__/RouteListener.spec.js.snap +1 -1
  162. package/src/components/__tests__/__snapshots__/SearchInput.spec.js.snap +10 -12
  163. package/src/components/__tests__/__snapshots__/SearchMenu.spec.js.snap +3 -1
  164. package/src/components/__tests__/__snapshots__/SelectedFilters.spec.js.snap +8 -8
  165. package/src/components/__tests__/__snapshots__/SideMenu.spec.js.snap +112 -50
  166. package/src/components/__tests__/__snapshots__/Submenu.spec.js.snap +3 -0
  167. package/src/components/__tests__/__snapshots__/SystemsLoader.spec.js.snap +3 -0
  168. package/src/components/__tests__/__snapshots__/TaxonomyMenu.spec.js.snap +3 -1
  169. package/src/components/__tests__/__snapshots__/TemplateSelector.spec.js.snap +7 -7
  170. package/src/components/common/SearchContextWrapper.js +1 -4
  171. package/src/hooks/__mocks__/useAuthorized.js +2 -0
  172. package/src/hooks/__mocks__/useUserFilters.js +17 -0
  173. package/src/hooks/__tests__/{useAclEntries.spec.js → useAclEntries.spec.js.disabled} +1 -1
  174. package/src/hooks/__tests__/useAuthorized.spec.js +1 -1
  175. package/src/hooks/useAclEntries.js +6 -3
  176. package/src/hooks/useActiveRoute.js +3 -3
  177. package/src/hooks/useActiveRoutes.js +4 -4
  178. package/src/hooks/useHierarchies.js +112 -0
  179. package/src/hooks/useLocales.js +1 -1
  180. package/src/hooks/useMessages.js +1 -1
  181. package/src/hooks/usePath.js +4 -4
  182. package/src/hooks/useUserFilters.js +1 -1
  183. package/src/i18n/components/EditableCell.js +1 -1
  184. package/src/i18n/components/I18nRoutes.js +11 -16
  185. package/src/i18n/components/LangProvider.js +56 -101
  186. package/src/i18n/components/LangProviderWrapper.js +26 -33
  187. package/src/i18n/components/Languages.js +8 -7
  188. package/src/i18n/components/MessageForm.js +9 -23
  189. package/src/i18n/components/Messages.js +5 -4
  190. package/src/i18n/components/MessagesTable.js +0 -1
  191. package/src/i18n/components/NewMessage.js +5 -4
  192. package/src/i18n/components/__tests__/EditableCell.spec.js +18 -20
  193. package/src/i18n/components/__tests__/I18nRoutes.spec.js +39 -5
  194. package/src/i18n/components/__tests__/MessageForm.spec.js +0 -1
  195. package/src/i18n/components/__tests__/Messages.spec.js +9 -21
  196. package/src/i18n/components/__tests__/NewMessage.spec.js +0 -1
  197. package/src/i18n/components/__tests__/__snapshots__/I18nRoutes.spec.js.snap +25 -1
  198. package/src/i18n/components/__tests__/__snapshots__/MessageForm.spec.js.snap +1 -0
  199. package/src/i18n/components/__tests__/__snapshots__/Messages.spec.js.snap +5 -13
  200. package/src/i18n/components/__tests__/__snapshots__/NewMessage.spec.js.snap +2 -0
  201. package/src/reducers/__tests__/comments.spec.js +9 -6
  202. package/src/reducers/__tests__/commentsResource.spec.js +5 -2
  203. package/src/reducers/__tests__/coreMessage.spec.js +1 -1
  204. package/src/reducers/__tests__/dashboardDomains.spec.js +5 -5
  205. package/src/reducers/__tests__/systems.spec.js +42 -0
  206. package/src/reducers/__tests__/systemsLoading.spec.js +22 -0
  207. package/src/reducers/index.js +5 -1
  208. package/src/reducers/systems.js +19 -0
  209. package/src/reducers/systemsLoading.js +14 -0
  210. package/src/router/Loader.js +10 -0
  211. package/src/router/ProtectedRoute.js +11 -0
  212. package/src/router/Unauthorized.js +16 -0
  213. package/src/router/__tests__/ProtectedRoute.spec.js +49 -0
  214. package/src/router/__tests__/Unauthorized.spec.js +15 -0
  215. package/src/router/__tests__/__snapshots__/ProtectedRoute.spec.js.snap +44 -0
  216. package/src/router/__tests__/__snapshots__/Unauthorized.spec.js.snap +26 -0
  217. package/src/router/index.js +5 -0
  218. package/src/routes.js +7 -7
  219. package/src/routesTree.js +93 -0
  220. package/src/routines.js +8 -0
  221. package/src/sagas/__tests__/addComment.spec.js +3 -5
  222. package/src/sagas/__tests__/fetchComments.spec.js +1 -1
  223. package/src/sagas/__tests__/fetchSystems.spec.js +69 -0
  224. package/src/sagas/fetchSystems.js +25 -0
  225. package/src/sagas/index.js +3 -0
  226. package/src/search/FilterDropdown.js +0 -1
  227. package/src/search/FilterItem.js +0 -1
  228. package/src/search/FilterMultilevelDropdown.js +1 -1
  229. package/src/search/FilterQueryDropdown.js +38 -42
  230. package/src/search/HierarchyFilterDropdown.js +3 -4
  231. package/src/search/ModalSaveFilter.js +1 -1
  232. package/src/search/Pagination.js +0 -1
  233. package/src/search/SearchContext.js +9 -11
  234. package/src/search/SearchDateFilter.js +0 -1
  235. package/src/search/SearchFilters.js +1 -2
  236. package/src/search/SearchSelectedFilters.js +4 -4
  237. package/src/search/SearchWidget.js +0 -4
  238. package/src/search/UserFilter.js +0 -2
  239. package/src/search/UserFilters.js +4 -3
  240. package/src/search/__tests__/FilterDropdown.spec.js +54 -51
  241. package/src/search/__tests__/FilterItem.spec.js +20 -15
  242. package/src/search/__tests__/FilterQueryDropdown.spec.js +106 -84
  243. package/src/search/__tests__/ModalSaveFilter.spec.js +4 -5
  244. package/src/search/__tests__/SearchContext.spec.js +3 -4
  245. package/src/search/__tests__/SearchWidget.spec.js +0 -1
  246. package/src/selectors/__tests__/getConceptSubscope.spec.js +37 -0
  247. package/src/selectors/__tests__/getDashboardConfig.spec.js +9 -9
  248. package/src/selectors/__tests__/getMessage.spec.js +1 -1
  249. package/src/selectors/__tests__/getSidemenuGlossarySubscopes.spec.js +17 -0
  250. package/src/selectors/__tests__/makeActiveFiltersSelector.spec.js +2 -2
  251. package/src/selectors/__tests__/makeSearchQuerySelector.spec.js +1 -1
  252. package/src/selectors/__tests__/makeTagOptionsSelector.spec.js +6 -6
  253. package/src/selectors/getConceptSubscope.js +19 -0
  254. package/src/selectors/getMessage.js +2 -2
  255. package/src/selectors/getRecipients.js +34 -0
  256. package/src/selectors/getSidemenuGlossarySubscopes.js +8 -0
  257. package/src/selectors/index.js +5 -0
  258. package/src/selectors/makeActiveFiltersSelector.js +2 -6
  259. package/src/selectors/makeSearchQuerySelector.js +4 -11
  260. package/src/selectors/makeTagOptionsSelector.js +4 -8
  261. package/src/selectors/subscopedTemplates.js +16 -0
  262. package/src/selectors/taxonomy.js +170 -0
  263. package/src/services/__tests__/columnDecorator.spec.js +1 -1
  264. package/src/services/__tests__/dateFilterFormatter.spec.js +2 -2
  265. package/src/services/__tests__/fieldType.spec.js +2 -2
  266. package/src/services/__tests__/filters.spec.js +1 -1
  267. package/src/services/__tests__/message.spec.js +2 -2
  268. package/src/services/__tests__/operators.spec.js +5 -5
  269. package/src/services/__tests__/sort.spec.js +8 -8
  270. package/src/services/__tests__/storage.spec.js +17 -0
  271. package/src/services/arrays.js +16 -14
  272. package/src/services/columnDecoratorComponent.js +2 -2
  273. package/src/services/columnDecorators.js +0 -1
  274. package/src/services/fieldType.js +8 -8
  275. package/src/services/filters.js +5 -5
  276. package/src/services/message.js +1 -4
  277. package/src/services/operators.js +1 -1
@@ -1,38 +1,37 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
3
- import { RouteListener } from "../RouteListener";
1
+ import { render } from "@truedat/test/render";
2
+ import RouteListener from "../RouteListener";
3
+ import * as routines from "../../routines";
4
+
5
+ jest.mock("../../routines", () => ({
6
+ dismissAlert: jest.fn(() => ({ type: "DISMISS_ALERT" })),
7
+ }));
4
8
 
5
9
  describe("<RouteListener />", () => {
6
- const props = {
7
- message: {},
8
- location: { pathname: "/test" },
9
- };
10
+ const mockDispatch = jest.fn();
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ });
10
15
 
11
16
  it("matches the latest snapshot", () => {
12
- const wrapper = shallow(<RouteListener {...props} />);
13
- expect(wrapper).toMatchSnapshot();
17
+ const { container } = render(<RouteListener />);
18
+ expect(container).toMatchSnapshot();
14
19
  });
15
20
 
16
21
  it("when changing location with message will call dismissAlert", () => {
17
- const dismissAlert = jest.fn();
18
- const wrapper = shallow(
19
- <RouteListener dismissAlert={dismissAlert} {...props} />
20
- );
21
- wrapper.setProps({
22
- message: { not: "empty" },
23
- location: { pathname: "/different" },
22
+ // Initial render with a message
23
+ const { rerender } = render(<RouteListener />, {
24
+ routes: ["/initial"],
25
+ dispatch: mockDispatch,
24
26
  });
25
- expect(dismissAlert.mock.calls.length).toBe(1);
26
- });
27
27
 
28
- it("when changing location without message will not call dismissAlert", () => {
29
- const dismissAlert = jest.fn();
30
- const wrapper = shallow(
31
- <RouteListener dismissAlert={dismissAlert} {...props} />
32
- );
33
- wrapper.setProps({
34
- location: { pathname: "/different" },
28
+ // Change location
29
+ rerender(<RouteListener />, {
30
+ routes: ["/initial", "/different"],
31
+ routeIndex: 1,
32
+ dispatch: mockDispatch,
35
33
  });
36
- expect(dismissAlert.mock.calls.length).toBe(0);
34
+
35
+ expect(mockDispatch).toHaveBeenCalledWith(routines.dismissAlert());
37
36
  });
38
37
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import SafeLink from "../SafeLink";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import SearchDateFilter from "@truedat/core/search/SearchDateFilter";
4
3
  import SearchContextWrapper from "@truedat/core/components/common/SearchContextWrapper";
@@ -1,14 +1,12 @@
1
1
  /* eslint-disable react/prop-types */
2
- import React from "react";
3
- import { render } from "@truedat/test/render";
4
- import { within, waitFor } from "@testing-library/react";
5
- import userEvent from "@testing-library/user-event";
6
-
7
2
  import { Icon, Dropdown, Segment } from "semantic-ui-react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { within, waitFor } from "@testing-library/react";
5
+ import { render, waitForLoad } from "@truedat/test/render";
8
6
 
9
7
  import SearchFilterDropdown from "../SearchFilterDropdown";
10
8
 
11
- const DummyLoader = () => <div></div>;
9
+ const DummyLoader = () => <div />;
12
10
  const DummyFilerItem = ({ active, toggleFilterValue, option }) => (
13
11
  <Dropdown.Item onClick={() => toggleFilterValue(option)} active={active}>
14
12
  <Segment vertical>
@@ -51,44 +49,50 @@ const props = {
51
49
  };
52
50
 
53
51
  describe("<SearchFilterDropDown/>", () => {
54
- it("matches the latest snapshot unfolded", () => {
55
- const { container } = render(<SearchFilterDropdown {...props} />);
56
- expect(container).toMatchSnapshot();
52
+ it("matches the latest snapshot unfolded", async () => {
53
+ const rendered = render(<SearchFilterDropdown {...props} />);
54
+ await waitForLoad(rendered);
55
+ expect(rendered.container).toMatchSnapshot();
57
56
  });
58
57
 
59
- it("matches the latest snapshot folded", () => {
58
+ it("matches the latest snapshot folded", async () => {
60
59
  const customProps = {
61
60
  ...props,
62
61
  open: false,
63
62
  };
64
- const { container } = render(<SearchFilterDropdown {...customProps} />);
65
- expect(container).toMatchSnapshot();
63
+ const rendered = render(<SearchFilterDropdown {...customProps} />);
64
+ await waitForLoad(rendered);
65
+ expect(rendered.container).toMatchSnapshot();
66
66
  });
67
67
 
68
- it("check option check it correctly", () => {
69
- const { getByRole, getAllByRole } = render(
70
- <SearchFilterDropdown {...props} />
71
- );
68
+ it("check option check it correctly", async () => {
69
+ const rendered = render(<SearchFilterDropdown {...props} />);
70
+ await waitForLoad(rendered);
71
+
72
+ const user = userEvent.setup({ delay: null });
72
73
 
73
74
  expect(props.toggleFilterValue).toBeCalledTimes(0);
74
- userEvent.click(getByRole("option", { name: "baz_option" }));
75
+ await user.click(rendered.getByRole("option", { name: /baz_option/i }));
75
76
  expect(props.toggleFilterValue).toBeCalledWith({
76
77
  value: 3,
77
78
  filter: "foo_filter",
78
79
  });
79
80
 
80
81
  expect(
81
- within(getAllByRole("option")[0]).queryByText("baz_option")
82
+ within(rendered.getAllByRole("option")[0]).queryByText(/baz_option/i)
82
83
  ).not.toBeNull();
83
84
  });
84
85
 
85
- it("type in filter input dispatch searchCallback with correct query", () => {
86
+ it("type in filter input dispatch searchCallback with correct query", async () => {
86
87
  const searchText = "a";
88
+ const user = userEvent.setup({ delay: null });
89
+
90
+ const rendered = render(<SearchFilterDropdown {...props} />);
91
+ await waitForLoad(rendered);
87
92
 
88
- const { getByRole } = render(<SearchFilterDropdown {...props} />);
89
- const input = getByRole("textbox");
93
+ const input = rendered.getByRole("textbox");
90
94
 
91
- userEvent.type(input, searchText);
95
+ await user.type(input, searchText);
92
96
 
93
97
  expect(props.searchCallback).toBeCalledWith({
94
98
  query: `${props.query}${searchText}`,
@@ -97,8 +101,12 @@ describe("<SearchFilterDropDown/>", () => {
97
101
  });
98
102
 
99
103
  it("remove filter dispatches removeFilter", async () => {
100
- const { container } = render(<SearchFilterDropdown {...props} />);
101
- userEvent.click(container.querySelector('[class="delete icon"]'));
104
+ const rendered = render(<SearchFilterDropdown {...props} />);
105
+ await waitForLoad(rendered);
106
+
107
+ const user = userEvent.setup({ delay: null });
108
+
109
+ await user.click(rendered.container.querySelector('[class="delete icon"]'));
102
110
  await waitFor(() => {
103
111
  expect(props.removeFilter).toBeCalledTimes(1);
104
112
  });
@@ -1,5 +1,4 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { SearchInput } from "../SearchInput";
4
3
 
5
4
  describe("<SearchInput />", () => {
@@ -7,8 +6,9 @@ describe("<SearchInput />", () => {
7
6
  const placeholder = "Search...";
8
7
  const props = { onChange, placeholder };
9
8
 
10
- it("matches the latest snapshot", () => {
11
- const wrapper = shallow(<SearchInput {...props} />);
12
- expect(wrapper).toMatchSnapshot();
9
+ it("matches the latest snapshot", async () => {
10
+ const rendered = render(<SearchInput {...props} />);
11
+ await waitForLoad(rendered);
12
+ expect(rendered.container).toMatchSnapshot();
13
13
  });
14
14
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { SearchMenu } from "../SearchMenu";
4
3
 
@@ -1,20 +1,19 @@
1
1
  /* eslint-disable react/prop-types */
2
- import React from "react";
3
- import { render } from "@truedat/test/render";
4
-
5
- import userEvent from "@testing-library/user-event";
6
2
  import { Icon, Dropdown, Segment } from "semantic-ui-react";
3
+ import userEvent from "@testing-library/user-event";
4
+
5
+ import { render } from "@truedat/test/render";
7
6
 
8
7
  import { SelectedFilters } from "../SelectedFilters";
9
8
 
10
- jest.mock("react-router-dom", () => ({
11
- ...jest.requireActual("react-router-dom"),
9
+ jest.mock("react-router", () => ({
10
+ ...jest.requireActual("react-router"),
12
11
  useLocation: () => ({
13
12
  pathname: "/domains/123/structures",
14
13
  }),
15
14
  }));
16
15
 
17
- const DummyLoader = () => <div></div>;
16
+ const DummyLoader = () => <div />;
18
17
  const DummyFilerItem = ({ active, toggleFilterValue, option }) => (
19
18
  <Dropdown.Item onClick={() => toggleFilterValue(option)} active={active}>
20
19
  <Segment vertical>
@@ -55,49 +54,51 @@ describe("<SelectedFilters/>", () => {
55
54
  },
56
55
  };
57
56
 
58
- it("matches the latest snapshot", () => {
59
- const { container } = render(<SelectedFilters {...props} />);
60
- expect(container).toMatchSnapshot();
57
+ it("matches the latest snapshot", async () => {
58
+ const rendered = render(<SelectedFilters {...props} />);
59
+ expect(rendered.container).toMatchSnapshot();
61
60
  });
62
61
 
63
- it("dispatches resetFilters", () => {
64
- const { getByText } = render(<SelectedFilters {...props} />, renderOptions);
62
+ it("dispatches resetFilters", async () => {
63
+ const rendered = render(<SelectedFilters {...props} />, renderOptions);
64
+ const user = userEvent.setup({ delay: null });
65
65
 
66
66
  expect(props.resetFilters).toBeCalledTimes(0);
67
- userEvent.click(getByText(messages["search.clear_filters"]));
67
+ await user.click(rendered.getByText(/clean filters/i));
68
68
  expect(props.resetFilters).toBeCalledTimes(1);
69
69
  });
70
70
 
71
- it("does not render Save filters option if saveFilters is undefined", () => {
72
- const { queryByText } = render(
73
- <SelectedFilters {...props} />,
74
- renderOptions
75
- );
76
- expect(queryByText(messages["search.save_filters"])).toBeNull();
71
+ it("does not render Save filters option if saveFilters is undefined", async () => {
72
+ const rendered = render(<SelectedFilters {...props} />, renderOptions);
73
+ expect(rendered.queryByText(/save filters/i)).toBeNull();
77
74
  });
78
75
 
79
- it("renders Save filters option if saveFilters is defined", () => {
76
+ it("renders Save filters option if saveFilters is defined", async () => {
80
77
  const customProps = { ...props, saveFilters: jest.fn() };
81
- const { getByText } = render(
78
+ const rendered = render(
82
79
  <SelectedFilters {...customProps} />,
83
80
  renderOptions
84
81
  );
85
- expect(getByText(messages["search.save_filters"])).toBeInTheDocument();
82
+ expect(rendered.getByText(/save filters/i)).toBeInTheDocument();
86
83
  });
87
84
 
88
- it("does not render userFilters if they are empty", () => {
85
+ it("does not render userFilters if they are empty", async () => {
89
86
  const customProps = { ...props, userFilters: [] };
90
- const { container } = render(<SelectedFilters {...customProps} />);
91
- expect(container.getElementsByClassName("userFilter")).toHaveLength(0);
87
+ const rendered = render(<SelectedFilters {...customProps} />);
88
+ expect(
89
+ rendered.container.getElementsByClassName("userFilter")
90
+ ).toHaveLength(0);
92
91
  });
93
92
 
94
- it("renders userFilters if they are defined", () => {
93
+ it("renders userFilters if they are defined", async () => {
95
94
  const customProps = { ...props, userFilters: [{ country: ["a"] }] };
96
- const { container } = render(<SelectedFilters {...customProps} />);
97
- expect(container.getElementsByClassName("userFilter")).toHaveLength(1);
95
+ const rendered = render(<SelectedFilters {...customProps} />);
96
+ expect(
97
+ rendered.container.getElementsByClassName("userFilter")
98
+ ).toHaveLength(1);
98
99
  });
99
100
 
100
- it("renders FilterMultilevelDropdown if filter is of type domain", () => {
101
+ it("renders FilterMultilevelDropdown if filter is of type domain", async () => {
101
102
  const customProps = {
102
103
  ...props,
103
104
  selectedFilters: ["taxonomy"],
@@ -105,13 +106,13 @@ describe("<SelectedFilters/>", () => {
105
106
  filterTypes: { taxonomy: "domain" },
106
107
  selectedFilterValues: [{ id: 1, name: "foo", level: 0 }],
107
108
  };
108
- const { container } = render(<SelectedFilters {...customProps} />);
109
+ const rendered = render(<SelectedFilters {...customProps} />);
109
110
  expect(
110
- container.querySelector('[name="filterMultilevelDropdown"]')
111
+ rendered.container.querySelector('[name="filterMultilevelDropdown"]')
111
112
  ).not.toBeNull();
112
113
  });
113
114
 
114
- it("renders HierarchyFilterDropdown if filter is of type hierarchy", () => {
115
+ it("renders HierarchyFilterDropdown if filter is of type hierarchy", async () => {
115
116
  const customProps = {
116
117
  ...props,
117
118
  selectedFilters: ["hierarchy_field"],
@@ -119,13 +120,13 @@ describe("<SelectedFilters/>", () => {
119
120
  filterTypes: { hierarchy_field: "hierarchy" },
120
121
  selectedFilterValues: [],
121
122
  };
122
- const { container } = render(<SelectedFilters {...customProps} />);
123
+ const rendered = render(<SelectedFilters {...customProps} />);
123
124
  expect(
124
- container.querySelector('[name="hierarchyFilterDropdown"]')
125
+ rendered.container.querySelector('[name="hierarchyFilterDropdown"]')
125
126
  ).not.toBeNull();
126
127
  });
127
128
 
128
- it("renders SearchFilterDropdown if filter is of type search", () => {
129
+ it("renders SearchFilterDropdown if filter is of type search", async () => {
129
130
  const customProps = {
130
131
  ...props,
131
132
  selectedFilters: ["search_filter"],
@@ -145,9 +146,9 @@ describe("<SelectedFilters/>", () => {
145
146
  },
146
147
  searchFilterDispacher: jest.fn(),
147
148
  };
148
- const { container } = render(<SelectedFilters {...customProps} />);
149
+ const rendered = render(<SelectedFilters {...customProps} />);
149
150
  expect(
150
- container.querySelector('[name="searchFilterDropdown"]')
151
+ rendered.container.querySelector('[name="searchFilterDropdown"]')
151
152
  ).not.toBeNull();
152
153
  });
153
154
  });
@@ -211,17 +212,19 @@ describe("<SelectedFilters/> taxonomy screens", () => {
211
212
  searchFilterDispacher: jest.fn(),
212
213
  };
213
214
 
214
- it("matches the latest snapshot", () => {
215
- const { container } = render(<SelectedFilters {...props} />);
216
- expect(container).toMatchSnapshot();
215
+ it("matches the latest snapshot", async () => {
216
+ const rendered = render(<SelectedFilters {...props} />);
217
+ expect(rendered.container).toMatchSnapshot();
217
218
  });
218
219
 
219
- it("render only Show filters", () => {
220
- const { queryByText } = render(<SelectedFilters {...props} />);
221
- expect(queryByText("Hide Domain Filter")).toBeNull();
222
- expect(queryByText("Show Status Filter")).toBeInTheDocument();
223
- expect(queryByText("Hide Multiple Domain Filter")).toBeNull();
224
- expect(queryByText("Hide Other Domain Filter")).toBeNull();
225
- expect(queryByText("Show Status and Domain Filter")).toBeInTheDocument();
220
+ it("render only Show filters", async () => {
221
+ const rendered = render(<SelectedFilters {...props} />);
222
+ expect(rendered.queryByText("Hide Domain Filter")).toBeNull();
223
+ expect(rendered.queryByText("Show Status Filter")).toBeInTheDocument();
224
+ expect(rendered.queryByText("Hide Multiple Domain Filter")).toBeNull();
225
+ expect(rendered.queryByText("Hide Other Domain Filter")).toBeNull();
226
+ expect(
227
+ rendered.queryByText("Show Status and Domain Filter")
228
+ ).toBeInTheDocument();
226
229
  });
227
230
  });
@@ -1,7 +1,5 @@
1
- import React from "react";
2
- import { render } from "@truedat/test/render";
3
- import { waitForElementToBeRemoved } from "@testing-library/react";
4
- import { CATALOG_VIEW_CONFIGS_QUERY } from "@truedat/dd/api/queries";
1
+ import { render, waitForLoad } from "@truedat/test/render";
2
+ import { CATALOG_VIEW_CONFIGS_QUERY } from "@truedat/core/api/queries";
5
3
  import SideMenu from "../SideMenu";
6
4
 
7
5
  jest.mock("@truedat/core/hooks", () => ({
@@ -39,14 +37,13 @@ const renderOpts = {
39
37
 
40
38
  describe("<SideMenu />", () => {
41
39
  it("matches the latest snapshot", async () => {
42
- const { container } = render(
40
+ const rendered = render(
43
41
  <SideMenu>
44
42
  <p>Hello</p>
45
43
  </SideMenu>,
46
44
  renderOpts
47
45
  );
48
- const loader = container.querySelector(".loader");
49
- await waitForElementToBeRemoved(loader);
50
- expect(container).toMatchSnapshot();
46
+ await waitForLoad(rendered);
47
+ expect(rendered.container).toMatchSnapshot();
51
48
  });
52
49
  });
@@ -1,9 +1,9 @@
1
- import React from "react";
2
- import { render } from "@truedat/test/render";
3
- import { within } from "@testing-library/react";
4
1
  import userEvent from "@testing-library/user-event";
2
+ import { render, waitForLoad } from "@truedat/test/render";
5
3
  import { StructureFilterItem } from "../StructureFilterItem";
6
4
 
5
+ const user = userEvent.setup({ delay: null });
6
+
7
7
  const props = {
8
8
  active: true,
9
9
  filter: "foo",
@@ -12,15 +12,17 @@ const props = {
12
12
  };
13
13
 
14
14
  describe("<StructureFilterItem/>", () => {
15
- it("matches the latest snapshot", () => {
16
- const { container } = render(<StructureFilterItem {...props} />);
17
- expect(container).toMatchSnapshot();
15
+ it("matches the latest snapshot", async () => {
16
+ const rendered = render(<StructureFilterItem {...props} />);
17
+ await waitForLoad(rendered);
18
+ expect(rendered.container).toMatchSnapshot();
18
19
  });
19
20
 
20
- it("dispatches toggleFilterValue on click", () => {
21
- const { container } = render(<StructureFilterItem {...props} />);
22
- expect(props.toggleFilterValue.mock.calls.length).toBe(0);
23
- userEvent.click(within(container).getByText(props.option.name));
24
- expect(props.toggleFilterValue.mock.calls.length).toBe(1);
21
+ it("dispatches toggleFilterValue on click", async () => {
22
+ const rendered = render(<StructureFilterItem {...props} />);
23
+ await waitForLoad(rendered);
24
+ expect(props.toggleFilterValue).toHaveBeenCalledTimes(0);
25
+ await user.click(rendered.getByText(/bar/));
26
+ expect(props.toggleFilterValue).toHaveBeenCalledTimes(1);
25
27
  });
26
28
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import Submenu from "../Submenu";
4
3
 
@@ -0,0 +1,40 @@
1
+ import { render, waitForLoad } from "@truedat/test/render";
2
+ import { SystemsLoader } from "../SystemsLoader";
3
+
4
+ describe("<SystemsLoader />", () => {
5
+ it("matches the latest snapshot", async () => {
6
+ const fetchSystems = jest.fn();
7
+ const systemsLoading = true;
8
+ const props = { fetchSystems, systemsLoading, clearSystems: jest.fn() };
9
+ const rendered = render(<SystemsLoader {...props} />);
10
+ await waitForLoad(rendered);
11
+ expect(rendered.container).toMatchSnapshot();
12
+ });
13
+
14
+ it("renders null if systemsLoading is false", async () => {
15
+ const fetchSystems = jest.fn();
16
+ const systemsLoading = false;
17
+ const props = { fetchSystems, systemsLoading, clearSystems: jest.fn() };
18
+ const rendered = render(<SystemsLoader {...props} />);
19
+ await waitForLoad(rendered);
20
+ expect(rendered.container.firstChild).toBeNull();
21
+ });
22
+
23
+ it("calls fetchSystems when component mounts, clearSystems when component unmounts", async () => {
24
+ const fetchSystems = jest.fn();
25
+ const clearSystems = jest.fn();
26
+ const systemsLoading = false;
27
+ const props = {
28
+ fetchSystems,
29
+ systemsLoading,
30
+ clearSystems,
31
+ };
32
+ const rendered = render(<SystemsLoader {...props} />);
33
+ await waitForLoad(rendered);
34
+ expect(clearSystems).not.toHaveBeenCalled();
35
+ expect(fetchSystems).toHaveBeenCalledTimes(1);
36
+ rendered.unmount();
37
+ expect(clearSystems).toHaveBeenCalledTimes(1);
38
+ expect(fetchSystems).toHaveBeenCalledTimes(1);
39
+ });
40
+ });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import TaxonomyMenu from "../TaxonomyMenu";
4
3
 
@@ -1,7 +1,5 @@
1
- import React from "react";
2
- import { waitForElementToBeRemoved } from "@testing-library/react";
3
1
  import userEvent from "@testing-library/user-event";
4
- import { render } from "@truedat/test/render";
2
+ import { render, waitForLoad } from "@truedat/test/render";
5
3
  import {
6
4
  errorTemplateMock,
7
5
  multipleTemplatesMock,
@@ -19,24 +17,21 @@ describe("<TemplateSelector />", () => {
19
17
 
20
18
  it("matches the latest snapshot (loading)", () => {
21
19
  const renderOpts = { mocks: [multipleTemplatesMock(variables)] };
22
- const { container, queryByText } = render(
23
- <TemplateSelector {...props} />,
24
- renderOpts
25
- );
26
- expect(queryByText(/loading/i)).toBeInTheDocument();
27
- expect(container).toMatchSnapshot();
20
+ const rendered = render(<TemplateSelector {...props} />, renderOpts);
21
+ expect(rendered.getByText(/loading/i)).toBeInTheDocument();
22
+ expect(rendered.container).toMatchSnapshot();
28
23
  });
29
24
 
30
25
  it("matches the latest snapshot", async () => {
31
26
  const renderOpts = { mocks: [multipleTemplatesMock(variables)] };
32
27
  const onLoad = jest.fn();
33
- const { container, queryByText } = render(
28
+ const rendered = render(
34
29
  <TemplateSelector {...props} onLoad={onLoad} />,
35
30
  renderOpts
36
31
  );
37
- await waitForElementToBeRemoved(() => queryByText(/loading/i));
38
- expect(queryByText("template1")).toBeInTheDocument();
39
- expect(container).toMatchSnapshot();
32
+ await waitForLoad(rendered);
33
+ expect(rendered.getByText(/template1/i)).toBeInTheDocument();
34
+ expect(rendered.container).toMatchSnapshot();
40
35
  expect(onLoad.mock.calls.length).toBe(1);
41
36
  });
42
37
 
@@ -47,41 +42,44 @@ describe("<TemplateSelector />", () => {
47
42
  ...props,
48
43
  label: "foo_label",
49
44
  };
50
- const { queryByText } = render(
45
+ const rendered = render(
51
46
  <TemplateSelector {...newProps} onLoad={onLoad} />,
52
47
  renderOpts
53
48
  );
54
- await waitForElementToBeRemoved(() => queryByText(/loading/i));
55
- expect(queryByText("template1")).toBeInTheDocument();
56
- expect(queryByText("foo_label")).toBeInTheDocument();
49
+ await waitForLoad(rendered);
50
+ expect(rendered.getByText(/template1/i)).toBeInTheDocument();
51
+ expect(rendered.getByText(/foo_label/i)).toBeInTheDocument();
57
52
  });
58
53
 
59
54
  it("matches the latest snapshot when required", async () => {
60
55
  const renderOpts = { mocks: [multipleTemplatesMock(variables)] };
61
- const { container, queryByText } = render(
56
+ const rendered = render(
62
57
  <TemplateSelector {...props} required />,
63
58
  renderOpts
64
59
  );
65
- await waitForElementToBeRemoved(() => queryByText(/loading/i));
66
- expect(queryByText("template1")).toBeInTheDocument();
67
- expect(container).toMatchSnapshot();
60
+ await waitForLoad(rendered);
61
+ expect(rendered.getByText(/template1/i)).toBeInTheDocument();
62
+ expect(rendered.container).toMatchSnapshot();
68
63
  });
69
64
 
70
65
  it("is empty if templates query returns an error", async () => {
71
66
  const renderOpts = { mocks: [errorTemplateMock(variables)] };
72
- const { queryByText } = render(
67
+ const rendered = render(
73
68
  <TemplateSelector {...props} required />,
74
69
  renderOpts
75
70
  );
76
- await waitForElementToBeRemoved(() => queryByText(/loading/i));
77
- expect(queryByText("template1")).not.toBeInTheDocument();
71
+ await waitForLoad(rendered);
72
+ expect(rendered.queryByText(/template1/i)).not.toBeInTheDocument();
78
73
  });
79
74
 
80
75
  it("calls onChange when template is selected", async () => {
81
76
  const renderOpts = { mocks: [multipleTemplatesMock(variables)] };
82
- const { findByRole } = render(<TemplateSelector {...props} />, renderOpts);
77
+ const rendered = render(<TemplateSelector {...props} />, renderOpts);
83
78
 
84
- userEvent.click(await findByRole("option", { name: "template1" }));
79
+ const user = userEvent.setup({ delay: null });
80
+ await user.click(
81
+ await rendered.findByRole("option", { name: /template1/i })
82
+ );
85
83
  expect(onChange.mock.calls[0][1]).toMatchObject({
86
84
  template: { id: "1", label: "template1" },
87
85
  });
@@ -89,8 +87,8 @@ describe("<TemplateSelector />", () => {
89
87
 
90
88
  it("is empty when query returns a single template", async () => {
91
89
  const renderOpts = { mocks: [singleTemplateMock(variables)] };
92
- const { queryByText } = render(<TemplateSelector {...props} />, renderOpts);
93
- await waitForElementToBeRemoved(() => queryByText(/loading/i));
94
- expect(queryByText("template1")).not.toBeInTheDocument();
90
+ const rendered = render(<TemplateSelector {...props} />, renderOpts);
91
+ await waitForLoad(rendered);
92
+ expect(rendered.queryByText(/template1/i)).not.toBeInTheDocument();
95
93
  });
96
94
  });
@@ -0,0 +1,30 @@
1
+ import { render, waitForLoad } from "@truedat/test/render";
2
+ import { TemplatesLoader } from "@truedat/core/components/TemplatesLoader";
3
+
4
+ describe("<TemplatesLoader />", () => {
5
+ it("calls fetchTemplates when component mounts but not when it unmounts", async () => {
6
+ const props = {
7
+ clearTemplates: jest.fn(),
8
+ fetchTemplates: jest.fn(),
9
+ scope: "foo",
10
+ };
11
+ const rendered = render(<TemplatesLoader {...props} />);
12
+ await waitForLoad(rendered);
13
+ expect(props.fetchTemplates).toHaveBeenCalledTimes(1);
14
+ rendered.unmount();
15
+ expect(props.fetchTemplates).toHaveBeenCalledTimes(1);
16
+ });
17
+
18
+ it("calls clearTemplates when component unmounts but not when it mounts", async () => {
19
+ const props = {
20
+ clearTemplates: jest.fn(),
21
+ fetchTemplates: jest.fn(),
22
+ scope: "foo",
23
+ };
24
+ const rendered = render(<TemplatesLoader {...props} />);
25
+ await waitForLoad(rendered);
26
+ expect(props.clearTemplates).toHaveBeenCalledTimes(0);
27
+ rendered.unmount();
28
+ expect(props.clearTemplates).toHaveBeenCalledTimes(1);
29
+ });
30
+ });