@truedat/lm 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 (71) hide show
  1. package/index.js +5 -0
  2. package/package.json +43 -67
  3. package/src/components/ConceptImplementationLink.js +1 -2
  4. package/src/components/ConceptLink.js +2 -3
  5. package/src/components/ConceptLinkTags.js +0 -1
  6. package/src/components/ConceptStructureLinkForm.js +3 -3
  7. package/src/components/ConfirmDeleteRelation.js +0 -1
  8. package/src/components/ImplementationLinkRow.js +0 -1
  9. package/src/components/ImplementationLinks.js +1 -2
  10. package/src/components/ImplementationRelationForm.js +5 -8
  11. package/src/components/LinksPane.js +0 -1
  12. package/src/components/NewRelationTag.js +0 -1
  13. package/src/components/RelationActions.js +3 -4
  14. package/src/components/RelationGraph.js +1 -1
  15. package/src/components/RelationGraphDepth.js +6 -3
  16. package/src/components/RelationRoutes.js +16 -25
  17. package/src/components/RelationRow.js +6 -7
  18. package/src/components/RelationTagCards.js +2 -2
  19. package/src/components/RelationTagForm.js +0 -2
  20. package/src/components/RelationTags.js +1 -2
  21. package/src/components/RelationTagsLoader.js +2 -2
  22. package/src/components/Relations.js +0 -1
  23. package/src/components/RelationsGraphLoader.js +0 -1
  24. package/src/components/StructureLinkRow.js +0 -1
  25. package/src/components/StructureLinks.js +1 -2
  26. package/src/components/StructureRelationForm.js +5 -9
  27. package/src/components/TagTypeDropdownSelector.js +1 -1
  28. package/src/components/TagTypeSelector.js +0 -2
  29. package/src/components/__tests__/ConceptImplementationLink.spec.js +0 -1
  30. package/src/components/__tests__/ConceptLinkTags.spec.js +7 -9
  31. package/src/components/__tests__/ConceptStructureLinkForm.spec.js +68 -20
  32. package/src/components/__tests__/ConfirmDeleteRelation.spec.js +0 -1
  33. package/src/components/__tests__/ImplementationLinkRow.spec.js +0 -1
  34. package/src/components/__tests__/ImplementationLinks.spec.js +0 -1
  35. package/src/components/__tests__/ImplementationRelationForm.spec.js +45 -73
  36. package/src/components/__tests__/LinksPane.spec.js +0 -1
  37. package/src/components/__tests__/NewRelationTag.spec.js +0 -1
  38. package/src/components/__tests__/RelationActions.spec.js +14 -15
  39. package/src/components/__tests__/RelationRoutes.spec.js +59 -7
  40. package/src/components/__tests__/RelationRow.spec.js +46 -23
  41. package/src/components/__tests__/RelationTagCards.spec.js +0 -1
  42. package/src/components/__tests__/RelationTagForm.spec.js +26 -37
  43. package/src/components/__tests__/RelationTags.spec.js +0 -1
  44. package/src/components/__tests__/RelationTagsLoader.spec.js +6 -6
  45. package/src/components/__tests__/Relations.spec.js +19 -17
  46. package/src/components/__tests__/RelationsGraphLoader.spec.js +32 -26
  47. package/src/components/__tests__/RelationsLoader.spec.js +19 -19
  48. package/src/components/__tests__/StructureRelationForm.spec.js +41 -42
  49. package/src/components/__tests__/TagTypeSelector.spec.js +7 -13
  50. package/src/components/__tests__/__snapshots__/ConceptImplementationLink.spec.js.snap +1 -0
  51. package/src/components/__tests__/__snapshots__/ConceptLinkTags.spec.js.snap +12 -20
  52. package/src/components/__tests__/__snapshots__/ConceptStructureLinkForm.spec.js.snap +170 -19
  53. package/src/components/__tests__/__snapshots__/ImplementationLinks.spec.js.snap +4 -0
  54. package/src/components/__tests__/__snapshots__/ImplementationRelationForm.spec.js.snap +13 -13
  55. package/src/components/__tests__/__snapshots__/NewRelationTag.spec.js.snap +12 -11
  56. package/src/components/__tests__/__snapshots__/RelationActions.spec.js.snap +1 -1
  57. package/src/components/__tests__/__snapshots__/RelationRoutes.spec.js.snap +21 -5
  58. package/src/components/__tests__/__snapshots__/RelationRow.spec.js.snap +7 -1
  59. package/src/components/__tests__/__snapshots__/RelationTagCards.spec.js.snap +0 -1
  60. package/src/components/__tests__/__snapshots__/RelationTagForm.spec.js.snap +11 -10
  61. package/src/components/__tests__/__snapshots__/RelationTags.spec.js.snap +1 -1
  62. package/src/components/__tests__/__snapshots__/RelationTagsLoader.spec.js.snap +1 -1
  63. package/src/components/__tests__/__snapshots__/Relations.spec.js.snap +36 -27
  64. package/src/components/__tests__/__snapshots__/RelationsGraphLoader.spec.js.snap +1 -25
  65. package/src/components/__tests__/__snapshots__/StructureRelationForm.spec.js.snap +1 -1
  66. package/src/components/__tests__/__snapshots__/TagTypeSelector.spec.js.snap +11 -14
  67. package/src/hooks/useTags.js +1 -1
  68. package/src/sagas/__tests__/fetchRelationsGraph.spec.js +2 -2
  69. package/src/sagas/fetchRelationsGraph.js +1 -1
  70. package/src/selectors/getStructureLinks.js +1 -1
  71. package/src/services/relationGraphTraversal.js +3 -3
@@ -1,40 +1,88 @@
1
- import React, { Suspense } from "react";
2
- import { shallow, mount } from "enzyme";
3
- import { MemoryRouter } from "react-router-dom";
4
- import { intl } from "@truedat/test/intl-stub";
1
+ import { render, waitForLoad } from "@truedat/test/render";
5
2
  import { ConceptStructureLinkForm } from "../ConceptStructureLinkForm";
6
3
 
7
- // workaround for enzyme issue with React.useContext
8
- // see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
9
- jest.spyOn(React, "useContext").mockImplementation(() => intl);
4
+ jest.mock("@truedat/core/hooks/useUserFilters");
5
+
6
+ const structure = {
7
+ external_id: "external_id",
8
+ id: 67583,
9
+ updated_at: "2021-06-10T12:01:17.343065Z",
10
+ name: "structure",
11
+ };
12
+
13
+ jest.mock("@truedat/dd/hooks/useStructures", () => {
14
+ const originalModule = jest.requireActual("@truedat/dd/hooks/useStructures");
15
+
16
+ const data = {
17
+ _actions: { bulkUpdate: { href: "/structures/bulkUpdate" } },
18
+ data: [structure],
19
+ };
20
+
21
+ return {
22
+ __esModule: true,
23
+ ...originalModule,
24
+ useDataStructureFilters: () => ({
25
+ trigger: () => ({
26
+ then: (callback) =>
27
+ callback({
28
+ data: { data: {} },
29
+ }),
30
+ }),
31
+ }),
32
+ useDataStructureSearch: () => ({
33
+ trigger: () => ({
34
+ then: (callback) =>
35
+ callback({
36
+ data,
37
+ headers: {},
38
+ }),
39
+ }),
40
+ }),
41
+ };
42
+ });
43
+
44
+ const useFilters = jest.fn(() => ({
45
+ trigger: jest.fn(() => new Promise(() => {})),
46
+ isMutating: false,
47
+ }));
48
+
49
+ const useSearch = () => ({
50
+ trigger: () => ({
51
+ then: (callback) =>
52
+ callback({
53
+ data: {
54
+ data: [structure],
55
+ },
56
+ }),
57
+ }),
58
+ });
10
59
 
11
60
  const makeProps = () => ({
12
61
  clearSelectedRelationTags: jest.fn(),
13
62
  clearStructures: jest.fn(),
14
63
  createRelation: jest.fn(),
15
64
  id: 42,
16
- sourceId: 42
65
+ sourceId: 42,
17
66
  });
18
67
 
19
68
  describe("<ConceptStructureLinkForm />", () => {
20
- it("matches the latest snapshot", () => {
69
+ it("matches the latest snapshot", async () => {
21
70
  const props = makeProps();
22
- const wrapper = shallow(<ConceptStructureLinkForm {...props} />);
23
- expect(wrapper).toMatchSnapshot();
71
+ const rendered = render(<ConceptStructureLinkForm {...props} />);
72
+ await waitForLoad(rendered);
73
+ expect(rendered.container).toMatchSnapshot();
24
74
  });
25
75
 
26
- it("calls clearSelectedRelationTags and clearStructures on unmount", () => {
76
+ it("calls clearSelectedRelationTags and clearStructures on unmount", async () => {
27
77
  const props = makeProps();
28
- const wrapper = mount(
29
- <Suspense fallback={null}>
30
- <MemoryRouter>
31
- <ConceptStructureLinkForm {...props} />
32
- </MemoryRouter>
33
- </Suspense>
34
- );
78
+ const rendered = render(<ConceptStructureLinkForm {...props} />);
79
+ await waitForLoad(rendered);
80
+
35
81
  expect(props.clearSelectedRelationTags).not.toHaveBeenCalled();
36
82
  expect(props.clearStructures).not.toHaveBeenCalled();
37
- wrapper.unmount();
83
+
84
+ rendered.unmount();
85
+
38
86
  expect(props.clearSelectedRelationTags).toHaveBeenCalled();
39
87
  expect(props.clearStructures).toHaveBeenCalled();
40
88
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { ConfirmDeleteRelation } from "../ConfirmDeleteRelation";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { Table } from "semantic-ui-react";
4
3
  import { ImplementationLinkRow } from "../ImplementationLinkRow";
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { ImplementationLinks } from "../ImplementationLinks";
4
3
 
@@ -1,13 +1,13 @@
1
- import React from "react";
2
- import { render } from "@truedat/test/render";
3
- import { linkTo } from "@truedat/core/routes";
4
1
  import userEvent from "@testing-library/user-event";
5
2
  import { waitFor } from "@testing-library/react";
3
+ import { render, waitForLoad } from "@truedat/test/render";
4
+ import { linkTo } from "@truedat/core/routes";
6
5
  import { ImplementationRelationForm } from "../ImplementationRelationForm";
7
- import en from "../../messages/en";
8
6
 
9
7
  const linkConcept = jest.fn();
10
8
 
9
+ jest.mock("@truedat/core/hooks/useUserFilters");
10
+
11
11
  const data = {
12
12
  data: [
13
13
  {
@@ -80,8 +80,6 @@ const tagOptions = [
80
80
  { id: 2, text: "text", value: 1 },
81
81
  ];
82
82
 
83
- const concepts = [];
84
-
85
83
  const props = {
86
84
  implementation: { rule_id: 2, id: 4, implementation_ref: 1 },
87
85
  tagOptions,
@@ -90,53 +88,27 @@ const props = {
90
88
  selectedRelationTags: [1],
91
89
  };
92
90
 
93
- const renderOpts = {
94
- messages: {
95
- en: {
96
- ...en,
97
- "implementations.relation.new.header": "header",
98
- "conceptRelations.relationType": "relationType",
99
- "actions.cancel": "Cancel",
100
- "actions.create": "Create",
101
- "conceptRelations.relationType.text": "text",
102
- "concepts.props.name": "Name",
103
- "concepts.props.domain": "Domain",
104
- "concepts.props.status": "Status",
105
- "search.save_filters": "Save Filters",
106
- "search.clear_filters": "Clear Filters",
107
- "search.applied_filters": "Applied Filters",
108
- "conceptRelations.relatedConcept": "Related Concept",
109
- "concepts.search.placeholder": "Search",
110
- "concepts.search.placeholder": "Search",
111
- "search.placeholder": "Search...",
112
- "concepts.search.results.empty": "No concepts found",
113
- },
114
- },
115
- // state: {},
116
- fallback: "lazy",
117
- };
118
-
119
91
  describe("<ImplementationRelationForm />", () => {
120
92
  it("matches the latest snapshot", async () => {
121
- const { container, getByText, findByText } = render(
122
- <ImplementationRelationForm {...props} />,
123
- renderOpts
124
- );
93
+ const rendered = render(<ImplementationRelationForm {...props} />);
94
+ await waitForLoad(rendered);
125
95
 
126
- await waitFor(
127
- () => {
128
- expect(getByText(/relates_to/)).toBeInTheDocument();
129
- },
130
- { timeout: 60000 }
96
+ await waitFor(() =>
97
+ expect(rendered.getByText(/relates_to/i)).toBeInTheDocument()
131
98
  );
132
- userEvent.click(await findByText(/some/));
133
- await waitFor(() => {
134
- expect(container.querySelector(".loading")).toBeNull();
135
- });
99
+
100
+ const user = userEvent.setup({ delay: null });
101
+ await user.click(await rendered.findByText(/some/i));
102
+
136
103
  await waitFor(() => {
137
- expect(getByText(/foo concept/)).toBeInTheDocument();
104
+ expect(rendered.container.querySelector(".loading")).toBeNull();
138
105
  });
139
- expect(container).toMatchSnapshot();
106
+
107
+ await waitFor(() =>
108
+ expect(rendered.getByText(/foo concept/i)).toBeInTheDocument()
109
+ );
110
+
111
+ expect(rendered.container).toMatchSnapshot();
140
112
  });
141
113
 
142
114
  it("disables submit and shows loading state if concept is linking", async () => {
@@ -145,44 +117,44 @@ describe("<ImplementationRelationForm />", () => {
145
117
  conceptLinking: true,
146
118
  };
147
119
 
148
- const { queryByRole, getByText, findByRole, findByText } = render(
149
- <ImplementationRelationForm {...newProps} />,
150
- renderOpts
120
+ const rendered = render(<ImplementationRelationForm {...newProps} />);
121
+
122
+ await waitFor(() =>
123
+ expect(rendered.getByText(/relates_to/i)).toBeInTheDocument()
151
124
  );
152
125
 
153
- await waitFor(() => {
154
- expect(getByText(/relates_to/)).toBeInTheDocument();
155
- });
126
+ expect(rendered.queryByRole("button", { name: /create/i })).toBeDisabled();
156
127
 
157
- expect(queryByRole("button", { name: /Create/ })).toBeDisabled();
158
- userEvent.click(await findByText(/relates_to/));
159
- userEvent.click(await findByText(/bar concept/));
128
+ const user = userEvent.setup({ delay: null });
129
+ await user.click(await rendered.findByText(/relates_to/i));
130
+ await user.click(await rendered.findByText(/bar concept/i));
160
131
 
161
- await waitFor(() => {
162
- expect(queryByRole("button", { name: /Create/ })).toBeEnabled();
163
- });
132
+ await waitFor(() =>
133
+ expect(rendered.queryByRole("button", { name: /create/i })).toBeEnabled()
134
+ );
164
135
 
165
- userEvent.click(await findByRole("button", { name: /Create/ }));
136
+ await user.click(await rendered.findByRole("button", { name: /create/i }));
166
137
 
167
- await waitFor(() => {
168
- expect(queryByRole("button", { name: /Create/ })).toHaveClass("loading");
169
- });
138
+ await waitFor(() =>
139
+ expect(rendered.queryByRole("button", { name: /create/i })).toHaveClass(
140
+ "loading"
141
+ )
142
+ );
170
143
  });
171
144
 
172
145
  it("submits the selected relation", async () => {
173
- const { getByText, findByRole, findByText } = render(
174
- <ImplementationRelationForm {...props} />,
175
- renderOpts
176
- );
146
+ const rendered = render(<ImplementationRelationForm {...props} />);
147
+ await waitForLoad(rendered);
177
148
 
178
- await waitFor(() => {
179
- expect(getByText(/relates_to/)).toBeInTheDocument();
180
- });
149
+ await waitFor(() =>
150
+ expect(rendered.getByText(/relates_to/i)).toBeInTheDocument()
151
+ );
181
152
 
182
- userEvent.click(await findByText(/relates_to/));
183
- userEvent.click(await findByText(/bar concept/));
153
+ const user = userEvent.setup({ delay: null });
154
+ await user.click(await rendered.findByText(/relates_to/i));
155
+ await user.click(await rendered.findByText(/bar concept/i));
184
156
 
185
- userEvent.click(await findByRole("button", { name: /Create/ }));
157
+ await user.click(await rendered.findByRole("button", { name: /create/i }));
186
158
 
187
159
  const expectedRelation = {
188
160
  redirectUrl: linkTo.IMPLEMENTATION_CONCEPT_LINKS({
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { LinksPane } from "../LinksPane";
4
3
 
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { NewRelationTag } from "../NewRelationTag";
4
3
 
@@ -1,24 +1,23 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { RelationActions } from "../RelationActions";
4
3
 
5
- jest.mock("react-router-dom", () => ({
6
- ...jest.requireActual("react-router-dom"),
7
- useLocation: () => ({ pathname: "my_path" })
4
+ jest.mock("react-router", () => ({
5
+ ...jest.requireActual("react-router"),
6
+ useLocation: () => ({ pathname: "my_path" }),
8
7
  }));
9
8
 
10
9
  describe("<RelationActions />", () => {
11
- it("matches the latest snapshot", () => {
12
- const addConceptRelation = false;
13
- const props = { addConceptRelation };
14
- const wrapper = shallow(<RelationActions {...props} />);
15
- expect(wrapper).toMatchSnapshot();
10
+ it("matches the latest snapshot", async () => {
11
+ const props = { addConceptRelation: false };
12
+ const rendered = render(<RelationActions {...props} />);
13
+ await waitForLoad(rendered);
14
+ expect(rendered.container).toMatchSnapshot();
16
15
  });
17
16
 
18
- it("when addConceptRelation it renders a button", () => {
19
- const addConceptRelation = true;
20
- const props = { addConceptRelation };
21
- const wrapper = shallow(<RelationActions {...props} />);
22
- expect(wrapper.find("Button").length).toBe(1);
17
+ it("when addConceptRelation it renders a button", async () => {
18
+ const props = { addConceptRelation: true };
19
+ const rendered = render(<RelationActions {...props} />);
20
+ await waitForLoad(rendered);
21
+ expect(rendered.getByText(/relations.actions.create/i)).toBeInTheDocument();
23
22
  });
24
23
  });
@@ -1,14 +1,66 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
2
+ import { useAuthorized } from "@truedat/core/hooks/useAuthorized";
3
+ import { RELATION_TAGS, RELATION_TAGS_NEW } from "@truedat/core/routes";
3
4
  import { RelationRoutes } from "../RelationRoutes";
4
5
 
5
- jest.mock("@truedat/core/hooks", () => ({
6
- useAuthorized: jest.fn(() => true)
6
+ // Mock the hooks module
7
+ jest.mock("@truedat/core/hooks/useAuthorized");
8
+
9
+ // Mock child components
10
+ jest.mock(
11
+ "../NewRelationTag",
12
+ () =>
13
+ function NewRelationTag() {
14
+ return <div>NewRelationTag</div>;
15
+ }
16
+ );
17
+ jest.mock(
18
+ "../RelationTags",
19
+ () =>
20
+ function RelationTags() {
21
+ return <div>RelationTags</div>;
22
+ }
23
+ );
24
+ jest.mock(
25
+ "../RelationTagsLoader",
26
+ () =>
27
+ function RelationTagsLoader() {
28
+ return <div>RelationTagsLoader</div>;
29
+ }
30
+ );
31
+ jest.mock("@truedat/core/components", () => ({
32
+ Unauthorized: () => <div>Unauthorized</div>,
33
+ ...jest.requireActual("@truedat/core/components"),
7
34
  }));
8
35
 
9
36
  describe("<RelationRoutes />", () => {
10
- it("matches the latest snapshot", () => {
11
- const wrapper = shallow(<RelationRoutes />);
12
- expect(wrapper).toMatchSnapshot();
37
+ it("renders correctly with default route", async () => {
38
+ const rendered = render(<RelationRoutes />);
39
+ await waitForLoad(rendered);
40
+ expect(rendered.container).toMatchSnapshot();
41
+ });
42
+
43
+ it("renders correctly with RELATION_TAGS route", async () => {
44
+ const rendered = render(<RelationRoutes />, {
45
+ routes: [RELATION_TAGS],
46
+ });
47
+ await waitForLoad(rendered);
48
+ expect(rendered.container).toMatchSnapshot();
49
+ });
50
+
51
+ it("renders correctly with RELATION_TAGS_NEW route", async () => {
52
+ const rendered = render(<RelationRoutes />, {
53
+ routes: [RELATION_TAGS_NEW],
54
+ });
55
+ await waitForLoad(rendered);
56
+ expect(rendered.container).toMatchSnapshot();
57
+ });
58
+
59
+ it("renders unauthorized component when not authorized", async () => {
60
+ useAuthorized.mockReturnValueOnce(false);
61
+
62
+ const rendered = render(<RelationRoutes />);
63
+ await waitForLoad(rendered);
64
+ expect(rendered.container).toMatchSnapshot();
13
65
  });
14
66
  });
@@ -1,10 +1,9 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { RelationRow } from "../RelationRow";
4
3
 
5
- jest.mock("react-router-dom", () => ({
6
- ...jest.requireActual("react-router-dom"),
7
- useHistory: () => ({ push: jest.fn() })
4
+ jest.mock("react-router", () => ({
5
+ ...jest.requireActual("react-router"),
6
+ useNavigate: () => jest.fn(),
8
7
  }));
9
8
 
10
9
  describe("<RelationRow />", () => {
@@ -15,36 +14,60 @@ describe("<RelationRow />", () => {
15
14
  relationContext: {},
16
15
  tags: [],
17
16
  relationPath: "",
18
- history: {}
17
+ history: {},
19
18
  };
20
- it("matches the latest snapshot", () => {
21
- const wrapper = shallow(<RelationRow {...defaultProps} />);
22
- expect(wrapper).toMatchSnapshot();
19
+ it("matches the latest snapshot", async () => {
20
+ const rendered = render(
21
+ <table>
22
+ <tbody>
23
+ <RelationRow {...defaultProps} />
24
+ </tbody>
25
+ </table>
26
+ );
27
+ await waitForLoad(rendered);
28
+ expect(rendered.container).toMatchSnapshot();
23
29
  });
24
30
 
25
- it("renders null when relationContext not empty and source and target whitin it are null", () => {
26
- const wrapper = shallow(<RelationRow {...defaultProps} />);
27
- expect(wrapper.type()).toEqual(null);
31
+ it("renders null when relationContext not empty and source and target whitin it are null", async () => {
32
+ const rendered = render(
33
+ <table>
34
+ <tbody>
35
+ <RelationRow {...defaultProps} />
36
+ </tbody>
37
+ </table>
38
+ );
39
+ await waitForLoad(rendered);
40
+ expect(rendered.container.firstChild.firstChild.firstChild).toBeNull();
28
41
  });
29
42
 
30
- it("renders a row with one cell when relationContext not empty and source and target whitin it are null", () => {
43
+ it("renders a row with one cell when relationContext not empty and source and target whitin it are null", async () => {
31
44
  const relationContext = { source: null, target: null };
32
- const wrapper = shallow(
33
- <RelationRow {...{ ...defaultProps, relationContext }} />
45
+ const rendered = render(
46
+ <table>
47
+ <tbody>
48
+ <RelationRow {...{ ...defaultProps, relationContext }} />
49
+ </tbody>
50
+ </table>
34
51
  );
35
- expect(wrapper.find("TableRow").length).toBe(1);
36
- expect(wrapper.find("TableCell").length).toBe(1);
52
+ await waitForLoad(rendered);
53
+ expect(rendered.container.querySelectorAll("tr").length).toBe(1);
54
+ expect(rendered.container.querySelectorAll("td").length).toBe(1);
37
55
  });
38
56
 
39
- it("renders a row with four cells when relationContext not empty and source and target whitin it are informed", () => {
57
+ it("renders a row with four cells when relationContext not empty and source and target whitin it are informed", async () => {
40
58
  const relationContext = {
41
59
  source: { name: "source name" },
42
- target: { name: "target name" }
60
+ target: { name: "target name" },
43
61
  };
44
- const wrapper = shallow(
45
- <RelationRow {...{ ...defaultProps, relationContext }} />
62
+ const rendered = render(
63
+ <table>
64
+ <tbody>
65
+ <RelationRow {...{ ...defaultProps, relationContext }} />
66
+ </tbody>
67
+ </table>
46
68
  );
47
- expect(wrapper.find("TableRow").length).toBe(1);
48
- expect(wrapper.find("TableCell").length).toBe(4);
69
+ await waitForLoad(rendered);
70
+ expect(rendered.container.querySelectorAll("tr").length).toBe(1);
71
+ expect(rendered.container.querySelectorAll("td").length).toBe(4);
49
72
  });
50
73
  });
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import { RelationTagCards } from "../RelationTagCards";
4
3
 
@@ -1,68 +1,57 @@
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 { RelationTagForm } from "../RelationTagForm";
6
5
 
7
- const renderOpts = {
8
- messages: {
9
- en: {
10
- "actions.cancel": "cancel",
11
- "actions.create": "create",
12
- "form.validation.required": "required",
13
- "relationTags.props.expandable": "Expandable",
14
- "relationTags.props.target_type": "target",
15
- "relationTags.props.target_type.placeholder": "...",
16
- "relationTags.props.type": "type",
17
- "relationTags.props.type.placeholder": "...",
18
- "target_type.business_concept": "concept",
19
- "target_type.data_field": "structure",
20
- "target_type.ingest": "ingest",
21
- "target_type.implementations": "implementations",
22
- },
23
- },
24
- };
25
-
26
6
  describe("<RelationTagForm />", () => {
27
7
  it("matches the latest snapshot", async () => {
28
- const { container, findByRole } = render(<RelationTagForm />, renderOpts);
29
- await findByRole("button", { name: /create/ });
30
- expect(container).toMatchSnapshot();
8
+ const rendered = render(<RelationTagForm />);
9
+ await waitForLoad(rendered);
10
+ await rendered.findByRole("button", { name: /create/i });
11
+ expect(rendered.container).toMatchSnapshot();
31
12
  });
32
13
 
33
14
  it("calls createRelationTag with on submit", async () => {
34
15
  const onSubmit = jest.fn();
16
+ const user = userEvent.setup({ delay: null });
35
17
 
36
- const { findByRole, getByRole, findByText } = render(
37
- <RelationTagForm onSubmit={(props) => onSubmit(props)} />,
38
- renderOpts
18
+ const rendered = render(
19
+ <RelationTagForm onSubmit={(props) => onSubmit(props)} />
39
20
  );
21
+ await waitForLoad(rendered);
40
22
 
41
23
  // Submit button should initially be disabled
42
24
  await waitFor(() =>
43
- expect(getByRole("button", { name: /create/ })).toBeDisabled()
25
+ expect(rendered.getByRole("button", { name: /create/i })).toBeDisabled()
44
26
  );
45
27
 
46
28
  // Input name
47
- userEvent.type(await findByRole("textbox", { name: "type" }), "foo");
29
+ await user.type(
30
+ await rendered.findByRole("textbox", { name: /type/i }),
31
+ "foo"
32
+ );
48
33
 
49
34
  // Select type
50
- userEvent.click(await findByText("target"));
51
- userEvent.click(await findByRole("option", { name: "concept" }));
35
+ await user.click(
36
+ await rendered.findByText("relationTags.props.target_type")
37
+ );
38
+ await user.click(await rendered.findByRole("option", { name: /concept/i }));
52
39
 
53
40
  //expandable
54
- const expandableCheckbox = await findByRole("checkbox", {
55
- name: /Expandable/,
41
+ const expandableCheckbox = await rendered.findByRole("checkbox", {
42
+ name: /expandable/i,
56
43
  });
57
- userEvent.click(expandableCheckbox);
44
+ await user.click(expandableCheckbox);
58
45
 
59
46
  // Submit button should now be enabled
60
47
  await waitFor(() =>
61
- expect(getByRole("button", { name: /create/ })).not.toBeDisabled()
48
+ expect(
49
+ rendered.getByRole("button", { name: /create/i })
50
+ ).not.toBeDisabled()
62
51
  );
63
52
 
64
53
  // Submit
65
- userEvent.click(await findByRole("button", { name: /create/ }));
54
+ await user.click(await rendered.findByRole("button", { name: /create/i }));
66
55
 
67
56
  await waitFor(() =>
68
57
  expect(onSubmit).toHaveBeenCalledWith({
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { render } from "@truedat/test/render";
3
2
  import RelationTags from "../RelationTags";
4
3
 
@@ -1,15 +1,15 @@
1
- import React from "react";
2
- import { shallow } from "enzyme";
1
+ import { render, waitForLoad } from "@truedat/test/render";
3
2
  import { RelationTagsLoader } from "../RelationTagsLoader";
4
3
 
5
4
  describe("<RelationTagsLoader />", () => {
6
- it("matches the latest snapshot", () => {
5
+ it("matches the latest snapshot", async () => {
7
6
  const props = {
8
7
  fetchRelationTags: jest.fn(),
9
8
  clearRelationTags: jest.fn(),
10
- relationTagsLoading: false
9
+ relationTagsLoading: false,
11
10
  };
12
- const wrapper = shallow(<RelationTagsLoader {...props} />);
13
- expect(wrapper).toMatchSnapshot();
11
+ const rendered = render(<RelationTagsLoader {...props} />);
12
+ await waitForLoad(rendered);
13
+ expect(rendered.container).toMatchSnapshot();
14
14
  });
15
15
  });