@northern.tech/testing 0.1.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.
Files changed (84) hide show
  1. package/dist/baseTestConfig.json +24 -0
  2. package/dist/chunk-3KEPLFEG.js +64 -0
  3. package/dist/chunk-3KEPLFEG.js.map +1 -0
  4. package/dist/chunk-4ZCNCVNV.js +309 -0
  5. package/dist/chunk-4ZCNCVNV.js.map +1 -0
  6. package/dist/chunk-5MREOBVU.js +833 -0
  7. package/dist/chunk-5MREOBVU.js.map +1 -0
  8. package/dist/chunk-A7LWVKMZ.js +209 -0
  9. package/dist/chunk-A7LWVKMZ.js.map +1 -0
  10. package/dist/chunk-ERCKCRE4.js +179 -0
  11. package/dist/chunk-ERCKCRE4.js.map +1 -0
  12. package/dist/chunk-HRGVXWMH.js +17 -0
  13. package/dist/chunk-HRGVXWMH.js.map +1 -0
  14. package/dist/chunk-MH5OGHNU.js +29 -0
  15. package/dist/chunk-MH5OGHNU.js.map +1 -0
  16. package/dist/chunk-QSR5PAZ3.js +207 -0
  17. package/dist/chunk-QSR5PAZ3.js.map +1 -0
  18. package/dist/mockData.cjs +866 -0
  19. package/dist/mockData.cjs.map +1 -0
  20. package/dist/mockData.d.cts +558 -0
  21. package/dist/mockData.d.ts +558 -0
  22. package/dist/mockData.js +45 -0
  23. package/dist/mockData.js.map +1 -0
  24. package/dist/requestHandlers/deploymentHandlers.cjs +955 -0
  25. package/dist/requestHandlers/deploymentHandlers.cjs.map +1 -0
  26. package/dist/requestHandlers/deploymentHandlers.d.cts +5 -0
  27. package/dist/requestHandlers/deploymentHandlers.d.ts +5 -0
  28. package/dist/requestHandlers/deploymentHandlers.js +8 -0
  29. package/dist/requestHandlers/deploymentHandlers.js.map +1 -0
  30. package/dist/requestHandlers/deviceHandlers.cjs +1044 -0
  31. package/dist/requestHandlers/deviceHandlers.cjs.map +1 -0
  32. package/dist/requestHandlers/deviceHandlers.d.cts +20 -0
  33. package/dist/requestHandlers/deviceHandlers.d.ts +20 -0
  34. package/dist/requestHandlers/deviceHandlers.js +12 -0
  35. package/dist/requestHandlers/deviceHandlers.js.map +1 -0
  36. package/dist/requestHandlers/monitorHandlers.cjs +775 -0
  37. package/dist/requestHandlers/monitorHandlers.cjs.map +1 -0
  38. package/dist/requestHandlers/monitorHandlers.d.cts +5 -0
  39. package/dist/requestHandlers/monitorHandlers.d.ts +5 -0
  40. package/dist/requestHandlers/monitorHandlers.js +8 -0
  41. package/dist/requestHandlers/monitorHandlers.js.map +1 -0
  42. package/dist/requestHandlers/organizationHandlers.cjs +968 -0
  43. package/dist/requestHandlers/organizationHandlers.cjs.map +1 -0
  44. package/dist/requestHandlers/organizationHandlers.d.cts +5 -0
  45. package/dist/requestHandlers/organizationHandlers.d.ts +5 -0
  46. package/dist/requestHandlers/organizationHandlers.js +8 -0
  47. package/dist/requestHandlers/organizationHandlers.js.map +1 -0
  48. package/dist/requestHandlers/releaseHandlers.cjs +809 -0
  49. package/dist/requestHandlers/releaseHandlers.cjs.map +1 -0
  50. package/dist/requestHandlers/releaseHandlers.d.cts +5 -0
  51. package/dist/requestHandlers/releaseHandlers.d.ts +5 -0
  52. package/dist/requestHandlers/releaseHandlers.js +8 -0
  53. package/dist/requestHandlers/releaseHandlers.js.map +1 -0
  54. package/dist/requestHandlers/requestHandlers.cjs +1712 -0
  55. package/dist/requestHandlers/requestHandlers.cjs.map +1 -0
  56. package/dist/requestHandlers/requestHandlers.d.cts +5 -0
  57. package/dist/requestHandlers/requestHandlers.d.ts +5 -0
  58. package/dist/requestHandlers/requestHandlers.js +35 -0
  59. package/dist/requestHandlers/requestHandlers.js.map +1 -0
  60. package/dist/requestHandlers/userHandlers.cjs +925 -0
  61. package/dist/requestHandlers/userHandlers.cjs.map +1 -0
  62. package/dist/requestHandlers/userHandlers.d.cts +5 -0
  63. package/dist/requestHandlers/userHandlers.d.ts +5 -0
  64. package/dist/requestHandlers/userHandlers.js +8 -0
  65. package/dist/requestHandlers/userHandlers.js.map +1 -0
  66. package/dist/setupTests.cjs +905 -0
  67. package/dist/setupTests.cjs.map +1 -0
  68. package/dist/setupTests.d.cts +75 -0
  69. package/dist/setupTests.d.ts +75 -0
  70. package/dist/setupTests.js +119 -0
  71. package/dist/setupTests.js.map +1 -0
  72. package/dist/theme/light.cjs +41 -0
  73. package/dist/theme/light.cjs.map +1 -0
  74. package/dist/theme/light.d.cts +12 -0
  75. package/dist/theme/light.d.ts +12 -0
  76. package/dist/theme/light.js +7 -0
  77. package/dist/theme/light.js.map +1 -0
  78. package/dist/utils.cjs +41 -0
  79. package/dist/utils.cjs.map +1 -0
  80. package/dist/utils.d.cts +3 -0
  81. package/dist/utils.d.ts +3 -0
  82. package/dist/utils.js +16 -0
  83. package/dist/utils.js.map +1 -0
  84. package/package.json +55 -0
@@ -0,0 +1,905 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/setupTests.tsx
32
+ var setupTests_exports = {};
33
+ __export(setupTests_exports, {
34
+ TEST_LOCATION: () => TEST_LOCATION,
35
+ afterAll: () => afterAll,
36
+ afterEach: () => afterEach,
37
+ beforeAll: () => beforeAll,
38
+ mockAbortController: () => mockAbortController,
39
+ render: () => customRender
40
+ });
41
+ module.exports = __toCommonJS(setupTests_exports);
42
+ var import_react = __toESM(require("react"), 1);
43
+ var import_react_redux = require("react-redux");
44
+ var import_react_router_dom = require("react-router-dom");
45
+ var import_jest = require("@emotion/jest");
46
+ var import_styles = require("@mui/material/styles");
47
+ var import_helpers = require("@northern.tech/utils/helpers");
48
+ var import_toolkit = require("@reduxjs/toolkit");
49
+ var import_react2 = require("@testing-library/react");
50
+ var import_vitest = require("vitest");
51
+ var import_worker_threads = require("worker_threads");
52
+
53
+ // src/mockData.ts
54
+ var import_constants = require("@northern.tech/utils/constants");
55
+ var menderEnvironment = {
56
+ features: {
57
+ hasMultitenancy: true
58
+ },
59
+ integrationVersion: "saas-123.34",
60
+ menderVersion: "next",
61
+ metaMenderVersion: "saas-123.34",
62
+ services: {
63
+ deploymentsVersion: "1.2.3",
64
+ deviceauthVersion: null,
65
+ inventoryVersion: null
66
+ }
67
+ };
68
+ var TEST_SESSION_DATETIME = "2019-01-13T13:00:00.000Z";
69
+ var testDate = new Date(TEST_SESSION_DATETIME);
70
+ var mockDate = new Date(testDate.setMilliseconds(testDate.getMilliseconds() + import_constants.maxSessionAge));
71
+ var defaultCreationDate = "2019-01-13T06:25:00.000Z";
72
+ var defaultMacAddress = "dc:a6:32:12:ad:bf";
73
+ var permissionSetObjectTypes = {
74
+ any: "Any",
75
+ artifacts: "Artifacts",
76
+ empty: "",
77
+ groups: "Device groups",
78
+ releases: "Releases",
79
+ tenantManagement: "Tenant management",
80
+ userManagement: "User management"
81
+ };
82
+ var commonEndpoints = {
83
+ artifacts: "^/api/management/v1/deployments/artifacts",
84
+ artifactDetails: "^/api/management/v1/deployments/artifacts/[^/]+",
85
+ deviceManagement: "^/api/management/(v[1-9])/(devauth|inventory)/"
86
+ };
87
+ var token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjZTNkMGY4Yy1hZWRlLTQwMzAtYjM5MS03ZDUwMjBlYjg3M2UiLCJzdWIiOiJhMzBhNzgwYi1iODQzLTUzNDQtODBlMy0wZmQ5NWE0ZjZmYzMiLCJleHAiOjE2MDY4MTUzNjksImlhdCI6MTYwNjIxMDU2OSwibWVuZGVyLnRlbmFudCI6IjVmODVjMTdiY2U2MmI3ZmE3ZjVmNzA0MCIsIm1lbmRlci51c2VyIjp0cnVlLCJpc3MiOiJNZW5kZXIgVXNlcnMiLCJzY3AiOiJtZW5kZXIuKiIsIm1lbmRlci5wbGFuIjoicHJvZmVzc2lvbmFsIiwibmJmIjoxNjA2MjEwNTY5fQ.qVgYdCzLTf8OdK9uUctqqaY_HWkIiwpekuGvuGQAXCEgOv4bRNDlZRN_ZRSbxQoARG3pquhScbQrjBV9tcF4irTUPlTn3yrsXNO17DpcbTVeKRkb88RDtIKiRw3orVZ_GlIb-ckTQ5dS-Nqlyyf3Fmrhca-gwt6m_xv2UrmJK6eYYTMfggdRRWb-4u7mEkBI_pHPMTQrT8kJ2BeX-vHgazH9AoH0k85LHtFZQXD7pXHlDZRnLxJXukncwMGDmF17374gavYAIyDIzcC8sEBMDnVXgpikeA1sauzirqix6mAVs6XmxdQO7aF0wfXO1_PTYUA3Nk1oQfMYNlEI3U9uLRJRZIq2L8fmrrBryhstKd4y0KlBbGAQrx8NtRkgajjd1ljMfPBUEZrb7uSerVjneiO-aIBO76CuH0zdklphIjpGJeogkBhe8pAYNggp1XsZHgpZfl7IE5faKaDkMGnutaea--Czor6bhqUNCuY4tR0cpQJbNwy6LS9o1CFy4Log";
88
+ var userId = "a30a780b-b843-5344-80e3-0fd95a4f6fc3";
89
+ var defaultUser = {
90
+ created_ts: "2019-01-01T10:30:00.000Z",
91
+ email: "a@b.com",
92
+ id: "a1",
93
+ roles: ["RBAC_ROLE_PERMIT_ALL"],
94
+ tfa_status: "enabled",
95
+ verified: true
96
+ };
97
+ var deviceTypes = { qemu: "qemux86-64" };
98
+ var checkInTimeRounded = "2019-01-01T00:00:00.000Z";
99
+ var checkInTimeExact = "2019-01-01T10:25:00.000Z";
100
+ var mockApiResponses = {
101
+ deployments: {
102
+ byId: {
103
+ d1: {
104
+ id: "d1",
105
+ name: "test deployment",
106
+ created: "2019-01-01T12:30:00.000Z",
107
+ devices: {
108
+ a1: {
109
+ id: "a1",
110
+ status: "installing",
111
+ attributes: {},
112
+ image: { size: 123 }
113
+ }
114
+ },
115
+ statistics: {
116
+ status: {
117
+ "already-installed": 0,
118
+ decommissioned: 0,
119
+ downloading: 0,
120
+ failure: 0,
121
+ installing: 1,
122
+ noartifact: 0,
123
+ pending: 0,
124
+ rebooting: 0,
125
+ success: 0
126
+ },
127
+ total_size: 1234
128
+ }
129
+ },
130
+ d2: {
131
+ id: "d2",
132
+ name: "test deployment 2",
133
+ artifact_name: "r1",
134
+ artifacts: ["123"],
135
+ created: "2019-01-01T12:25:00.000Z",
136
+ device_count: 1,
137
+ devices: {
138
+ b1: {
139
+ attributes: {},
140
+ id: "b1",
141
+ status: "pending"
142
+ }
143
+ },
144
+ filter: void 0,
145
+ group: void 0,
146
+ statistics: {
147
+ status: {
148
+ downloading: 0,
149
+ decommissioned: 0,
150
+ failure: 0,
151
+ installing: 0,
152
+ noartifact: 0,
153
+ pending: 1,
154
+ rebooting: 0,
155
+ success: 0,
156
+ "already-installed": 0
157
+ }
158
+ }
159
+ },
160
+ d3: {
161
+ id: "d3",
162
+ name: "Test",
163
+ phases: [
164
+ { id: "0", batch_size: 2, device_count: 2 },
165
+ { id: "1", start_ts: "2019-02-04T11:45:10.002Z", batch_size: 3, device_count: 3 },
166
+ { id: "2", start_ts: "2019-02-05T11:45:10.002Z", batch_size: 5, device_count: 5 },
167
+ { id: "3", start_ts: "2019-02-06T11:45:10.002Z", batch_size: 5, device_count: 5 },
168
+ { id: "4", start_ts: "2019-02-21T11:45:10.002Z", batch_size: 5, device_count: 0 }
169
+ ],
170
+ max_devices: 0,
171
+ created: "2019-01-31T12:59:30.020Z",
172
+ devices: {},
173
+ filter: void 0,
174
+ group: void 0,
175
+ stats: {
176
+ pending: 3,
177
+ decommissioned: 0,
178
+ failure: 23,
179
+ pause_before_committing: 0,
180
+ pause_before_rebooting: 0,
181
+ installing: 0,
182
+ rebooting: 0,
183
+ "already-installed": 0,
184
+ pause_before_installing: 0,
185
+ downloading: 0,
186
+ success: 6,
187
+ aborted: 0,
188
+ noartifact: 0
189
+ },
190
+ statistics: { total_size: "1234" },
191
+ status: "inprogress",
192
+ active: true,
193
+ device_count: 100,
194
+ retries: "0",
195
+ type: "software"
196
+ }
197
+ },
198
+ byStatus: {
199
+ pending: { deploymentIds: ["d2"] },
200
+ inprogress: { deploymentIds: ["d3"] }
201
+ }
202
+ },
203
+ devices: {
204
+ byId: {
205
+ a1: {
206
+ id: "a1",
207
+ auth_sets: [
208
+ {
209
+ id: "auth1",
210
+ identity_data: { mac: defaultMacAddress },
211
+ pubkey: "-----BEGIN PUBLIC KEY-----\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\n-----END PUBLIC KEY-----\n",
212
+ status: "accepted",
213
+ ts: defaultCreationDate
214
+ }
215
+ ],
216
+ updated_ts: "2019-01-01T09:25:00.000Z"
217
+ },
218
+ b1: {
219
+ id: "b1",
220
+ attributes: {
221
+ ipv4_wlan0: "192.168.10.141/24",
222
+ device_type: [deviceTypes.qemu]
223
+ },
224
+ system: {
225
+ check_in_time: checkInTimeRounded
226
+ },
227
+ check_in_time: checkInTimeExact,
228
+ check_in_time_exact: checkInTimeExact,
229
+ check_in_time_rounded: checkInTimeRounded,
230
+ identity_data: { mac: defaultMacAddress },
231
+ status: "accepted",
232
+ decommissioning: false,
233
+ created_ts: defaultCreationDate,
234
+ updated_ts: "2019-01-01T09:25:00.000Z",
235
+ auth_sets: [
236
+ {
237
+ id: "auth1",
238
+ identity_data: { mac: defaultMacAddress },
239
+ pubkey: "-----BEGIN PUBLIC KEY-----\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\n-----END PUBLIC KEY-----\n",
240
+ ts: defaultCreationDate,
241
+ status: "accepted"
242
+ }
243
+ ]
244
+ }
245
+ },
246
+ groups: {
247
+ byId: {
248
+ testGroup: {
249
+ deviceIds: ["a1", "b1"],
250
+ filters: [],
251
+ total: 2
252
+ },
253
+ testGroupDynamic: {
254
+ id: "filter1",
255
+ name: "filter1",
256
+ filters: [{ scope: "system", key: "group", operator: "$eq", value: "things" }]
257
+ }
258
+ }
259
+ },
260
+ limit: 500,
261
+ byStatus: {
262
+ accepted: { deviceIds: ["a1", "b1"], total: 2 },
263
+ active: { deviceIds: [], total: 0 },
264
+ inactive: { deviceIds: [], total: 0 },
265
+ pending: { deviceIds: ["c1"], total: 1 },
266
+ preauthorized: { deviceIds: [], total: 0 },
267
+ rejected: { deviceIds: [], total: 0 }
268
+ }
269
+ },
270
+ organization: {
271
+ organization: {
272
+ id: "1",
273
+ addons: [],
274
+ name: "test",
275
+ plan: "os",
276
+ trial: false
277
+ },
278
+ intentId: "testIntent",
279
+ auditlog: {
280
+ events: [
281
+ {
282
+ actor: {
283
+ id: "string",
284
+ type: "user",
285
+ email: "string@example.com"
286
+ },
287
+ time: "2019-01-01T12:10:22.667Z",
288
+ action: "create",
289
+ object: {
290
+ id: "string",
291
+ type: "user",
292
+ user: {
293
+ email: "user@acme.com"
294
+ }
295
+ },
296
+ change: "change1"
297
+ },
298
+ {
299
+ actor: {
300
+ id: "string",
301
+ type: "user",
302
+ email: "string",
303
+ identity_data: "string"
304
+ },
305
+ time: "2019-01-01T12:16:22.667Z",
306
+ action: "create",
307
+ object: {
308
+ id: "string",
309
+ type: "deployment",
310
+ deployment: {
311
+ name: "production",
312
+ artifact_name: "Application 0.0.1"
313
+ }
314
+ },
315
+ change: "change2"
316
+ },
317
+ {
318
+ actor: {
319
+ id: "string",
320
+ type: "user",
321
+ email: "string@example.com"
322
+ },
323
+ time: "2019-01-01T12:10:22.669Z",
324
+ action: "open_terminal",
325
+ meta: {
326
+ session_id: ["abd313a8-ee88-48ab-9c99-fbcd80048e6e"]
327
+ },
328
+ object: {
329
+ id: "a1",
330
+ type: "device"
331
+ },
332
+ change: "change3"
333
+ }
334
+ ]
335
+ }
336
+ },
337
+ releases: {
338
+ byId: {
339
+ r1: {
340
+ name: "r1",
341
+ artifacts: [
342
+ {
343
+ id: "art1",
344
+ description: "test description",
345
+ device_types_compatible: [deviceTypes.qemu],
346
+ modified: "2020-09-10T12:16:22.667Z",
347
+ updates: [{ type_info: "testtype" }],
348
+ artifact_depends: {
349
+ device_type: [deviceTypes.qemu]
350
+ },
351
+ artifact_provides: {
352
+ artifact_name: "myapp",
353
+ "data-partition.myapp.version": "v2020.10",
354
+ list_of_fancy: [deviceTypes.qemu, "x172"]
355
+ },
356
+ clears_artifact_provides: ["data-partition.myapp.*"]
357
+ }
358
+ ],
359
+ device_types_compatible: [deviceTypes.qemu],
360
+ modified: "2020-09-10T12:16:22.667Z",
361
+ metaData: {}
362
+ }
363
+ }
364
+ },
365
+ users: {
366
+ byId: {
367
+ a1: defaultUser,
368
+ [userId]: { ...defaultUser, id: userId, email: "a2@b.com", created_ts: "2019-01-01T12:30:00.000Z" }
369
+ },
370
+ rolesById: {
371
+ admin: {
372
+ name: "admin",
373
+ description: "Administrator role",
374
+ permissions: []
375
+ },
376
+ test: { name: "test", description: "test description", permissions: [] }
377
+ },
378
+ globalSettings: {
379
+ "2fa": "enabled",
380
+ id_attribute: void 0,
381
+ previousFilters: []
382
+ },
383
+ userSettings: {
384
+ "2fa": "disabled",
385
+ columnSelection: [],
386
+ onboarding: { something: "here" },
387
+ tooltips: {},
388
+ previousFilters: []
389
+ }
390
+ }
391
+ };
392
+ var releasesList = Array.from({ length: 5e3 }, (x, i) => ({
393
+ artifacts: [
394
+ {
395
+ id: "art1",
396
+ description: "test description",
397
+ device_types_compatible: [deviceTypes.qemu],
398
+ modified: "2020-09-10T12:16:22.667Z",
399
+ updates: [{ type_info: "testtype" }],
400
+ artifact_depends: {
401
+ device_type: [deviceTypes.qemu]
402
+ },
403
+ artifact_provides: {
404
+ artifact_name: "myapp",
405
+ "data-partition.myapp.version": "v2020.10",
406
+ list_of_fancy: [deviceTypes.qemu, "x172"]
407
+ },
408
+ clears_artifact_provides: ["data-partition.myapp.*"]
409
+ }
410
+ ],
411
+ device_types_compatible: [deviceTypes.qemu],
412
+ metaData: {},
413
+ name: `release-${i + 1}`,
414
+ modified: i
415
+ }));
416
+ var permissionSets = [
417
+ {
418
+ ...import_constants.defaultPermissionSets.Basic,
419
+ object: permissionSetObjectTypes.empty,
420
+ description: "Set containing basic permissions.",
421
+ permissions: [
422
+ { action: "http", object: { type: "any", value: "^/api/management/v1/useradm/settings$" } },
423
+ { action: "http", object: { type: "any", value: "^/api/management/v1/useradm/users/me$" } },
424
+ { action: "http", object: { type: "any", value: "^/api/management/1.0/auth/verify$" } },
425
+ { action: "http", object: { type: "PUT", value: "^/api/management/v1/useradm/2faverify$" } },
426
+ { action: "http", object: { type: "POST", value: "^/api/management/v1/useradm/users/me/2fa/(enable|disable)$" } },
427
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/useradm/roles" } },
428
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/tenantadm/user/tenant" } }
429
+ ]
430
+ },
431
+ {
432
+ ...import_constants.defaultPermissionSets.ManageReleases,
433
+ action: import_constants.uiPermissionsById.manage.title,
434
+ object: permissionSetObjectTypes.releases,
435
+ description: "Set of permissions which allows user to manage releases",
436
+ permissions: [
437
+ { action: "http", object: { type: "GET", value: commonEndpoints.artifacts } },
438
+ { action: "http", object: { type: "GET", value: commonEndpoints.artifactDetails } },
439
+ { action: "http", object: { type: "PUT", value: commonEndpoints.artifactDetails } },
440
+ { action: "http", object: { type: "DELETE", value: commonEndpoints.artifactDetails } },
441
+ { action: "http", object: { type: "GET", value: "^/api/management/v1/deployments/artifacts/[^/]+/download" } }
442
+ ]
443
+ },
444
+ {
445
+ ...import_constants.defaultPermissionSets.ReadUsers,
446
+ action: import_constants.uiPermissionsById.read.title,
447
+ object: permissionSetObjectTypes.userManagement,
448
+ description: "Set of permissions which allows user to view other users",
449
+ permissions: [{ action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/useradm/" } }]
450
+ },
451
+ {
452
+ ...import_constants.defaultPermissionSets.ManageUsers,
453
+ action: import_constants.uiPermissionsById.manage.title,
454
+ object: permissionSetObjectTypes.userManagement,
455
+ description: "Set of permissions which allows user manage other user accounts",
456
+ permissions: [{ action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/useradm/" } }]
457
+ },
458
+ {
459
+ ...import_constants.defaultPermissionSets.ReadTenants,
460
+ action: import_constants.uiPermissionsById.read.title,
461
+ object: permissionSetObjectTypes.tenantManagement,
462
+ description: "Set of permissions which allows user to list other tenants and their config",
463
+ permissions: [
464
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/tenantadm/" } },
465
+ { action: "http", object: { type: "POST", value: "^/api/management/(v[1-9])/tenantadm/" } }
466
+ ]
467
+ },
468
+ {
469
+ ...import_constants.defaultPermissionSets.ManageTenants,
470
+ action: import_constants.uiPermissionsById.manage.title,
471
+ object: permissionSetObjectTypes.tenantManagement,
472
+ description: "Set of permissions which allows user to manage other tenants and their config",
473
+ permissions: [
474
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/tenantadm/" } },
475
+ { action: "http", object: { type: "POST", value: "^/api/management/(v[1-9])/tenantadm/" } },
476
+ { action: "http", object: { type: "PUT", value: "^/api/management/(v[1-9])/tenantadm/" } }
477
+ ]
478
+ },
479
+ {
480
+ ...import_constants.defaultPermissionSets.ReadAuditLogs,
481
+ action: import_constants.uiPermissionsById.read.title,
482
+ object: "System Audit Log",
483
+ description: "Set of permissions which allows user to view system audit log",
484
+ permissions: [{ action: "http", object: { type: "GET", value: "^/api/management/(v[1-9]|0.1.0)/auditlogs/logs" } }]
485
+ },
486
+ {
487
+ ...import_constants.defaultPermissionSets.DeployToDevices,
488
+ action: "Deploy",
489
+ object: permissionSetObjectTypes.groups,
490
+ description: "Set of permissions which allows user to deploy to devices",
491
+ permissions: [{ action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/(deployments|deviceconfig)/" } }],
492
+ supported_scope_types: [import_constants.scopedPermissionAreas.groups.scopeType]
493
+ },
494
+ {
495
+ ...import_constants.defaultPermissionSets.ConfigureDevices,
496
+ action: "Configure",
497
+ object: permissionSetObjectTypes.groups,
498
+ description: "Set of permissions which allows user to manage configuration of the devices",
499
+ permissions: [{ action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deviceconfig/" } }],
500
+ supported_scope_types: [import_constants.scopedPermissionAreas.groups.scopeType]
501
+ },
502
+ {
503
+ ...import_constants.defaultPermissionSets.ConnectToDevices,
504
+ action: "Connect",
505
+ object: permissionSetObjectTypes.groups,
506
+ description: "Set of permissions which allows user to use remote terminal and file transfer",
507
+ permissions: [
508
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/connect$" } },
509
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/download\\?path=[^&]+$" } },
510
+ { action: "http", object: { type: "PUT", value: "^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/upload$" } }
511
+ ],
512
+ supported_scope_types: [import_constants.scopedPermissionAreas.groups.scopeType]
513
+ },
514
+ {
515
+ ...import_constants.defaultPermissionSets.SuperUser,
516
+ action: "Any",
517
+ object: permissionSetObjectTypes.any,
518
+ description: "Set of permissions which allows user to do anything",
519
+ permissions: [{ action: "any", object: { type: "any", value: "any" } }]
520
+ },
521
+ {
522
+ ...import_constants.defaultPermissionSets.UploadArtifacts,
523
+ action: "Upload",
524
+ object: permissionSetObjectTypes.artifacts,
525
+ description: "Set of permissions which allows user to upload artifacts",
526
+ permissions: [
527
+ { action: "http", object: { type: "POST", value: commonEndpoints.artifacts } },
528
+ { action: "http", object: { type: "POST", value: "^/api/management/v1/deployments/artifacts/generate" } }
529
+ ]
530
+ },
531
+ {
532
+ ...import_constants.defaultPermissionSets.ReadDevices,
533
+ action: import_constants.uiPermissionsById.read.title,
534
+ object: permissionSetObjectTypes.groups,
535
+ description: "Set of permissions which allows user to view devices",
536
+ permissions: [
537
+ { action: "http", object: { type: "POST", value: "^/api/management/v2/inventory/filters/search" } },
538
+ { action: "http", object: { type: "POST", value: "^/api/management/v1/reporting/devices/search" } },
539
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9])/(deployments|devauth|inventory|deviceconfig|devicemonitor)/" } },
540
+ { action: "http", object: { type: "GET", value: "^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+$" } }
541
+ ],
542
+ supported_scope_types: [import_constants.scopedPermissionAreas.groups.scopeType]
543
+ },
544
+ {
545
+ ...import_constants.defaultPermissionSets.ManageDevices,
546
+ action: import_constants.uiPermissionsById.manage.title,
547
+ object: permissionSetObjectTypes.groups,
548
+ description: "Set of permissions which allows user to manage devices",
549
+ permissions: [
550
+ { action: "http", object: { type: "POST", value: commonEndpoints.deviceManagement } },
551
+ { action: "http", object: { type: "PUT", value: commonEndpoints.deviceManagement } },
552
+ { action: "http", object: { type: "DELETE", value: commonEndpoints.deviceManagement } }
553
+ ],
554
+ supported_scope_types: [import_constants.scopedPermissionAreas.groups.scopeType]
555
+ },
556
+ {
557
+ ...import_constants.defaultPermissionSets.ReadReleases,
558
+ action: import_constants.uiPermissionsById.read.title,
559
+ object: permissionSetObjectTypes.releases,
560
+ description: "Set of permissions which allows user to view releases",
561
+ permissions: [
562
+ { action: "http", object: { type: "GET", value: commonEndpoints.artifacts } },
563
+ { action: "http", object: { type: "GET", value: commonEndpoints.artifactDetails } },
564
+ { action: "http", object: { type: "GET", value: "^/api/management/v1/deployments/artifacts/[^/]+/download" } }
565
+ ]
566
+ },
567
+ {
568
+ name: "almostAdmin",
569
+ object: permissionSetObjectTypes.empty,
570
+ description: "Set containing all the permissions.",
571
+ permissions: [
572
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/auditlogs/.*" } },
573
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deployments/.*" } },
574
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deployments/config/.*" } },
575
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deployments/deployments/.*" } },
576
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deployments/deployments/releases/.*" } },
577
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/devauth/.*" } },
578
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deviceconfig/.*" } },
579
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deviceconnect/.*" } },
580
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/deviceconnect/devices" } },
581
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/inventory/.*" } },
582
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/iot-manager/.*" } },
583
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/monitor/.*" } },
584
+ { action: "http", object: { type: "any", value: "^/api/management/(v[1-9])/useradm/.*" } }
585
+ ]
586
+ }
587
+ ];
588
+ var rbacRoles = [
589
+ {
590
+ name: "dyn",
591
+ description: "",
592
+ permissions: [
593
+ { action: "CREATE_DEPLOYMENT", object: { type: "DEVICE_GROUP", value: "dyn" } },
594
+ { action: "VIEW_DEVICE", object: { type: "DEVICE_GROUP", value: "dyn" } }
595
+ ]
596
+ },
597
+ { name: "asdasd", description: "123", permissions: [{ action: "http", object: { type: "any", value: "/api/management/v1/useradm/.*" } }] },
598
+ {
599
+ name: "141sasd",
600
+ description: "1313adg",
601
+ permission_sets_with_scope: [
602
+ { ...import_constants.defaultPermissionSets.ReadDevices, scope: { type: import_constants.scopedPermissionAreas.groups.scopeType, value: ["bestgroup"] } },
603
+ { ...import_constants.defaultPermissionSets.ConnectToDevices, scope: { type: import_constants.scopedPermissionAreas.groups.scopeType, value: ["bestgroup"] } },
604
+ { ...import_constants.defaultPermissionSets.ManageUsers }
605
+ ]
606
+ },
607
+ {
608
+ name: "kljlkk",
609
+ description: "lkl",
610
+ permission_sets_with_scope: [{ ...import_constants.defaultPermissionSets.ConnectToDevices, scope: { type: import_constants.scopedPermissionAreas.groups.scopeType, value: ["bestgroup"] } }]
611
+ },
612
+ {
613
+ name: "yyyyy",
614
+ description: "asd",
615
+ permission_sets_with_scope: [
616
+ { ...import_constants.defaultPermissionSets.ManageDevices, scope: { type: import_constants.scopedPermissionAreas.groups.scopeType, value: ["dockerclient"] } },
617
+ { ...import_constants.defaultPermissionSets.ManageReleases }
618
+ ]
619
+ },
620
+ {
621
+ name: "RBAC_ROLE_DEPLOYMENTS_MANAGER",
622
+ description: "Intended for users responsible for managing deployments, this role can create and abort deployments",
623
+ permission_sets_with_scope: [{ ...import_constants.defaultPermissionSets.DeployToDevices }]
624
+ },
625
+ {
626
+ name: "RBAC_ROLE_REMOTE_TERMINAL",
627
+ description: `Intended for tech support accounts, this role can access the devices' Remote Terminal.`,
628
+ permission_sets_with_scope: [{ ...import_constants.defaultPermissionSets.ConnectToDevices }]
629
+ },
630
+ { name: "RBAC_ROLE_PERMIT_ALL", description: "", permission_sets_with_scope: [{ ...import_constants.defaultPermissionSets.SuperUser }] },
631
+ {
632
+ name: "RBAC_ROLE_OBSERVER",
633
+ description: "Intended for team leaders or limited tech support accounts, this role can see all Devices, Artifacts and Deployment reports but not make any changes.",
634
+ permission_sets_with_scope: [{ ...import_constants.defaultPermissionSets.ReadReleases }, { ...import_constants.defaultPermissionSets.ReadDevices }]
635
+ },
636
+ {
637
+ name: "RBAC_ROLE_CI",
638
+ description: "Intended for automation accounts building software (e.g. CI/CD systems), this role can only manage Artifacts, including upload new Artifacts and delete Artifacts. It does not have access to Devices or Deployments.",
639
+ permission_sets_with_scope: [
640
+ { ...import_constants.defaultPermissionSets.ReadReleases },
641
+ { ...import_constants.defaultPermissionSets.ManageReleases },
642
+ { ...import_constants.defaultPermissionSets.UploadArtifacts }
643
+ ]
644
+ },
645
+ {
646
+ name: "almostAdmin",
647
+ description: "almost admin rights",
648
+ permissions: permissionSets.find((item) => item.name === "almostAdmin")?.permissions
649
+ },
650
+ {
651
+ name: "almostAdminNew",
652
+ description: "almost admin rights",
653
+ permission_sets_with_scope: Object.values(import_constants.defaultPermissionSets)
654
+ }
655
+ ];
656
+ var expectedParsedRoles = {
657
+ "141sasd": {
658
+ editable: true,
659
+ isCustom: void 0,
660
+ uiPermissions: {
661
+ ...import_constants.emptyUiPermissions,
662
+ groups: { bestgroup: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.connect.value] },
663
+ userManagement: [import_constants.uiPermissionsById.manage.value]
664
+ }
665
+ },
666
+ asdasd: {
667
+ editable: false,
668
+ isCustom: true,
669
+ uiPermissions: { ...import_constants.emptyUiPermissions, userManagement: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.manage.value] }
670
+ },
671
+ dyn: {
672
+ editable: false,
673
+ isCustom: true,
674
+ uiPermissions: {
675
+ ...import_constants.emptyUiPermissions,
676
+ deployments: [import_constants.uiPermissionsById.deploy.value],
677
+ groups: { dyn: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.deploy.value] }
678
+ }
679
+ },
680
+ kljlkk: {
681
+ editable: true,
682
+ isCustom: false,
683
+ uiPermissions: { ...import_constants.emptyUiPermissions, groups: { bestgroup: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.connect.value] } }
684
+ },
685
+ yyyyy: {
686
+ editable: true,
687
+ isCustom: void 0,
688
+ uiPermissions: {
689
+ ...import_constants.emptyUiPermissions,
690
+ groups: { dockerclient: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.manage.value] },
691
+ releases: { [import_constants.ALL_RELEASES]: [import_constants.uiPermissionsById.manage.value] }
692
+ }
693
+ },
694
+ almostAdmin: {
695
+ editable: false,
696
+ isCustom: true,
697
+ uiPermissions: {
698
+ ...import_constants.emptyUiPermissions,
699
+ auditlog: [import_constants.uiPermissionsById.read.value],
700
+ deployments: [import_constants.uiPermissionsById.manage.value, import_constants.uiPermissionsById.deploy.value, import_constants.uiPermissionsById.read.value],
701
+ groups: {
702
+ [import_constants.ALL_DEVICES]: [
703
+ import_constants.uiPermissionsById.read.value,
704
+ // we can't assign deployment permissions to devices here, since the old path based rbac controls don't allow the scoped permissions
705
+ // uiPermissionsById.deploy.value,
706
+ import_constants.uiPermissionsById.manage.value,
707
+ import_constants.uiPermissionsById.connect.value,
708
+ import_constants.uiPermissionsById.configure.value
709
+ ]
710
+ },
711
+ releases: {
712
+ [import_constants.ALL_RELEASES]: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.upload.value, import_constants.uiPermissionsById.manage.value]
713
+ },
714
+ userManagement: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.manage.value]
715
+ }
716
+ },
717
+ almostAdminNew: {
718
+ editable: true,
719
+ isCustom: void 0,
720
+ uiPermissions: {
721
+ ...import_constants.emptyUiPermissions,
722
+ auditlog: [import_constants.uiPermissionsById.read.value],
723
+ deployments: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.deploy.value, import_constants.uiPermissionsById.manage.value],
724
+ groups: {
725
+ [import_constants.ALL_DEVICES]: [
726
+ import_constants.uiPermissionsById.read.value,
727
+ import_constants.uiPermissionsById.manage.value,
728
+ import_constants.uiPermissionsById.deploy.value,
729
+ import_constants.uiPermissionsById.connect.value,
730
+ import_constants.uiPermissionsById.configure.value
731
+ ]
732
+ },
733
+ releases: {
734
+ [import_constants.ALL_RELEASES]: [import_constants.uiPermissionsById.manage.value, import_constants.uiPermissionsById.upload.value, import_constants.uiPermissionsById.read.value]
735
+ },
736
+ tenantManagement: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.manage.value],
737
+ userManagement: [import_constants.uiPermissionsById.read.value, import_constants.uiPermissionsById.manage.value]
738
+ }
739
+ }
740
+ };
741
+ var defaultRolesById = {
742
+ ...import_constants.rolesById,
743
+ test: {
744
+ ...import_constants.emptyRole,
745
+ name: "test",
746
+ description: "test description",
747
+ editable: true,
748
+ uiPermissions: {
749
+ ...import_constants.emptyUiPermissions,
750
+ groups: { testGroup: [import_constants.uiPermissionsById.read.value] },
751
+ releases: { bar: [import_constants.uiPermissionsById.read.value] }
752
+ }
753
+ }
754
+ };
755
+ var receivedRoles = rbacRoles.reduce(
756
+ (accu, role) => {
757
+ const { name, description, ...roleRemainder } = role;
758
+ if (name.startsWith("RBAC")) {
759
+ accu[name] = {
760
+ ...defaultRolesById[name],
761
+ ...roleRemainder,
762
+ editable: false,
763
+ isCustom: false,
764
+ description: defaultRolesById[name].description ? defaultRolesById[name].description : description
765
+ };
766
+ } else {
767
+ const result = expectedParsedRoles[name] ?? {};
768
+ accu[name] = {
769
+ ...import_constants.emptyRole,
770
+ ...role,
771
+ ...result,
772
+ name
773
+ };
774
+ }
775
+ return accu;
776
+ },
777
+ { ...defaultRolesById }
778
+ );
779
+ var receivedPermissionSets = permissionSets.reduce((accu, set) => {
780
+ const result = import_constants.defaultPermissionSets[set.name]?.result ?? {};
781
+ accu[set.name] = {
782
+ ...set,
783
+ result: {
784
+ ...import_constants.emptyUiPermissions,
785
+ ...result
786
+ }
787
+ };
788
+ return accu;
789
+ }, {});
790
+
791
+ // src/theme/light.ts
792
+ var palette = {
793
+ border: {
794
+ main: "#e3e3e3"
795
+ },
796
+ tooltip: {
797
+ tierTipBackground: "#f7fafb"
798
+ }
799
+ };
800
+ var light = {
801
+ palette
802
+ };
803
+
804
+ // src/setupTests.tsx
805
+ __reExport(setupTests_exports, require("@testing-library/react"), module.exports);
806
+ var import_jsx_runtime = require("react/jsx-runtime");
807
+ import_vitest.expect.addSnapshotSerializer((0, import_jest.createSerializer)({ includeStyles: true }));
808
+ var TEST_LOCATION = "localhost";
809
+ var mockAbortController = { signal: { addEventListener: () => {
810
+ }, removeEventListener: () => {
811
+ } } };
812
+ var oldWindowLocalStorage = window.localStorage;
813
+ var oldWindowLocation = window.location;
814
+ var oldWindowSessionStorage = window.sessionStorage;
815
+ import_vitest.vi.mock("uuid", () => ({ v4: () => "mock-uuid" }));
816
+ import_vitest.vi.useFakeTimers({ now: mockDate });
817
+ import_vitest.vi.setSystemTime(mockDate);
818
+ var storage = {};
819
+ global.HTMLCanvasElement.prototype.getContext = import_vitest.vi.fn();
820
+ var beforeAll = async () => {
821
+ delete window.location;
822
+ window.location = {
823
+ ...oldWindowLocation,
824
+ hostname: TEST_LOCATION,
825
+ origin: "http://localhost",
826
+ assign: import_vitest.vi.fn(),
827
+ replace: import_vitest.vi.fn(),
828
+ reload: import_vitest.vi.fn()
829
+ };
830
+ delete window.sessionStorage;
831
+ window.sessionStorage = {
832
+ ...oldWindowSessionStorage,
833
+ getItem: import_vitest.vi.fn(import_helpers.yes),
834
+ setItem: import_vitest.vi.fn(),
835
+ removeItem: import_vitest.vi.fn()
836
+ };
837
+ delete window.localStorage;
838
+ window.localStorage = {
839
+ ...oldWindowLocalStorage,
840
+ getItem: import_vitest.vi.fn((name) => {
841
+ if (name === "JWT") {
842
+ return JSON.stringify({ token });
843
+ }
844
+ return storage[name];
845
+ }),
846
+ setItem: import_vitest.vi.fn((name) => storage[name]),
847
+ removeItem: import_vitest.vi.fn()
848
+ };
849
+ window.mender_environment = menderEnvironment;
850
+ window.ENV = "test";
851
+ global.AbortController = import_vitest.vi.fn().mockImplementation(() => mockAbortController);
852
+ global.MessageChannel = import_worker_threads.MessageChannel;
853
+ global.ResizeObserver = import_vitest.vi.fn().mockImplementation(() => ({
854
+ observe: import_vitest.vi.fn(),
855
+ unobserve: import_vitest.vi.fn(),
856
+ disconnect: import_vitest.vi.fn()
857
+ }));
858
+ window.RTCPeerConnection = () => ({
859
+ createOffer: () => {
860
+ },
861
+ setLocalDescription: () => {
862
+ },
863
+ createDataChannel: () => {
864
+ }
865
+ });
866
+ Object.defineProperty(navigator, "appVersion", { value: "Test", writable: true });
867
+ const intersectionObserverMock = () => ({
868
+ observe: import_vitest.vi.fn(),
869
+ disconnect: import_vitest.vi.fn()
870
+ });
871
+ window.prompt = import_vitest.vi.fn();
872
+ window.IntersectionObserver = import_vitest.vi.fn().mockImplementation(intersectionObserverMock);
873
+ import_vitest.vi.spyOn(import_react.default, "useEffect").mockImplementation(import_react.default.useLayoutEffect);
874
+ const _jest = globalThis.jest;
875
+ globalThis.jest = {
876
+ ...globalThis.jest,
877
+ advanceTimersByTime: import_vitest.vi.advanceTimersByTime.bind(import_vitest.vi)
878
+ };
879
+ return () => void (globalThis.jest = _jest);
880
+ };
881
+ var afterEach = async () => (0, import_react2.cleanup)();
882
+ var afterAll = async () => {
883
+ window.localStorage = oldWindowLocalStorage;
884
+ window.location = oldWindowLocation;
885
+ window.sessionStorage = oldWindowSessionStorage;
886
+ import_react.default.useEffect.mockRestore();
887
+ };
888
+ var theme = (0, import_styles.createTheme)(light);
889
+ var customRender = (ui, options = {}) => {
890
+ const { preloadedState = { users: { currentSession: { token, expiresAt: void 0 } } }, ...remainder } = options;
891
+ const store = options.store ?? (0, import_toolkit.configureStore)({ preloadedState });
892
+ const AllTheProviders = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_styles.ThemeProvider, { theme, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.MemoryRouter, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_redux.Provider, { store, children }) }) });
893
+ return { store, ...(0, import_react2.render)(ui, { wrapper: AllTheProviders, ...remainder }) };
894
+ };
895
+ // Annotate the CommonJS export names for ESM import in node:
896
+ 0 && (module.exports = {
897
+ TEST_LOCATION,
898
+ afterAll,
899
+ afterEach,
900
+ beforeAll,
901
+ mockAbortController,
902
+ render,
903
+ ...require("@testing-library/react")
904
+ });
905
+ //# sourceMappingURL=setupTests.cjs.map