@truedat/dd 5.2.8 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/package.json +5 -5
- package/src/api/queries.js +31 -0
- package/src/components/DictionaryRoutes.js +3 -0
- package/src/components/ReferenceDatasetFieldSelector.js +146 -0
- package/src/components/Task.js +149 -0
- package/src/components/Tasks.js +138 -0
- package/src/components/TasksRoutes.js +27 -0
- package/src/components/__tests__/ReferenceDatasetFieldSelector.spec.js +86 -0
- package/src/components/__tests__/Task.spec.js +44 -0
- package/src/components/__tests__/Tasks.spec.js +120 -0
- package/src/components/__tests__/TasksRoutes.spec.js +56 -0
- package/src/components/__tests__/__snapshots__/DictionaryRoutes.spec.js.snap +4 -0
- package/src/components/__tests__/__snapshots__/Task.spec.js.snap +298 -0
- package/src/components/__tests__/__snapshots__/Tasks.spec.js.snap +301 -0
- package/src/components/__tests__/__snapshots__/TasksRoutes.spec.js.snap +448 -0
- package/src/messages/en.js +17 -0
- package/src/messages/es.js +17 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* eslint-disable fp/no-mutation */
|
|
2
|
+
/* eslint-disable fp/no-let */
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { waitFor } from "@testing-library/react";
|
|
5
|
+
import { render } from "@truedat/test/render";
|
|
6
|
+
import userEvent from "@testing-library/user-event";
|
|
7
|
+
import { Tasks } from "../Tasks";
|
|
8
|
+
import { TASKS_QUERY } from "../../api/queries";
|
|
9
|
+
import en from "../../messages/en";
|
|
10
|
+
|
|
11
|
+
const mockHistory = {
|
|
12
|
+
push: jest.fn(),
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
jest.mock("react-router-dom", () => ({
|
|
16
|
+
...jest.requireActual("react-router-dom"),
|
|
17
|
+
useHistory: () => mockHistory,
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
const task = {
|
|
21
|
+
__typename: "Task",
|
|
22
|
+
id: "123",
|
|
23
|
+
started_at: "2020-01-01T00:00:00.000Z",
|
|
24
|
+
last_message_at: "2020-01-01T00:01:00.000Z",
|
|
25
|
+
index: "grants",
|
|
26
|
+
status: "processing",
|
|
27
|
+
count: 10000,
|
|
28
|
+
processed: 1000,
|
|
29
|
+
memory_trace: [["2020-01-01T00:01:00.000Z", 100000]],
|
|
30
|
+
elapsed: 10,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const refetchTask = {
|
|
34
|
+
__typename: "Task",
|
|
35
|
+
id: "123",
|
|
36
|
+
started_at: "2020-01-01T00:00:00.000Z",
|
|
37
|
+
last_message_at: "2020-01-01T00:02:00.000Z",
|
|
38
|
+
index: "grants",
|
|
39
|
+
status: "done",
|
|
40
|
+
count: 10000,
|
|
41
|
+
processed: 10000,
|
|
42
|
+
memory_trace: [["2020-01-01T00:01:00.000Z", 100000]],
|
|
43
|
+
elapsed: 20,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
let queryCalled = false;
|
|
47
|
+
const tasksMock = {
|
|
48
|
+
request: { query: TASKS_QUERY },
|
|
49
|
+
newData: () => {
|
|
50
|
+
if (queryCalled) {
|
|
51
|
+
return {
|
|
52
|
+
data: { tasks: [refetchTask] },
|
|
53
|
+
};
|
|
54
|
+
} else {
|
|
55
|
+
queryCalled = true;
|
|
56
|
+
return {
|
|
57
|
+
data: { tasks: [task] },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const renderOpts = {
|
|
63
|
+
messages: { en },
|
|
64
|
+
mocks: [tasksMock],
|
|
65
|
+
};
|
|
66
|
+
const props = {
|
|
67
|
+
reindexAllGrants: jest.fn(),
|
|
68
|
+
reindexAllStructures: jest.fn(),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
describe("<Tasks />", () => {
|
|
72
|
+
it("matches the latest snapshot", async () => {
|
|
73
|
+
queryCalled = false;
|
|
74
|
+
const { container, findByText } = render(<Tasks {...props} />, renderOpts);
|
|
75
|
+
await findByText("processing");
|
|
76
|
+
expect(container).toMatchSnapshot();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("refetches button", async () => {
|
|
80
|
+
queryCalled = false;
|
|
81
|
+
const { container, findByText, findByRole } = render(
|
|
82
|
+
<Tasks {...props} />,
|
|
83
|
+
renderOpts
|
|
84
|
+
);
|
|
85
|
+
await findByText("processing");
|
|
86
|
+
|
|
87
|
+
userEvent.click(await findByRole("button", { name: /Refresh/i }));
|
|
88
|
+
await findByText("done");
|
|
89
|
+
expect(container).toMatchSnapshot();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("triggers Reindex Grants and Structures", async () => {
|
|
93
|
+
queryCalled = false;
|
|
94
|
+
const { findByText, findByRole } = render(<Tasks {...props} />, renderOpts);
|
|
95
|
+
await findByText("processing");
|
|
96
|
+
|
|
97
|
+
userEvent.click(
|
|
98
|
+
await findByRole("button", { name: /Reindex all structures/i })
|
|
99
|
+
);
|
|
100
|
+
await waitFor(() =>
|
|
101
|
+
expect(props.reindexAllStructures).toHaveBeenCalledTimes(1)
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
userEvent.click(
|
|
105
|
+
await findByRole("button", { name: /Reindex all grants/i })
|
|
106
|
+
);
|
|
107
|
+
await waitFor(() =>
|
|
108
|
+
expect(props.reindexAllGrants).toHaveBeenCalledTimes(1)
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("navigates to task detail", async () => {
|
|
113
|
+
queryCalled = false;
|
|
114
|
+
const { findByText } = render(<Tasks {...props} />, renderOpts);
|
|
115
|
+
await findByText("processing");
|
|
116
|
+
|
|
117
|
+
userEvent.click(await findByText(/processing/i));
|
|
118
|
+
expect(mockHistory.push.mock.calls[0][0]).toBe("/tasks/123");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render } from "@truedat/test/render";
|
|
3
|
+
import TasksRoutes from "../TasksRoutes";
|
|
4
|
+
import { TASK_QUERY, TASKS_QUERY } from "../../api/queries";
|
|
5
|
+
import en from "../../messages/en";
|
|
6
|
+
|
|
7
|
+
jest.mock("@truedat/core/hooks", () => ({
|
|
8
|
+
useAuthorized: jest.fn(() => true),
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
const task = {
|
|
12
|
+
__typename: "Task",
|
|
13
|
+
id: "123",
|
|
14
|
+
started_at: "2020-01-01T00:00:00.000Z",
|
|
15
|
+
last_message_at: "2020-01-01T00:01:00.000Z",
|
|
16
|
+
index: "grants",
|
|
17
|
+
status: "processing",
|
|
18
|
+
count: 10000,
|
|
19
|
+
processed: 1000,
|
|
20
|
+
memory_trace: [["2020-01-01T00:01:00.000Z", 100000]],
|
|
21
|
+
elapsed: 10,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const tasksMock = {
|
|
25
|
+
request: { query: TASKS_QUERY },
|
|
26
|
+
result: { data: { tasks: [task] } },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const taskMock = {
|
|
30
|
+
request: { query: TASK_QUERY, variables: { id: "123" } },
|
|
31
|
+
result: { data: { task } },
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
describe("<TasksRoutes />", () => {
|
|
35
|
+
it("matches the latest snapshot (list route)", async () => {
|
|
36
|
+
const renderOpts = {
|
|
37
|
+
messages: { en },
|
|
38
|
+
routes: ["/tasks"],
|
|
39
|
+
mocks: [tasksMock],
|
|
40
|
+
};
|
|
41
|
+
const { container, findByText } = render(<TasksRoutes />, renderOpts);
|
|
42
|
+
await findByText("processing");
|
|
43
|
+
expect(container).toMatchSnapshot();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("matches the latest snapshot (view route)", async () => {
|
|
47
|
+
const renderOpts = {
|
|
48
|
+
messages: { en },
|
|
49
|
+
routes: ["/tasks/123"],
|
|
50
|
+
mocks: [taskMock],
|
|
51
|
+
};
|
|
52
|
+
const { container, findByText } = render(<TasksRoutes />, renderOpts);
|
|
53
|
+
await findByText("processing");
|
|
54
|
+
expect(container).toMatchSnapshot();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`<Task /> matches the latest snapshot 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<div
|
|
6
|
+
class="ui breadcrumb"
|
|
7
|
+
>
|
|
8
|
+
<a
|
|
9
|
+
class="section"
|
|
10
|
+
href="/tasks"
|
|
11
|
+
>
|
|
12
|
+
Tasks
|
|
13
|
+
</a>
|
|
14
|
+
<i
|
|
15
|
+
aria-hidden="true"
|
|
16
|
+
class="right angle icon divider"
|
|
17
|
+
/>
|
|
18
|
+
<div
|
|
19
|
+
class="active section"
|
|
20
|
+
>
|
|
21
|
+
grants
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
<div
|
|
25
|
+
class="ui segment"
|
|
26
|
+
>
|
|
27
|
+
<h2
|
|
28
|
+
class="ui header"
|
|
29
|
+
>
|
|
30
|
+
<i
|
|
31
|
+
aria-hidden="true"
|
|
32
|
+
class="check circular icon"
|
|
33
|
+
/>
|
|
34
|
+
<div
|
|
35
|
+
class="content"
|
|
36
|
+
>
|
|
37
|
+
Task details
|
|
38
|
+
<div
|
|
39
|
+
class="sub header"
|
|
40
|
+
>
|
|
41
|
+
Background reindex task
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</h2>
|
|
45
|
+
<div
|
|
46
|
+
class="ui basic segment"
|
|
47
|
+
>
|
|
48
|
+
<button
|
|
49
|
+
class="ui primary button"
|
|
50
|
+
>
|
|
51
|
+
Refresh
|
|
52
|
+
</button>
|
|
53
|
+
</div>
|
|
54
|
+
<div
|
|
55
|
+
class="dimmable"
|
|
56
|
+
>
|
|
57
|
+
<div
|
|
58
|
+
class="ui inverted dimmer"
|
|
59
|
+
style=""
|
|
60
|
+
>
|
|
61
|
+
<div
|
|
62
|
+
class="content"
|
|
63
|
+
>
|
|
64
|
+
<div
|
|
65
|
+
class="ui loader"
|
|
66
|
+
/>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div
|
|
70
|
+
class="ui divided four column grid"
|
|
71
|
+
>
|
|
72
|
+
<div
|
|
73
|
+
class="row"
|
|
74
|
+
>
|
|
75
|
+
<div
|
|
76
|
+
class="three wide column"
|
|
77
|
+
>
|
|
78
|
+
<div
|
|
79
|
+
class="item"
|
|
80
|
+
>
|
|
81
|
+
<div
|
|
82
|
+
class="content"
|
|
83
|
+
>
|
|
84
|
+
<h5
|
|
85
|
+
class="header"
|
|
86
|
+
>
|
|
87
|
+
Index
|
|
88
|
+
</h5>
|
|
89
|
+
<div
|
|
90
|
+
class="description"
|
|
91
|
+
>
|
|
92
|
+
grants
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div
|
|
98
|
+
class="three wide column"
|
|
99
|
+
>
|
|
100
|
+
<div
|
|
101
|
+
class="item"
|
|
102
|
+
>
|
|
103
|
+
<div
|
|
104
|
+
class="content"
|
|
105
|
+
>
|
|
106
|
+
<h5
|
|
107
|
+
class="header"
|
|
108
|
+
>
|
|
109
|
+
Status
|
|
110
|
+
</h5>
|
|
111
|
+
<div
|
|
112
|
+
class="description"
|
|
113
|
+
>
|
|
114
|
+
processing
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
<div
|
|
120
|
+
class="three wide column"
|
|
121
|
+
>
|
|
122
|
+
<div
|
|
123
|
+
class="item"
|
|
124
|
+
>
|
|
125
|
+
<div
|
|
126
|
+
class="content"
|
|
127
|
+
>
|
|
128
|
+
<h5
|
|
129
|
+
class="header"
|
|
130
|
+
>
|
|
131
|
+
Started at
|
|
132
|
+
</h5>
|
|
133
|
+
<div
|
|
134
|
+
class="description"
|
|
135
|
+
>
|
|
136
|
+
<time
|
|
137
|
+
datetime="1577836800000"
|
|
138
|
+
>
|
|
139
|
+
2020-01-01 00:00
|
|
140
|
+
</time>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div
|
|
146
|
+
class="three wide column"
|
|
147
|
+
>
|
|
148
|
+
<div
|
|
149
|
+
class="item"
|
|
150
|
+
>
|
|
151
|
+
<div
|
|
152
|
+
class="content"
|
|
153
|
+
>
|
|
154
|
+
<h5
|
|
155
|
+
class="header"
|
|
156
|
+
>
|
|
157
|
+
Last message at
|
|
158
|
+
</h5>
|
|
159
|
+
<div
|
|
160
|
+
class="description"
|
|
161
|
+
>
|
|
162
|
+
<time
|
|
163
|
+
datetime="1577836860000"
|
|
164
|
+
>
|
|
165
|
+
2020-01-01 00:01
|
|
166
|
+
</time>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
<div
|
|
172
|
+
class="three wide column"
|
|
173
|
+
>
|
|
174
|
+
<div
|
|
175
|
+
class="item"
|
|
176
|
+
>
|
|
177
|
+
<div
|
|
178
|
+
class="content"
|
|
179
|
+
>
|
|
180
|
+
<h5
|
|
181
|
+
class="header"
|
|
182
|
+
>
|
|
183
|
+
Elapsed time
|
|
184
|
+
</h5>
|
|
185
|
+
<div
|
|
186
|
+
class="description"
|
|
187
|
+
>
|
|
188
|
+
0.01s
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
<div
|
|
196
|
+
class="ui divider"
|
|
197
|
+
/>
|
|
198
|
+
<div
|
|
199
|
+
class="ui progress"
|
|
200
|
+
data-percent="10"
|
|
201
|
+
>
|
|
202
|
+
<div
|
|
203
|
+
class="bar"
|
|
204
|
+
style="width: 10%;"
|
|
205
|
+
>
|
|
206
|
+
<div
|
|
207
|
+
class="progress"
|
|
208
|
+
>
|
|
209
|
+
10%
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
<div
|
|
213
|
+
class="label"
|
|
214
|
+
>
|
|
215
|
+
Progress
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
<div
|
|
219
|
+
class="ui divider"
|
|
220
|
+
/>
|
|
221
|
+
<div
|
|
222
|
+
class="ui divided four column grid"
|
|
223
|
+
>
|
|
224
|
+
<div
|
|
225
|
+
class="row"
|
|
226
|
+
>
|
|
227
|
+
<div
|
|
228
|
+
class="three wide column"
|
|
229
|
+
>
|
|
230
|
+
<div
|
|
231
|
+
class="item"
|
|
232
|
+
>
|
|
233
|
+
<div
|
|
234
|
+
class="content"
|
|
235
|
+
>
|
|
236
|
+
<h5
|
|
237
|
+
class="header"
|
|
238
|
+
>
|
|
239
|
+
Max memory usage
|
|
240
|
+
</h5>
|
|
241
|
+
<div
|
|
242
|
+
class="description"
|
|
243
|
+
>
|
|
244
|
+
0MB
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
<div
|
|
250
|
+
class="three wide column"
|
|
251
|
+
>
|
|
252
|
+
<div
|
|
253
|
+
class="item"
|
|
254
|
+
>
|
|
255
|
+
<div
|
|
256
|
+
class="content"
|
|
257
|
+
>
|
|
258
|
+
<h5
|
|
259
|
+
class="header"
|
|
260
|
+
>
|
|
261
|
+
Min memory usage
|
|
262
|
+
</h5>
|
|
263
|
+
<div
|
|
264
|
+
class="description"
|
|
265
|
+
>
|
|
266
|
+
0MB
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
<div
|
|
272
|
+
class="three wide column"
|
|
273
|
+
>
|
|
274
|
+
<div
|
|
275
|
+
class="item"
|
|
276
|
+
>
|
|
277
|
+
<div
|
|
278
|
+
class="content"
|
|
279
|
+
>
|
|
280
|
+
<h5
|
|
281
|
+
class="header"
|
|
282
|
+
>
|
|
283
|
+
Last memory usage
|
|
284
|
+
</h5>
|
|
285
|
+
<div
|
|
286
|
+
class="description"
|
|
287
|
+
>
|
|
288
|
+
0MB
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
`;
|