@northern.tech/testing 0.8.1 → 0.8.4
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/dist/mockData.cjs +1302 -0
- package/dist/mockData.cjs.map +1 -0
- package/dist/mockData.d.cts +662 -0
- package/dist/mockData.d.ts +662 -0
- package/dist/mockData.js +1280 -0
- package/dist/mockData.js.map +1 -0
- package/dist/public/baseTestConfig.json +17 -0
- package/dist/requestHandlers/deploymentHandlers.cjs +193 -0
- package/dist/requestHandlers/deploymentHandlers.cjs.map +1 -0
- package/dist/requestHandlers/deploymentHandlers.d.cts +7 -0
- package/dist/requestHandlers/deploymentHandlers.d.ts +7 -0
- package/dist/requestHandlers/deploymentHandlers.js +191 -0
- package/dist/requestHandlers/deploymentHandlers.js.map +1 -0
- package/dist/requestHandlers/deviceHandlers.cjs +432 -0
- package/dist/requestHandlers/deviceHandlers.cjs.map +1 -0
- package/dist/requestHandlers/deviceHandlers.d.cts +22 -0
- package/dist/requestHandlers/deviceHandlers.d.ts +22 -0
- package/dist/requestHandlers/deviceHandlers.js +428 -0
- package/dist/requestHandlers/deviceHandlers.js.map +1 -0
- package/dist/requestHandlers/monitorHandlers.cjs +23 -0
- package/dist/requestHandlers/monitorHandlers.cjs.map +1 -0
- package/dist/requestHandlers/monitorHandlers.d.cts +7 -0
- package/dist/requestHandlers/monitorHandlers.d.ts +7 -0
- package/dist/requestHandlers/monitorHandlers.js +21 -0
- package/dist/requestHandlers/monitorHandlers.js.map +1 -0
- package/dist/requestHandlers/organizationHandlers.cjs +312 -0
- package/dist/requestHandlers/organizationHandlers.cjs.map +1 -0
- package/dist/requestHandlers/organizationHandlers.d.cts +7 -0
- package/dist/requestHandlers/organizationHandlers.d.ts +7 -0
- package/dist/requestHandlers/organizationHandlers.js +310 -0
- package/dist/requestHandlers/organizationHandlers.js.map +1 -0
- package/dist/requestHandlers/releaseHandlers.cjs +161 -0
- package/dist/requestHandlers/releaseHandlers.cjs.map +1 -0
- package/dist/requestHandlers/releaseHandlers.d.cts +7 -0
- package/dist/requestHandlers/releaseHandlers.d.ts +7 -0
- package/dist/requestHandlers/releaseHandlers.js +159 -0
- package/dist/requestHandlers/releaseHandlers.js.map +1 -0
- package/dist/requestHandlers/requestHandlers.cjs +28 -0
- package/dist/requestHandlers/requestHandlers.cjs.map +1 -0
- package/dist/requestHandlers/requestHandlers.d.cts +6 -0
- package/dist/requestHandlers/requestHandlers.d.ts +7 -0
- package/dist/requestHandlers/requestHandlers.js +27 -0
- package/dist/requestHandlers/requestHandlers.js.map +1 -0
- package/dist/requestHandlers/userHandlers.cjs +141 -0
- package/dist/requestHandlers/userHandlers.cjs.map +1 -0
- package/dist/requestHandlers/userHandlers.d.cts +7 -0
- package/dist/requestHandlers/userHandlers.d.ts +7 -0
- package/dist/requestHandlers/userHandlers.js +139 -0
- package/dist/requestHandlers/userHandlers.js.map +1 -0
- package/dist/setupTests.cjs +173 -0
- package/dist/setupTests.cjs.map +1 -0
- package/dist/setupTests.d.cts +79 -0
- package/dist/setupTests.d.ts +79 -0
- package/dist/setupTests.js +135 -0
- package/dist/setupTests.js.map +1 -0
- package/dist/theme/light.cjs +9 -0
- package/dist/theme/light.cjs.map +1 -0
- package/dist/theme/light.d.cts +7 -0
- package/dist/theme/light.d.ts +7 -0
- package/dist/theme/light.js +8 -0
- package/dist/theme/light.js.map +1 -0
- package/dist/theme/mui.d.cjs +0 -0
- package/dist/theme/mui.d.cts +11 -0
- package/dist/theme/mui.d.ts +11 -0
- package/dist/utils.cjs +21 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +8 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { mockApiResponses, tenants, webhookEvents } from "../mockData.js";
|
|
2
|
+
import { auditLogsApiUrl, headerNames, iotManagerBaseURL, ssoIdpApiUrlv1, tenantadmApiUrlv1, tenantadmApiUrlv2 } from "@northern.tech/utils/constants";
|
|
3
|
+
import { HttpResponse, http } from "msw";
|
|
4
|
+
//#region src/requestHandlers/organizationHandlers.ts
|
|
5
|
+
const PLANS = {
|
|
6
|
+
os: {
|
|
7
|
+
id: "os",
|
|
8
|
+
name: "Basic"
|
|
9
|
+
},
|
|
10
|
+
professional: {
|
|
11
|
+
id: "professional",
|
|
12
|
+
name: "Professional"
|
|
13
|
+
},
|
|
14
|
+
enterprise: {
|
|
15
|
+
id: "enterprise",
|
|
16
|
+
name: "Enterprise"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const releasesSample = {
|
|
20
|
+
lts: ["3.3"],
|
|
21
|
+
releases: {
|
|
22
|
+
"3.2": {
|
|
23
|
+
"3.2.1": {
|
|
24
|
+
release_date: "2022-02-02",
|
|
25
|
+
release: "3.2.1",
|
|
26
|
+
repos: [
|
|
27
|
+
{
|
|
28
|
+
name: "integration",
|
|
29
|
+
version: "1.2.3"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "mender",
|
|
33
|
+
version: "3.2.1"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "mender-artifact",
|
|
37
|
+
version: "1.3.7"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "service",
|
|
41
|
+
version: "3.0.0"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "other-service",
|
|
45
|
+
version: "1.1.0"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"3.2.0": {
|
|
50
|
+
release_date: "2022-01-24",
|
|
51
|
+
release: "3.2.0",
|
|
52
|
+
repos: [{
|
|
53
|
+
name: "service",
|
|
54
|
+
version: "3.0.0"
|
|
55
|
+
}, {
|
|
56
|
+
name: "another-service",
|
|
57
|
+
version: "4.1.0"
|
|
58
|
+
}]
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"2.7": { "2.7.2": {
|
|
62
|
+
release_date: "2021-11-04",
|
|
63
|
+
release: "2.7.2",
|
|
64
|
+
repos: [{
|
|
65
|
+
name: "service",
|
|
66
|
+
version: "1.1.0"
|
|
67
|
+
}, {
|
|
68
|
+
name: "more-service",
|
|
69
|
+
version: "1.0.2"
|
|
70
|
+
}]
|
|
71
|
+
} },
|
|
72
|
+
"1.0": {
|
|
73
|
+
supported_until: "2018-02",
|
|
74
|
+
"1.0.1": {
|
|
75
|
+
release_date: "2017-04-03",
|
|
76
|
+
release: "1.0.1",
|
|
77
|
+
repos: [{
|
|
78
|
+
name: "service",
|
|
79
|
+
version: "1.0.1"
|
|
80
|
+
}]
|
|
81
|
+
},
|
|
82
|
+
"1.0.0": {
|
|
83
|
+
release_date: "2017-02-16",
|
|
84
|
+
release: "1.0.0",
|
|
85
|
+
repos: [{
|
|
86
|
+
name: "mono-service",
|
|
87
|
+
version: "1.0.0"
|
|
88
|
+
}]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
saas: [
|
|
93
|
+
{
|
|
94
|
+
tag: "saas-v2022.03.10",
|
|
95
|
+
date: "2022-03-09"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
tag: "saas-v2020.09.25",
|
|
99
|
+
date: "2020-09-24"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
tag: "saas-v2020.07.09",
|
|
103
|
+
date: "2020-07-09"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
};
|
|
107
|
+
const tagsSample = [{
|
|
108
|
+
name: "saas-v2023.05.02",
|
|
109
|
+
more: "here"
|
|
110
|
+
}];
|
|
111
|
+
const signupHandler = async ({ request }) => {
|
|
112
|
+
const signup = await request.json();
|
|
113
|
+
if ([
|
|
114
|
+
"email",
|
|
115
|
+
"organization",
|
|
116
|
+
"plan",
|
|
117
|
+
"tos"
|
|
118
|
+
].every((item) => !!signup[item])) return HttpResponse.text("test");
|
|
119
|
+
return new HttpResponse(null, { status: 400 });
|
|
120
|
+
};
|
|
121
|
+
const invoicePreviewBasic = {
|
|
122
|
+
id: "upcoming_in_1RlAkbFlFfXikjZVOHK5VQx0",
|
|
123
|
+
period_start: "2025-07-15T15:25:22Z",
|
|
124
|
+
period_end: "2025-08-15T15:25:22Z",
|
|
125
|
+
total: 3200,
|
|
126
|
+
currency: "usd",
|
|
127
|
+
lines: [{
|
|
128
|
+
description: "50 device × Mender Basic (Tier 1 at $0.00 / month)",
|
|
129
|
+
amount: 0,
|
|
130
|
+
currency: "usd",
|
|
131
|
+
product: "mender_standard",
|
|
132
|
+
quantity: 50,
|
|
133
|
+
price_id: "price_1PYktlFlFfXikjZVh2aNHp7i"
|
|
134
|
+
}, {
|
|
135
|
+
description: "Mender Basic (Tier 1 at $32.00 / month)",
|
|
136
|
+
amount: 3200,
|
|
137
|
+
currency: "usd",
|
|
138
|
+
product: "mender_standard",
|
|
139
|
+
quantity: 0,
|
|
140
|
+
price_id: "price_1PYktlFlFfXikjZVh2aNHp7i"
|
|
141
|
+
}]
|
|
142
|
+
};
|
|
143
|
+
const subscriptionBasic = {
|
|
144
|
+
id: "sub_1RlAjOFlFfXikjZVj5BvpJE4",
|
|
145
|
+
status: "active",
|
|
146
|
+
plan: "os",
|
|
147
|
+
products: [{
|
|
148
|
+
name: "mender_standard",
|
|
149
|
+
quantity: 50
|
|
150
|
+
}]
|
|
151
|
+
};
|
|
152
|
+
const organizationHandlers = [
|
|
153
|
+
http.get("/tags.json", () => HttpResponse.json(tagsSample)),
|
|
154
|
+
http.get("/versions.json", () => HttpResponse.json(releasesSample)),
|
|
155
|
+
http.get(`${tenantadmApiUrlv1}/user/tenant`, () => HttpResponse.json(mockApiResponses.organization.organization)),
|
|
156
|
+
http.put(`${tenantadmApiUrlv2}/tenants/:tenantId/child`, () => new HttpResponse(null, { status: 200 })),
|
|
157
|
+
http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/cancel`, () => new HttpResponse(null, { status: 200 })),
|
|
158
|
+
http.post(`${tenantadmApiUrlv2}/tenants/trial`, signupHandler),
|
|
159
|
+
http.post(`${tenantadmApiUrlv2}/tenants`, async ({ request }) => {
|
|
160
|
+
const { users } = await request.json();
|
|
161
|
+
const { email } = users[0];
|
|
162
|
+
if (email.includes("bad")) return new HttpResponse(null, { status: 553 });
|
|
163
|
+
return new HttpResponse(null, { status: 200 });
|
|
164
|
+
}),
|
|
165
|
+
http.post(`https://hosted.mender.io${tenantadmApiUrlv2}/tenants/trial`, signupHandler),
|
|
166
|
+
http.get(`${tenantadmApiUrlv2}/tenants`, () => HttpResponse.json(tenants)),
|
|
167
|
+
http.get(`${tenantadmApiUrlv2}/billing`, () => HttpResponse.json({ card: {
|
|
168
|
+
last4: "7890",
|
|
169
|
+
exp_month: 1,
|
|
170
|
+
exp_year: 2024,
|
|
171
|
+
brand: "testCorp"
|
|
172
|
+
} })),
|
|
173
|
+
http.get(`${tenantadmApiUrlv2}/billing/profile`, () => HttpResponse.json({
|
|
174
|
+
name: "company",
|
|
175
|
+
email: "test@test.com",
|
|
176
|
+
address: {
|
|
177
|
+
state: "OSLO",
|
|
178
|
+
line1: "Blindern",
|
|
179
|
+
country: "NO",
|
|
180
|
+
city: "OSLO",
|
|
181
|
+
postal_code: "0123"
|
|
182
|
+
},
|
|
183
|
+
shipping: { address: {
|
|
184
|
+
state: "OSLO",
|
|
185
|
+
line1: "Blindern",
|
|
186
|
+
country: "NO",
|
|
187
|
+
city: "OSLO",
|
|
188
|
+
postal_code: "0123"
|
|
189
|
+
} }
|
|
190
|
+
})),
|
|
191
|
+
http.post(`${tenantadmApiUrlv2}/billing/card`, () => HttpResponse.json({
|
|
192
|
+
intent_id: mockApiResponses.organization.intentId,
|
|
193
|
+
secret: "testSecret"
|
|
194
|
+
})),
|
|
195
|
+
http.post(`${tenantadmApiUrlv2}/billing/card/:intentId/confirm`, ({ params: { intentId } }) => new HttpResponse(null, { status: intentId == mockApiResponses.organization.intentId ? 200 : 540 })),
|
|
196
|
+
http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/upgrade/:status`, async ({ params: { status, tenantId }, request }) => {
|
|
197
|
+
if (tenantId != mockApiResponses.organization.organization.id || ![
|
|
198
|
+
"cancel",
|
|
199
|
+
"complete",
|
|
200
|
+
"start"
|
|
201
|
+
].includes(status)) return new HttpResponse(null, { status: 541 });
|
|
202
|
+
if (status === "start") return HttpResponse.json({ secret: "testSecret" });
|
|
203
|
+
let plan;
|
|
204
|
+
try {
|
|
205
|
+
plan = (await request.json()).plan;
|
|
206
|
+
} catch {}
|
|
207
|
+
if (plan && !Object.keys(PLANS).includes(plan)) return new HttpResponse(null, { status: 542 });
|
|
208
|
+
return new HttpResponse(null, { status: 200 });
|
|
209
|
+
}),
|
|
210
|
+
http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/plan`, async ({ params: { tenantId }, request }) => {
|
|
211
|
+
const body = await request.json();
|
|
212
|
+
const expectedKeys = [
|
|
213
|
+
"current_plan",
|
|
214
|
+
"requested_plan",
|
|
215
|
+
"current_addons",
|
|
216
|
+
"requested_addons",
|
|
217
|
+
"user_message"
|
|
218
|
+
];
|
|
219
|
+
if (tenantId != mockApiResponses.organization.organization.id || !Object.keys(body).every((key) => expectedKeys.includes(key))) return new HttpResponse(null, { status: 544 });
|
|
220
|
+
if (body.requested_plan && !Object.values(PLANS).some((item) => item.name === body.requested_plan)) return new HttpResponse(null, { status: 545 });
|
|
221
|
+
return new HttpResponse(null, { status: 200 });
|
|
222
|
+
}),
|
|
223
|
+
http.post(`${tenantadmApiUrlv2}/contact/support`, async ({ request }) => {
|
|
224
|
+
const { subject, body } = await request.json();
|
|
225
|
+
if (!(subject && body)) return new HttpResponse(null, { status: 543 });
|
|
226
|
+
return new HttpResponse(null, { status: 200 });
|
|
227
|
+
}),
|
|
228
|
+
http.patch(`${tenantadmApiUrlv2}/billing/profile`, () => new HttpResponse(null, { status: 200 })),
|
|
229
|
+
http.post(`${tenantadmApiUrlv2}/billing/profile`, () => new HttpResponse(null, { status: 200 })),
|
|
230
|
+
http.post(`${tenantadmApiUrlv2}/billing/subscription`, () => new HttpResponse(null, { status: 202 })),
|
|
231
|
+
http.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, () => HttpResponse.json(invoicePreviewBasic)),
|
|
232
|
+
http.get(`${tenantadmApiUrlv2}/billing/subscription`, () => HttpResponse.json(subscriptionBasic)),
|
|
233
|
+
http.get(`${tenantadmApiUrlv2}/billing/products`, () => HttpResponse.json(mockApiResponses.organization.products)),
|
|
234
|
+
http.get(`${auditLogsApiUrl}/logs`, ({ request }) => {
|
|
235
|
+
const { searchParams } = new URL(request.url);
|
|
236
|
+
if (Number(searchParams.get("per_page")) === 500) return HttpResponse.json([{
|
|
237
|
+
meta: mockApiResponses.organization.auditlog.events[2].meta,
|
|
238
|
+
time: mockApiResponses.organization.auditlog.events[1].time,
|
|
239
|
+
action: "close_terminal"
|
|
240
|
+
}]);
|
|
241
|
+
return new HttpResponse(JSON.stringify(mockApiResponses.organization.auditlog.events), { headers: { [headerNames.total]: mockApiResponses.organization.auditlog.events.length } });
|
|
242
|
+
}),
|
|
243
|
+
http.get(`${auditLogsApiUrl}/logs/export`, () => HttpResponse.text(`action,actor.id,actor.type,actor.email,actor.identity_data,object.id,object.type,object.user.email,object.deployment.name,object.deployment.artifact_name,change
|
|
244
|
+
update,5c56c2ed-2a9a-5de9-bb86-cf38b3d4a5e1,user,test@example.coim,,067f23a9-76a5-5585-b119-32402a120978,user,test@example.com,,,"Update user 067f23a9-76a5-5585-b119-32402a120978 (test@example.com).
|
|
245
|
+
Diff:
|
|
246
|
+
--- Original
|
|
247
|
+
+++ Current
|
|
248
|
+
@@ -9 +9,2 @@
|
|
249
|
+
- ""RBAC_ROLE_OBSERVER""
|
|
250
|
+
+ ""RBAC_ROLE_OBSERVER"",
|
|
251
|
+
+ ""RBAC_ROLE_PERMIT_ALL""
|
|
252
|
+
"
|
|
253
|
+
`)),
|
|
254
|
+
http.get(`${iotManagerBaseURL}/integrations`, () => HttpResponse.json([{
|
|
255
|
+
connection_string: "something_else",
|
|
256
|
+
id: 1,
|
|
257
|
+
provider: "iot-hub"
|
|
258
|
+
}, {
|
|
259
|
+
id: 2,
|
|
260
|
+
provider: "iot-core",
|
|
261
|
+
something: "new"
|
|
262
|
+
}])),
|
|
263
|
+
http.post(`${iotManagerBaseURL}/integrations`, () => HttpResponse.json([{
|
|
264
|
+
connection_string: "something_else",
|
|
265
|
+
provider: "iot-hub"
|
|
266
|
+
}])),
|
|
267
|
+
http.put(`${iotManagerBaseURL}/integrations/:integrationId`, ({ params: { integrationId } }) => {
|
|
268
|
+
if (!integrationId) return new HttpResponse(null, { status: 547 });
|
|
269
|
+
return new HttpResponse(null, { status: 200 });
|
|
270
|
+
}),
|
|
271
|
+
http.put(`${iotManagerBaseURL}/integrations/:integrationId/credentials`, ({ params: { integrationId } }) => {
|
|
272
|
+
if (!integrationId) return new HttpResponse(null, { status: 548 });
|
|
273
|
+
return new HttpResponse(null, { status: 200 });
|
|
274
|
+
}),
|
|
275
|
+
http.delete(`${iotManagerBaseURL}/integrations/:integrationId`, ({ params: { integrationId } }) => {
|
|
276
|
+
if (!integrationId) return new HttpResponse(null, { status: 549 });
|
|
277
|
+
return new HttpResponse(null, { status: 200 });
|
|
278
|
+
}),
|
|
279
|
+
http.get(`${iotManagerBaseURL}/events`, ({ request }) => {
|
|
280
|
+
const { searchParams } = new URL(request.url);
|
|
281
|
+
const page = Number(searchParams.get("page"));
|
|
282
|
+
const perPage = Number(searchParams.get("per_page"));
|
|
283
|
+
return HttpResponse.json(webhookEvents.slice(page - 1, page * perPage));
|
|
284
|
+
}),
|
|
285
|
+
http.get(ssoIdpApiUrlv1, () => HttpResponse.json([{
|
|
286
|
+
id: "1",
|
|
287
|
+
issuer: "https://samltest.id/saml/idp",
|
|
288
|
+
valid_until: "2038-08-24T21:14:09Z"
|
|
289
|
+
}, {
|
|
290
|
+
id: "2",
|
|
291
|
+
issuer: "https://samltest2.id/saml/idp",
|
|
292
|
+
valid_until: "2030-10-24T21:14:09Z"
|
|
293
|
+
}])),
|
|
294
|
+
http.post(ssoIdpApiUrlv1, () => new HttpResponse(null, { status: 200 })),
|
|
295
|
+
http.get(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => {
|
|
296
|
+
if (!configId) return new HttpResponse(null, { status: 550 });
|
|
297
|
+
return HttpResponse.json({
|
|
298
|
+
email: "user@acme.com",
|
|
299
|
+
password: "mypass1234",
|
|
300
|
+
login: { google: "bob@gmail.com" },
|
|
301
|
+
config: "<div>not quite right</div>"
|
|
302
|
+
});
|
|
303
|
+
}),
|
|
304
|
+
http.put(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => new HttpResponse(null, { status: configId ? 200 : 551 })),
|
|
305
|
+
http.delete(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => new HttpResponse(null, { status: configId ? 200 : 552 }))
|
|
306
|
+
];
|
|
307
|
+
//#endregion
|
|
308
|
+
export { organizationHandlers };
|
|
309
|
+
|
|
310
|
+
//# sourceMappingURL=organizationHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organizationHandlers.js","names":[],"sources":["../../src/requestHandlers/organizationHandlers.ts"],"sourcesContent":["// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport { auditLogsApiUrl, headerNames, iotManagerBaseURL, ssoIdpApiUrlv1, tenantadmApiUrlv1, tenantadmApiUrlv2 } from '@northern.tech/utils/constants';\nimport { HttpResponse, http } from 'msw';\n\nimport { mockApiResponses, tenants, webhookEvents } from '../mockData';\n\nconst PLANS = {\n os: { id: 'os', name: 'Basic' },\n professional: { id: 'professional', name: 'Professional' },\n enterprise: { id: 'enterprise', name: 'Enterprise' }\n};\n\nconst releasesSample = {\n lts: ['3.3'],\n releases: {\n '3.2': {\n '3.2.1': {\n release_date: '2022-02-02',\n release: '3.2.1',\n repos: [\n { name: 'integration', version: '1.2.3' },\n { name: 'mender', version: '3.2.1' },\n { name: 'mender-artifact', version: '1.3.7' },\n { name: 'service', version: '3.0.0' },\n { name: 'other-service', version: '1.1.0' }\n ]\n },\n '3.2.0': {\n release_date: '2022-01-24',\n release: '3.2.0',\n repos: [\n { name: 'service', version: '3.0.0' },\n { name: 'another-service', version: '4.1.0' }\n ]\n }\n },\n '2.7': {\n '2.7.2': {\n release_date: '2021-11-04',\n release: '2.7.2',\n repos: [\n { name: 'service', version: '1.1.0' },\n { name: 'more-service', version: '1.0.2' }\n ]\n }\n },\n '1.0': {\n supported_until: '2018-02',\n '1.0.1': {\n release_date: '2017-04-03',\n release: '1.0.1',\n repos: [{ name: 'service', version: '1.0.1' }]\n },\n '1.0.0': {\n release_date: '2017-02-16',\n release: '1.0.0',\n repos: [{ name: 'mono-service', version: '1.0.0' }]\n }\n }\n },\n saas: [\n { tag: 'saas-v2022.03.10', date: '2022-03-09' },\n { tag: 'saas-v2020.09.25', date: '2020-09-24' },\n { tag: 'saas-v2020.07.09', date: '2020-07-09' }\n ]\n};\n\nconst tagsSample = [{ name: 'saas-v2023.05.02', more: 'here' }];\n\nconst signupHandler = async ({ request }) => {\n const signup = await request.json();\n if (['email', 'organization', 'plan', 'tos'].every(item => !!signup[item])) {\n return HttpResponse.text('test');\n }\n return new HttpResponse(null, { status: 400 });\n};\n\nconst invoicePreviewBasic = {\n id: 'upcoming_in_1RlAkbFlFfXikjZVOHK5VQx0',\n period_start: '2025-07-15T15:25:22Z',\n period_end: '2025-08-15T15:25:22Z',\n total: 3200,\n currency: 'usd',\n lines: [\n {\n description: '50 device × Mender Basic (Tier 1 at $0.00 / month)',\n amount: 0,\n currency: 'usd',\n product: 'mender_standard',\n quantity: 50,\n price_id: 'price_1PYktlFlFfXikjZVh2aNHp7i'\n },\n {\n description: 'Mender Basic (Tier 1 at $32.00 / month)',\n amount: 3200,\n currency: 'usd',\n product: 'mender_standard',\n quantity: 0,\n price_id: 'price_1PYktlFlFfXikjZVh2aNHp7i'\n }\n ]\n};\nconst subscriptionBasic = {\n id: 'sub_1RlAjOFlFfXikjZVj5BvpJE4',\n status: 'active',\n plan: 'os',\n products: [\n {\n name: 'mender_standard',\n quantity: 50\n }\n ]\n};\n\nexport const organizationHandlers = [\n http.get('/tags.json', () => HttpResponse.json(tagsSample)),\n http.get('/versions.json', () => HttpResponse.json(releasesSample)),\n http.get(`${tenantadmApiUrlv1}/user/tenant`, () => HttpResponse.json(mockApiResponses.organization.organization)),\n http.put(`${tenantadmApiUrlv2}/tenants/:tenantId/child`, () => new HttpResponse(null, { status: 200 })),\n http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/cancel`, () => new HttpResponse(null, { status: 200 })),\n http.post(`${tenantadmApiUrlv2}/tenants/trial`, signupHandler),\n http.post(`${tenantadmApiUrlv2}/tenants`, async ({ request }) => {\n const { users } = await request.json();\n const { email } = users[0];\n if (email.includes('bad')) {\n return new HttpResponse(null, { status: 553 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.post(`https://hosted.mender.io${tenantadmApiUrlv2}/tenants/trial`, signupHandler),\n http.get(`${tenantadmApiUrlv2}/tenants`, () => HttpResponse.json(tenants)),\n http.get(`${tenantadmApiUrlv2}/billing`, () => HttpResponse.json({ card: { last4: '7890', exp_month: 1, exp_year: 2024, brand: 'testCorp' } })),\n http.get(`${tenantadmApiUrlv2}/billing/profile`, () =>\n HttpResponse.json({\n name: 'company',\n email: 'test@test.com',\n address: { state: 'OSLO', line1: 'Blindern', country: 'NO', city: 'OSLO', postal_code: '0123' },\n shipping: { address: { state: 'OSLO', line1: 'Blindern', country: 'NO', city: 'OSLO', postal_code: '0123' } }\n })\n ),\n http.post(`${tenantadmApiUrlv2}/billing/card`, () => HttpResponse.json({ intent_id: mockApiResponses.organization.intentId, secret: 'testSecret' })),\n http.post(\n `${tenantadmApiUrlv2}/billing/card/:intentId/confirm`,\n ({ params: { intentId } }) => new HttpResponse(null, { status: intentId == mockApiResponses.organization.intentId ? 200 : 540 })\n ),\n http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/upgrade/:status`, async ({ params: { status, tenantId }, request }) => {\n if (tenantId != mockApiResponses.organization.organization.id || !['cancel', 'complete', 'start'].includes(status)) {\n return new HttpResponse(null, { status: 541 });\n }\n if (status === 'start') {\n return HttpResponse.json({ secret: 'testSecret' });\n }\n let plan;\n try {\n const body = await request.json();\n plan = body.plan;\n } catch {\n // no completion;\n }\n if (plan && !Object.keys(PLANS).includes(plan)) {\n return new HttpResponse(null, { status: 542 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.post(`${tenantadmApiUrlv2}/tenants/:tenantId/plan`, async ({ params: { tenantId }, request }) => {\n const body = await request.json();\n const expectedKeys = ['current_plan', 'requested_plan', 'current_addons', 'requested_addons', 'user_message'];\n if (tenantId != mockApiResponses.organization.organization.id || !Object.keys(body).every(key => expectedKeys.includes(key))) {\n return new HttpResponse(null, { status: 544 });\n }\n if (body.requested_plan && !Object.values(PLANS).some(item => item.name === body.requested_plan)) {\n return new HttpResponse(null, { status: 545 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.post(`${tenantadmApiUrlv2}/contact/support`, async ({ request }) => {\n const { subject, body } = await request.json();\n if (!(subject && body)) {\n return new HttpResponse(null, { status: 543 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.patch(`${tenantadmApiUrlv2}/billing/profile`, () => new HttpResponse(null, { status: 200 })),\n http.post(`${tenantadmApiUrlv2}/billing/profile`, () => new HttpResponse(null, { status: 200 })),\n http.post(`${tenantadmApiUrlv2}/billing/subscription`, () => new HttpResponse(null, { status: 202 })),\n http.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, () => HttpResponse.json(invoicePreviewBasic)),\n http.get(`${tenantadmApiUrlv2}/billing/subscription`, () => HttpResponse.json(subscriptionBasic)),\n http.get(`${tenantadmApiUrlv2}/billing/products`, () => HttpResponse.json(mockApiResponses.organization.products)),\n http.get(`${auditLogsApiUrl}/logs`, ({ request }) => {\n const { searchParams } = new URL(request.url);\n const perPage = Number(searchParams.get('per_page'));\n if (perPage === 500) {\n return HttpResponse.json([\n { meta: mockApiResponses.organization.auditlog.events[2].meta, time: mockApiResponses.organization.auditlog.events[1].time, action: 'close_terminal' }\n ]);\n }\n return new HttpResponse(JSON.stringify(mockApiResponses.organization.auditlog.events), {\n headers: { [headerNames.total]: mockApiResponses.organization.auditlog.events.length }\n });\n }),\n http.get(`${auditLogsApiUrl}/logs/export`, () =>\n HttpResponse.text(`action,actor.id,actor.type,actor.email,actor.identity_data,object.id,object.type,object.user.email,object.deployment.name,object.deployment.artifact_name,change\n update,5c56c2ed-2a9a-5de9-bb86-cf38b3d4a5e1,user,test@example.coim,,067f23a9-76a5-5585-b119-32402a120978,user,test@example.com,,,\"Update user 067f23a9-76a5-5585-b119-32402a120978 (test@example.com).\n Diff:\n --- Original\n +++ Current\n @@ -9 +9,2 @@\n - \"\"RBAC_ROLE_OBSERVER\"\"\n + \"\"RBAC_ROLE_OBSERVER\"\",\n + \"\"RBAC_ROLE_PERMIT_ALL\"\"\n \"\n `)\n ),\n http.get(`${iotManagerBaseURL}/integrations`, () =>\n HttpResponse.json([\n { connection_string: 'something_else', id: 1, provider: 'iot-hub' },\n { id: 2, provider: 'iot-core', something: 'new' }\n ])\n ),\n http.post(`${iotManagerBaseURL}/integrations`, () => HttpResponse.json([{ connection_string: 'something_else', provider: 'iot-hub' }])),\n http.put(`${iotManagerBaseURL}/integrations/:integrationId`, ({ params: { integrationId } }) => {\n if (!integrationId) {\n return new HttpResponse(null, { status: 547 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.put(`${iotManagerBaseURL}/integrations/:integrationId/credentials`, ({ params: { integrationId } }) => {\n if (!integrationId) {\n return new HttpResponse(null, { status: 548 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.delete(`${iotManagerBaseURL}/integrations/:integrationId`, ({ params: { integrationId } }) => {\n if (!integrationId) {\n return new HttpResponse(null, { status: 549 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.get(`${iotManagerBaseURL}/events`, ({ request }) => {\n const { searchParams } = new URL(request.url);\n const page = Number(searchParams.get('page'));\n const perPage = Number(searchParams.get('per_page'));\n return HttpResponse.json(webhookEvents.slice(page - 1, page * perPage));\n }),\n http.get(ssoIdpApiUrlv1, () =>\n HttpResponse.json([\n { id: '1', issuer: 'https://samltest.id/saml/idp', valid_until: '2038-08-24T21:14:09Z' },\n { id: '2', issuer: 'https://samltest2.id/saml/idp', valid_until: '2030-10-24T21:14:09Z' }\n ])\n ),\n http.post(ssoIdpApiUrlv1, () => new HttpResponse(null, { status: 200 })),\n http.get(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => {\n if (!configId) {\n return new HttpResponse(null, { status: 550 });\n }\n return HttpResponse.json({ email: 'user@acme.com', password: 'mypass1234', login: { google: 'bob@gmail.com' }, config: '<div>not quite right</div>' });\n }),\n http.put(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => new HttpResponse(null, { status: configId ? 200 : 551 })),\n http.delete(`${ssoIdpApiUrlv1}/:configId`, ({ params: { configId } }) => new HttpResponse(null, { status: configId ? 200 : 552 }))\n];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_mockData = require("../mockData.cjs");
|
|
3
|
+
require("../setupTests.cjs");
|
|
4
|
+
let _northern_tech_utils_constants = require("@northern.tech/utils/constants");
|
|
5
|
+
let _northern_tech_utils_helpers = require("@northern.tech/utils/helpers");
|
|
6
|
+
let msw = require("msw");
|
|
7
|
+
//#region src/requestHandlers/releaseHandlers.ts
|
|
8
|
+
const deltaJobs = {
|
|
9
|
+
"delta-job-1": {
|
|
10
|
+
id: "delta-job-1",
|
|
11
|
+
to_release: "mender-demo-artifact-3.3.1",
|
|
12
|
+
from_release: "mender-demo-artifact-3.2.1",
|
|
13
|
+
to_version: "mender-demo-artifact-3.3.1",
|
|
14
|
+
from_version: "mender-demo-artifact-3.2.1",
|
|
15
|
+
device_types_compatible: ["qemux86-64"],
|
|
16
|
+
started: "2022-07-11T20:49:00.000Z",
|
|
17
|
+
status: "success"
|
|
18
|
+
},
|
|
19
|
+
"delta-job-2": {
|
|
20
|
+
id: "delta-job-2",
|
|
21
|
+
to_release: "mender-demo-artifact-3.3.1",
|
|
22
|
+
from_release: "mender-demo-artifact-3.3.0",
|
|
23
|
+
to_version: "mender-demo-artifact-3.3.1",
|
|
24
|
+
from_version: "mender-demo-artifact-3.3.0",
|
|
25
|
+
device_types_compatible: [
|
|
26
|
+
"raspberrypi0w",
|
|
27
|
+
"raspberrypi0-wifi",
|
|
28
|
+
"raspberrypi3",
|
|
29
|
+
"raspberrypi4"
|
|
30
|
+
],
|
|
31
|
+
started: "2022-07-11T20:49:00.000Z",
|
|
32
|
+
status: "failed"
|
|
33
|
+
},
|
|
34
|
+
"delta-job-3": {
|
|
35
|
+
id: "delta-job-3",
|
|
36
|
+
to_release: "mender-demo-artifact-3.3.1",
|
|
37
|
+
from_release: "mender-demo-artifact-3.3.0",
|
|
38
|
+
to_version: "mender-demo-artifact-3.3.1",
|
|
39
|
+
from_version: "mender-demo-artifact-3.3.0",
|
|
40
|
+
device_types_compatible: [
|
|
41
|
+
"beaglebone",
|
|
42
|
+
"beaglebone-yocto",
|
|
43
|
+
"beaglebone-yocto"
|
|
44
|
+
],
|
|
45
|
+
started: "2022-07-11T20:49:00.000Z",
|
|
46
|
+
status: "pending"
|
|
47
|
+
},
|
|
48
|
+
"delta-job-4": {
|
|
49
|
+
id: "delta-job-4",
|
|
50
|
+
to_release: "mender-demo-artifact-3.2.0",
|
|
51
|
+
from_release: "mender-demo-artifact-3.1.0",
|
|
52
|
+
to_version: "mender-demo-artifact-3.2.0",
|
|
53
|
+
from_version: "mender-demo-artifact-3.1.0",
|
|
54
|
+
device_types_compatible: ["qemux86-64"],
|
|
55
|
+
started: "2022-07-10T15:30:00.000Z",
|
|
56
|
+
status: "artifact_uploaded"
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const mockDeltaJobDetails = {
|
|
60
|
+
"delta-job-1": {
|
|
61
|
+
...deltaJobs["delta-job-1"],
|
|
62
|
+
delta_artifact_size: 1024e3,
|
|
63
|
+
deployment_id: "d1",
|
|
64
|
+
devices_types_compatible: ["qemux86-64"],
|
|
65
|
+
exit_code: 0,
|
|
66
|
+
log: "Delta generation started at 2022-07-11T20:49:00.000Z\nProcessing artifacts...\nDelta generation completed successfully at 2022-07-11T20:52:15.000Z",
|
|
67
|
+
to_artifact_size: 2048e3
|
|
68
|
+
},
|
|
69
|
+
"delta-job-2": {
|
|
70
|
+
...deltaJobs["delta-job-2"],
|
|
71
|
+
delta_artifact_size: null,
|
|
72
|
+
deployment_id: "d2",
|
|
73
|
+
devices_types_compatible: [
|
|
74
|
+
"raspberrypi0w",
|
|
75
|
+
"raspberrypi0-wifi",
|
|
76
|
+
"raspberrypi3",
|
|
77
|
+
"raspberrypi4"
|
|
78
|
+
],
|
|
79
|
+
exit_code: 1,
|
|
80
|
+
log: "Delta generation started at 2022-07-11T20:49:00.000Z\nError: incompatible artifact types\nDelta generation failed at 2022-07-11T20:51:30.000Z",
|
|
81
|
+
to_artifact_size: 3072e3
|
|
82
|
+
},
|
|
83
|
+
"delta-job-3": {
|
|
84
|
+
...deltaJobs["delta-job-3"],
|
|
85
|
+
delta_artifact_size: null,
|
|
86
|
+
deployment_id: "d3",
|
|
87
|
+
devices_types_compatible: ["beaglebone", "beaglebone-yocto"],
|
|
88
|
+
exit_code: null,
|
|
89
|
+
log: "Delta generation started at 2022-07-11T20:49:00.000Z\nQueued for processing...",
|
|
90
|
+
to_artifact_size: 256e4
|
|
91
|
+
},
|
|
92
|
+
"delta-job-4": {
|
|
93
|
+
...deltaJobs["delta-job-4"],
|
|
94
|
+
delta_artifact_size: 512e3,
|
|
95
|
+
deployment_id: "d1",
|
|
96
|
+
devices_types_compatible: ["qemux86-64"],
|
|
97
|
+
exit_code: 0,
|
|
98
|
+
log: "Delta generation started at 2022-07-10T15:30:00.000Z\nProcessing artifacts...\nArtifact uploaded successfully at 2022-07-10T15:45:20.000Z",
|
|
99
|
+
to_artifact_size: 1536e3
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const releaseHandlers = [
|
|
103
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/:id`, () => new msw.HttpResponse(null, { status: 200 })),
|
|
104
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/:id/download`, () => msw.HttpResponse.json({ uri: "https://testlocation.com/artifact.mender" })),
|
|
105
|
+
msw.http.delete(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/:id`, ({ params: { id } }) => new msw.HttpResponse(null, { status: id === require_mockData.mockApiResponses.releases.byId.r1.artifacts[0].id ? 200 : 591 })),
|
|
106
|
+
msw.http.put(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/:id`, async ({ params: { id }, request }) => {
|
|
107
|
+
const { description } = await request.json();
|
|
108
|
+
return new msw.HttpResponse(null, { status: id === require_mockData.mockApiResponses.releases.byId.r1.artifacts[0].id && description ? 200 : 592 });
|
|
109
|
+
}),
|
|
110
|
+
msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/generate`, () => new msw.HttpResponse(null, { headers: {
|
|
111
|
+
[_northern_tech_utils_constants.headerNames.location]: `${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts/generate/${require_mockData.mockApiResponses.releases.byId.r1.artifacts[0].id}`,
|
|
112
|
+
status: 201
|
|
113
|
+
} })),
|
|
114
|
+
msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrl}/artifacts`, () => new msw.HttpResponse(null, { status: 200 })),
|
|
115
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases`, async ({ request }) => {
|
|
116
|
+
const { searchParams } = new URL(request.url);
|
|
117
|
+
const page = Number(searchParams.get("page"));
|
|
118
|
+
const perPage = Number(searchParams.get("per_page"));
|
|
119
|
+
if (!page || ![
|
|
120
|
+
1,
|
|
121
|
+
10,
|
|
122
|
+
20,
|
|
123
|
+
50,
|
|
124
|
+
100,
|
|
125
|
+
250,
|
|
126
|
+
500
|
|
127
|
+
].includes(perPage)) return new msw.HttpResponse(null, { status: 593 });
|
|
128
|
+
if (searchParams.get("device_type")) return msw.HttpResponse.json([]);
|
|
129
|
+
if (page == 42) return new msw.HttpResponse(JSON.stringify([require_mockData.mockApiResponses.releases.byId.r1]), { headers: { [_northern_tech_utils_constants.headerNames.total]: 1 } });
|
|
130
|
+
const sort = searchParams.get("sort");
|
|
131
|
+
const releaseListSection = require_mockData.releasesList.sort((0, _northern_tech_utils_helpers.customSort)(sort.includes(_northern_tech_utils_constants.SORTING_OPTIONS.desc), "name")).slice((page - 1) * perPage, page * perPage);
|
|
132
|
+
if (page === 1 && perPage === 1 && searchParams.get("name")) return msw.HttpResponse.json([require_mockData.mockApiResponses.releases.byId.r1]);
|
|
133
|
+
if (searchParams.get("name")) return new msw.HttpResponse(JSON.stringify(releaseListSection), { headers: { [_northern_tech_utils_constants.headerNames.total]: 1234 } });
|
|
134
|
+
return new msw.HttpResponse(JSON.stringify(releaseListSection), { headers: { [_northern_tech_utils_constants.headerNames.total]: require_mockData.releasesList.length } });
|
|
135
|
+
}),
|
|
136
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases/:name`, () => msw.HttpResponse.json(require_mockData.mockApiResponses.releases.byId.r1)),
|
|
137
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/releases/all/tags`, () => msw.HttpResponse.json(["foo", "bar"])),
|
|
138
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/releases/all/types`, () => msw.HttpResponse.json(["single-file", "not-this"])),
|
|
139
|
+
msw.http.put(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases/:name/tags`, async ({ params: { name }, request }) => {
|
|
140
|
+
const tags = await request.json();
|
|
141
|
+
if (name && tags.every((i) => i && i.toString() === i)) return new msw.HttpResponse(null, { status: 200 });
|
|
142
|
+
return new msw.HttpResponse(null, { status: 593 });
|
|
143
|
+
}),
|
|
144
|
+
msw.http.patch(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases/:name`, async ({ params: { name }, request }) => {
|
|
145
|
+
const { notes } = await request.json();
|
|
146
|
+
return new msw.HttpResponse(null, { status: name && notes.length ? 200 : 594 });
|
|
147
|
+
}),
|
|
148
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases/delta/jobs`, () => {
|
|
149
|
+
const jobs = Object.values(deltaJobs);
|
|
150
|
+
return new msw.HttpResponse(JSON.stringify(jobs), { headers: { [_northern_tech_utils_constants.headerNames.total]: jobs.length } });
|
|
151
|
+
}),
|
|
152
|
+
msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments/releases/delta/jobs/:jobId`, ({ params: { jobId } }) => {
|
|
153
|
+
const jobDetails = mockDeltaJobDetails[jobId];
|
|
154
|
+
if (jobDetails) return msw.HttpResponse.json(jobDetails);
|
|
155
|
+
return new msw.HttpResponse(null, { status: 404 });
|
|
156
|
+
})
|
|
157
|
+
];
|
|
158
|
+
//#endregion
|
|
159
|
+
exports.releaseHandlers = releaseHandlers;
|
|
160
|
+
|
|
161
|
+
//# sourceMappingURL=releaseHandlers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseHandlers.cjs","names":["http","deploymentsApiUrl","HttpResponse","mockApiResponses","headerNames","deploymentsApiUrlV2","releasesList","SORTING_OPTIONS"],"sources":["../../src/requestHandlers/releaseHandlers.ts"],"sourcesContent":["// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//@ts-nocheck\nimport { SORTING_OPTIONS, deploymentsApiUrl, deploymentsApiUrlV2, headerNames } from '@northern.tech/utils/constants';\nimport { customSort } from '@northern.tech/utils/helpers';\nimport { HttpResponse, http } from 'msw';\n\nimport { mockApiResponses, releasesList } from '../mockData';\n\nconst deltaJobs = {\n 'delta-job-1': {\n id: 'delta-job-1',\n to_release: 'mender-demo-artifact-3.3.1',\n from_release: 'mender-demo-artifact-3.2.1',\n to_version: 'mender-demo-artifact-3.3.1',\n from_version: 'mender-demo-artifact-3.2.1',\n device_types_compatible: ['qemux86-64'],\n started: '2022-07-11T20:49:00.000Z',\n status: 'success'\n },\n 'delta-job-2': {\n id: 'delta-job-2',\n to_release: 'mender-demo-artifact-3.3.1',\n from_release: 'mender-demo-artifact-3.3.0',\n to_version: 'mender-demo-artifact-3.3.1',\n from_version: 'mender-demo-artifact-3.3.0',\n device_types_compatible: ['raspberrypi0w', 'raspberrypi0-wifi', 'raspberrypi3', 'raspberrypi4'],\n started: '2022-07-11T20:49:00.000Z',\n status: 'failed'\n },\n 'delta-job-3': {\n id: 'delta-job-3',\n to_release: 'mender-demo-artifact-3.3.1',\n from_release: 'mender-demo-artifact-3.3.0',\n to_version: 'mender-demo-artifact-3.3.1',\n from_version: 'mender-demo-artifact-3.3.0',\n device_types_compatible: ['beaglebone', 'beaglebone-yocto', 'beaglebone-yocto'],\n started: '2022-07-11T20:49:00.000Z',\n status: 'pending'\n },\n 'delta-job-4': {\n id: 'delta-job-4',\n to_release: 'mender-demo-artifact-3.2.0',\n from_release: 'mender-demo-artifact-3.1.0',\n to_version: 'mender-demo-artifact-3.2.0',\n from_version: 'mender-demo-artifact-3.1.0',\n device_types_compatible: ['qemux86-64'],\n started: '2022-07-10T15:30:00.000Z',\n status: 'artifact_uploaded'\n }\n};\n\nconst mockDeltaJobDetails = {\n 'delta-job-1': {\n ...deltaJobs['delta-job-1'],\n delta_artifact_size: 1024000,\n deployment_id: 'd1',\n devices_types_compatible: ['qemux86-64'],\n exit_code: 0,\n log: 'Delta generation started at 2022-07-11T20:49:00.000Z\\nProcessing artifacts...\\nDelta generation completed successfully at 2022-07-11T20:52:15.000Z',\n to_artifact_size: 2048000\n },\n 'delta-job-2': {\n ...deltaJobs['delta-job-2'],\n delta_artifact_size: null,\n deployment_id: 'd2',\n devices_types_compatible: ['raspberrypi0w', 'raspberrypi0-wifi', 'raspberrypi3', 'raspberrypi4'],\n exit_code: 1,\n log: 'Delta generation started at 2022-07-11T20:49:00.000Z\\nError: incompatible artifact types\\nDelta generation failed at 2022-07-11T20:51:30.000Z',\n to_artifact_size: 3072000\n },\n 'delta-job-3': {\n ...deltaJobs['delta-job-3'],\n delta_artifact_size: null,\n deployment_id: 'd3',\n devices_types_compatible: ['beaglebone', 'beaglebone-yocto'],\n exit_code: null,\n log: 'Delta generation started at 2022-07-11T20:49:00.000Z\\nQueued for processing...',\n to_artifact_size: 2560000\n },\n 'delta-job-4': {\n ...deltaJobs['delta-job-4'],\n delta_artifact_size: 512000,\n deployment_id: 'd1',\n devices_types_compatible: ['qemux86-64'],\n exit_code: 0,\n log: 'Delta generation started at 2022-07-10T15:30:00.000Z\\nProcessing artifacts...\\nArtifact uploaded successfully at 2022-07-10T15:45:20.000Z',\n to_artifact_size: 1536000\n }\n};\n\nexport const releaseHandlers = [\n http.get(`${deploymentsApiUrl}/artifacts/:id`, () => new HttpResponse(null, { status: 200 })),\n http.get(`${deploymentsApiUrl}/artifacts/:id/download`, () => HttpResponse.json({ uri: 'https://testlocation.com/artifact.mender' })),\n http.delete(\n `${deploymentsApiUrl}/artifacts/:id`,\n ({ params: { id } }) => new HttpResponse(null, { status: id === mockApiResponses.releases.byId.r1.artifacts[0].id ? 200 : 591 })\n ),\n http.put(`${deploymentsApiUrl}/artifacts/:id`, async ({ params: { id }, request }) => {\n const { description } = await request.json();\n return new HttpResponse(null, { status: id === mockApiResponses.releases.byId.r1.artifacts[0].id && description ? 200 : 592 });\n }),\n http.post(\n `${deploymentsApiUrl}/artifacts/generate`,\n () =>\n new HttpResponse(null, {\n headers: { [headerNames.location]: `${deploymentsApiUrl}/artifacts/generate/${mockApiResponses.releases.byId.r1.artifacts[0].id}`, status: 201 }\n })\n ),\n http.post(`${deploymentsApiUrl}/artifacts`, () => new HttpResponse(null, { status: 200 })),\n http.get(`${deploymentsApiUrlV2}/deployments/releases`, async ({ request }) => {\n const { searchParams } = new URL(request.url);\n const page = Number(searchParams.get('page'));\n const perPage = Number(searchParams.get('per_page'));\n if (!page || ![1, 10, 20, 50, 100, 250, 500].includes(perPage)) {\n return new HttpResponse(null, { status: 593 });\n }\n if (searchParams.get('device_type')) {\n return HttpResponse.json([]);\n }\n if (page == 42) {\n return new HttpResponse(JSON.stringify([mockApiResponses.releases.byId.r1]), { headers: { [headerNames.total]: 1 } });\n }\n const sort = searchParams.get('sort');\n const releaseListSection = releasesList.sort(customSort(sort.includes(SORTING_OPTIONS.desc), 'name')).slice((page - 1) * perPage, page * perPage);\n if (page === 1 && perPage === 1 && searchParams.get('name')) {\n return HttpResponse.json([mockApiResponses.releases.byId.r1]);\n }\n if (searchParams.get('name')) {\n return new HttpResponse(JSON.stringify(releaseListSection), { headers: { [headerNames.total]: 1234 } });\n }\n return new HttpResponse(JSON.stringify(releaseListSection), { headers: { [headerNames.total]: releasesList.length } });\n }),\n http.get(`${deploymentsApiUrlV2}/deployments/releases/:name`, () => HttpResponse.json(mockApiResponses.releases.byId.r1)),\n http.get(`${deploymentsApiUrlV2}/releases/all/tags`, () => HttpResponse.json(['foo', 'bar'])),\n http.get(`${deploymentsApiUrlV2}/releases/all/types`, () => HttpResponse.json(['single-file', 'not-this'])),\n http.put(`${deploymentsApiUrlV2}/deployments/releases/:name/tags`, async ({ params: { name }, request }) => {\n const tags = await request.json();\n if (name && tags.every(i => i && i.toString() === i)) {\n return new HttpResponse(null, { status: 200 });\n }\n return new HttpResponse(null, { status: 593 });\n }),\n http.patch(`${deploymentsApiUrlV2}/deployments/releases/:name`, async ({ params: { name }, request }) => {\n const { notes } = await request.json();\n return new HttpResponse(null, { status: name && notes.length ? 200 : 594 });\n }),\n http.get(`${deploymentsApiUrlV2}/deployments/releases/delta/jobs`, () => {\n const jobs = Object.values(deltaJobs);\n return new HttpResponse(JSON.stringify(jobs), { headers: { [headerNames.total]: jobs.length } });\n }),\n http.get(`${deploymentsApiUrlV2}/deployments/releases/delta/jobs/:jobId`, ({ params: { jobId } }) => {\n const jobDetails = mockDeltaJobDetails[jobId];\n if (jobDetails) {\n return HttpResponse.json(jobDetails);\n }\n return new HttpResponse(null, { status: 404 });\n })\n];\n"],"mappings":"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"}
|