@truedat/core 7.5.9 → 7.5.11

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 (279) hide show
  1. package/package.json +36 -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/Graph.js +101 -0
  39. package/src/components/GroupActions.js +15 -15
  40. package/src/components/Hierarchy.js +7 -10
  41. package/src/components/HierarchyFilterDropdown.js +1 -2
  42. package/src/components/HierarchyNodeFinder.js +4 -4
  43. package/src/components/HierarchySelector.js +1 -2
  44. package/src/components/HistoryBackButton.js +6 -6
  45. package/src/components/IngestMenu.js +0 -1
  46. package/src/components/LanguagesTabs.js +4 -4
  47. package/src/components/LineageMenu.js +0 -1
  48. package/src/components/Loading.js +1 -2
  49. package/src/components/MembersMenu.js +0 -1
  50. package/src/components/ModalSaveFilter.js +1 -1
  51. package/src/components/NodeOpenActions.js +0 -1
  52. package/src/components/OptionGroup.js +1 -2
  53. package/src/components/OptionModal.js +0 -1
  54. package/src/components/Pagination.js +0 -1
  55. package/src/components/QualityMenu.js +0 -1
  56. package/src/components/QxMenu.js +0 -1
  57. package/src/components/Redirector.js +3 -3
  58. package/src/components/ResourceMember.js +1 -2
  59. package/src/components/ResourceMembers.js +3 -3
  60. package/src/components/ResourceMembersActions.js +1 -2
  61. package/src/components/RichTextEditor.js +7 -8
  62. package/src/components/RouteListener.js +11 -32
  63. package/src/components/SafeLink.js +0 -1
  64. package/src/components/ScrollToTop.js +13 -16
  65. package/src/components/SearchFilterDropdown.js +1 -1
  66. package/src/components/SearchInput.js +3 -3
  67. package/src/components/SearchMenu.js +0 -1
  68. package/src/components/SelectedFilters.js +1 -2
  69. package/src/components/SideMenu.js +0 -1
  70. package/src/components/SidebarToggle.js +2 -2
  71. package/src/components/StructureFilterItem.js +0 -1
  72. package/src/components/Submenu.js +8 -7
  73. package/src/components/SystemsLoader.js +27 -0
  74. package/src/components/TaxonomyMenu.js +0 -1
  75. package/src/components/TemplateSelector.js +1 -1
  76. package/src/components/TemplatesLoader.js +24 -0
  77. package/src/components/TreeSelector.js +4 -4
  78. package/src/components/Unauthorized.js +0 -1
  79. package/src/components/UploadModal.js +152 -176
  80. package/src/components/UserFilter.js +0 -2
  81. package/src/components/UserFilters.js +0 -2
  82. package/src/components/__tests__/AddMemberForm.spec.js +26 -38
  83. package/src/components/__tests__/AddResourceMember.spec.js +0 -1
  84. package/src/components/__tests__/AdminMenu.spec.js +0 -1
  85. package/src/components/__tests__/Alert.spec.js +17 -21
  86. package/src/components/__tests__/AvailableFilters.spec.js +19 -14
  87. package/src/components/__tests__/CardGroupsAccordion.spec.js +24 -15
  88. package/src/components/__tests__/CatalogMenu.spec.js +27 -45
  89. package/src/components/__tests__/CommentsLoader.spec.js +17 -14
  90. package/src/components/__tests__/CursorPagination.spec.js +0 -1
  91. package/src/components/__tests__/DashboardMenu.spec.js +0 -1
  92. package/src/components/__tests__/DateFilter.spec.js +6 -28
  93. package/src/components/__tests__/DateTime.spec.js +0 -1
  94. package/src/components/__tests__/DomainSelector.spec.js +4 -4
  95. package/src/components/__tests__/DropdownMenuItem.spec.js +0 -1
  96. package/src/components/__tests__/FilterDropdown.spec.js +28 -27
  97. package/src/components/__tests__/FilterItem.spec.js +19 -20
  98. package/src/components/__tests__/FilterMultilevelDropdown.spec.js +16 -16
  99. package/src/components/__tests__/FiltersLoader.spec.js +25 -20
  100. package/src/components/__tests__/GenericCrumbs.spec.js +0 -1
  101. package/src/components/__tests__/GlossaryMenu.spec.js +0 -1
  102. package/src/components/__tests__/GrantMenu.spec.js +0 -1
  103. package/src/components/__tests__/GroupActions.spec.js +0 -1
  104. package/src/components/__tests__/Hierarchy.spec.js +0 -1
  105. package/src/components/__tests__/HierarchyFilterDropdown.spec.js +16 -14
  106. package/src/components/__tests__/HierarchyNodeFinder.spec.js +0 -1
  107. package/src/components/__tests__/HierarchySelector.spec.js +28 -35
  108. package/src/components/__tests__/HistoryBackButton.spec.js +23 -23
  109. package/src/components/__tests__/IngestMenu.spec.js +0 -1
  110. package/src/components/__tests__/LineageMenu.spec.js +0 -1
  111. package/src/components/__tests__/Loading.spec.js +4 -5
  112. package/src/components/__tests__/MembersMenu.spec.js +0 -1
  113. package/src/components/__tests__/ModalSaveFilter.spec.js +0 -1
  114. package/src/components/__tests__/OptionGroup.spec.js +5 -7
  115. package/src/components/__tests__/Pagination.spec.js +22 -16
  116. package/src/components/__tests__/QualityMenu.spec.js +0 -1
  117. package/src/components/__tests__/Redirector.spec.js +5 -10
  118. package/src/components/__tests__/ResourceMembers.spec.js +36 -27
  119. package/src/components/__tests__/ResourceMembersAction.spec.js +1 -2
  120. package/src/components/__tests__/RouteListener.spec.js +25 -26
  121. package/src/components/__tests__/SafeLink.spec.js +0 -1
  122. package/src/components/__tests__/SearchDateFilter.spec.js +0 -1
  123. package/src/components/__tests__/SearchFilterDropdown.spec.js +32 -24
  124. package/src/components/__tests__/SearchInput.spec.js +5 -5
  125. package/src/components/__tests__/SearchMenu.spec.js +0 -1
  126. package/src/components/__tests__/SelectedFilters.spec.js +50 -47
  127. package/src/components/__tests__/SideMenu.spec.js +5 -8
  128. package/src/components/__tests__/StructureFilterItem.spec.js +13 -11
  129. package/src/components/__tests__/Submenu.spec.js +0 -1
  130. package/src/components/__tests__/SystemsLoader.spec.js +40 -0
  131. package/src/components/__tests__/TaxonomyMenu.spec.js +0 -1
  132. package/src/components/__tests__/TemplateSelector.spec.js +27 -29
  133. package/src/components/__tests__/TemplatesLoader.spec.js +30 -0
  134. package/src/components/__tests__/TreeSelector.spec.js +110 -83
  135. package/src/components/__tests__/UploadModal.spec.js +171 -0
  136. package/src/components/__tests__/UserFilters.spec.js +44 -37
  137. package/src/components/__tests__/__snapshots__/AddMemberForm.spec.js.snap +1 -0
  138. package/src/components/__tests__/__snapshots__/AddResourceMember.spec.js.snap +10 -9
  139. package/src/components/__tests__/__snapshots__/AdminMenu.spec.js.snap +22 -11
  140. package/src/components/__tests__/__snapshots__/Alert.spec.js.snap +29 -17
  141. package/src/components/__tests__/__snapshots__/AvailableFilters.spec.js.snap +1 -1
  142. package/src/components/__tests__/__snapshots__/CatalogMenu.spec.js.snap +18 -8
  143. package/src/components/__tests__/__snapshots__/CursorPagination.spec.js.snap +3 -0
  144. package/src/components/__tests__/__snapshots__/DateFilter.spec.js.snap +165 -107
  145. package/src/components/__tests__/__snapshots__/DomainSelector.spec.js.snap +1 -1
  146. package/src/components/__tests__/__snapshots__/FilterItem.spec.js.snap +13 -20
  147. package/src/components/__tests__/__snapshots__/GlossaryMenu.spec.js.snap +8 -0
  148. package/src/components/__tests__/__snapshots__/GrantMenu.spec.js.snap +14 -7
  149. package/src/components/__tests__/__snapshots__/GroupActions.spec.js.snap +0 -1
  150. package/src/components/__tests__/__snapshots__/Hierarchy.spec.js.snap +0 -1
  151. package/src/components/__tests__/__snapshots__/HierarchySelector.spec.js.snap +1 -1
  152. package/src/components/__tests__/__snapshots__/HistoryBackButton.spec.js.snap +10 -20
  153. package/src/components/__tests__/__snapshots__/IngestMenu.spec.js.snap +3 -1
  154. package/src/components/__tests__/__snapshots__/LineageMenu.spec.js.snap +6 -3
  155. package/src/components/__tests__/__snapshots__/Loading.spec.js.snap +5 -4
  156. package/src/components/__tests__/__snapshots__/MembersMenu.spec.js.snap +6 -3
  157. package/src/components/__tests__/__snapshots__/OptionGroup.spec.js.snap +38 -28
  158. package/src/components/__tests__/__snapshots__/Pagination.spec.js.snap +213 -64
  159. package/src/components/__tests__/__snapshots__/QualityMenu.spec.js.snap +14 -8
  160. package/src/components/__tests__/__snapshots__/ResourceMembers.spec.js.snap +1 -0
  161. package/src/components/__tests__/__snapshots__/ResourceMembersAction.spec.js.snap +2 -1
  162. package/src/components/__tests__/__snapshots__/RouteListener.spec.js.snap +1 -1
  163. package/src/components/__tests__/__snapshots__/SearchInput.spec.js.snap +10 -12
  164. package/src/components/__tests__/__snapshots__/SearchMenu.spec.js.snap +3 -1
  165. package/src/components/__tests__/__snapshots__/SelectedFilters.spec.js.snap +8 -8
  166. package/src/components/__tests__/__snapshots__/SideMenu.spec.js.snap +112 -50
  167. package/src/components/__tests__/__snapshots__/Submenu.spec.js.snap +3 -0
  168. package/src/components/__tests__/__snapshots__/SystemsLoader.spec.js.snap +3 -0
  169. package/src/components/__tests__/__snapshots__/TaxonomyMenu.spec.js.snap +3 -1
  170. package/src/components/__tests__/__snapshots__/TemplateSelector.spec.js.snap +7 -7
  171. package/src/components/common/SearchContextWrapper.js +1 -4
  172. package/src/components/index.js +4 -2
  173. package/src/hooks/__mocks__/useAuthorized.js +2 -0
  174. package/src/hooks/__mocks__/useUserFilters.js +17 -0
  175. package/src/hooks/__tests__/{useAclEntries.spec.js → useAclEntries.spec.js.disabled} +1 -1
  176. package/src/hooks/__tests__/useAuthorized.spec.js +1 -1
  177. package/src/hooks/useAclEntries.js +6 -3
  178. package/src/hooks/useActiveRoute.js +3 -3
  179. package/src/hooks/useActiveRoutes.js +4 -4
  180. package/src/hooks/useHierarchies.js +112 -0
  181. package/src/hooks/useLocales.js +1 -1
  182. package/src/hooks/useMessages.js +1 -1
  183. package/src/hooks/usePath.js +4 -4
  184. package/src/hooks/useUserFilters.js +1 -1
  185. package/src/i18n/components/EditableCell.js +1 -1
  186. package/src/i18n/components/I18nRoutes.js +11 -16
  187. package/src/i18n/components/LangProvider.js +56 -101
  188. package/src/i18n/components/LangProviderWrapper.js +26 -33
  189. package/src/i18n/components/Languages.js +8 -7
  190. package/src/i18n/components/MessageForm.js +9 -23
  191. package/src/i18n/components/Messages.js +5 -4
  192. package/src/i18n/components/MessagesTable.js +0 -1
  193. package/src/i18n/components/NewMessage.js +5 -4
  194. package/src/i18n/components/__tests__/EditableCell.spec.js +18 -20
  195. package/src/i18n/components/__tests__/I18nRoutes.spec.js +39 -5
  196. package/src/i18n/components/__tests__/MessageForm.spec.js +0 -1
  197. package/src/i18n/components/__tests__/Messages.spec.js +9 -21
  198. package/src/i18n/components/__tests__/NewMessage.spec.js +0 -1
  199. package/src/i18n/components/__tests__/__snapshots__/I18nRoutes.spec.js.snap +25 -1
  200. package/src/i18n/components/__tests__/__snapshots__/MessageForm.spec.js.snap +1 -0
  201. package/src/i18n/components/__tests__/__snapshots__/Messages.spec.js.snap +5 -13
  202. package/src/i18n/components/__tests__/__snapshots__/NewMessage.spec.js.snap +2 -0
  203. package/src/reducers/__tests__/comments.spec.js +9 -6
  204. package/src/reducers/__tests__/commentsResource.spec.js +5 -2
  205. package/src/reducers/__tests__/coreMessage.spec.js +1 -1
  206. package/src/reducers/__tests__/dashboardDomains.spec.js +5 -5
  207. package/src/reducers/__tests__/systems.spec.js +42 -0
  208. package/src/reducers/__tests__/systemsLoading.spec.js +22 -0
  209. package/src/reducers/index.js +5 -1
  210. package/src/reducers/systems.js +19 -0
  211. package/src/reducers/systemsLoading.js +14 -0
  212. package/src/router/Loader.js +10 -0
  213. package/src/router/ProtectedRoute.js +11 -0
  214. package/src/router/Unauthorized.js +16 -0
  215. package/src/router/__tests__/ProtectedRoute.spec.js +49 -0
  216. package/src/router/__tests__/Unauthorized.spec.js +15 -0
  217. package/src/router/__tests__/__snapshots__/ProtectedRoute.spec.js.snap +44 -0
  218. package/src/router/__tests__/__snapshots__/Unauthorized.spec.js.snap +26 -0
  219. package/src/router/index.js +5 -0
  220. package/src/routes.js +7 -7
  221. package/src/routesTree.js +93 -0
  222. package/src/routines.js +8 -0
  223. package/src/sagas/__tests__/addComment.spec.js +3 -5
  224. package/src/sagas/__tests__/fetchComments.spec.js +1 -1
  225. package/src/sagas/__tests__/fetchSystems.spec.js +69 -0
  226. package/src/sagas/fetchSystems.js +25 -0
  227. package/src/sagas/index.js +3 -0
  228. package/src/search/FilterDropdown.js +0 -1
  229. package/src/search/FilterItem.js +0 -1
  230. package/src/search/FilterMultilevelDropdown.js +1 -1
  231. package/src/search/FilterQueryDropdown.js +38 -42
  232. package/src/search/HierarchyFilterDropdown.js +3 -4
  233. package/src/search/ModalSaveFilter.js +1 -1
  234. package/src/search/Pagination.js +0 -1
  235. package/src/search/SearchContext.js +9 -11
  236. package/src/search/SearchDateFilter.js +0 -1
  237. package/src/search/SearchFilters.js +1 -2
  238. package/src/search/SearchSelectedFilters.js +4 -4
  239. package/src/search/SearchWidget.js +0 -4
  240. package/src/search/UserFilter.js +0 -2
  241. package/src/search/UserFilters.js +4 -3
  242. package/src/search/__tests__/FilterDropdown.spec.js +54 -51
  243. package/src/search/__tests__/FilterItem.spec.js +20 -15
  244. package/src/search/__tests__/FilterQueryDropdown.spec.js +106 -84
  245. package/src/search/__tests__/ModalSaveFilter.spec.js +4 -5
  246. package/src/search/__tests__/SearchContext.spec.js +3 -4
  247. package/src/search/__tests__/SearchWidget.spec.js +0 -1
  248. package/src/selectors/__tests__/getConceptSubscope.spec.js +37 -0
  249. package/src/selectors/__tests__/getDashboardConfig.spec.js +9 -9
  250. package/src/selectors/__tests__/getMessage.spec.js +1 -1
  251. package/src/selectors/__tests__/getSidemenuGlossarySubscopes.spec.js +17 -0
  252. package/src/selectors/__tests__/makeActiveFiltersSelector.spec.js +2 -2
  253. package/src/selectors/__tests__/makeSearchQuerySelector.spec.js +1 -1
  254. package/src/selectors/__tests__/makeTagOptionsSelector.spec.js +6 -6
  255. package/src/selectors/getConceptSubscope.js +19 -0
  256. package/src/selectors/getMessage.js +2 -2
  257. package/src/selectors/getRecipients.js +34 -0
  258. package/src/selectors/getSidemenuGlossarySubscopes.js +8 -0
  259. package/src/selectors/index.js +5 -0
  260. package/src/selectors/makeActiveFiltersSelector.js +2 -6
  261. package/src/selectors/makeSearchQuerySelector.js +4 -11
  262. package/src/selectors/makeTagOptionsSelector.js +4 -8
  263. package/src/selectors/subscopedTemplates.js +16 -0
  264. package/src/selectors/taxonomy.js +170 -0
  265. package/src/services/__tests__/columnDecorator.spec.js +1 -1
  266. package/src/services/__tests__/dateFilterFormatter.spec.js +2 -2
  267. package/src/services/__tests__/fieldType.spec.js +2 -2
  268. package/src/services/__tests__/filters.spec.js +1 -1
  269. package/src/services/__tests__/message.spec.js +2 -2
  270. package/src/services/__tests__/operators.spec.js +5 -5
  271. package/src/services/__tests__/sort.spec.js +8 -8
  272. package/src/services/__tests__/storage.spec.js +17 -0
  273. package/src/services/arrays.js +16 -14
  274. package/src/services/columnDecoratorComponent.js +2 -2
  275. package/src/services/columnDecorators.js +0 -1
  276. package/src/services/fieldType.js +8 -8
  277. package/src/services/filters.js +5 -5
  278. package/src/services/message.js +1 -4
  279. package/src/services/operators.js +1 -1
@@ -1,44 +1,49 @@
1
- import React from "react";
2
- import { mount } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { FiltersLoader } from "../FiltersLoader";
4
3
 
5
4
  describe("<FiltersLoader/>", () => {
6
5
  const filters = { foo: "foo" };
7
6
 
8
- it("dispatches fetchFilters on mount, clearFilters on unmount", () => {
7
+ it("calls fetchFilters when component mounts but not when it unmounts", async () => {
9
8
  const props = {
10
9
  filters,
11
10
  fetchFilters: jest.fn(),
12
- clearFilters: jest.fn()
11
+ clearFilters: jest.fn(),
13
12
  };
14
- const wrapper = mount(<FiltersLoader {...props} />);
15
- expect(props.fetchFilters.mock.calls.length).toBe(1);
16
- expect(props.fetchFilters.mock.calls[0][0]).toEqual({ filters });
17
- wrapper.unmount();
18
- expect(props.fetchFilters.mock.calls.length).toBe(1);
13
+ const rendered = render(<FiltersLoader {...props} />);
14
+ await waitForLoad(rendered);
15
+
16
+ expect(props.fetchFilters).toHaveBeenCalledTimes(1);
17
+ expect(props.fetchFilters).toHaveBeenCalledWith({ filters });
18
+ rendered.unmount();
19
+ expect(props.fetchFilters).toHaveBeenCalledTimes(1);
19
20
  });
20
21
 
21
- it("dispatches clearFilters on unmount", () => {
22
+ it("calls clearFilters when component unmounts but not when it mounts", async () => {
22
23
  const props = {
23
24
  filters,
24
25
  fetchFilters: jest.fn(),
25
- clearFilters: jest.fn()
26
+ clearFilters: jest.fn(),
26
27
  };
27
- const wrapper = mount(<FiltersLoader {...props} />);
28
- expect(props.clearFilters.mock.calls.length).toBe(0);
29
- wrapper.unmount();
30
- expect(props.clearFilters.mock.calls.length).toBe(1);
28
+ const rendered = render(<FiltersLoader {...props} />);
29
+ await waitForLoad(rendered);
30
+
31
+ expect(props.clearFilters).toHaveBeenCalledTimes(0);
32
+ rendered.unmount();
33
+ expect(props.clearFilters).toHaveBeenCalledTimes(1);
31
34
  });
32
35
 
33
- it("dispatches clearSort on unmount if present", () => {
36
+ it("calls clearSort when component unmounts if present", async () => {
34
37
  const props = {
35
38
  filters,
36
39
  fetchFilters: jest.fn(),
37
40
  clearFilters: jest.fn(),
38
- clearSort: jest.fn()
41
+ clearSort: jest.fn(),
39
42
  };
40
- const wrapper = mount(<FiltersLoader {...props} />);
41
- wrapper.unmount();
42
- expect(props.clearSort.mock.calls.length).toBe(1);
43
+ const rendered = render(<FiltersLoader {...props} />);
44
+ await waitForLoad(rendered);
45
+
46
+ rendered.unmount();
47
+ expect(props.clearSort).toHaveBeenCalledTimes(1);
43
48
  });
44
49
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { GenericCrumbs } from "../GenericCrumbs";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import GlossaryMenu from "../GlossaryMenu";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import GrantMenu from "../GrantMenu";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { GroupActions } from "..";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import Hierarchy from "../Hierarchy";
4
3
  import en from "../../../../df/src/messages/en";
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { waitFor } from "@testing-library/react";
3
2
  import userEvent from "@testing-library/user-event";
4
3
  import { render } from "@truedat/test/render";
@@ -28,8 +27,10 @@ const hierarchy = {
28
27
  ],
29
28
  };
30
29
 
31
- jest.mock("@truedat/df/hooks/useHierarchies", () => {
32
- const originalModule = jest.requireActual("@truedat/df/hooks/useHierarchies");
30
+ jest.mock("@truedat/core/hooks/useHierarchies", () => {
31
+ const originalModule = jest.requireActual(
32
+ "@truedat/core/hooks/useHierarchies"
33
+ );
33
34
 
34
35
  return {
35
36
  __esModule: true,
@@ -42,6 +43,7 @@ jest.mock("@truedat/df/hooks/useHierarchies", () => {
42
43
  });
43
44
 
44
45
  describe("<HierarchyFilterDropdown />", () => {
46
+ const user = userEvent.setup({ delay: null });
45
47
  const toggleFilterValue = jest.fn();
46
48
  const openFilter = jest.fn();
47
49
  const closeFilter = jest.fn();
@@ -96,19 +98,19 @@ describe("<HierarchyFilterDropdown />", () => {
96
98
  }
97
99
  );
98
100
 
99
- userEvent.click(getByRole("listbox"));
101
+ await user.click(getByRole("listbox"));
100
102
 
101
- userEvent.click(container.querySelector('[class="chevron right icon"]'));
103
+ await user.click(container.querySelector('[class="chevron right icon"]'));
102
104
  await waitFor(() => {
103
105
  expect(getByRole("option", { name: /bar/i })).toBeTruthy();
104
106
  });
105
- userEvent.click(container.querySelector('[class="chevron down icon"]'));
107
+ await user.click(container.querySelector('[class="chevron down icon"]'));
106
108
  await waitFor(() => {
107
109
  expect(queryByText(/bar/)).toBeFalsy();
108
110
  });
109
- userEvent.click(container.querySelector('[class="chevron right icon"]'));
111
+ await user.click(container.querySelector('[class="chevron right icon"]'));
110
112
  // Select value
111
- userEvent.click(getByRole("option", { name: /bar/i }));
113
+ await user.click(getByRole("option", { name: /bar/i }));
112
114
  await waitFor(() => {
113
115
  expect(toggleFilterValue).toHaveBeenCalledWith({
114
116
  filter,
@@ -119,13 +121,13 @@ describe("<HierarchyFilterDropdown />", () => {
119
121
  <HierarchyFilterDropdown {...{ ...props, activeValues: ["123_2"] }} />
120
122
  );
121
123
  // Unselect
122
- userEvent.click(getByRole("option", { name: /bar/i }));
124
+ await user.click(getByRole("option", { name: /bar/i }));
123
125
  await waitFor(() => {
124
126
  expect(toggleFilterValue).toHaveBeenCalledWith({ filter, value: [] });
125
127
  });
126
128
  // Select parent
127
129
  rerender(<HierarchyFilterDropdown {...{ ...props, activeValues: [] }} />);
128
- userEvent.click(getByRole("option", { name: /foo/i }));
130
+ await user.click(getByRole("option", { name: /foo/i }));
129
131
  await waitFor(() => {
130
132
  expect(toggleFilterValue).toHaveBeenCalledWith({
131
133
  filter,
@@ -138,7 +140,7 @@ describe("<HierarchyFilterDropdown />", () => {
138
140
  {...{ ...props, activeValues: ["123_1", "123_2"] }}
139
141
  />
140
142
  );
141
- userEvent.click(getByRole("option", { name: /bar/i }));
143
+ await user.click(getByRole("option", { name: /bar/i }));
142
144
  await waitFor(() => {
143
145
  expect(toggleFilterValue).toHaveBeenCalledWith({
144
146
  filter,
@@ -146,7 +148,7 @@ describe("<HierarchyFilterDropdown />", () => {
146
148
  });
147
149
  });
148
150
  // Delete filter
149
- userEvent.click(container.querySelector('[class="delete icon"]'));
151
+ await user.click(container.querySelector('[class="delete icon"]'));
150
152
  await waitFor(() => {
151
153
  expect(removeFilter).toBeCalledTimes(1);
152
154
  });
@@ -173,7 +175,7 @@ describe("<HierarchyFilterDropdown />", () => {
173
175
  }
174
176
  );
175
177
 
176
- userEvent.click(getByRole("listbox"));
178
+ await user.click(getByRole("listbox"));
177
179
 
178
180
  await waitFor(() => {
179
181
  expect(getByRole("option", { name: /foo/i })).toBeTruthy();
@@ -181,7 +183,7 @@ describe("<HierarchyFilterDropdown />", () => {
181
183
  });
182
184
 
183
185
  const input = container.querySelector('[type="text"]');
184
- userEvent.type(input, "bar");
186
+ await user.type(input, "bar");
185
187
 
186
188
  await waitFor(() => {
187
189
  expect(getByRole("option", { name: /bar/i })).toBeTruthy();
@@ -1,5 +1,4 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
2
  import { render } from "@truedat/test/render";
4
3
  import HierarchyNodeFinder from "../HierarchyNodeFinder";
5
4
 
@@ -1,9 +1,7 @@
1
- import React from "react";
2
- import { waitFor } from "@testing-library/react";
3
1
  import userEvent from "@testing-library/user-event";
4
- import { render } from "@truedat/test/render";
2
+ import { waitFor } from "@testing-library/react";
3
+ import { render, waitForLoad } from "@truedat/test/render";
5
4
  import HierarchySelector from "../HierarchySelector";
6
- import en from "../../messages/en";
7
5
 
8
6
  const hierarchy = {
9
7
  id: 123,
@@ -21,13 +19,15 @@ const hierarchy = {
21
19
  ],
22
20
  };
23
21
 
24
- jest.mock("react-router-dom", () => ({
25
- ...jest.requireActual("react-router-dom"),
22
+ jest.mock("react-router", () => ({
23
+ ...jest.requireActual("react-router"),
26
24
  useParams: () => ({ id: 123 }),
27
25
  }));
28
26
 
29
- jest.mock("@truedat/df/hooks/useHierarchies", () => {
30
- const originalModule = jest.requireActual("@truedat/df/hooks/useHierarchies");
27
+ jest.mock("@truedat/core/hooks/useHierarchies", () => {
28
+ const originalModule = jest.requireActual(
29
+ "@truedat/core/hooks/useHierarchies"
30
+ );
31
31
 
32
32
  return {
33
33
  __esModule: true,
@@ -39,14 +39,6 @@ jest.mock("@truedat/df/hooks/useHierarchies", () => {
39
39
  };
40
40
  });
41
41
 
42
- const renderOpts = {
43
- messages: {
44
- en: {
45
- ...en,
46
- },
47
- },
48
- fallback: "lazy",
49
- };
50
42
  const props = {
51
43
  hierarchy,
52
44
  loading: false,
@@ -58,33 +50,34 @@ const props = {
58
50
 
59
51
  describe("<HierarchySelector />", () => {
60
52
  it("matches latest snapshot", async () => {
61
- const { container, queryByText } = render(
62
- <HierarchySelector {...props} />,
63
- renderOpts
53
+ const rendered = render(<HierarchySelector {...props} />);
54
+ await waitForLoad(rendered);
55
+
56
+ await waitFor(() =>
57
+ expect(rendered.queryByText(/foo/i)).toBeInTheDocument()
64
58
  );
65
- await waitFor(() => {
66
- expect(queryByText(/foo/)).toBeInTheDocument();
67
- });
68
- expect(container).toMatchSnapshot();
59
+ expect(rendered.container).toMatchSnapshot();
69
60
  });
70
61
 
71
62
  it("calls onChange with selected values", async () => {
72
- const { getByText, getByRole } = render(
73
- <HierarchySelector {...props} />,
74
- renderOpts
75
- );
63
+ const rendered = render(<HierarchySelector {...props} />);
64
+ await waitForLoad(rendered);
65
+
66
+ const user = userEvent.setup({ delay: null });
76
67
 
77
- await waitFor(() => {
78
- expect(getByText(/Select Hierarchies/)).toBeTruthy();
79
- });
68
+ await waitFor(() =>
69
+ expect(
70
+ rendered.queryByText(/hierarchy.multiple.placeholder/i)
71
+ ).toBeInTheDocument()
72
+ );
80
73
 
81
- userEvent.click(getByText(/Select Hierarchies/));
74
+ await user.click(rendered.getByText(/hierarchy.multiple.placeholder/i));
82
75
 
83
- await waitFor(() => {
84
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
85
- });
76
+ await waitFor(() =>
77
+ expect(rendered.getByRole("option", { name: /foo/i })).toBeInTheDocument()
78
+ );
86
79
 
87
- userEvent.click(getByRole("option", { name: /foo/i }));
80
+ await user.click(rendered.getByRole("option", { name: /foo/i }));
88
81
  expect(props.onChange.mock.calls.length).toBe(1);
89
82
  expect(props.onChange.mock.calls[0][1]).toEqual({ value: [1] });
90
83
  });
@@ -1,35 +1,35 @@
1
- import React from "react";
2
- import { shallow, mount } from "enzyme";
3
- import { MemoryRouter } from "react-router-dom";
1
+ import userEvent from "@testing-library/user-event";
2
+ import { render, waitForLoad } from "@truedat/test/render";
4
3
  import { HistoryBackButton } from "../HistoryBackButton";
5
4
 
6
- const mockHistory = {
7
- goBack: jest.fn()
8
- };
9
-
10
- jest.mock("react-router-dom", () => ({
11
- ...jest.requireActual("react-router-dom"),
12
- useHistory: () => mockHistory
5
+ const mockNavigate = jest.fn();
6
+ jest.mock("react-router", () => ({
7
+ ...jest.requireActual("react-router"),
8
+ useNavigate: () => mockNavigate,
13
9
  }));
14
10
 
15
11
  describe("<HistoryBackButton />", () => {
16
12
  const content = "Cancel";
17
13
  const props = { content };
18
14
 
19
- it("matches the latest snapshot", () => {
20
- const wrapper = shallow(<HistoryBackButton {...props} />);
21
- expect(wrapper).toMatchSnapshot();
15
+ it("matches the latest snapshot", async () => {
16
+ const rendered = render(<HistoryBackButton {...props} />);
17
+ await waitForLoad(rendered);
18
+ expect(rendered.container).toMatchSnapshot();
22
19
  });
23
20
 
24
- it("prevents submit and calls history.goBack when clicked", () => {
25
- const e = { preventDefault: jest.fn() };
26
- const wrapper = mount(
27
- <MemoryRouter>
28
- <HistoryBackButton {...props} />
29
- </MemoryRouter>
30
- );
31
- wrapper.find("HistoryBackButton").simulate("click", e);
32
- expect(e.preventDefault.mock.calls.length).toBe(1);
33
- expect(mockHistory.goBack).toHaveBeenCalledTimes(1);
21
+ it("prevents submit and navigates back when clicked", async () => {
22
+ const rendered = render(<HistoryBackButton {...props} />);
23
+ await waitForLoad(rendered);
24
+
25
+ const user = userEvent.setup({ delay: null });
26
+ const preventDefault = jest.fn();
27
+
28
+ const button = rendered.getByText(/cancel/i);
29
+ button.addEventListener("click", preventDefault);
30
+
31
+ await user.click(button);
32
+ expect(preventDefault).toHaveBeenCalled();
33
+ expect(mockNavigate).toHaveBeenCalledWith(-1);
34
34
  });
35
35
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { IngestMenu } from "../IngestMenu";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import LineageMenu from "../LineageMenu";
4
3
 
@@ -1,10 +1,9 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render } from "@truedat/test/render";
3
2
  import { Loading } from "../Loading";
4
3
 
5
4
  describe("<Loading />", () => {
6
- it("matches the latest snapshot", () => {
7
- const wrapper = shallow(<Loading inline="centered" />);
8
- expect(wrapper).toMatchSnapshot();
5
+ it("matches the latest snapshot", async () => {
6
+ const rendered = render(<Loading inline="centered" />);
7
+ expect(rendered.container).toMatchSnapshot();
9
8
  });
10
9
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { MembersMenu } from "../MembersMenu";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import userEvent from "@testing-library/user-event";
3
2
  import { render } from "@truedat/test/render";
4
3
  import messages from "@truedat/core/messages";
@@ -1,12 +1,10 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { OptionGroup } from "../OptionGroup";
4
3
 
5
4
  describe("<OptionGroup />", () => {
6
- it("matches the latest snapshot", () => {
7
- const wrapper = shallow(<OptionGroup />);
8
- expect(wrapper).toMatchSnapshot();
5
+ it("matches the latest snapshot", async () => {
6
+ const rendered = render(<OptionGroup options={[]} />);
7
+ await waitForLoad(rendered);
8
+ expect(rendered.container).toMatchSnapshot();
9
9
  });
10
-
11
- // TODO
12
10
  });
@@ -1,33 +1,39 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
3
- import { Pagination as SemanticPagination } from "semantic-ui-react";
1
+ import { render, waitForLoad } from "@truedat/test/render";
4
2
  import { Pagination, MAX_PAGES } from "../Pagination";
5
3
 
6
4
  describe("<Pagination />", () => {
7
5
  const props = {
8
6
  activePage: 1,
9
- selectPage: jest.fn()
7
+ selectPage: jest.fn(),
10
8
  };
11
9
 
12
- it("matches the latest snapshot", () => {
13
- const wrapper = shallow(<Pagination totalPages={10} {...props} />);
14
- expect(wrapper).toMatchSnapshot();
10
+ it("matches the latest snapshot", async () => {
11
+ const rendered = render(<Pagination totalPages={10} {...props} />);
12
+ await waitForLoad(rendered);
13
+ expect(rendered.container).toMatchSnapshot();
15
14
  });
16
15
 
17
- it("matches the latest snapshot (totalPages > 100)", () => {
18
- const wrapper = shallow(<Pagination totalPages={200} {...props} />);
19
- expect(wrapper).toMatchSnapshot();
16
+ it("matches the latest snapshot (totalPages > 100)", async () => {
17
+ const rendered = render(<Pagination totalPages={200} {...props} />);
18
+ await waitForLoad(rendered);
19
+ expect(rendered.container).toMatchSnapshot();
20
20
  });
21
21
 
22
- it("has no last item if totalPages exceeds page limit", () => {
23
- const wrapper = shallow(
22
+ it("has no last item if totalPages exceeds page limit", async () => {
23
+ const rendered = render(
24
24
  <Pagination totalPages={MAX_PAGES + 1} {...props} />
25
25
  );
26
- expect(wrapper.find(SemanticPagination).prop("lastItem")).toBeNull();
26
+ await waitForLoad(rendered);
27
+ const pagination = rendered.container.querySelector(".ui.pagination");
28
+ expect(pagination.querySelector("[aria-label='Last item']")).toBeNull();
27
29
  });
28
30
 
29
- it("has a last item if totalPages is within the page limit", () => {
30
- const wrapper = shallow(<Pagination totalPages={MAX_PAGES} {...props} />);
31
- expect(wrapper.prop("lastItem")).toMatchObject({ content: "»" });
31
+ it("has a last item if totalPages is within the page limit", async () => {
32
+ const rendered = render(<Pagination totalPages={MAX_PAGES} {...props} />);
33
+ await waitForLoad(rendered);
34
+ const pagination = rendered.container.querySelector(".ui.pagination");
35
+ expect(
36
+ pagination.querySelector("[aria-label='Last item']")
37
+ ).toHaveTextContent("»");
32
38
  });
33
39
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import QualityMenu from "../QualityMenu";
4
3
 
@@ -1,17 +1,12 @@
1
- import React from "react";
2
- import { mount } from "enzyme";
3
- import { MemoryRouter } from "react-router-dom";
1
+ import { render, waitForLoad } from "@truedat/test/render";
4
2
  import { Redirector } from "../Redirector";
5
3
 
6
4
  describe("<Redirector />", () => {
7
- it("dispatches clearRedirect on mount", () => {
5
+ it("dispatches clearRedirect on mount", async () => {
8
6
  const clearRedirect = jest.fn();
9
7
  const props = { clearRedirect };
10
- mount(
11
- <MemoryRouter>
12
- <Redirector {...props} />
13
- </MemoryRouter>
14
- );
15
- expect(clearRedirect.mock.calls).toHaveLength(1);
8
+ const rendered = render(<Redirector {...props} />);
9
+ await waitForLoad(rendered);
10
+ expect(clearRedirect).toHaveBeenCalledTimes(1);
16
11
  });
17
12
  });
@@ -1,16 +1,12 @@
1
- import React from "react";
1
+ import { waitFor } from "@testing-library/react";
2
2
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
4
- import { intl } from "@truedat/test/intl-stub";
3
+ import { render, waitForLoad } from "@truedat/test/render";
5
4
  import { useAclEntries } from "@truedat/core/hooks/useAclEntries";
6
5
  import { ResourceMembers } from "../ResourceMembers";
7
6
 
8
- // workaround for enzyme issue with React.useContext
9
- // see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
10
- jest.spyOn(React, "useContext").mockImplementation(() => intl);
11
7
  jest.mock("@truedat/core/hooks/useAclEntries");
12
- jest.mock("react-router-dom", () => ({
13
- ...jest.requireActual("react-router-dom"),
8
+ jest.mock("react-router", () => ({
9
+ ...jest.requireActual("react-router"),
14
10
  }));
15
11
 
16
12
  jest.mock("@truedat/core/hooks/useAclEntries", () => ({
@@ -73,7 +69,7 @@ describe("<ResourceMembers />", () => {
73
69
  ],
74
70
  };
75
71
 
76
- const props = { type: "domain", id: 1 };
72
+ const props = { type: "domain", id: "1" };
77
73
 
78
74
  useAclEntries.mockReturnValue({
79
75
  data: { ...aclEntries, actions: { canCreate: true } },
@@ -81,36 +77,49 @@ describe("<ResourceMembers />", () => {
81
77
  mutate: jest.fn(),
82
78
  });
83
79
 
84
- it("matches the latest snapshot", () => {
85
- const { container } = render(<ResourceMembers {...props} />);
86
- expect(container).toMatchSnapshot();
80
+ it("matches the latest snapshot", async () => {
81
+ const rendered = render(<ResourceMembers {...props} />);
82
+ await waitForLoad(rendered);
83
+ expect(rendered.container).toMatchSnapshot();
87
84
  });
88
85
 
89
- it("filters users and groups according to search filter", () => {
90
- const { getByRole } = render(<ResourceMembers {...props} />);
86
+ it("filters users and groups according to search filter", async () => {
87
+ const rendered = render(<ResourceMembers {...props} />);
88
+ await waitForLoad(rendered);
91
89
 
92
- const input = getByRole("textbox");
90
+ const input = rendered.getByRole("textbox");
91
+ const user = userEvent.setup({ delay: null });
93
92
 
94
- userEvent.type(input, "data");
93
+ await user.type(input, "data");
95
94
  expect(document.getElementsByClassName("card").length).toBe(2);
96
95
 
97
- userEvent.type(input, " owner");
96
+ await user.type(input, " owner");
98
97
  expect(document.getElementsByClassName("card").length).toBe(1);
99
98
  });
100
99
 
101
- it("renders users and groups grouped by role name", () => {
102
- const { getByRole, queryByRole } = render(<ResourceMembers {...props} />);
100
+ it("renders users and groups grouped by role name", async () => {
101
+ const rendered = render(<ResourceMembers {...props} />);
102
+ await waitForLoad(rendered);
103
103
 
104
- expect(getByRole("heading", { name: /data_owner/i })).toBeInTheDocument();
105
- expect(getByRole("heading", { name: /datos a/i })).toBeInTheDocument();
106
- expect(getByRole("heading", { name: /last r/i })).toBeInTheDocument();
104
+ expect(
105
+ rendered.getByRole("heading", { name: /data_owner/i })
106
+ ).toBeInTheDocument();
107
+ expect(
108
+ rendered.getByRole("heading", { name: /datos a/i })
109
+ ).toBeInTheDocument();
110
+ expect(
111
+ rendered.getByRole("heading", { name: /last r/i })
112
+ ).toBeInTheDocument();
107
113
 
108
- const input = getByRole("textbox");
114
+ const input = rendered.getByRole("textbox");
115
+ const user = userEvent.setup({ delay: null });
109
116
 
110
- userEvent.type(input, "data");
117
+ await user.type(input, "data");
111
118
 
112
- expect(getByRole("heading", { name: /data_owner/i })).toBeInTheDocument();
113
- expect(queryByRole("heading", { name: /datos a/i })).toBeNull();
114
- expect(queryByRole("heading", { name: /last r/i })).toBeNull();
119
+ expect(
120
+ rendered.getByRole("heading", { name: /data_owner/i })
121
+ ).toBeInTheDocument();
122
+ expect(rendered.queryByRole("heading", { name: /datos a/i })).toBeNull();
123
+ expect(rendered.queryByRole("heading", { name: /last r/i })).toBeNull();
115
124
  });
116
125
  });
@@ -1,11 +1,10 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { ResourceMembersActions } from "../ResourceMembersActions";
4
3
 
5
4
  const props = {
6
5
  resource: {
7
6
  type: "domain",
8
- id: 1,
7
+ id: "1",
9
8
  },
10
9
  actions: {
11
10
  canCreate: true,