@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,7 +1,6 @@
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 TreeSelector from "../TreeSelector";
6
5
 
7
6
  const baz = { id: "3", level: 2, name: "baz", children: [] };
@@ -9,28 +8,28 @@ const bar = { id: "2", level: 1, name: "bar", children: [baz] };
9
8
  const foo = { id: "1", level: 0, name: "foo", children: [bar] };
10
9
  const options = [foo, bar, baz];
11
10
 
12
- const renderOpts = {};
13
-
14
11
  describe("<TreeSelector />", () => {
15
- it("matches latest snapshot", () => {
12
+ it("matches latest snapshot", async () => {
16
13
  const props = {
17
14
  options,
18
15
  placeholder: "Select a domain",
19
16
  className: "testClassName",
20
17
  };
21
- const { container } = render(<TreeSelector {...props} />, renderOpts);
22
- expect(container).toMatchSnapshot();
18
+ const rendered = render(<TreeSelector {...props} />);
19
+ await waitForLoad(rendered);
20
+ expect(rendered.container).toMatchSnapshot();
23
21
  });
24
22
 
25
- it("matches latest snapshot with notDropdown parameter", () => {
23
+ it("matches latest snapshot with notDropdown parameter", async () => {
26
24
  const props = {
27
25
  options,
28
26
  placeholder: "Select a domain",
29
27
  className: "testClassName",
30
28
  notDropdown: true,
31
29
  };
32
- const { container } = render(<TreeSelector {...props} />, renderOpts);
33
- expect(container).toMatchSnapshot();
30
+ const rendered = render(<TreeSelector {...props} />);
31
+ await waitForLoad(rendered);
32
+ expect(rendered.container).toMatchSnapshot();
34
33
  });
35
34
 
36
35
  it("calls onChange with selected values (multiple)", async () => {
@@ -40,18 +39,20 @@ describe("<TreeSelector />", () => {
40
39
  placeholder: "Select a domain",
41
40
  value: [],
42
41
  };
43
- const { getByText, getByRole } = render(
44
- <TreeSelector multiple {...props} />,
45
- renderOpts
46
- );
42
+ const rendered = render(<TreeSelector multiple {...props} />);
43
+ await waitForLoad(rendered);
44
+
45
+ const user = userEvent.setup({ delay: null });
47
46
 
48
- userEvent.click(getByText("Select a domain"));
47
+ await user.click(rendered.getByText(/select a domain/i));
49
48
 
50
49
  await waitFor(() => {
51
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
50
+ expect(
51
+ rendered.getByRole("option", { name: /foo/i })
52
+ ).toBeInTheDocument();
52
53
  });
53
54
 
54
- userEvent.click(getByRole("option", { name: /foo/i }));
55
+ await user.click(rendered.getByRole("option", { name: /foo/i }));
55
56
  expect(props.onChange.mock.calls.length).toBe(1);
56
57
  expect(props.onChange.mock.calls[0][1]).toEqual({ value: ["1"] });
57
58
  });
@@ -62,18 +63,20 @@ describe("<TreeSelector />", () => {
62
63
  options,
63
64
  placeholder: "Select a domain",
64
65
  };
65
- const { getByText, getByRole } = render(
66
- <TreeSelector {...props} />,
67
- renderOpts
68
- );
66
+ const rendered = render(<TreeSelector {...props} />);
67
+ await waitForLoad(rendered);
68
+
69
+ const user = userEvent.setup({ delay: null });
69
70
 
70
- userEvent.click(getByText("Select a domain"));
71
+ await user.click(rendered.getByText(/select a domain/i));
71
72
 
72
73
  await waitFor(() => {
73
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
74
+ expect(
75
+ rendered.getByRole("option", { name: /foo/i })
76
+ ).toBeInTheDocument();
74
77
  });
75
78
 
76
- userEvent.click(getByRole("option", { name: /foo/i }));
79
+ await user.click(rendered.getByRole("option", { name: /foo/i }));
77
80
  expect(props.onChange.mock.calls.length).toBe(1);
78
81
  expect(props.onChange.mock.calls[0][1]).toEqual({ value: "1" });
79
82
  });
@@ -89,37 +92,44 @@ describe("<TreeSelector />", () => {
89
92
  value: [],
90
93
  };
91
94
 
92
- const { getByText, getByRole } = render(
93
- <TreeSelector multiple {...props} />,
94
- renderOpts
95
- );
96
- userEvent.click(getByText("Select a domain"));
95
+ const rendered = render(<TreeSelector multiple {...props} />);
96
+ await waitForLoad(rendered);
97
+
98
+ const user = userEvent.setup({ delay: null });
99
+
100
+ await user.click(rendered.getByText(/select a domain/i));
97
101
 
98
102
  await waitFor(() => {
99
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
103
+ expect(
104
+ rendered.getByRole("option", { name: /foo/i })
105
+ ).toBeInTheDocument();
100
106
  });
101
107
 
102
- userEvent.click(
103
- getByRole("option", { name: /foo/i }).querySelector(
104
- 'i[class="chevron right icon"]'
105
- )
108
+ await user.click(
109
+ rendered
110
+ .getByRole("option", { name: /foo/i })
111
+ .querySelector('i[class="chevron right icon"]')
106
112
  );
107
113
 
108
114
  await waitFor(() => {
109
- expect(getByRole("option", { name: /bar/i })).toBeTruthy();
115
+ expect(
116
+ rendered.getByRole("option", { name: /bar/i })
117
+ ).toBeInTheDocument();
110
118
  });
111
119
 
112
- userEvent.click(
113
- getByRole("option", { name: /bar/i }).querySelector(
114
- 'i[class="chevron right icon"]'
115
- )
120
+ await user.click(
121
+ rendered
122
+ .getByRole("option", { name: /bar/i })
123
+ .querySelector('i[class="chevron right icon"]')
116
124
  );
117
125
 
118
126
  await waitFor(() => {
119
- expect(getByRole("option", { name: /baz/i })).toBeTruthy();
127
+ expect(
128
+ rendered.getByRole("option", { name: /baz/i })
129
+ ).toBeInTheDocument();
120
130
  });
121
131
 
122
- userEvent.click(getByRole("option", { name: /baz/i }));
132
+ await user.click(rendered.getByRole("option", { name: /baz/i }));
123
133
  expect(props.onChange.mock.calls.length).toBe(1);
124
134
  expect(props.onChange.mock.calls[0][1]).toEqual({ value: ["3"] });
125
135
  expect(props.options.find((op) => op.id === "3") >= minDepth);
@@ -136,27 +146,32 @@ describe("<TreeSelector />", () => {
136
146
  value: [],
137
147
  };
138
148
 
139
- const { getByText, getByRole } = render(
140
- <TreeSelector multiple {...props} />,
141
- renderOpts
142
- );
143
- userEvent.click(getByText("Select a domain"));
149
+ const rendered = render(<TreeSelector multiple {...props} />);
150
+ await waitForLoad(rendered);
151
+
152
+ const user = userEvent.setup({ delay: null });
153
+
154
+ await user.click(rendered.getByText(/select a domain/i));
144
155
 
145
156
  await waitFor(() => {
146
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
157
+ expect(
158
+ rendered.getByRole("option", { name: /foo/i })
159
+ ).toBeInTheDocument();
147
160
  });
148
161
 
149
- userEvent.click(
150
- getByRole("option", { name: /foo/i }).querySelector(
151
- 'i[class="chevron right icon"]'
152
- )
162
+ await user.click(
163
+ rendered
164
+ .getByRole("option", { name: /foo/i })
165
+ .querySelector('i[class="chevron right icon"]')
153
166
  );
154
167
 
155
168
  await waitFor(() => {
156
- expect(getByRole("option", { name: /bar/i })).toBeTruthy();
169
+ expect(
170
+ rendered.getByRole("option", { name: /bar/i })
171
+ ).toBeInTheDocument();
157
172
  });
158
173
 
159
- userEvent.click(getByRole("option", { name: /bar/i }));
174
+ await user.click(rendered.getByRole("option", { name: /bar/i }));
160
175
 
161
176
  expect(props.onChange.mock.calls.length).toBe(0);
162
177
  });
@@ -171,37 +186,44 @@ describe("<TreeSelector />", () => {
171
186
  minDepth: minDepth,
172
187
  };
173
188
 
174
- const { getByText, getByRole } = render(
175
- <TreeSelector {...props} />,
176
- renderOpts
177
- );
178
- userEvent.click(getByText("Select a domain"));
189
+ const rendered = render(<TreeSelector {...props} />);
190
+ await waitForLoad(rendered);
191
+
192
+ const user = userEvent.setup({ delay: null });
193
+
194
+ await user.click(rendered.getByText(/select a domain/i));
179
195
 
180
196
  await waitFor(() => {
181
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
197
+ expect(
198
+ rendered.getByRole("option", { name: /foo/i })
199
+ ).toBeInTheDocument();
182
200
  });
183
201
 
184
- userEvent.click(
185
- getByRole("option", { name: /foo/i }).querySelector(
186
- 'i[class="chevron right icon"]'
187
- )
202
+ await user.click(
203
+ rendered
204
+ .getByRole("option", { name: /foo/i })
205
+ .querySelector('i[class="chevron right icon"]')
188
206
  );
189
207
 
190
208
  await waitFor(() => {
191
- expect(getByRole("option", { name: /bar/i })).toBeTruthy();
209
+ expect(
210
+ rendered.getByRole("option", { name: /bar/i })
211
+ ).toBeInTheDocument();
192
212
  });
193
213
 
194
- userEvent.click(
195
- getByRole("option", { name: /bar/i }).querySelector(
196
- 'i[class="chevron right icon"]'
197
- )
214
+ await user.click(
215
+ rendered
216
+ .getByRole("option", { name: /bar/i })
217
+ .querySelector('i[class="chevron right icon"]')
198
218
  );
199
219
 
200
220
  await waitFor(() => {
201
- expect(getByRole("option", { name: /baz/i })).toBeTruthy();
221
+ expect(
222
+ rendered.getByRole("option", { name: /baz/i })
223
+ ).toBeInTheDocument();
202
224
  });
203
225
 
204
- userEvent.click(getByRole("option", { name: /baz/i }));
226
+ await user.click(rendered.getByRole("option", { name: /baz/i }));
205
227
  expect(props.onChange.mock.calls.length).toBe(1);
206
228
  expect(props.onChange.mock.calls[0][1]).toEqual({ value: "3" });
207
229
  expect(props.options.find((op) => op.id === "3") >= minDepth);
@@ -217,27 +239,32 @@ describe("<TreeSelector />", () => {
217
239
  minDepth: minDepth,
218
240
  };
219
241
 
220
- const { getByText, getByRole } = render(
221
- <TreeSelector {...props} />,
222
- renderOpts
223
- );
224
- userEvent.click(getByText("Select a domain"));
242
+ const rendered = render(<TreeSelector {...props} />);
243
+ await waitForLoad(rendered);
244
+
245
+ const user = userEvent.setup({ delay: null });
246
+
247
+ await user.click(rendered.getByText(/select a domain/i));
225
248
 
226
249
  await waitFor(() => {
227
- expect(getByRole("option", { name: /foo/i })).toBeTruthy();
250
+ expect(
251
+ rendered.getByRole("option", { name: /foo/i })
252
+ ).toBeInTheDocument();
228
253
  });
229
254
 
230
- userEvent.click(
231
- getByRole("option", { name: /foo/i }).querySelector(
232
- 'i[class="chevron right icon"]'
233
- )
255
+ await user.click(
256
+ rendered
257
+ .getByRole("option", { name: /foo/i })
258
+ .querySelector('i[class="chevron right icon"]')
234
259
  );
235
260
 
236
261
  await waitFor(() => {
237
- expect(getByRole("option", { name: /bar/i })).toBeTruthy();
262
+ expect(
263
+ rendered.getByRole("option", { name: /bar/i })
264
+ ).toBeInTheDocument();
238
265
  });
239
266
 
240
- userEvent.click(getByRole("option", { name: /bar/i }));
267
+ await user.click(rendered.getByRole("option", { name: /bar/i }));
241
268
 
242
269
  expect(props.onChange.mock.calls.length).toBe(0);
243
270
  });
@@ -0,0 +1,171 @@
1
+ import { Dropdown } from "semantic-ui-react";
2
+ import { waitFor, fireEvent } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { render, waitForLoad } from "@truedat/test/render";
5
+ import { UploadModal } from "../UploadModal";
6
+
7
+ describe.skip("<UploadModal />", () => {
8
+ const trigger = <Dropdown.Item icon="upload" text="Trigger element" />;
9
+ const onClickExtraAction = jest.fn();
10
+ const onClickYesAction = jest.fn();
11
+ const user = userEvent.setup({ delay: null });
12
+
13
+ // See https://react-dropzone.js.org/ "Testing" section
14
+ const mockData = (files) => {
15
+ return {
16
+ dataTransfer: {
17
+ files,
18
+ items: files.map((file) => ({
19
+ kind: "file",
20
+ type: file.type,
21
+ getAsFile: () => file,
22
+ })),
23
+ types: ["Files"],
24
+ },
25
+ };
26
+ };
27
+
28
+ const extraAction = {
29
+ key: "yesWithAutoPublish",
30
+ primary: true,
31
+ content: "Extra action button",
32
+ onClick: onClickExtraAction,
33
+ };
34
+
35
+ it("shows the modal", async () => {
36
+ const rendered = render(
37
+ <UploadModal
38
+ {...{
39
+ trigger,
40
+ extraAction,
41
+ header: "header",
42
+ content: "content",
43
+ param: "implementations",
44
+ handleSubmit: onClickYesAction,
45
+ }}
46
+ />
47
+ );
48
+ await waitForLoad(rendered);
49
+
50
+ await user.click(
51
+ rendered.getByRole("option", { name: /trigger element/i })
52
+ );
53
+
54
+ const yesActionButton = rendered.getByRole("button", {
55
+ name: /uploadModal.accept.update/i,
56
+ });
57
+ expect(yesActionButton).toBeDisabled();
58
+
59
+ const extraActionButton = rendered.getByRole("button", {
60
+ name: /extra action button/i,
61
+ });
62
+ expect(extraActionButton).toBeDisabled();
63
+
64
+ expect(rendered.getByText(/trigger element/i)).toBeInTheDocument();
65
+ expect(
66
+ rendered.getByText(/uploadModal.actions.upload.confirmation.content/i)
67
+ ).toBeInTheDocument();
68
+ });
69
+
70
+ it("clicks yes action button", async () => {
71
+ const rendered = render(
72
+ <UploadModal
73
+ {...{
74
+ trigger,
75
+ header: "header",
76
+ content: "content",
77
+ param: "implementations",
78
+ handleSubmit: onClickYesAction,
79
+ }}
80
+ />
81
+ );
82
+ await waitForLoad(rendered);
83
+
84
+ await user.click(
85
+ rendered.getByRole("option", { name: /trigger element/i })
86
+ );
87
+
88
+ const yesActionButton = rendered.getByRole("button", {
89
+ name: /uploadModal.accept.update/i,
90
+ });
91
+ expect(yesActionButton).toBeDisabled();
92
+
93
+ const extraActionButton = rendered.queryByRole("button", {
94
+ name: /extra action button/i,
95
+ });
96
+ expect(extraActionButton).not.toBeInTheDocument();
97
+
98
+ const fakeFile = new File(["implementations"], "implementations.csv", {
99
+ type: "text/csv",
100
+ });
101
+
102
+ const dropZone = rendered.getByText(
103
+ /uploadModal.actions.upload.confirmation.content/i
104
+ );
105
+ const data = mockData([fakeFile]);
106
+
107
+ await waitFor(() => {
108
+ fireEvent.drop(dropZone, data);
109
+ });
110
+
111
+ expect(yesActionButton).toBeEnabled();
112
+
113
+ await waitFor(async () => {
114
+ await user.click(yesActionButton);
115
+ });
116
+
117
+ expect(onClickYesAction).toHaveBeenCalled();
118
+ });
119
+
120
+ it("clicks extra action button", async () => {
121
+ const rendered = render(
122
+ <UploadModal
123
+ {...{
124
+ trigger,
125
+ extraAction,
126
+ header: "header",
127
+ content: "content",
128
+ param: "implementations",
129
+ handleSubmit: onClickYesAction,
130
+ }}
131
+ />
132
+ );
133
+ await waitForLoad(rendered);
134
+
135
+ await user.click(
136
+ rendered.getByRole("option", { name: /trigger element/i })
137
+ );
138
+
139
+ const yesActionButton = rendered.getByRole("button", {
140
+ name: /uploadModal.accept.update/i,
141
+ });
142
+ expect(yesActionButton).toBeDisabled();
143
+
144
+ const extraActionButton = rendered.getByRole("button", {
145
+ name: /extra action button/i,
146
+ });
147
+ expect(extraActionButton).toBeDisabled();
148
+
149
+ const fakeFile = new File(["implementations"], "implementations.csv", {
150
+ type: "text/csv",
151
+ });
152
+
153
+ const dropZone = rendered.getByText(
154
+ /uploadModal.actions.upload.confirmation.content/i
155
+ );
156
+ const data = mockData([fakeFile]);
157
+
158
+ await waitFor(() => {
159
+ fireEvent.drop(dropZone, data);
160
+ });
161
+
162
+ expect(yesActionButton).toBeEnabled();
163
+ expect(extraActionButton).toBeEnabled();
164
+
165
+ await waitFor(async () => {
166
+ await user.click(extraActionButton);
167
+ });
168
+
169
+ expect(onClickExtraAction).toHaveBeenCalled();
170
+ });
171
+ });
@@ -1,17 +1,7 @@
1
- import React from "react";
2
1
  import userEvent from "@testing-library/user-event";
3
- import { render } from "@truedat/test/render";
4
- import messages from "@truedat/core/messages";
2
+ import { render, waitForLoad } from "@truedat/test/render";
5
3
  import UserFilters from "../UserFilters";
6
4
 
7
- const renderOpts = {
8
- messages: {
9
- en: {
10
- ...messages.en,
11
- },
12
- },
13
- };
14
-
15
5
  const applyUserFilter = jest.fn();
16
6
  const deleteUserFilter = jest.fn();
17
7
  const resetFilters = jest.fn();
@@ -27,7 +17,7 @@ describe("<UserFilters /> admin", () => {
27
17
  useAuthorized: jest.fn(() => true),
28
18
  }));
29
19
 
30
- it("matches the latest snapshot", () => {
20
+ it("matches the latest snapshot", async () => {
31
21
  const props = {
32
22
  applyUserFilter,
33
23
  deleteUserFilter,
@@ -35,11 +25,12 @@ describe("<UserFilters /> admin", () => {
35
25
  selectedUserFilter,
36
26
  userFilters,
37
27
  };
38
- const { container } = render(<UserFilters {...props} />, renderOpts);
39
- expect(container).toMatchSnapshot();
28
+ const rendered = render(<UserFilters {...props} />);
29
+ await waitForLoad(rendered);
30
+ expect(rendered.container).toMatchSnapshot();
40
31
  });
41
32
 
42
- it("matches the latest snapshot with global filters", () => {
33
+ it("matches the latest snapshot with global filters", async () => {
43
34
  const props = {
44
35
  applyUserFilter,
45
36
  deleteUserFilter,
@@ -47,8 +38,9 @@ describe("<UserFilters /> admin", () => {
47
38
  selectedUserFilter,
48
39
  userFilters: [...userFilters, { name: "g", is_global: true }],
49
40
  };
50
- const { container } = render(<UserFilters {...props} />, renderOpts);
51
- expect(container).toMatchSnapshot();
41
+ const rendered = render(<UserFilters {...props} />);
42
+ await waitForLoad(rendered);
43
+ expect(rendered.container).toMatchSnapshot();
52
44
  });
53
45
 
54
46
  it("calls applyUserFilter when selecting unselected filter label", async () => {
@@ -59,8 +51,12 @@ describe("<UserFilters /> admin", () => {
59
51
  selectedUserFilter,
60
52
  userFilters,
61
53
  };
62
- const { findByText } = render(<UserFilters {...props} />, renderOpts);
63
- userEvent.click(await findByText(/b/));
54
+ const rendered = render(<UserFilters {...props} />);
55
+ await waitForLoad(rendered);
56
+
57
+ const user = userEvent.setup({ delay: null });
58
+ await user.click(rendered.getByText(/b/i));
59
+
64
60
  expect(applyUserFilter.mock.calls.length).toBe(1);
65
61
  expect(applyUserFilter.mock.calls[0][0].userFilter).toEqual({
66
62
  id: 2,
@@ -76,8 +72,12 @@ describe("<UserFilters /> admin", () => {
76
72
  selectedUserFilter: "a",
77
73
  userFilters,
78
74
  };
79
- const { findByText } = render(<UserFilters {...props} />, renderOpts);
80
- userEvent.click(await findByText(/a/));
75
+ const rendered = render(<UserFilters {...props} />);
76
+ await waitForLoad(rendered);
77
+
78
+ const user = userEvent.setup({ delay: null });
79
+ await user.click(rendered.getByText(/a/i));
80
+
81
81
  expect(resetFilters.mock.calls.length).toBe(1);
82
82
  });
83
83
  });
@@ -88,7 +88,7 @@ describe("<UserFilters /> not admin", () => {
88
88
  useAuthorized: jest.fn(() => false),
89
89
  }));
90
90
 
91
- it("matches the latest snapshot", () => {
91
+ it("matches the latest snapshot", async () => {
92
92
  const props = {
93
93
  applyUserFilter,
94
94
  deleteUserFilter,
@@ -96,11 +96,12 @@ describe("<UserFilters /> not admin", () => {
96
96
  selectedUserFilter,
97
97
  userFilters,
98
98
  };
99
- const { container } = render(<UserFilters {...props} />, renderOpts);
100
- expect(container).toMatchSnapshot();
99
+ const rendered = render(<UserFilters {...props} />);
100
+ await waitForLoad(rendered);
101
+ expect(rendered.container).toMatchSnapshot();
101
102
  });
102
103
 
103
- it("matches the latest snapshot with global filters", () => {
104
+ it("matches the latest snapshot with global filters", async () => {
104
105
  const props = {
105
106
  applyUserFilter,
106
107
  deleteUserFilter,
@@ -108,8 +109,9 @@ describe("<UserFilters /> not admin", () => {
108
109
  selectedUserFilter,
109
110
  userFilters: [...userFilters, { name: "g", is_global: true }],
110
111
  };
111
- const { container } = render(<UserFilters {...props} />, renderOpts);
112
- expect(container).toMatchSnapshot();
112
+ const rendered = render(<UserFilters {...props} />);
113
+ await waitForLoad(rendered);
114
+ expect(rendered.container).toMatchSnapshot();
113
115
  });
114
116
  });
115
117
 
@@ -169,17 +171,22 @@ describe("<UserFilters /> for taxonomy screens", () => {
169
171
  ],
170
172
  };
171
173
 
172
- it("matches the latest snapshot", () => {
173
- const { container } = render(<UserFilters {...props} />, renderOpts);
174
- expect(container).toMatchSnapshot();
174
+ it("matches the latest snapshot", async () => {
175
+ const rendered = render(<UserFilters {...props} />);
176
+ await waitForLoad(rendered);
177
+ expect(rendered.container).toMatchSnapshot();
175
178
  });
176
179
 
177
- it("render only Show filters", () => {
178
- const { queryByText } = render(<UserFilters {...props} />, renderOpts);
179
- expect(queryByText("Hide Domain Filter")).toBeNull();
180
- expect(queryByText("Show Status Filter")).toBeInTheDocument();
181
- expect(queryByText("Hide Multiple Domain Filter")).toBeNull();
182
- expect(queryByText("Hide Other Domain Filter")).toBeNull();
183
- expect(queryByText("Show Status and Domain Filter")).toBeInTheDocument();
180
+ it("render only Show filters", async () => {
181
+ const rendered = render(<UserFilters {...props} />);
182
+ await waitForLoad(rendered);
183
+
184
+ expect(rendered.queryByText(/hide domain filter/i)).toBeNull();
185
+ expect(rendered.getByText(/show status filter/i)).toBeInTheDocument();
186
+ expect(rendered.queryByText(/hide multiple domain filter/i)).toBeNull();
187
+ expect(rendered.queryByText(/hide other domain filter/i)).toBeNull();
188
+ expect(
189
+ rendered.getByText(/show status and domain filter/i)
190
+ ).toBeInTheDocument();
184
191
  });
185
192
  });
@@ -176,6 +176,7 @@ exports[`<AddMemberForm /> matches the latest snapshot 1`] = `
176
176
  </button>
177
177
  <a
178
178
  class="ui secondary button"
179
+ data-discover="true"
179
180
  href="/"
180
181
  role="button"
181
182
  >