@truedat/dd 8.11.0 → 8.11.2
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/package.json +3 -3
- package/src/api/queries.js +4 -0
- package/src/components/GrantRequest.js +74 -8
- package/src/components/GrantRequestCancel.js +3 -0
- package/src/components/GrantRequestHeader.js +45 -14
- package/src/components/GrantRequestsDownloadButton.js +9 -1
- package/src/components/GrantRequestsTable.js +4 -1
- package/src/components/StructureGrantCartCheckout.js +9 -4
- package/src/components/StructureGrantCartUserSelector.js +19 -4
- package/src/components/StructureGrantDropdown.js +29 -3
- package/src/components/StructureGrantListButton.js +3 -1
- package/src/components/StructureGrantSummaryButton.js +8 -4
- package/src/components/__tests__/GrantRequest.spec.js +437 -0
- package/src/components/__tests__/GrantRequestHeader.spec.js +89 -2
- package/src/components/__tests__/GrantRequestsDownloadButton.spec.js +52 -0
- package/src/components/__tests__/GrantRequestsTable.spec.js +18 -0
- package/src/components/__tests__/StructureGrantCartCheckout.spec.js +41 -0
- package/src/components/__tests__/StructureGrantCartUserSelector.spec.js +105 -0
- package/src/components/__tests__/StructureGrantDropdown.spec.js +126 -0
- package/src/components/__tests__/StructureGrantListButton.spec.js +36 -1
- package/src/components/__tests__/StructureGrantSummaryButton.spec.js +89 -1
- package/src/components/__tests__/__snapshots__/GrantRequest.spec.js.snap +28 -0
- package/src/components/__tests__/__snapshots__/GrantRequestHeader.spec.js.snap +5 -0
- package/src/messages/en.js +5 -0
- package/src/messages/es.js +5 -0
- package/src/reducers/__tests__/grantRequestsCart.spec.js +12 -0
- package/src/reducers/grantRequestsCart.js +12 -0
- package/src/sagas/__tests__/createGrantRequestStatus.spec.js +67 -1
- package/src/sagas/__tests__/fetchGrantRequest.spec.js +26 -0
- package/src/sagas/createGrantRequestStatus.js +5 -0
- package/src/sagas/fetchGrantRequest.js +1 -1
- package/src/selectors/__tests__/getGrantRequestsSearchColumns.spec.js +82 -0
- package/src/selectors/getGrantRequestsSearchColumns.js +51 -8
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import userEvent from "@testing-library/user-event";
|
|
1
2
|
import { render, waitForLoad } from "@truedat/test/render";
|
|
2
3
|
import { GrantRequest } from "../GrantRequest";
|
|
4
|
+
import { createGrantRequestStatus, fetchGrantRequest } from "../../routines";
|
|
3
5
|
|
|
4
6
|
describe("<GrantRequest />", () => {
|
|
5
7
|
const grantRequest = {
|
|
@@ -97,4 +99,439 @@ describe("<GrantRequest />", () => {
|
|
|
97
99
|
await waitForLoad(rendered);
|
|
98
100
|
expect(rendered.container).toMatchSnapshot();
|
|
99
101
|
});
|
|
102
|
+
|
|
103
|
+
it("shows user group alias when grant request is for a group", async () => {
|
|
104
|
+
const groupGrantRequest = {
|
|
105
|
+
...grantRequest,
|
|
106
|
+
_embedded: {
|
|
107
|
+
...grantRequest._embedded,
|
|
108
|
+
group: {
|
|
109
|
+
type: "request",
|
|
110
|
+
_embedded: {
|
|
111
|
+
user_group: { id: 10, name: "finance", alias: "Fin" },
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const rendered = render(
|
|
118
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
119
|
+
renderOpts,
|
|
120
|
+
);
|
|
121
|
+
await waitForLoad(rendered);
|
|
122
|
+
expect(rendered.getByText(/fin/i)).toBeInTheDocument();
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("shows user group name when alias is empty", async () => {
|
|
126
|
+
const groupGrantRequest = {
|
|
127
|
+
...grantRequest,
|
|
128
|
+
_embedded: {
|
|
129
|
+
...grantRequest._embedded,
|
|
130
|
+
group: {
|
|
131
|
+
type: "request",
|
|
132
|
+
_embedded: {
|
|
133
|
+
user_group: { id: 11, name: "legal", alias: "" },
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const rendered = render(
|
|
140
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
141
|
+
renderOpts,
|
|
142
|
+
);
|
|
143
|
+
await waitForLoad(rendered);
|
|
144
|
+
expect(rendered.getByText(/legal/i)).toBeInTheDocument();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("shows cancel when current user created the group grant request", async () => {
|
|
148
|
+
const groupGrantRequest = {
|
|
149
|
+
...grantRequest,
|
|
150
|
+
_embedded: {
|
|
151
|
+
...grantRequest._embedded,
|
|
152
|
+
group: {
|
|
153
|
+
created_by_id: 7,
|
|
154
|
+
type: "request",
|
|
155
|
+
_embedded: {
|
|
156
|
+
user_group: { id: 10, name: "finance", alias: "Fin" },
|
|
157
|
+
created_by: { user_name: "ada" },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const rendered = render(
|
|
164
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
165
|
+
{
|
|
166
|
+
...renderOpts,
|
|
167
|
+
state: { authentication: { user_name: "ada" } },
|
|
168
|
+
},
|
|
169
|
+
);
|
|
170
|
+
await waitForLoad(rendered);
|
|
171
|
+
expect(rendered.getByText(/cancel/i)).toBeInTheDocument();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("does not show cancel when current user is a group member and not the creator", async () => {
|
|
175
|
+
const groupGrantRequest = {
|
|
176
|
+
...grantRequest,
|
|
177
|
+
_embedded: {
|
|
178
|
+
...grantRequest._embedded,
|
|
179
|
+
group: {
|
|
180
|
+
created_by_id: 7,
|
|
181
|
+
type: "request",
|
|
182
|
+
_embedded: {
|
|
183
|
+
user_group: { id: 10, name: "finance", alias: "Fin" },
|
|
184
|
+
created_by: { user_name: "ada" },
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const rendered = render(
|
|
191
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
192
|
+
{
|
|
193
|
+
...renderOpts,
|
|
194
|
+
state: { authentication: { user_name: "bob" } },
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
await waitForLoad(rendered);
|
|
198
|
+
expect(rendered.queryByText(/cancel/i)).not.toBeInTheDocument();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("shows cancel when grant request is for a user", async () => {
|
|
202
|
+
const rendered = render(<GrantRequest {...props} />, renderOpts);
|
|
203
|
+
await waitForLoad(rendered);
|
|
204
|
+
expect(rendered.getByText(/cancel/i)).toBeInTheDocument();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("shows accordion with group members when grant request is for a group", async () => {
|
|
208
|
+
const user = userEvent.setup({ delay: null });
|
|
209
|
+
const groupGrantRequest = {
|
|
210
|
+
...grantRequest,
|
|
211
|
+
_embedded: {
|
|
212
|
+
...grantRequest._embedded,
|
|
213
|
+
group: {
|
|
214
|
+
type: "request",
|
|
215
|
+
_embedded: {
|
|
216
|
+
user_group: {
|
|
217
|
+
id: 10,
|
|
218
|
+
name: "finance",
|
|
219
|
+
alias: "Fin",
|
|
220
|
+
users: [
|
|
221
|
+
{ id: 1, user_name: "ada", full_name: "Ada Lovelace" },
|
|
222
|
+
{ id: 2, user_name: "bob", full_name: "Bob Smith" },
|
|
223
|
+
],
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const rendered = render(
|
|
231
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
232
|
+
renderOpts,
|
|
233
|
+
);
|
|
234
|
+
await waitForLoad(rendered);
|
|
235
|
+
|
|
236
|
+
const item = rendered.getByText(/fin/i).closest(".item");
|
|
237
|
+
expect(item.querySelector(".angle.right.icon")).toBeInTheDocument();
|
|
238
|
+
await user.click(item.querySelector(".angle.right.icon"));
|
|
239
|
+
expect(item.querySelector(".angle.down.icon")).toBeInTheDocument();
|
|
240
|
+
expect(rendered.getByText(/ada lovelace/i)).toBeInTheDocument();
|
|
241
|
+
expect(rendered.getByText(/bob smith/i)).toBeInTheDocument();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("shows accordion when grant request is for a group with no members", async () => {
|
|
245
|
+
const user = userEvent.setup({ delay: null });
|
|
246
|
+
const groupGrantRequest = {
|
|
247
|
+
...grantRequest,
|
|
248
|
+
_embedded: {
|
|
249
|
+
...grantRequest._embedded,
|
|
250
|
+
group: {
|
|
251
|
+
type: "request",
|
|
252
|
+
_embedded: {
|
|
253
|
+
user_group: { id: 11, name: "legal", alias: "", users: [] },
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const rendered = render(
|
|
260
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
261
|
+
renderOpts,
|
|
262
|
+
);
|
|
263
|
+
await waitForLoad(rendered);
|
|
264
|
+
|
|
265
|
+
const item = rendered.getByText(/legal/i).closest(".item");
|
|
266
|
+
expect(item.querySelector(".angle.right.icon")).toBeInTheDocument();
|
|
267
|
+
await user.click(item.querySelector(".angle.right.icon"));
|
|
268
|
+
expect(item.querySelector(".angle.down.icon")).toBeInTheDocument();
|
|
269
|
+
expect(rendered.queryByText(/ada/i)).not.toBeInTheDocument();
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it("does not show accordion when grant request is for a user", async () => {
|
|
273
|
+
const rendered = render(<GrantRequest {...props} />, renderOpts);
|
|
274
|
+
await waitForLoad(rendered);
|
|
275
|
+
|
|
276
|
+
expect(
|
|
277
|
+
rendered.container.querySelector(".angle.right.icon:not(.divider)"),
|
|
278
|
+
).not.toBeInTheDocument();
|
|
279
|
+
expect(
|
|
280
|
+
rendered.container.querySelector(".angle.down.icon"),
|
|
281
|
+
).not.toBeInTheDocument();
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it("cancelling from the detail refetches the grant request", async () => {
|
|
285
|
+
const user = userEvent.setup({ delay: null });
|
|
286
|
+
const dispatch = jest.fn();
|
|
287
|
+
const rendered = render(<GrantRequest {...props} />, {
|
|
288
|
+
...renderOpts,
|
|
289
|
+
dispatch,
|
|
290
|
+
});
|
|
291
|
+
await waitForLoad(rendered);
|
|
292
|
+
|
|
293
|
+
await user.click(rendered.getByText(/cancel_grant_request/i));
|
|
294
|
+
await user.click(
|
|
295
|
+
rendered.getByRole("button", { name: /modal-affirmative-action/i }),
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
const cancelAction = dispatch.mock.calls.find(
|
|
299
|
+
([action]) => action.type === createGrantRequestStatus().type,
|
|
300
|
+
);
|
|
301
|
+
const { onSuccess } = cancelAction[0].payload;
|
|
302
|
+
onSuccess();
|
|
303
|
+
expect(dispatch).toHaveBeenLastCalledWith({
|
|
304
|
+
...fetchGrantRequest(),
|
|
305
|
+
payload: { id: grantRequest.id },
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it("shows a single translated full name column in the group members accordion", async () => {
|
|
310
|
+
const user = userEvent.setup({ delay: null });
|
|
311
|
+
const groupGrantRequest = {
|
|
312
|
+
...grantRequest,
|
|
313
|
+
_embedded: {
|
|
314
|
+
...grantRequest._embedded,
|
|
315
|
+
group: {
|
|
316
|
+
type: "request",
|
|
317
|
+
_embedded: {
|
|
318
|
+
user_group: {
|
|
319
|
+
id: 10,
|
|
320
|
+
name: "finance",
|
|
321
|
+
alias: "Fin",
|
|
322
|
+
users: [
|
|
323
|
+
{ id: 1, user_name: "foo", full_name: "foo user" },
|
|
324
|
+
{ id: 2, user_name: "bar", full_name: "bar user" },
|
|
325
|
+
],
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const rendered = render(
|
|
333
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
334
|
+
{
|
|
335
|
+
...renderOpts,
|
|
336
|
+
messages: {
|
|
337
|
+
en: {
|
|
338
|
+
"grantRequests.props.user_full_name": "User",
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
);
|
|
343
|
+
await waitForLoad(rendered);
|
|
344
|
+
|
|
345
|
+
const item = rendered.getByText(/fin/i).closest(".item");
|
|
346
|
+
await user.click(item.querySelector(".angle.right.icon"));
|
|
347
|
+
const membersTable = item.querySelector("table");
|
|
348
|
+
expect(membersTable).toBeInTheDocument();
|
|
349
|
+
expect(rendered.queryByText(/^user_name$/i)).not.toBeInTheDocument();
|
|
350
|
+
expect(rendered.queryByText(/^full_name$/i)).not.toBeInTheDocument();
|
|
351
|
+
expect(rendered.getByText(/^user$/i)).toBeInTheDocument();
|
|
352
|
+
expect(rendered.getByText(/foo user/i)).toBeInTheDocument();
|
|
353
|
+
expect(rendered.getByText(/bar user/i)).toBeInTheDocument();
|
|
354
|
+
expect(membersTable.querySelectorAll("th")).toHaveLength(1);
|
|
355
|
+
expect(membersTable.querySelectorAll("td")).toHaveLength(2);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it("shows a compact collapsing small members table in the group accordion", async () => {
|
|
359
|
+
const user = userEvent.setup({ delay: null });
|
|
360
|
+
const groupGrantRequest = {
|
|
361
|
+
...grantRequest,
|
|
362
|
+
_embedded: {
|
|
363
|
+
...grantRequest._embedded,
|
|
364
|
+
group: {
|
|
365
|
+
type: "request",
|
|
366
|
+
_embedded: {
|
|
367
|
+
user_group: {
|
|
368
|
+
id: 10,
|
|
369
|
+
name: "finance",
|
|
370
|
+
alias: "Fin",
|
|
371
|
+
users: [{ id: 1, user_name: "foo", full_name: "foo user" }],
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
const rendered = render(
|
|
379
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
380
|
+
renderOpts,
|
|
381
|
+
);
|
|
382
|
+
await waitForLoad(rendered);
|
|
383
|
+
|
|
384
|
+
const item = rendered.getByText(/fin/i).closest(".item");
|
|
385
|
+
await user.click(item.querySelector(".angle.right.icon"));
|
|
386
|
+
const membersTable = item.querySelector("table");
|
|
387
|
+
expect(membersTable).toBeInTheDocument();
|
|
388
|
+
expect(membersTable).toHaveClass("compact");
|
|
389
|
+
expect(membersTable).toHaveClass("collapsing");
|
|
390
|
+
expect(membersTable).toHaveClass("small");
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it("shows User as the beneficiary field title for a user grant request", async () => {
|
|
394
|
+
const userGrantRequest = {
|
|
395
|
+
...grantRequest,
|
|
396
|
+
_embedded: {
|
|
397
|
+
...grantRequest._embedded,
|
|
398
|
+
group: {
|
|
399
|
+
type: "request",
|
|
400
|
+
_embedded: {
|
|
401
|
+
user: { user_name: "foo user" },
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
const rendered = render(
|
|
408
|
+
<GrantRequest {...{ ...props, grantRequest: userGrantRequest }} />,
|
|
409
|
+
{
|
|
410
|
+
...renderOpts,
|
|
411
|
+
messages: {
|
|
412
|
+
en: {
|
|
413
|
+
"grantRequest.header.user": "User",
|
|
414
|
+
"grantRequest.header.group": "User group",
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
);
|
|
419
|
+
await waitForLoad(rendered);
|
|
420
|
+
|
|
421
|
+
const item = rendered.getByText(/^foo user$/i).closest(".item");
|
|
422
|
+
expect(item.querySelector(".header")).toHaveTextContent(/^user$/i);
|
|
423
|
+
expect(item.querySelector(".header")).not.toHaveTextContent(/user group/i);
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
it("shows User group as the beneficiary field title for a group grant request", async () => {
|
|
427
|
+
const groupGrantRequest = {
|
|
428
|
+
...grantRequest,
|
|
429
|
+
_embedded: {
|
|
430
|
+
...grantRequest._embedded,
|
|
431
|
+
group: {
|
|
432
|
+
type: "request",
|
|
433
|
+
_embedded: {
|
|
434
|
+
user_group: {
|
|
435
|
+
id: 10,
|
|
436
|
+
name: "finance",
|
|
437
|
+
alias: "Fin",
|
|
438
|
+
users: [{ id: 1, user_name: "foo", full_name: "foo user" }],
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
const rendered = render(
|
|
446
|
+
<GrantRequest {...{ ...props, grantRequest: groupGrantRequest }} />,
|
|
447
|
+
{
|
|
448
|
+
...renderOpts,
|
|
449
|
+
messages: {
|
|
450
|
+
en: {
|
|
451
|
+
"grantRequest.header.user": "User/group",
|
|
452
|
+
"grantRequest.header.group": "User group",
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
},
|
|
456
|
+
);
|
|
457
|
+
await waitForLoad(rendered);
|
|
458
|
+
|
|
459
|
+
const item = rendered.getByText(/fin/i).closest(".item");
|
|
460
|
+
expect(item.querySelector(".header")).toHaveTextContent(/^user group$/i);
|
|
461
|
+
expect(item.querySelector(".header")).not.toHaveTextContent(/user\/group/i);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
it("shows Deleted user when the beneficiary user is missing", async () => {
|
|
465
|
+
const deletedUserGrantRequest = {
|
|
466
|
+
...grantRequest,
|
|
467
|
+
_embedded: {
|
|
468
|
+
...grantRequest._embedded,
|
|
469
|
+
group: {
|
|
470
|
+
type: "request",
|
|
471
|
+
_embedded: {},
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
const rendered = render(
|
|
477
|
+
<GrantRequest {...{ ...props, grantRequest: deletedUserGrantRequest }} />,
|
|
478
|
+
{
|
|
479
|
+
...renderOpts,
|
|
480
|
+
messages: {
|
|
481
|
+
en: {
|
|
482
|
+
"grantRequest.header.user": "User",
|
|
483
|
+
"grantRequest.header.group": "User group",
|
|
484
|
+
"grantRequest.deleted.user": "Deleted user",
|
|
485
|
+
"grantRequest.deleted.group": "Deleted group",
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
);
|
|
490
|
+
await waitForLoad(rendered);
|
|
491
|
+
|
|
492
|
+
const item = rendered.getByText(/^deleted user$/i).closest(".item");
|
|
493
|
+
expect(item.querySelector(".header")).toHaveTextContent(/^user$/i);
|
|
494
|
+
expect(item.querySelector(".header")).not.toHaveTextContent(/user group/i);
|
|
495
|
+
expect(item.querySelector(".angle.right.icon")).not.toBeInTheDocument();
|
|
496
|
+
expect(item.querySelector(".angle.down.icon")).not.toBeInTheDocument();
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
it("shows Deleted group without accordion when the beneficiary group is missing", async () => {
|
|
500
|
+
const deletedGroupGrantRequest = {
|
|
501
|
+
...grantRequest,
|
|
502
|
+
_embedded: {
|
|
503
|
+
...grantRequest._embedded,
|
|
504
|
+
group: {
|
|
505
|
+
type: "request",
|
|
506
|
+
user_group_id: 10,
|
|
507
|
+
_embedded: {},
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
const rendered = render(
|
|
513
|
+
<GrantRequest
|
|
514
|
+
{...{ ...props, grantRequest: deletedGroupGrantRequest }}
|
|
515
|
+
/>,
|
|
516
|
+
{
|
|
517
|
+
...renderOpts,
|
|
518
|
+
messages: {
|
|
519
|
+
en: {
|
|
520
|
+
"grantRequest.header.user": "User",
|
|
521
|
+
"grantRequest.header.group": "User group",
|
|
522
|
+
"grantRequest.deleted.user": "Deleted user",
|
|
523
|
+
"grantRequest.deleted.group": "Deleted group",
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
);
|
|
528
|
+
await waitForLoad(rendered);
|
|
529
|
+
|
|
530
|
+
const item = rendered.getByText(/^deleted group$/i).closest(".item");
|
|
531
|
+
expect(item.querySelector(".header")).toHaveTextContent(/^user group$/i);
|
|
532
|
+
expect(item.querySelector(".header")).not.toHaveTextContent(/^user$/i);
|
|
533
|
+
expect(item.querySelector(".angle.right.icon")).not.toBeInTheDocument();
|
|
534
|
+
expect(item.querySelector(".angle.down.icon")).not.toBeInTheDocument();
|
|
535
|
+
expect(item.querySelector("table")).not.toBeInTheDocument();
|
|
536
|
+
});
|
|
100
537
|
});
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Suspense } from "react";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
2
|
+
import userEvent from "@testing-library/user-event";
|
|
3
|
+
import { render, waitForLoad } from "@truedat/test/render";
|
|
4
|
+
import ConnectedGrantRequestHeader, {
|
|
5
|
+
GrantRequestHeader,
|
|
6
|
+
} from "../GrantRequestHeader";
|
|
7
|
+
import { createGrantRequestStatus, fetchGrantRequest } from "../../routines";
|
|
4
8
|
import en from "../../messages/en";
|
|
5
9
|
|
|
6
10
|
describe("<GrantRequestHeader />", () => {
|
|
@@ -31,4 +35,87 @@ describe("<GrantRequestHeader />", () => {
|
|
|
31
35
|
);
|
|
32
36
|
expect(container).toMatchSnapshot();
|
|
33
37
|
});
|
|
38
|
+
|
|
39
|
+
it("cancelling refetches the grant request", async () => {
|
|
40
|
+
const user = userEvent.setup({ delay: null });
|
|
41
|
+
const dispatch = jest.fn();
|
|
42
|
+
const grantRequest = {
|
|
43
|
+
id: 8,
|
|
44
|
+
status: "pending",
|
|
45
|
+
_embedded: { data_structure: { id: 3 } },
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const rendered = render(<ConnectedGrantRequestHeader />, {
|
|
49
|
+
...renderOpts,
|
|
50
|
+
state: { grantRequest },
|
|
51
|
+
dispatch,
|
|
52
|
+
});
|
|
53
|
+
await waitForLoad(rendered);
|
|
54
|
+
|
|
55
|
+
await user.click(rendered.getByText(/cancel request/i));
|
|
56
|
+
await user.click(
|
|
57
|
+
rendered.getByRole("button", { name: /modal-affirmative-action/i }),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const cancelAction = dispatch.mock.calls.find(
|
|
61
|
+
([action]) => action.type === createGrantRequestStatus().type,
|
|
62
|
+
);
|
|
63
|
+
const { onSuccess } = cancelAction[0].payload;
|
|
64
|
+
expect(onSuccess).toBeDefined();
|
|
65
|
+
onSuccess();
|
|
66
|
+
expect(dispatch).toHaveBeenLastCalledWith({
|
|
67
|
+
...fetchGrantRequest(),
|
|
68
|
+
payload: { id: grantRequest.id },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("shows cancel button when status is pending", async () => {
|
|
73
|
+
const grantRequest = { status: "pending" };
|
|
74
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
75
|
+
await waitForLoad(rendered);
|
|
76
|
+
expect(rendered.getByText(/cancel_grant_request/i)).toBeInTheDocument();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("shows cancel button when status is approved", async () => {
|
|
80
|
+
const grantRequest = { status: "approved" };
|
|
81
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
82
|
+
await waitForLoad(rendered);
|
|
83
|
+
expect(rendered.getByText(/cancel_grant_request/i)).toBeInTheDocument();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("does not show cancel button when status is rejected", async () => {
|
|
87
|
+
const grantRequest = { status: "rejected" };
|
|
88
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
89
|
+
await waitForLoad(rendered);
|
|
90
|
+
expect(
|
|
91
|
+
rendered.queryByText(/cancel_grant_request/i),
|
|
92
|
+
).not.toBeInTheDocument();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("does not show cancel button when status is processing", async () => {
|
|
96
|
+
const grantRequest = { status: "processing" };
|
|
97
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
98
|
+
await waitForLoad(rendered);
|
|
99
|
+
expect(
|
|
100
|
+
rendered.queryByText(/cancel_grant_request/i),
|
|
101
|
+
).not.toBeInTheDocument();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("does not show cancel button when status is cancelled", async () => {
|
|
105
|
+
const grantRequest = { status: "cancelled" };
|
|
106
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
107
|
+
await waitForLoad(rendered);
|
|
108
|
+
expect(
|
|
109
|
+
rendered.queryByText(/cancel_grant_request/i),
|
|
110
|
+
).not.toBeInTheDocument();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("does not show cancel button when status is failed", async () => {
|
|
114
|
+
const grantRequest = { status: "failed" };
|
|
115
|
+
const rendered = render(<GrantRequestHeader grantRequest={grantRequest} />);
|
|
116
|
+
await waitForLoad(rendered);
|
|
117
|
+
expect(
|
|
118
|
+
rendered.queryByText(/cancel_grant_request/i),
|
|
119
|
+
).not.toBeInTheDocument();
|
|
120
|
+
});
|
|
34
121
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { render, waitForLoad } from "@truedat/test/render";
|
|
2
|
+
import userEvent from "@testing-library/user-event";
|
|
2
3
|
import { screen } from "@testing-library/react";
|
|
3
4
|
import SearchContext from "@truedat/core/search/SearchContext";
|
|
4
5
|
import { GrantRequestsDownloadButton } from "../GrantRequestsDownloadButton";
|
|
@@ -195,4 +196,55 @@ describe("<GrantRequestsDownloadButton />", () => {
|
|
|
195
196
|
}),
|
|
196
197
|
);
|
|
197
198
|
});
|
|
199
|
+
|
|
200
|
+
it("sends User / Group in header_labels for user_full_name", async () => {
|
|
201
|
+
const triggerMock = jest.fn();
|
|
202
|
+
const grantRequestHook = require("@truedat/dd/hooks/useGrantRequest");
|
|
203
|
+
grantRequestHook.useGrantRequestsDownload.mockReturnValue({
|
|
204
|
+
trigger: triggerMock,
|
|
205
|
+
isMutating: false,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const props = {
|
|
209
|
+
hasFilterApplied: true,
|
|
210
|
+
searchBy: "approve",
|
|
211
|
+
setDownloading: jest.fn(),
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const rendered = render(
|
|
215
|
+
<SearchContext value={buildSearchContext({ status: ["pending"] })}>
|
|
216
|
+
<GrantRequestsDownloadButton {...props} />
|
|
217
|
+
</SearchContext>,
|
|
218
|
+
{
|
|
219
|
+
messages: {
|
|
220
|
+
en: {
|
|
221
|
+
"grantRequest.actions.download.tooltip": "Descargar / Download",
|
|
222
|
+
"grantRequest.actions.download.popup":
|
|
223
|
+
"Search or apply a filter to download grant requests",
|
|
224
|
+
"grantRequests.props.current_status": "Status",
|
|
225
|
+
"grantRequests.props.user_full_name": "User/group",
|
|
226
|
+
"grantRequests.props.user_or_group": "User / Group",
|
|
227
|
+
"grantRequests.props.created_by_full_name": "Created by",
|
|
228
|
+
"grantRequests.props.structure_external_id": "Structure",
|
|
229
|
+
"grantRequests.props.domains": "Domains",
|
|
230
|
+
"grantRequests.props.system_name": "System",
|
|
231
|
+
"grantRequests.props.structure_path": "Path",
|
|
232
|
+
"grantRequests.props.request_type": "Request type",
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
await waitForLoad(rendered);
|
|
239
|
+
const user = userEvent.setup({ delay: null });
|
|
240
|
+
await user.click(await rendered.findByRole("button"));
|
|
241
|
+
|
|
242
|
+
expect(triggerMock).toHaveBeenCalledWith(
|
|
243
|
+
expect.objectContaining({
|
|
244
|
+
header_labels: expect.objectContaining({
|
|
245
|
+
user_full_name: "User / Group",
|
|
246
|
+
}),
|
|
247
|
+
}),
|
|
248
|
+
);
|
|
249
|
+
});
|
|
198
250
|
});
|
|
@@ -49,4 +49,22 @@ describe("<GrantRequestsTable />", () => {
|
|
|
49
49
|
);
|
|
50
50
|
expect(container).toMatchSnapshot();
|
|
51
51
|
});
|
|
52
|
+
|
|
53
|
+
it("shows User / Group header for the user column", () => {
|
|
54
|
+
const rendered = render(
|
|
55
|
+
<SearchContext value={searchContext}>
|
|
56
|
+
<GrantRequestsTable {...props} />
|
|
57
|
+
</SearchContext>,
|
|
58
|
+
{
|
|
59
|
+
messages: {
|
|
60
|
+
en: {
|
|
61
|
+
"grantRequest.current_status.pending": "pending",
|
|
62
|
+
"grantRequest.header.user": "User/group",
|
|
63
|
+
"grantRequests.props.user_or_group": "User / Group",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
expect(rendered.getByText(/user \/ group/i)).toBeInTheDocument();
|
|
69
|
+
});
|
|
52
70
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import userEvent from "@testing-library/user-event";
|
|
1
2
|
import { render, waitForLoad } from "@truedat/test/render";
|
|
2
3
|
import { singleTemplateMock, domainsMock } from "@truedat/test/mocks";
|
|
3
4
|
import { StructureGrantCartCheckout } from "../StructureGrantCartCheckout";
|
|
@@ -397,4 +398,44 @@ describe("StructureGrantCartCheckout", () => {
|
|
|
397
398
|
});
|
|
398
399
|
expect(mockInitGroupTemplates).not.toHaveBeenCalled();
|
|
399
400
|
});
|
|
401
|
+
|
|
402
|
+
it("sends user_group_id and not user_id on single checkout", async () => {
|
|
403
|
+
const user = userEvent.setup({ delay: null });
|
|
404
|
+
useWebContext.mockReturnValue({ scopesWithRelations: [] });
|
|
405
|
+
useTemplateRelations.mockReturnValue({ resource: [] });
|
|
406
|
+
|
|
407
|
+
const grantRequestsCartUserGroup = {
|
|
408
|
+
template: "some_template",
|
|
409
|
+
templateContent: {},
|
|
410
|
+
modificationGrant: null,
|
|
411
|
+
validCart: true,
|
|
412
|
+
user: { id: null, valid: true },
|
|
413
|
+
user_group_id: 10,
|
|
414
|
+
structures: [
|
|
415
|
+
{
|
|
416
|
+
id: 101,
|
|
417
|
+
system_id: 10,
|
|
418
|
+
system: { id: 10, name: "System A" },
|
|
419
|
+
domain_ids: [1],
|
|
420
|
+
},
|
|
421
|
+
],
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
const props = {
|
|
425
|
+
...defaultProps,
|
|
426
|
+
grantRequestsCart: grantRequestsCartUserGroup,
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
const rendered = render(
|
|
430
|
+
<StructureGrantCartCheckout {...props} />,
|
|
431
|
+
renderOpts,
|
|
432
|
+
);
|
|
433
|
+
await waitForLoad(rendered);
|
|
434
|
+
await user.click(rendered.getByText(/save/i));
|
|
435
|
+
|
|
436
|
+
expect(mockTrigger).toHaveBeenCalled();
|
|
437
|
+
const [{ grant_request_group }] = mockTrigger.mock.calls[0];
|
|
438
|
+
expect(grant_request_group.user_group_id).toBe(10);
|
|
439
|
+
expect(grant_request_group.user_id).toBeUndefined();
|
|
440
|
+
});
|
|
400
441
|
});
|