@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.
@@ -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
+ });
@@ -37,5 +37,9 @@ exports[`<DictionaryRoutes /> matches the latest snapshot 1`] = `
37
37
  path="/profileGroups/:id"
38
38
  render={[Function]}
39
39
  />
40
+ <Route
41
+ path="/tasks"
42
+ render={[Function]}
43
+ />
40
44
  </Fragment>
41
45
  `;
@@ -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
+ `;