@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.
Files changed (71) hide show
  1. package/dist/mockData.cjs +1302 -0
  2. package/dist/mockData.cjs.map +1 -0
  3. package/dist/mockData.d.cts +662 -0
  4. package/dist/mockData.d.ts +662 -0
  5. package/dist/mockData.js +1280 -0
  6. package/dist/mockData.js.map +1 -0
  7. package/dist/public/baseTestConfig.json +17 -0
  8. package/dist/requestHandlers/deploymentHandlers.cjs +193 -0
  9. package/dist/requestHandlers/deploymentHandlers.cjs.map +1 -0
  10. package/dist/requestHandlers/deploymentHandlers.d.cts +7 -0
  11. package/dist/requestHandlers/deploymentHandlers.d.ts +7 -0
  12. package/dist/requestHandlers/deploymentHandlers.js +191 -0
  13. package/dist/requestHandlers/deploymentHandlers.js.map +1 -0
  14. package/dist/requestHandlers/deviceHandlers.cjs +432 -0
  15. package/dist/requestHandlers/deviceHandlers.cjs.map +1 -0
  16. package/dist/requestHandlers/deviceHandlers.d.cts +22 -0
  17. package/dist/requestHandlers/deviceHandlers.d.ts +22 -0
  18. package/dist/requestHandlers/deviceHandlers.js +428 -0
  19. package/dist/requestHandlers/deviceHandlers.js.map +1 -0
  20. package/dist/requestHandlers/monitorHandlers.cjs +23 -0
  21. package/dist/requestHandlers/monitorHandlers.cjs.map +1 -0
  22. package/dist/requestHandlers/monitorHandlers.d.cts +7 -0
  23. package/dist/requestHandlers/monitorHandlers.d.ts +7 -0
  24. package/dist/requestHandlers/monitorHandlers.js +21 -0
  25. package/dist/requestHandlers/monitorHandlers.js.map +1 -0
  26. package/dist/requestHandlers/organizationHandlers.cjs +312 -0
  27. package/dist/requestHandlers/organizationHandlers.cjs.map +1 -0
  28. package/dist/requestHandlers/organizationHandlers.d.cts +7 -0
  29. package/dist/requestHandlers/organizationHandlers.d.ts +7 -0
  30. package/dist/requestHandlers/organizationHandlers.js +310 -0
  31. package/dist/requestHandlers/organizationHandlers.js.map +1 -0
  32. package/dist/requestHandlers/releaseHandlers.cjs +161 -0
  33. package/dist/requestHandlers/releaseHandlers.cjs.map +1 -0
  34. package/dist/requestHandlers/releaseHandlers.d.cts +7 -0
  35. package/dist/requestHandlers/releaseHandlers.d.ts +7 -0
  36. package/dist/requestHandlers/releaseHandlers.js +159 -0
  37. package/dist/requestHandlers/releaseHandlers.js.map +1 -0
  38. package/dist/requestHandlers/requestHandlers.cjs +28 -0
  39. package/dist/requestHandlers/requestHandlers.cjs.map +1 -0
  40. package/dist/requestHandlers/requestHandlers.d.cts +6 -0
  41. package/dist/requestHandlers/requestHandlers.d.ts +7 -0
  42. package/dist/requestHandlers/requestHandlers.js +27 -0
  43. package/dist/requestHandlers/requestHandlers.js.map +1 -0
  44. package/dist/requestHandlers/userHandlers.cjs +141 -0
  45. package/dist/requestHandlers/userHandlers.cjs.map +1 -0
  46. package/dist/requestHandlers/userHandlers.d.cts +7 -0
  47. package/dist/requestHandlers/userHandlers.d.ts +7 -0
  48. package/dist/requestHandlers/userHandlers.js +139 -0
  49. package/dist/requestHandlers/userHandlers.js.map +1 -0
  50. package/dist/setupTests.cjs +173 -0
  51. package/dist/setupTests.cjs.map +1 -0
  52. package/dist/setupTests.d.cts +79 -0
  53. package/dist/setupTests.d.ts +79 -0
  54. package/dist/setupTests.js +135 -0
  55. package/dist/setupTests.js.map +1 -0
  56. package/dist/theme/light.cjs +9 -0
  57. package/dist/theme/light.cjs.map +1 -0
  58. package/dist/theme/light.d.cts +7 -0
  59. package/dist/theme/light.d.ts +7 -0
  60. package/dist/theme/light.js +8 -0
  61. package/dist/theme/light.js.map +1 -0
  62. package/dist/theme/mui.d.cjs +0 -0
  63. package/dist/theme/mui.d.cts +11 -0
  64. package/dist/theme/mui.d.ts +11 -0
  65. package/dist/utils.cjs +21 -0
  66. package/dist/utils.cjs.map +1 -0
  67. package/dist/utils.d.cts +8 -0
  68. package/dist/utils.d.ts +8 -0
  69. package/dist/utils.js +18 -0
  70. package/dist/utils.js.map +1 -0
  71. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockData.js","names":[],"sources":["../src/mockData.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.\nimport {\n ALL_DEVICES,\n ALL_RELEASES,\n defaultPermissionSets,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n rolesById,\n scopedPermissionAreas,\n uiPermissionsById\n} from '@northern.tech/utils/constants';\n\nexport const undefineds = /undefined|\\[object Object\\]/;\n\nexport const menderEnvironment = {\n features: {\n hasMultitenancy: true\n },\n integrationVersion: 'saas-123.34',\n menderVersion: 'next',\n metaMenderVersion: 'saas-123.34',\n services: {\n deploymentsVersion: '1.2.3',\n deviceauthVersion: null,\n inventoryVersion: null\n }\n};\nexport const TEST_SESSION_DATETIME = '2019-01-13T13:00:00.000Z';\nconst testDate = new Date(TEST_SESSION_DATETIME);\nexport const mockDate = new Date(testDate.setMilliseconds(testDate.getMilliseconds() + maxSessionAge));\n\nexport const defaultPassword = 'mysecretpassword!123';\nexport const defaultCreationDate = '2019-01-13T06:25:00.000Z';\nexport const defaultMacAddress = 'dc:a6:32:12:ad:bf';\n\nexport const testSsoId = 'sso_id';\n\nconst permissionSetObjectTypes = {\n any: 'Any',\n artifacts: 'Artifacts',\n empty: '',\n groups: 'Device groups',\n releases: 'Releases',\n tenantManagement: 'Tenant management',\n userManagement: 'User management'\n};\n\nconst commonEndpoints = {\n artifacts: '^/api/management/v1/deployments/artifacts',\n artifactDetails: '^/api/management/v1/deployments/artifacts/[^/]+',\n deviceManagement: '^/api/management/(v[1-9])/(devauth|inventory)/'\n};\n\nexport const token =\n 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjZTNkMGY4Yy1hZWRlLTQwMzAtYjM5MS03ZDUwMjBlYjg3M2UiLCJzdWIiOiJhMzBhNzgwYi1iODQzLTUzNDQtODBlMy0wZmQ5NWE0ZjZmYzMiLCJleHAiOjE2MDY4MTUzNjksImlhdCI6MTYwNjIxMDU2OSwibWVuZGVyLnRlbmFudCI6IjVmODVjMTdiY2U2MmI3ZmE3ZjVmNzA0MCIsIm1lbmRlci51c2VyIjp0cnVlLCJpc3MiOiJNZW5kZXIgVXNlcnMiLCJzY3AiOiJtZW5kZXIuKiIsIm1lbmRlci5wbGFuIjoicHJvZmVzc2lvbmFsIiwibmJmIjoxNjA2MjEwNTY5fQ.qVgYdCzLTf8OdK9uUctqqaY_HWkIiwpekuGvuGQAXCEgOv4bRNDlZRN_ZRSbxQoARG3pquhScbQrjBV9tcF4irTUPlTn3yrsXNO17DpcbTVeKRkb88RDtIKiRw3orVZ_GlIb-ckTQ5dS-Nqlyyf3Fmrhca-gwt6m_xv2UrmJK6eYYTMfggdRRWb-4u7mEkBI_pHPMTQrT8kJ2BeX-vHgazH9AoH0k85LHtFZQXD7pXHlDZRnLxJXukncwMGDmF17374gavYAIyDIzcC8sEBMDnVXgpikeA1sauzirqix6mAVs6XmxdQO7aF0wfXO1_PTYUA3Nk1oQfMYNlEI3U9uLRJRZIq2L8fmrrBryhstKd4y0KlBbGAQrx8NtRkgajjd1ljMfPBUEZrb7uSerVjneiO-aIBO76CuH0zdklphIjpGJeogkBhe8pAYNggp1XsZHgpZfl7IE5faKaDkMGnutaea--Czor6bhqUNCuY4tR0cpQJbNwy6LS9o1CFy4Log';\n\nexport const accessTokens = [\n { id: 'some-id-1', expiration_date: '2022-06-02T11:11:21.725Z', name: 'some-name-1' },\n { id: 'some-id-2', expiration_date: '2022-06-02T11:11:21.725Z', last_used: '2022-06-02T11:05:21.725Z', name: 'some-name-2' }\n];\n\nexport const webhookEvents = [\n {\n id: '1',\n type: 'device-status-changed',\n data: { id: '1', status: 'accepted' },\n time: '2020-09-01T12:00:00.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n },\n {\n id: '2',\n type: 'device-status-changed',\n data: { id: '3', status: 'accepted' },\n time: '2020-09-01T12:00:05.000Z',\n delivery_statuses: [{ integration_id: '1', success: true, status_code: 200 }]\n }\n];\n\nexport const spTenantLimits = {\n max_devices: {\n current_value: 0,\n name: 'max_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 200\n },\n max_micro_devices: {\n current_value: 0,\n name: 'max_micro_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 280\n },\n max_system_devices: {\n current_value: 0,\n name: 'max_system_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 20\n }\n};\n\nexport const tenants = [\n {\n id: '671a0f1dd58c813118fe8622',\n parent_tenant_id: '6718de64b42e08dea2a2065d',\n name: 'child2',\n tenant_token: 'mQDYRCr-tGbDuJhPp7fArbfTA5htVTWE9G204AzhDUM',\n status: 'active',\n additional_info: {\n marketing: false,\n campaign: ''\n },\n plan: 'enterprise',\n trial: false,\n trial_expiration: null,\n service_provider: false,\n created_at: '2024-10-24T09:10:53.281Z',\n cancelled_at: null,\n children_tenants: null,\n max_child_tenants: 0,\n device_count: 0,\n device_limit: 100,\n device_limits: {\n max_devices: {\n current_value: 0,\n name: 'max_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 200\n },\n max_micro_devices: {\n current_value: 0,\n name: 'max_micro_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 280\n },\n max_system_devices: {\n current_value: 0,\n name: 'max_system_devices',\n tenant_id: '699f07a3e783def54cf6201f',\n value: 20\n }\n },\n binary_delta: true\n }\n];\n\nexport const adminUserCapabilities = {\n canAuditlog: true,\n canConfigure: true,\n canDeploy: true,\n canManageDevices: true,\n canManageReleases: true,\n canManageUsers: true,\n canReadDeployments: true,\n canReadDevices: true,\n canReadReleases: true,\n canReadUsers: true,\n canTroubleshoot: true,\n canUploadReleases: true,\n canWriteDevices: true\n};\n\nexport const userId = 'a30a780b-b843-5344-80e3-0fd95a4f6fc3';\n\nconst defaultUser = {\n created_ts: '2019-01-01T10:30:00.000Z',\n email: 'a@b.com',\n id: 'a1',\n roles: ['RBAC_ROLE_PERMIT_ALL'],\n tfa_status: 'enabled',\n verified: true\n};\n\nconst deviceTypes = { qemu: 'qemux86-64' };\n\nconst checkInTimeRounded = '2019-01-01T00:00:00.000Z';\nconst checkInTimeExact = '2019-01-01T10:25:00.000Z';\n\nexport const mockApiResponses = {\n deployments: {\n byId: {\n d1: {\n id: 'd1',\n name: 'test deployment',\n created: '2019-01-01T12:30:00.000Z',\n devices: {\n a1: {\n id: 'a1',\n status: 'installing',\n attributes: {},\n image: { size: 123 }\n }\n },\n statistics: {\n status: {\n 'already-installed': 0,\n decommissioned: 0,\n downloading: 0,\n failure: 0,\n installing: 1,\n noartifact: 0,\n pending: 0,\n rebooting: 0,\n success: 0\n },\n total_size: 1234\n }\n },\n d2: {\n id: 'd2',\n name: 'test deployment 2',\n artifact_name: 'r1',\n artifacts: ['123'],\n created: '2019-01-01T12:25:00.000Z',\n device_count: 1,\n devices: {\n b1: {\n attributes: {},\n id: 'b1',\n status: 'pending'\n }\n },\n filter: undefined,\n group: undefined,\n statistics: {\n status: {\n downloading: 0,\n decommissioned: 0,\n failure: 0,\n installing: 0,\n noartifact: 0,\n pending: 1,\n rebooting: 0,\n success: 0,\n 'already-installed': 0\n }\n }\n },\n d3: {\n id: 'd3',\n name: 'Test',\n phases: [\n { id: '0', batch_size: 2, device_count: 2 },\n { id: '1', start_ts: '2019-02-04T11:45:10.002Z', batch_size: 3, device_count: 3 },\n { id: '2', start_ts: '2019-02-05T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '3', start_ts: '2019-02-06T11:45:10.002Z', batch_size: 5, device_count: 5 },\n { id: '4', start_ts: '2019-02-21T11:45:10.002Z', batch_size: 5, device_count: 0 }\n ],\n max_devices: 0,\n created: '2019-01-31T12:59:30.020Z',\n devices: {},\n filter: undefined,\n group: undefined,\n stats: {\n pending: 3,\n decommissioned: 0,\n failure: 23,\n pause_before_committing: 0,\n pause_before_rebooting: 0,\n installing: 0,\n rebooting: 0,\n 'already-installed': 0,\n pause_before_installing: 0,\n downloading: 0,\n success: 6,\n aborted: 0,\n noartifact: 0\n },\n statistics: { total_size: '1234' },\n status: 'inprogress',\n active: true,\n device_count: 100,\n retries: '0',\n type: 'software'\n }\n },\n byStatus: {\n pending: { deploymentIds: ['d2'] },\n inprogress: { deploymentIds: ['d3'] }\n }\n },\n devices: {\n byId: {\n a1: {\n id: 'a1',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n status: 'accepted',\n ts: defaultCreationDate\n }\n ],\n updated_ts: '2019-01-01T09:25:00.000Z'\n },\n b1: {\n id: 'b1',\n attributes: {\n ipv4_wlan0: '192.168.10.141/24',\n device_type: [deviceTypes.qemu]\n },\n system: {\n check_in_time: checkInTimeRounded\n },\n check_in_time: checkInTimeExact,\n check_in_time_exact: checkInTimeExact,\n check_in_time_rounded: checkInTimeRounded,\n identity_data: { mac: defaultMacAddress },\n status: 'accepted',\n decommissioning: false,\n created_ts: defaultCreationDate,\n updated_ts: '2019-01-01T09:25:00.000Z',\n auth_sets: [\n {\n id: 'auth1',\n identity_data: { mac: defaultMacAddress },\n pubkey: '-----BEGIN PUBLIC KEY-----\\nMIIBojWELzgJ62hcXIhAfqfoNiaB1326XZByZwcnHr5BuSPAgMBAAE=\\n-----END PUBLIC KEY-----\\n',\n ts: defaultCreationDate,\n status: 'accepted'\n }\n ]\n }\n },\n groups: {\n byId: {\n testGroup: {\n deviceIds: ['a1', 'b1'],\n filters: [],\n total: 2\n },\n testGroupDynamic: {\n id: 'filter1',\n name: 'filter1',\n filters: [{ scope: 'system', key: 'group', operator: '$eq', value: 'things' }]\n }\n }\n },\n limits: { standard: 500, micro: 0, system: 0 },\n byStatus: {\n accepted: { deviceIds: ['a1', 'b1'], total: 2 },\n active: { deviceIds: [], total: 0 },\n inactive: { deviceIds: [], total: 0 },\n pending: { deviceIds: ['c1'], total: 1 },\n preauthorized: { deviceIds: [], total: 0 },\n rejected: { deviceIds: [], total: 0 }\n }\n },\n organization: {\n organization: {\n id: '1',\n addons: [],\n name: 'test',\n plan: 'os',\n trial: false\n },\n products: [\n {\n name: 'mender_standard',\n billing_unit: 'devices',\n prices: [\n {\n plan: 'os',\n constraints: {\n min: 50,\n max: 1000,\n div: 50\n }\n },\n {\n plan: 'professional',\n constraints: {\n min: 250,\n max: 10000,\n div: 50\n }\n }\n ],\n addons: [\n {\n name: 'troubleshoot',\n prices: [{ plan: 'os' }, { plan: 'professional' }]\n },\n {\n name: 'configure',\n prices: [{ plan: 'os' }, { plan: 'professional' }]\n },\n {\n name: 'monitor',\n prices: [{ plan: 'professional' }]\n }\n ]\n },\n {\n name: 'mender_micro',\n billing_unit: 'devices',\n prices: [\n {\n plan: 'os',\n constraints: {\n min: 50,\n max: 5000,\n div: 50\n }\n },\n {\n plan: 'professional',\n constraints: {\n min: 500,\n max: 100000,\n div: 50\n }\n }\n ]\n }\n ],\n intentId: 'testIntent',\n auditlog: {\n events: [\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'user',\n user: {\n email: 'user@acme.com'\n }\n },\n change: 'change1'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string',\n identity_data: 'string'\n },\n time: '2019-01-01T12:16:22.667Z',\n action: 'create',\n object: {\n id: 'string',\n type: 'deployment',\n deployment: {\n name: 'production',\n artifact_name: 'Application 0.0.1'\n }\n },\n change: 'change2'\n },\n {\n actor: {\n id: 'string',\n type: 'user',\n email: 'string@example.com'\n },\n time: '2019-01-01T12:10:22.669Z',\n action: 'open_terminal',\n meta: {\n session_id: ['abd313a8-ee88-48ab-9c99-fbcd80048e6e']\n },\n object: {\n id: 'a1',\n type: 'device'\n },\n change: 'change3'\n }\n ]\n }\n },\n releases: {\n byId: {\n r1: {\n name: 'r1',\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n metaData: {}\n }\n }\n },\n users: {\n byId: {\n a1: defaultUser,\n [userId]: { ...defaultUser, id: userId, email: 'a2@b.com', created_ts: '2019-01-01T12:30:00.000Z' }\n },\n rolesById: {\n admin: {\n name: 'admin',\n description: 'Administrator role',\n permissions: []\n },\n test: { name: 'test', description: 'test description', permissions: [] }\n },\n globalSettings: {\n '2fa': 'enabled',\n id_attribute: undefined,\n previousFilters: []\n },\n userSettings: {\n '2fa': 'disabled',\n columnSelection: [],\n onboarding: { something: 'here' },\n tooltips: {},\n previousFilters: []\n }\n }\n};\n\nexport const releasesList = Array.from({ length: 5000 }, (x, i) => ({\n artifacts: [\n {\n id: 'art1',\n description: 'test description',\n device_types_compatible: [deviceTypes.qemu],\n modified: '2020-09-10T12:16:22.667Z',\n updates: [{ type_info: { type: 'testtype' } }],\n artifact_depends: {\n device_type: [deviceTypes.qemu]\n },\n artifact_provides: {\n artifact_name: 'myapp',\n 'data-partition.myapp.version': 'v2020.10',\n list_of_fancy: [deviceTypes.qemu, 'x172']\n },\n clears_artifact_provides: ['data-partition.myapp.*']\n }\n ],\n device_types_compatible: [deviceTypes.qemu],\n metaData: {},\n name: `release-${i + 1}`,\n modified: i\n}));\n\nexport const permissionSets = [\n {\n ...defaultPermissionSets.Basic,\n object: permissionSetObjectTypes.empty,\n description: 'Set containing basic permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/settings$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/v1/useradm/users/me$' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/1.0/auth/verify$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/v1/useradm/2faverify$' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/useradm/users/me/2fa/(enable|disable)$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/roles' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/user/tenant' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageReleases,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to manage releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadUsers,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user to view other users',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ManageUsers,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.userManagement,\n description: 'Set of permissions which allows user manage other user accounts',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/' } }]\n },\n {\n ...defaultPermissionSets.ReadTenants,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to list other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ManageTenants,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.tenantManagement,\n description: 'Set of permissions which allows user to manage other tenants and their config',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/(v[1-9])/tenantadm/' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9])/tenantadm/' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadAuditLogs,\n action: uiPermissionsById.read.title,\n object: 'System Audit Log',\n description: 'Set of permissions which allows user to view system audit log',\n permissions: [{ action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/auditlogs/logs' } }]\n },\n {\n ...defaultPermissionSets.DeployToDevices,\n action: 'Deploy',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to deploy to devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/(deployments|deviceconfig)/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConfigureDevices,\n action: 'Configure',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage configuration of the devices',\n permissions: [{ action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/' } }],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ConnectToDevices,\n action: 'Connect',\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to use remote terminal and file transfer',\n permissions: [\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/connect$' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/download\\\\?path=[^\\u0026]+$' } },\n { action: 'http', object: { type: 'PUT', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+/upload$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.SuperUser,\n action: 'Any',\n object: permissionSetObjectTypes.any,\n description: 'Set of permissions which allows user to do anything',\n permissions: [{ action: 'any', object: { type: 'any', value: 'any' } }]\n },\n {\n ...defaultPermissionSets.UploadArtifacts,\n action: 'Upload',\n object: permissionSetObjectTypes.artifacts,\n description: 'Set of permissions which allows user to upload artifacts',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'POST', value: '^/api/management/v1/deployments/artifacts/generate' } }\n ]\n },\n {\n ...defaultPermissionSets.ReadDevices,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to view devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: '^/api/management/v2/inventory/filters/search' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9])/(deployments|devauth|inventory|deviceconfig|devicemonitor)/' } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/(v[1-9]|0.1.0)/deviceconnect/devices/[^/]+$' } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ManageDevices,\n action: uiPermissionsById.manage.title,\n object: permissionSetObjectTypes.groups,\n description: 'Set of permissions which allows user to manage devices',\n permissions: [\n { action: 'http', object: { type: 'POST', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'PUT', value: commonEndpoints.deviceManagement } },\n { action: 'http', object: { type: 'DELETE', value: commonEndpoints.deviceManagement } }\n ],\n supported_scope_types: [scopedPermissionAreas.groups.scopeType]\n },\n {\n ...defaultPermissionSets.ReadReleases,\n action: uiPermissionsById.read.title,\n object: permissionSetObjectTypes.releases,\n description: 'Set of permissions which allows user to view releases',\n permissions: [\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifacts } },\n { action: 'http', object: { type: 'GET', value: commonEndpoints.artifactDetails } },\n { action: 'http', object: { type: 'GET', value: '^/api/management/v1/deployments/artifacts/[^/]+/download' } }\n ]\n },\n {\n name: 'almostAdmin',\n object: permissionSetObjectTypes.empty,\n description: 'Set containing all the permissions.',\n permissions: [\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/auditlogs/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/config/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deployments/deployments/releases/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/devauth/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconfig/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/deviceconnect/devices' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/inventory/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/iot-manager/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/monitor/.*' } },\n { action: 'http', object: { type: 'any', value: '^/api/management/(v[1-9])/useradm/.*' } }\n ]\n }\n];\n\nexport const rbacRoles = [\n {\n name: 'dyn',\n description: '',\n permissions: [\n { action: 'CREATE_DEPLOYMENT', object: { type: 'DEVICE_GROUP', value: 'dyn' } },\n { action: 'VIEW_DEVICE', object: { type: 'DEVICE_GROUP', value: 'dyn' } }\n ]\n },\n { name: 'asdasd', description: '123', permissions: [{ action: 'http', object: { type: 'any', value: '/api/management/v1/useradm/.*' } }] },\n {\n name: '141sasd',\n description: '1313adg',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } },\n { ...defaultPermissionSets.ManageUsers }\n ]\n },\n {\n name: 'kljlkk',\n description: 'lkl',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['bestgroup'] } }]\n },\n {\n name: 'yyyyy',\n description: 'asd',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ManageDevices, scope: { type: scopedPermissionAreas.groups.scopeType, value: ['dockerclient'] } },\n { ...defaultPermissionSets.ManageReleases }\n ]\n },\n {\n name: 'RBAC_ROLE_DEPLOYMENTS_MANAGER',\n description: 'Intended for users responsible for managing deployments, this role can create and abort deployments',\n permission_sets_with_scope: [{ ...defaultPermissionSets.DeployToDevices }]\n },\n {\n name: 'RBAC_ROLE_REMOTE_TERMINAL',\n description: `Intended for tech support accounts, this role can access the devices' Remote Terminal.`,\n permission_sets_with_scope: [{ ...defaultPermissionSets.ConnectToDevices }]\n },\n { name: 'RBAC_ROLE_PERMIT_ALL', description: '', permission_sets_with_scope: [{ ...defaultPermissionSets.SuperUser }] },\n {\n name: 'RBAC_ROLE_OBSERVER',\n description:\n 'Intended for team leaders or limited tech support accounts, this role can see all Devices, Artifacts and Deployment reports but not make any changes.',\n permission_sets_with_scope: [{ ...defaultPermissionSets.ReadReleases }, { ...defaultPermissionSets.ReadDevices }]\n },\n {\n name: 'RBAC_ROLE_CI',\n description:\n '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.',\n permission_sets_with_scope: [\n { ...defaultPermissionSets.ReadReleases },\n { ...defaultPermissionSets.ManageReleases },\n { ...defaultPermissionSets.UploadArtifacts }\n ]\n },\n {\n name: 'almostAdmin',\n description: 'almost admin rights',\n permissions: permissionSets.find(item => item.name === 'almostAdmin')?.permissions\n },\n {\n name: 'almostAdminNew',\n description: 'almost admin rights',\n permission_sets_with_scope: Object.values(defaultPermissionSets)\n }\n];\n\nconst expectedParsedRoles = {\n '141sasd': {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] },\n userManagement: [uiPermissionsById.manage.value]\n }\n },\n asdasd: {\n editable: false,\n isCustom: true,\n uiPermissions: { ...emptyUiPermissions, userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value] }\n },\n dyn: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n deployments: [uiPermissionsById.deploy.value],\n groups: { dyn: [uiPermissionsById.read.value, uiPermissionsById.deploy.value] }\n }\n },\n kljlkk: {\n editable: true,\n isCustom: false,\n uiPermissions: { ...emptyUiPermissions, groups: { bestgroup: [uiPermissionsById.read.value, uiPermissionsById.connect.value] } }\n },\n yyyyy: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { dockerclient: [uiPermissionsById.read.value, uiPermissionsById.manage.value] },\n releases: { [ALL_RELEASES]: [uiPermissionsById.manage.value] }\n }\n },\n almostAdmin: {\n editable: false,\n isCustom: true,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.manage.value, uiPermissionsById.deploy.value, uiPermissionsById.read.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n // we can't assign deployment permissions to devices here, since the old path based rbac controls don't allow the scoped permissions\n // uiPermissionsById.deploy.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.read.value, uiPermissionsById.upload.value, uiPermissionsById.manage.value]\n },\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n },\n almostAdminNew: {\n editable: true,\n isCustom: undefined,\n uiPermissions: {\n ...emptyUiPermissions,\n auditlog: [uiPermissionsById.read.value],\n deployments: [uiPermissionsById.read.value, uiPermissionsById.deploy.value, uiPermissionsById.manage.value],\n groups: {\n [ALL_DEVICES]: [\n uiPermissionsById.read.value,\n uiPermissionsById.manage.value,\n uiPermissionsById.deploy.value,\n uiPermissionsById.connect.value,\n uiPermissionsById.configure.value\n ]\n },\n releases: {\n [ALL_RELEASES]: [uiPermissionsById.manage.value, uiPermissionsById.upload.value, uiPermissionsById.read.value]\n },\n tenantManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value],\n userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]\n }\n }\n};\n\nconst defaultRolesById = {\n ...rolesById,\n test: {\n ...emptyRole,\n name: 'test',\n description: 'test description',\n editable: true,\n uiPermissions: {\n ...emptyUiPermissions,\n groups: { testGroup: [uiPermissionsById.read.value] },\n releases: { bar: [uiPermissionsById.read.value] }\n }\n }\n};\n\nexport const receivedRoles = rbacRoles.reduce(\n (accu, role) => {\n const { name, description, ...roleRemainder } = role;\n if (name.startsWith('RBAC')) {\n accu[name] = {\n ...defaultRolesById[name],\n ...roleRemainder,\n editable: false,\n isCustom: false,\n description: defaultRolesById[name].description ? defaultRolesById[name].description : description\n };\n } else {\n const result = expectedParsedRoles[name] ?? {};\n accu[name] = {\n ...emptyRole,\n ...role,\n ...result,\n name\n };\n }\n return accu;\n },\n { ...defaultRolesById }\n);\n\nexport const receivedPermissionSets = permissionSets.reduce((accu, set) => {\n const result = defaultPermissionSets[set.name]?.result ?? {};\n accu[set.name] = {\n ...set,\n result: {\n ...emptyUiPermissions,\n ...result\n }\n };\n return accu;\n}, {});\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "server": {
3
+ "port": 80,
4
+ "middlewareMode": false
5
+ },
6
+ "test": {
7
+ "env": {
8
+ "BABEL_ENV": "test",
9
+ "NODE_ENV": "test",
10
+ "PUBLIC_URL": "",
11
+ "TZ": "UTC"
12
+ },
13
+ "retry": 0,
14
+ "environment": "jsdom",
15
+ "globals": true
16
+ }
17
+ }
@@ -0,0 +1,193 @@
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 msw = require("msw");
6
+ //#region src/requestHandlers/deploymentHandlers.ts
7
+ const createdDeployment = {
8
+ id: "created-123",
9
+ name: "test deployment",
10
+ artifact_name: "r1",
11
+ artifacts: ["123"],
12
+ created: "2019-01-01T12:30:00.000Z",
13
+ device_count: 1,
14
+ devices: { a1: {
15
+ attributes: {},
16
+ id: "a1",
17
+ image: { size: 123 },
18
+ status: "installing"
19
+ } },
20
+ filter: void 0,
21
+ group: void 0,
22
+ statistics: {
23
+ status: {
24
+ downloading: 0,
25
+ decommissioned: 0,
26
+ failure: 0,
27
+ installing: 1,
28
+ noartifact: 0,
29
+ pending: 0,
30
+ rebooting: 0,
31
+ success: 0,
32
+ "already-installed": 0
33
+ },
34
+ total_size: 1234
35
+ }
36
+ };
37
+ const defaultDeploymentConfig = { delta: {
38
+ enabled: true,
39
+ binary_delta: {
40
+ xdelta_args: {
41
+ disable_checksum: false,
42
+ disable_external_decompression: false,
43
+ compression_level: 6,
44
+ source_window_size: 0,
45
+ input_window_size: 0,
46
+ compression_duplicates_window: 0,
47
+ instruction_buffer_size: 0
48
+ },
49
+ timeout: 0
50
+ },
51
+ binary_delta_limits: {
52
+ xdelta_args_limits: {
53
+ source_window_size: _northern_tech_utils_constants.limitDefault,
54
+ input_window_size: _northern_tech_utils_constants.limitDefault,
55
+ compression_duplicates_window: _northern_tech_utils_constants.limitDefault,
56
+ instruction_buffer_size: _northern_tech_utils_constants.limitDefault
57
+ },
58
+ timeout: {
59
+ min: 60,
60
+ max: 3600,
61
+ default: 60
62
+ },
63
+ jobs_in_parallel: _northern_tech_utils_constants.limitDefault,
64
+ queue_length: _northern_tech_utils_constants.limitDefault
65
+ }
66
+ } };
67
+ const deploymentHandlers = [
68
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments`, () => new msw.HttpResponse(JSON.stringify(Object.values(require_mockData.mockApiResponses.deployments.byId).reverse()), { headers: { [_northern_tech_utils_constants.headerNames.total]: Object.keys(require_mockData.mockApiResponses.deployments.byId).length } })),
69
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/releases`, ({ request }) => {
70
+ const { searchParams } = new URL(request.url);
71
+ const releaseName = searchParams.get("name");
72
+ const release = require_mockData.mockApiResponses.releases.byId[releaseName] || {};
73
+ if (releaseName) {
74
+ const { device_types_compatible, ...remainder } = release;
75
+ return Object.keys(remainder).length || releaseName === "createdRelease" ? msw.HttpResponse.json([remainder]) : new msw.HttpResponse(null, { status: 520 });
76
+ }
77
+ const releases = Object.values(require_mockData.mockApiResponses.releases.byId).map((stateRelease) => {
78
+ const { device_types_compatible, ...remainder } = stateRelease;
79
+ return remainder;
80
+ });
81
+ return msw.HttpResponse.json(releases);
82
+ }),
83
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId`, ({ params: { deploymentId } }) => {
84
+ if (deploymentId === createdDeployment.id) return msw.HttpResponse.json(createdDeployment);
85
+ else if (deploymentId === "config1") return msw.HttpResponse.json({
86
+ ...createdDeployment,
87
+ id: "config1",
88
+ created: "2019-01-01T09:25:01.000Z",
89
+ finished: "2019-01-01T09:25:03.000Z",
90
+ status: "finished"
91
+ });
92
+ return msw.HttpResponse.json(require_mockData.mockApiResponses.deployments.byId[deploymentId]);
93
+ }),
94
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId/devices`, ({ params: { deploymentId } }) => {
95
+ if (deploymentId === createdDeployment.id) return msw.HttpResponse.json(Object.values(createdDeployment.devices));
96
+ else if (require_mockData.mockApiResponses.deployments.byId[deploymentId]) return msw.HttpResponse.json(Object.values(require_mockData.mockApiResponses.deployments.byId[deploymentId].devices));
97
+ return new msw.HttpResponse(null, { status: 521 });
98
+ }),
99
+ msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/statistics/list`, async ({ request }) => {
100
+ const { deployment_ids = [] } = await request.json();
101
+ if (deployment_ids.includes(createdDeployment.id)) return msw.HttpResponse.json([]);
102
+ else if (deployment_ids.every((id) => require_mockData.mockApiResponses.deployments.byId[id])) {
103
+ const stats = deployment_ids.map((id) => ({
104
+ id,
105
+ stats: require_mockData.mockApiResponses.deployments.byId[id].statistics.status
106
+ }));
107
+ return msw.HttpResponse.json(stats);
108
+ }
109
+ return new msw.HttpResponse(null, { status: 522 });
110
+ }),
111
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId/devices/:deviceId/log`, ({ params: { deploymentId, deviceId } }) => {
112
+ if (require_mockData.mockApiResponses.deployments.byId[deploymentId] && require_mockData.mockApiResponses.deployments.byId[deploymentId].devices[deviceId]) return msw.HttpResponse.text("test");
113
+ return new msw.HttpResponse(null, { status: 523 });
114
+ }),
115
+ msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments`, async ({ request }) => {
116
+ const body = await request.json();
117
+ if (!Object.keys(body).length) return new msw.HttpResponse(JSON.stringify({}), { status: 524 });
118
+ return new msw.HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
119
+ }),
120
+ msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrlV2}/deployments`, async ({ request }) => {
121
+ const { filter_id, devices = [] } = await request.json();
122
+ if (!filter_id || !!devices.length) return new msw.HttpResponse(JSON.stringify({}), { status: 525 });
123
+ return new msw.HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
124
+ }),
125
+ msw.http.post(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/group/:deploymentGroup`, async ({ params: { deploymentGroup }, request }) => {
126
+ const { filter_id, devices = [] } = await request.json();
127
+ if (filter_id || !!devices.length || deploymentGroup !== Object.keys(require_mockData.mockApiResponses.devices.groups.byId)[0]) return new msw.HttpResponse(JSON.stringify({}), { status: 526 });
128
+ return new msw.HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
129
+ }),
130
+ msw.http.patch(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId`, async ({ params: { deploymentId }, request }) => {
131
+ const { update_control_map } = await request.json();
132
+ if (deploymentId === createdDeployment.id && Object.keys(update_control_map).length) return new msw.HttpResponse(null, { status: 204 });
133
+ return new msw.HttpResponse(null, { status: 581 });
134
+ }),
135
+ msw.http.put(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId/status`, async ({ params: { deploymentId }, request }) => {
136
+ const { status } = await request.json();
137
+ return new msw.HttpResponse(JSON.stringify({}), { status: status === "aborted" && [...require_mockData.mockApiResponses.deployments.byStatus.pending.deploymentIds, ...require_mockData.mockApiResponses.deployments.byStatus.inprogress.deploymentIds].includes(deploymentId) ? 200 : 528 });
138
+ }),
139
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/:deploymentId/devices/list`, ({ params: { deploymentId } }) => {
140
+ if (deploymentId === createdDeployment.id) return new msw.HttpResponse(JSON.stringify(Object.values(createdDeployment.devices)), { headers: { [_northern_tech_utils_constants.headerNames.total]: Object.keys(createdDeployment.devices).length } });
141
+ else if (require_mockData.mockApiResponses.deployments.byId[deploymentId]) return new msw.HttpResponse(JSON.stringify(Object.values(require_mockData.mockApiResponses.deployments.byId[deploymentId].devices)), { headers: { [_northern_tech_utils_constants.headerNames.total]: Object.keys(require_mockData.mockApiResponses.deployments.byId[deploymentId].devices).length } });
142
+ return new msw.HttpResponse(null, { status: 529 });
143
+ }),
144
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/config`, () => msw.HttpResponse.json(defaultDeploymentConfig)),
145
+ msw.http.put(`${_northern_tech_utils_constants.deploymentsApiUrl}/config/binary_delta`, async ({ request }) => {
146
+ const { xdelta_args = {} } = await request.json();
147
+ if (xdelta_args.source_window_size === 55) return new msw.HttpResponse(null, { status: 530 });
148
+ return new msw.HttpResponse(null, { status: 200 });
149
+ }),
150
+ msw.http.get(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/devices/:deviceId`, ({ params: { deviceId } }) => {
151
+ if (deviceId === require_mockData.mockApiResponses.devices.byId.a1.id) return new msw.HttpResponse(JSON.stringify([{
152
+ id: createdDeployment.id + "something",
153
+ deployment: {
154
+ ...createdDeployment,
155
+ id: require_mockData.mockApiResponses.deployments.byId.d1.id,
156
+ status: "inprogress"
157
+ },
158
+ device: {
159
+ created: "2019-01-01T12:35:00.000Z",
160
+ finished: "2019-01-01T12:40:00.000Z",
161
+ status: "noartifact",
162
+ id: "something",
163
+ image: { ...require_mockData.mockApiResponses.releases.byId.r1 }
164
+ },
165
+ log: true,
166
+ attempts: 1,
167
+ delta_job_id: ""
168
+ }]), { headers: { [_northern_tech_utils_constants.headerNames.total]: 34 } });
169
+ return new msw.HttpResponse(null, { status: 529 });
170
+ }),
171
+ msw.http.delete(`${_northern_tech_utils_constants.deploymentsApiUrl}/deployments/devices/:deviceId/history`, () => new msw.HttpResponse(null, { status: 204 })),
172
+ msw.http.get(`/api/management/v1alpha1/deployments/deployments/:deploymentId/devices/:deviceId/log/explain`, ({ params: { deploymentId, deviceId } }) => {
173
+ if (deploymentId === require_mockData.mockApiResponses.deployments.byId.d1.id && deviceId === require_mockData.mockApiResponses.devices.byId.a1.id) return msw.HttpResponse.text(`## Summary
174
+ The deployment failed during the artifact download phase. The device was unable to establish a secure connection to the artifact repository.
175
+
176
+ ## Key Issues
177
+ 1. **Network connectivity issues** - Connection timeout occurred
178
+ 2. **SSL/TLS certificate verification failed** - Invalid certificate chain
179
+ 3. **Artifact verification failed** - Checksum mismatch detected
180
+
181
+ ## Recommendations
182
+ - Check network connectivity between device and artifact repository
183
+ - Verify SSL certificates are properly configured
184
+ - Ensure artifact integrity before deployment`);
185
+ if (deploymentId === "rate-limited-deployment") return new msw.HttpResponse(JSON.stringify({ error: "Rate limit exceeded" }), { status: 429 });
186
+ if (deploymentId === "error-deployment") return new msw.HttpResponse(JSON.stringify({ error: "Analysis failed" }), { status: 500 });
187
+ return new msw.HttpResponse(null, { status: 404 });
188
+ })
189
+ ];
190
+ //#endregion
191
+ exports.deploymentHandlers = deploymentHandlers;
192
+
193
+ //# sourceMappingURL=deploymentHandlers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploymentHandlers.cjs","names":["limitDefault","http","deploymentsApiUrlV2","HttpResponse","mockApiResponses","headerNames","deploymentsApiUrl"],"sources":["../../src/requestHandlers/deploymentHandlers.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 { deploymentsApiUrl, deploymentsApiUrlV2, headerNames, limitDefault } from '@northern.tech/utils/constants';\nimport { HttpResponse, http } from 'msw';\n\nimport { mockApiResponses } from '../mockData';\n\nconst createdDeployment = {\n id: 'created-123',\n name: 'test deployment',\n artifact_name: 'r1',\n artifacts: ['123'],\n created: '2019-01-01T12:30:00.000Z',\n device_count: 1,\n devices: {\n a1: {\n attributes: {},\n id: 'a1',\n image: { size: 123 },\n status: 'installing'\n }\n },\n filter: undefined,\n group: undefined,\n statistics: {\n status: {\n downloading: 0,\n decommissioned: 0,\n failure: 0,\n installing: 1,\n noartifact: 0,\n pending: 0,\n rebooting: 0,\n success: 0,\n 'already-installed': 0\n },\n total_size: 1234\n }\n};\n\nconst defaultDeploymentConfig = {\n delta: {\n enabled: true,\n binary_delta: {\n xdelta_args: {\n disable_checksum: false,\n disable_external_decompression: false,\n compression_level: 6,\n source_window_size: 0,\n input_window_size: 0,\n compression_duplicates_window: 0,\n instruction_buffer_size: 0\n },\n timeout: 0\n },\n binary_delta_limits: {\n xdelta_args_limits: {\n source_window_size: limitDefault,\n input_window_size: limitDefault,\n compression_duplicates_window: limitDefault,\n instruction_buffer_size: limitDefault\n },\n timeout: { min: 60, max: 3600, default: 60 },\n jobs_in_parallel: limitDefault,\n queue_length: limitDefault\n }\n }\n};\n\nexport const deploymentHandlers = [\n http.get(\n `${deploymentsApiUrlV2}/deployments`,\n () =>\n new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId).reverse()), {\n headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId).length }\n })\n ),\n http.get(`${deploymentsApiUrl}/deployments/releases`, ({ request }) => {\n const { searchParams } = new URL(request.url);\n const releaseName = searchParams.get('name');\n const release = mockApiResponses.releases.byId[releaseName] || {};\n if (releaseName) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { device_types_compatible, ...remainder } = release;\n return Object.keys(remainder).length || releaseName === 'createdRelease' ? HttpResponse.json([remainder]) : new HttpResponse(null, { status: 520 });\n }\n const releases = Object.values(mockApiResponses.releases.byId).map(stateRelease => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { device_types_compatible, ...remainder } = stateRelease;\n return remainder;\n });\n return HttpResponse.json(releases);\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return HttpResponse.json(createdDeployment);\n } else if (deploymentId === 'config1') {\n return HttpResponse.json({\n ...createdDeployment,\n id: 'config1',\n created: '2019-01-01T09:25:01.000Z',\n finished: '2019-01-01T09:25:03.000Z',\n status: 'finished'\n });\n }\n return HttpResponse.json(mockApiResponses.deployments.byId[deploymentId]);\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return HttpResponse.json(Object.values(createdDeployment.devices));\n } else if (mockApiResponses.deployments.byId[deploymentId]) {\n return HttpResponse.json(Object.values(mockApiResponses.deployments.byId[deploymentId].devices));\n }\n return new HttpResponse(null, { status: 521 });\n }),\n http.post(`${deploymentsApiUrl}/deployments/statistics/list`, async ({ request }) => {\n const { deployment_ids = [] } = await request.json();\n if (deployment_ids.includes(createdDeployment.id)) {\n return HttpResponse.json([]);\n } else if (deployment_ids.every(id => mockApiResponses.deployments.byId[id])) {\n const stats = deployment_ids.map(id => ({ id, stats: mockApiResponses.deployments.byId[id].statistics.status }));\n return HttpResponse.json(stats);\n }\n return new HttpResponse(null, { status: 522 });\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/:deviceId/log`, ({ params: { deploymentId, deviceId } }) => {\n if (mockApiResponses.deployments.byId[deploymentId] && mockApiResponses.deployments.byId[deploymentId].devices[deviceId]) {\n return HttpResponse.text('test');\n }\n return new HttpResponse(null, { status: 523 });\n }),\n http.post(`${deploymentsApiUrl}/deployments`, async ({ request }) => {\n const body = await request.json();\n if (!Object.keys(body).length) {\n return new HttpResponse(JSON.stringify({}), { status: 524 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.post(`${deploymentsApiUrlV2}/deployments`, async ({ request }) => {\n const { filter_id, devices = [] } = await request.json();\n if (!filter_id || !!devices.length) {\n return new HttpResponse(JSON.stringify({}), { status: 525 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.post(`${deploymentsApiUrl}/deployments/group/:deploymentGroup`, async ({ params: { deploymentGroup }, request }) => {\n const { filter_id, devices = [] } = await request.json();\n if (filter_id || !!devices.length || deploymentGroup !== Object.keys(mockApiResponses.devices.groups.byId)[0]) {\n return new HttpResponse(JSON.stringify({}), { status: 526 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.patch(`${deploymentsApiUrl}/deployments/:deploymentId`, async ({ params: { deploymentId }, request }) => {\n const { update_control_map } = await request.json();\n if (deploymentId === createdDeployment.id && Object.keys(update_control_map).length) {\n return new HttpResponse(null, { status: 204 });\n }\n return new HttpResponse(null, { status: 581 });\n }),\n http.put(`${deploymentsApiUrl}/deployments/:deploymentId/status`, async ({ params: { deploymentId }, request }) => {\n const { status } = await request.json();\n return new HttpResponse(JSON.stringify({}), {\n status:\n status === 'aborted' &&\n [...mockApiResponses.deployments.byStatus.pending.deploymentIds, ...mockApiResponses.deployments.byStatus.inprogress.deploymentIds].includes(\n deploymentId\n )\n ? 200\n : 528\n });\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/list`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return new HttpResponse(JSON.stringify(Object.values(createdDeployment.devices)), {\n headers: { [headerNames.total]: Object.keys(createdDeployment.devices).length }\n });\n } else if (mockApiResponses.deployments.byId[deploymentId]) {\n return new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId[deploymentId].devices)), {\n headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId[deploymentId].devices).length }\n });\n }\n return new HttpResponse(null, { status: 529 });\n }),\n http.get(`${deploymentsApiUrl}/config`, () => HttpResponse.json(defaultDeploymentConfig)),\n http.put(`${deploymentsApiUrl}/config/binary_delta`, async ({ request }) => {\n const { xdelta_args = {} } = await request.json();\n if (xdelta_args.source_window_size === 55) {\n return new HttpResponse(null, { status: 530 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.get(`${deploymentsApiUrl}/deployments/devices/:deviceId`, ({ params: { deviceId } }) => {\n if (deviceId === mockApiResponses.devices.byId.a1.id) {\n return new HttpResponse(\n JSON.stringify([\n {\n id: createdDeployment.id + 'something',\n deployment: { ...createdDeployment, id: mockApiResponses.deployments.byId.d1.id, status: 'inprogress' },\n device: {\n created: '2019-01-01T12:35:00.000Z',\n finished: '2019-01-01T12:40:00.000Z',\n status: 'noartifact',\n id: 'something',\n image: { ...mockApiResponses.releases.byId.r1 }\n },\n log: true,\n attempts: 1,\n delta_job_id: ''\n }\n ]),\n {\n headers: { [headerNames.total]: 34 }\n }\n );\n }\n return new HttpResponse(null, { status: 529 });\n }),\n http.delete(`${deploymentsApiUrl}/deployments/devices/:deviceId/history`, () => new HttpResponse(null, { status: 204 })),\n http.get(`/api/management/v1alpha1/deployments/deployments/:deploymentId/devices/:deviceId/log/explain`, ({ params: { deploymentId, deviceId } }) => {\n if (deploymentId === mockApiResponses.deployments.byId.d1.id && deviceId === mockApiResponses.devices.byId.a1.id) {\n const mockAnalysis = `## Summary\nThe deployment failed during the artifact download phase. The device was unable to establish a secure connection to the artifact repository.\n\n## Key Issues\n1. **Network connectivity issues** - Connection timeout occurred\n2. **SSL/TLS certificate verification failed** - Invalid certificate chain\n3. **Artifact verification failed** - Checksum mismatch detected\n\n## Recommendations\n- Check network connectivity between device and artifact repository\n- Verify SSL certificates are properly configured\n- Ensure artifact integrity before deployment`;\n return HttpResponse.text(mockAnalysis);\n }\n if (deploymentId === 'rate-limited-deployment') {\n return new HttpResponse(JSON.stringify({ error: 'Rate limit exceeded' }), { status: 429 });\n }\n if (deploymentId === 'error-deployment') {\n return new HttpResponse(JSON.stringify({ error: 'Analysis failed' }), { status: 500 });\n }\n return new HttpResponse(null, { status: 404 });\n })\n];\n"],"mappings":";;;;;;AAmBA,MAAM,oBAAoB;CACxB,IAAI;CACJ,MAAM;CACN,eAAe;CACf,WAAW,CAAC,MAAM;CAClB,SAAS;CACT,cAAc;CACd,SAAS,EACP,IAAI;EACF,YAAY,EAAE;EACd,IAAI;EACJ,OAAO,EAAE,MAAM,KAAK;EACpB,QAAQ;EACT,EACF;CACD,QAAQ,KAAA;CACR,OAAO,KAAA;CACP,YAAY;EACV,QAAQ;GACN,aAAa;GACb,gBAAgB;GAChB,SAAS;GACT,YAAY;GACZ,YAAY;GACZ,SAAS;GACT,WAAW;GACX,SAAS;GACT,qBAAqB;GACtB;EACD,YAAY;EACb;CACF;AAED,MAAM,0BAA0B,EAC9B,OAAO;CACL,SAAS;CACT,cAAc;EACZ,aAAa;GACX,kBAAkB;GAClB,gCAAgC;GAChC,mBAAmB;GACnB,oBAAoB;GACpB,mBAAmB;GACnB,+BAA+B;GAC/B,yBAAyB;GAC1B;EACD,SAAS;EACV;CACD,qBAAqB;EACnB,oBAAoB;GAClB,oBAAoBA,+BAAAA;GACpB,mBAAmBA,+BAAAA;GACnB,+BAA+BA,+BAAAA;GAC/B,yBAAyBA,+BAAAA;GAC1B;EACD,SAAS;GAAE,KAAK;GAAI,KAAK;GAAM,SAAS;GAAI;EAC5C,kBAAkBA,+BAAAA;EAClB,cAAcA,+BAAAA;EACf;CACF,EACF;AAED,MAAa,qBAAqB;CAChCC,IAAAA,KAAK,IACH,GAAGC,+BAAAA,oBAAoB,qBAErB,IAAIC,IAAAA,aAAa,KAAK,UAAU,OAAO,OAAOC,iBAAAA,iBAAiB,YAAY,KAAK,CAAC,SAAS,CAAC,EAAE,EAC3F,SAAS,GAAGC,+BAAAA,YAAY,QAAQ,OAAO,KAAKD,iBAAAA,iBAAiB,YAAY,KAAK,CAAC,QAAQ,EACxF,CAAC,CACL;CACDH,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,yBAAyB,EAAE,cAAc;EACrE,MAAM,EAAE,iBAAiB,IAAI,IAAI,QAAQ,IAAI;EAC7C,MAAM,cAAc,aAAa,IAAI,OAAO;EAC5C,MAAM,UAAUF,iBAAAA,iBAAiB,SAAS,KAAK,gBAAgB,EAAE;AACjE,MAAI,aAAa;GAEf,MAAM,EAAE,yBAAyB,GAAG,cAAc;AAClD,UAAO,OAAO,KAAK,UAAU,CAAC,UAAU,gBAAgB,mBAAmBD,IAAAA,aAAa,KAAK,CAAC,UAAU,CAAC,GAAG,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;;EAErJ,MAAM,WAAW,OAAO,OAAOC,iBAAAA,iBAAiB,SAAS,KAAK,CAAC,KAAI,iBAAgB;GAEjF,MAAM,EAAE,yBAAyB,GAAG,cAAc;AAClD,UAAO;IACP;AACF,SAAOD,IAAAA,aAAa,KAAK,SAAS;GAClC;CACFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,8BAA8B,EAAE,QAAQ,EAAE,qBAAqB;AAC3F,MAAI,iBAAiB,kBAAkB,GACrC,QAAOH,IAAAA,aAAa,KAAK,kBAAkB;WAClC,iBAAiB,UAC1B,QAAOA,IAAAA,aAAa,KAAK;GACvB,GAAG;GACH,IAAI;GACJ,SAAS;GACT,UAAU;GACV,QAAQ;GACT,CAAC;AAEJ,SAAOA,IAAAA,aAAa,KAAKC,iBAAAA,iBAAiB,YAAY,KAAK,cAAc;GACzE;CACFH,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,sCAAsC,EAAE,QAAQ,EAAE,qBAAqB;AACnG,MAAI,iBAAiB,kBAAkB,GACrC,QAAOH,IAAAA,aAAa,KAAK,OAAO,OAAO,kBAAkB,QAAQ,CAAC;WACzDC,iBAAAA,iBAAiB,YAAY,KAAK,cAC3C,QAAOD,IAAAA,aAAa,KAAK,OAAO,OAAOC,iBAAAA,iBAAiB,YAAY,KAAK,cAAc,QAAQ,CAAC;AAElG,SAAO,IAAID,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,KAAK,GAAGK,+BAAAA,kBAAkB,+BAA+B,OAAO,EAAE,cAAc;EACnF,MAAM,EAAE,iBAAiB,EAAE,KAAK,MAAM,QAAQ,MAAM;AACpD,MAAI,eAAe,SAAS,kBAAkB,GAAG,CAC/C,QAAOH,IAAAA,aAAa,KAAK,EAAE,CAAC;WACnB,eAAe,OAAM,OAAMC,iBAAAA,iBAAiB,YAAY,KAAK,IAAI,EAAE;GAC5E,MAAM,QAAQ,eAAe,KAAI,QAAO;IAAE;IAAI,OAAOA,iBAAAA,iBAAiB,YAAY,KAAK,IAAI,WAAW;IAAQ,EAAE;AAChH,UAAOD,IAAAA,aAAa,KAAK,MAAM;;AAEjC,SAAO,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,oDAAoD,EAAE,QAAQ,EAAE,cAAc,iBAAiB;AAC3H,MAAIF,iBAAAA,iBAAiB,YAAY,KAAK,iBAAiBA,iBAAAA,iBAAiB,YAAY,KAAK,cAAc,QAAQ,UAC7G,QAAOD,IAAAA,aAAa,KAAK,OAAO;AAElC,SAAO,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,KAAK,GAAGK,+BAAAA,kBAAkB,eAAe,OAAO,EAAE,cAAc;EACnE,MAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,MAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OACrB,QAAO,IAAIH,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE9D,SAAO,IAAIA,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,gBAAgB,kBAAkB,MAAM,EAAE,CAAC;GAC9G;CACFF,IAAAA,KAAK,KAAK,GAAGC,+BAAAA,oBAAoB,eAAe,OAAO,EAAE,cAAc;EACrE,MAAM,EAAE,WAAW,UAAU,EAAE,KAAK,MAAM,QAAQ,MAAM;AACxD,MAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,OAC1B,QAAO,IAAIC,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE9D,SAAO,IAAIA,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,gBAAgB,kBAAkB,MAAM,EAAE,CAAC;GAC9G;CACFF,IAAAA,KAAK,KAAK,GAAGK,+BAAAA,kBAAkB,sCAAsC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,cAAc;EACvH,MAAM,EAAE,WAAW,UAAU,EAAE,KAAK,MAAM,QAAQ,MAAM;AACxD,MAAI,aAAa,CAAC,CAAC,QAAQ,UAAU,oBAAoB,OAAO,KAAKF,iBAAAA,iBAAiB,QAAQ,OAAO,KAAK,CAAC,GACzG,QAAO,IAAID,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE9D,SAAO,IAAIA,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,gBAAgB,kBAAkB,MAAM,EAAE,CAAC;GAC9G;CACFF,IAAAA,KAAK,MAAM,GAAGK,+BAAAA,kBAAkB,6BAA6B,OAAO,EAAE,QAAQ,EAAE,gBAAgB,cAAc;EAC5G,MAAM,EAAE,uBAAuB,MAAM,QAAQ,MAAM;AACnD,MAAI,iBAAiB,kBAAkB,MAAM,OAAO,KAAK,mBAAmB,CAAC,OAC3E,QAAO,IAAIH,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;AAEhD,SAAO,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,oCAAoC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,cAAc;EACjH,MAAM,EAAE,WAAW,MAAM,QAAQ,MAAM;AACvC,SAAO,IAAIH,IAAAA,aAAa,KAAK,UAAU,EAAE,CAAC,EAAE,EAC1C,QACE,WAAW,aACX,CAAC,GAAGC,iBAAAA,iBAAiB,YAAY,SAAS,QAAQ,eAAe,GAAGA,iBAAAA,iBAAiB,YAAY,SAAS,WAAW,cAAc,CAAC,SAClI,aACD,GACG,MACA,KACP,CAAC;GACF;CACFH,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,2CAA2C,EAAE,QAAQ,EAAE,qBAAqB;AACxG,MAAI,iBAAiB,kBAAkB,GACrC,QAAO,IAAIH,IAAAA,aAAa,KAAK,UAAU,OAAO,OAAO,kBAAkB,QAAQ,CAAC,EAAE,EAChF,SAAS,GAAGE,+BAAAA,YAAY,QAAQ,OAAO,KAAK,kBAAkB,QAAQ,CAAC,QAAQ,EAChF,CAAC;WACOD,iBAAAA,iBAAiB,YAAY,KAAK,cAC3C,QAAO,IAAID,IAAAA,aAAa,KAAK,UAAU,OAAO,OAAOC,iBAAAA,iBAAiB,YAAY,KAAK,cAAc,QAAQ,CAAC,EAAE,EAC9G,SAAS,GAAGC,+BAAAA,YAAY,QAAQ,OAAO,KAAKD,iBAAAA,iBAAiB,YAAY,KAAK,cAAc,QAAQ,CAAC,QAAQ,EAC9G,CAAC;AAEJ,SAAO,IAAID,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,gBAAgBH,IAAAA,aAAa,KAAK,wBAAwB,CAAC;CACzFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,uBAAuB,OAAO,EAAE,cAAc;EAC1E,MAAM,EAAE,cAAc,EAAE,KAAK,MAAM,QAAQ,MAAM;AACjD,MAAI,YAAY,uBAAuB,GACrC,QAAO,IAAIH,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;AAEhD,SAAO,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,IAAI,GAAGK,+BAAAA,kBAAkB,kCAAkC,EAAE,QAAQ,EAAE,iBAAiB;AAC3F,MAAI,aAAaF,iBAAAA,iBAAiB,QAAQ,KAAK,GAAG,GAChD,QAAO,IAAID,IAAAA,aACT,KAAK,UAAU,CACb;GACE,IAAI,kBAAkB,KAAK;GAC3B,YAAY;IAAE,GAAG;IAAmB,IAAIC,iBAAAA,iBAAiB,YAAY,KAAK,GAAG;IAAI,QAAQ;IAAc;GACvG,QAAQ;IACN,SAAS;IACT,UAAU;IACV,QAAQ;IACR,IAAI;IACJ,OAAO,EAAE,GAAGA,iBAAAA,iBAAiB,SAAS,KAAK,IAAI;IAChD;GACD,KAAK;GACL,UAAU;GACV,cAAc;GACf,CACF,CAAC,EACF,EACE,SAAS,GAAGC,+BAAAA,YAAY,QAAQ,IAAI,EACrC,CACF;AAEH,SAAO,IAAIF,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACFF,IAAAA,KAAK,OAAO,GAAGK,+BAAAA,kBAAkB,+CAA+C,IAAIH,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC;CACxHF,IAAAA,KAAK,IAAI,iGAAiG,EAAE,QAAQ,EAAE,cAAc,iBAAiB;AACnJ,MAAI,iBAAiBG,iBAAAA,iBAAiB,YAAY,KAAK,GAAG,MAAM,aAAaA,iBAAAA,iBAAiB,QAAQ,KAAK,GAAG,GAa5G,QAAOD,IAAAA,aAAa,KAZC;;;;;;;;;;;+CAYiB;AAExC,MAAI,iBAAiB,0BACnB,QAAO,IAAIA,IAAAA,aAAa,KAAK,UAAU,EAAE,OAAO,uBAAuB,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE5F,MAAI,iBAAiB,mBACnB,QAAO,IAAIA,IAAAA,aAAa,KAAK,UAAU,EAAE,OAAO,mBAAmB,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAExF,SAAO,IAAIA,IAAAA,aAAa,MAAM,EAAE,QAAQ,KAAK,CAAC;GAC9C;CACH"}
@@ -0,0 +1,7 @@
1
+ import * as _$msw from "msw";
2
+
3
+ //#region src/requestHandlers/deploymentHandlers.d.ts
4
+ declare const deploymentHandlers: _$msw.HttpHandler[];
5
+ //#endregion
6
+ export { deploymentHandlers };
7
+ //# sourceMappingURL=deploymentHandlers.d.cts.map
@@ -0,0 +1,7 @@
1
+ import * as _$msw from "msw";
2
+
3
+ //#region src/requestHandlers/deploymentHandlers.d.ts
4
+ declare const deploymentHandlers: _$msw.HttpHandler[];
5
+ //#endregion
6
+ export { deploymentHandlers };
7
+ //# sourceMappingURL=deploymentHandlers.d.ts.map
@@ -0,0 +1,191 @@
1
+ import { mockApiResponses } from "../mockData.js";
2
+ import { deploymentsApiUrl, deploymentsApiUrlV2, headerNames, limitDefault } from "@northern.tech/utils/constants";
3
+ import { HttpResponse, http } from "msw";
4
+ //#region src/requestHandlers/deploymentHandlers.ts
5
+ const createdDeployment = {
6
+ id: "created-123",
7
+ name: "test deployment",
8
+ artifact_name: "r1",
9
+ artifacts: ["123"],
10
+ created: "2019-01-01T12:30:00.000Z",
11
+ device_count: 1,
12
+ devices: { a1: {
13
+ attributes: {},
14
+ id: "a1",
15
+ image: { size: 123 },
16
+ status: "installing"
17
+ } },
18
+ filter: void 0,
19
+ group: void 0,
20
+ statistics: {
21
+ status: {
22
+ downloading: 0,
23
+ decommissioned: 0,
24
+ failure: 0,
25
+ installing: 1,
26
+ noartifact: 0,
27
+ pending: 0,
28
+ rebooting: 0,
29
+ success: 0,
30
+ "already-installed": 0
31
+ },
32
+ total_size: 1234
33
+ }
34
+ };
35
+ const defaultDeploymentConfig = { delta: {
36
+ enabled: true,
37
+ binary_delta: {
38
+ xdelta_args: {
39
+ disable_checksum: false,
40
+ disable_external_decompression: false,
41
+ compression_level: 6,
42
+ source_window_size: 0,
43
+ input_window_size: 0,
44
+ compression_duplicates_window: 0,
45
+ instruction_buffer_size: 0
46
+ },
47
+ timeout: 0
48
+ },
49
+ binary_delta_limits: {
50
+ xdelta_args_limits: {
51
+ source_window_size: limitDefault,
52
+ input_window_size: limitDefault,
53
+ compression_duplicates_window: limitDefault,
54
+ instruction_buffer_size: limitDefault
55
+ },
56
+ timeout: {
57
+ min: 60,
58
+ max: 3600,
59
+ default: 60
60
+ },
61
+ jobs_in_parallel: limitDefault,
62
+ queue_length: limitDefault
63
+ }
64
+ } };
65
+ const deploymentHandlers = [
66
+ http.get(`${deploymentsApiUrlV2}/deployments`, () => new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId).reverse()), { headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId).length } })),
67
+ http.get(`${deploymentsApiUrl}/deployments/releases`, ({ request }) => {
68
+ const { searchParams } = new URL(request.url);
69
+ const releaseName = searchParams.get("name");
70
+ const release = mockApiResponses.releases.byId[releaseName] || {};
71
+ if (releaseName) {
72
+ const { device_types_compatible, ...remainder } = release;
73
+ return Object.keys(remainder).length || releaseName === "createdRelease" ? HttpResponse.json([remainder]) : new HttpResponse(null, { status: 520 });
74
+ }
75
+ const releases = Object.values(mockApiResponses.releases.byId).map((stateRelease) => {
76
+ const { device_types_compatible, ...remainder } = stateRelease;
77
+ return remainder;
78
+ });
79
+ return HttpResponse.json(releases);
80
+ }),
81
+ http.get(`${deploymentsApiUrl}/deployments/:deploymentId`, ({ params: { deploymentId } }) => {
82
+ if (deploymentId === createdDeployment.id) return HttpResponse.json(createdDeployment);
83
+ else if (deploymentId === "config1") return HttpResponse.json({
84
+ ...createdDeployment,
85
+ id: "config1",
86
+ created: "2019-01-01T09:25:01.000Z",
87
+ finished: "2019-01-01T09:25:03.000Z",
88
+ status: "finished"
89
+ });
90
+ return HttpResponse.json(mockApiResponses.deployments.byId[deploymentId]);
91
+ }),
92
+ http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices`, ({ params: { deploymentId } }) => {
93
+ if (deploymentId === createdDeployment.id) return HttpResponse.json(Object.values(createdDeployment.devices));
94
+ else if (mockApiResponses.deployments.byId[deploymentId]) return HttpResponse.json(Object.values(mockApiResponses.deployments.byId[deploymentId].devices));
95
+ return new HttpResponse(null, { status: 521 });
96
+ }),
97
+ http.post(`${deploymentsApiUrl}/deployments/statistics/list`, async ({ request }) => {
98
+ const { deployment_ids = [] } = await request.json();
99
+ if (deployment_ids.includes(createdDeployment.id)) return HttpResponse.json([]);
100
+ else if (deployment_ids.every((id) => mockApiResponses.deployments.byId[id])) {
101
+ const stats = deployment_ids.map((id) => ({
102
+ id,
103
+ stats: mockApiResponses.deployments.byId[id].statistics.status
104
+ }));
105
+ return HttpResponse.json(stats);
106
+ }
107
+ return new HttpResponse(null, { status: 522 });
108
+ }),
109
+ http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/:deviceId/log`, ({ params: { deploymentId, deviceId } }) => {
110
+ if (mockApiResponses.deployments.byId[deploymentId] && mockApiResponses.deployments.byId[deploymentId].devices[deviceId]) return HttpResponse.text("test");
111
+ return new HttpResponse(null, { status: 523 });
112
+ }),
113
+ http.post(`${deploymentsApiUrl}/deployments`, async ({ request }) => {
114
+ const body = await request.json();
115
+ if (!Object.keys(body).length) return new HttpResponse(JSON.stringify({}), { status: 524 });
116
+ return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
117
+ }),
118
+ http.post(`${deploymentsApiUrlV2}/deployments`, async ({ request }) => {
119
+ const { filter_id, devices = [] } = await request.json();
120
+ if (!filter_id || !!devices.length) return new HttpResponse(JSON.stringify({}), { status: 525 });
121
+ return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
122
+ }),
123
+ http.post(`${deploymentsApiUrl}/deployments/group/:deploymentGroup`, async ({ params: { deploymentGroup }, request }) => {
124
+ const { filter_id, devices = [] } = await request.json();
125
+ if (filter_id || !!devices.length || deploymentGroup !== Object.keys(mockApiResponses.devices.groups.byId)[0]) return new HttpResponse(JSON.stringify({}), { status: 526 });
126
+ return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });
127
+ }),
128
+ http.patch(`${deploymentsApiUrl}/deployments/:deploymentId`, async ({ params: { deploymentId }, request }) => {
129
+ const { update_control_map } = await request.json();
130
+ if (deploymentId === createdDeployment.id && Object.keys(update_control_map).length) return new HttpResponse(null, { status: 204 });
131
+ return new HttpResponse(null, { status: 581 });
132
+ }),
133
+ http.put(`${deploymentsApiUrl}/deployments/:deploymentId/status`, async ({ params: { deploymentId }, request }) => {
134
+ const { status } = await request.json();
135
+ return new HttpResponse(JSON.stringify({}), { status: status === "aborted" && [...mockApiResponses.deployments.byStatus.pending.deploymentIds, ...mockApiResponses.deployments.byStatus.inprogress.deploymentIds].includes(deploymentId) ? 200 : 528 });
136
+ }),
137
+ http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/list`, ({ params: { deploymentId } }) => {
138
+ if (deploymentId === createdDeployment.id) return new HttpResponse(JSON.stringify(Object.values(createdDeployment.devices)), { headers: { [headerNames.total]: Object.keys(createdDeployment.devices).length } });
139
+ else if (mockApiResponses.deployments.byId[deploymentId]) return new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId[deploymentId].devices)), { headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId[deploymentId].devices).length } });
140
+ return new HttpResponse(null, { status: 529 });
141
+ }),
142
+ http.get(`${deploymentsApiUrl}/config`, () => HttpResponse.json(defaultDeploymentConfig)),
143
+ http.put(`${deploymentsApiUrl}/config/binary_delta`, async ({ request }) => {
144
+ const { xdelta_args = {} } = await request.json();
145
+ if (xdelta_args.source_window_size === 55) return new HttpResponse(null, { status: 530 });
146
+ return new HttpResponse(null, { status: 200 });
147
+ }),
148
+ http.get(`${deploymentsApiUrl}/deployments/devices/:deviceId`, ({ params: { deviceId } }) => {
149
+ if (deviceId === mockApiResponses.devices.byId.a1.id) return new HttpResponse(JSON.stringify([{
150
+ id: createdDeployment.id + "something",
151
+ deployment: {
152
+ ...createdDeployment,
153
+ id: mockApiResponses.deployments.byId.d1.id,
154
+ status: "inprogress"
155
+ },
156
+ device: {
157
+ created: "2019-01-01T12:35:00.000Z",
158
+ finished: "2019-01-01T12:40:00.000Z",
159
+ status: "noartifact",
160
+ id: "something",
161
+ image: { ...mockApiResponses.releases.byId.r1 }
162
+ },
163
+ log: true,
164
+ attempts: 1,
165
+ delta_job_id: ""
166
+ }]), { headers: { [headerNames.total]: 34 } });
167
+ return new HttpResponse(null, { status: 529 });
168
+ }),
169
+ http.delete(`${deploymentsApiUrl}/deployments/devices/:deviceId/history`, () => new HttpResponse(null, { status: 204 })),
170
+ http.get(`/api/management/v1alpha1/deployments/deployments/:deploymentId/devices/:deviceId/log/explain`, ({ params: { deploymentId, deviceId } }) => {
171
+ if (deploymentId === mockApiResponses.deployments.byId.d1.id && deviceId === mockApiResponses.devices.byId.a1.id) return HttpResponse.text(`## Summary
172
+ The deployment failed during the artifact download phase. The device was unable to establish a secure connection to the artifact repository.
173
+
174
+ ## Key Issues
175
+ 1. **Network connectivity issues** - Connection timeout occurred
176
+ 2. **SSL/TLS certificate verification failed** - Invalid certificate chain
177
+ 3. **Artifact verification failed** - Checksum mismatch detected
178
+
179
+ ## Recommendations
180
+ - Check network connectivity between device and artifact repository
181
+ - Verify SSL certificates are properly configured
182
+ - Ensure artifact integrity before deployment`);
183
+ if (deploymentId === "rate-limited-deployment") return new HttpResponse(JSON.stringify({ error: "Rate limit exceeded" }), { status: 429 });
184
+ if (deploymentId === "error-deployment") return new HttpResponse(JSON.stringify({ error: "Analysis failed" }), { status: 500 });
185
+ return new HttpResponse(null, { status: 404 });
186
+ })
187
+ ];
188
+ //#endregion
189
+ export { deploymentHandlers };
190
+
191
+ //# sourceMappingURL=deploymentHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploymentHandlers.js","names":[],"sources":["../../src/requestHandlers/deploymentHandlers.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 { deploymentsApiUrl, deploymentsApiUrlV2, headerNames, limitDefault } from '@northern.tech/utils/constants';\nimport { HttpResponse, http } from 'msw';\n\nimport { mockApiResponses } from '../mockData';\n\nconst createdDeployment = {\n id: 'created-123',\n name: 'test deployment',\n artifact_name: 'r1',\n artifacts: ['123'],\n created: '2019-01-01T12:30:00.000Z',\n device_count: 1,\n devices: {\n a1: {\n attributes: {},\n id: 'a1',\n image: { size: 123 },\n status: 'installing'\n }\n },\n filter: undefined,\n group: undefined,\n statistics: {\n status: {\n downloading: 0,\n decommissioned: 0,\n failure: 0,\n installing: 1,\n noartifact: 0,\n pending: 0,\n rebooting: 0,\n success: 0,\n 'already-installed': 0\n },\n total_size: 1234\n }\n};\n\nconst defaultDeploymentConfig = {\n delta: {\n enabled: true,\n binary_delta: {\n xdelta_args: {\n disable_checksum: false,\n disable_external_decompression: false,\n compression_level: 6,\n source_window_size: 0,\n input_window_size: 0,\n compression_duplicates_window: 0,\n instruction_buffer_size: 0\n },\n timeout: 0\n },\n binary_delta_limits: {\n xdelta_args_limits: {\n source_window_size: limitDefault,\n input_window_size: limitDefault,\n compression_duplicates_window: limitDefault,\n instruction_buffer_size: limitDefault\n },\n timeout: { min: 60, max: 3600, default: 60 },\n jobs_in_parallel: limitDefault,\n queue_length: limitDefault\n }\n }\n};\n\nexport const deploymentHandlers = [\n http.get(\n `${deploymentsApiUrlV2}/deployments`,\n () =>\n new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId).reverse()), {\n headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId).length }\n })\n ),\n http.get(`${deploymentsApiUrl}/deployments/releases`, ({ request }) => {\n const { searchParams } = new URL(request.url);\n const releaseName = searchParams.get('name');\n const release = mockApiResponses.releases.byId[releaseName] || {};\n if (releaseName) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { device_types_compatible, ...remainder } = release;\n return Object.keys(remainder).length || releaseName === 'createdRelease' ? HttpResponse.json([remainder]) : new HttpResponse(null, { status: 520 });\n }\n const releases = Object.values(mockApiResponses.releases.byId).map(stateRelease => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { device_types_compatible, ...remainder } = stateRelease;\n return remainder;\n });\n return HttpResponse.json(releases);\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return HttpResponse.json(createdDeployment);\n } else if (deploymentId === 'config1') {\n return HttpResponse.json({\n ...createdDeployment,\n id: 'config1',\n created: '2019-01-01T09:25:01.000Z',\n finished: '2019-01-01T09:25:03.000Z',\n status: 'finished'\n });\n }\n return HttpResponse.json(mockApiResponses.deployments.byId[deploymentId]);\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return HttpResponse.json(Object.values(createdDeployment.devices));\n } else if (mockApiResponses.deployments.byId[deploymentId]) {\n return HttpResponse.json(Object.values(mockApiResponses.deployments.byId[deploymentId].devices));\n }\n return new HttpResponse(null, { status: 521 });\n }),\n http.post(`${deploymentsApiUrl}/deployments/statistics/list`, async ({ request }) => {\n const { deployment_ids = [] } = await request.json();\n if (deployment_ids.includes(createdDeployment.id)) {\n return HttpResponse.json([]);\n } else if (deployment_ids.every(id => mockApiResponses.deployments.byId[id])) {\n const stats = deployment_ids.map(id => ({ id, stats: mockApiResponses.deployments.byId[id].statistics.status }));\n return HttpResponse.json(stats);\n }\n return new HttpResponse(null, { status: 522 });\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/:deviceId/log`, ({ params: { deploymentId, deviceId } }) => {\n if (mockApiResponses.deployments.byId[deploymentId] && mockApiResponses.deployments.byId[deploymentId].devices[deviceId]) {\n return HttpResponse.text('test');\n }\n return new HttpResponse(null, { status: 523 });\n }),\n http.post(`${deploymentsApiUrl}/deployments`, async ({ request }) => {\n const body = await request.json();\n if (!Object.keys(body).length) {\n return new HttpResponse(JSON.stringify({}), { status: 524 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.post(`${deploymentsApiUrlV2}/deployments`, async ({ request }) => {\n const { filter_id, devices = [] } = await request.json();\n if (!filter_id || !!devices.length) {\n return new HttpResponse(JSON.stringify({}), { status: 525 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.post(`${deploymentsApiUrl}/deployments/group/:deploymentGroup`, async ({ params: { deploymentGroup }, request }) => {\n const { filter_id, devices = [] } = await request.json();\n if (filter_id || !!devices.length || deploymentGroup !== Object.keys(mockApiResponses.devices.groups.byId)[0]) {\n return new HttpResponse(JSON.stringify({}), { status: 526 });\n }\n return new HttpResponse(JSON.stringify({}), { headers: { location: `find/me/here/${createdDeployment.id}` } });\n }),\n http.patch(`${deploymentsApiUrl}/deployments/:deploymentId`, async ({ params: { deploymentId }, request }) => {\n const { update_control_map } = await request.json();\n if (deploymentId === createdDeployment.id && Object.keys(update_control_map).length) {\n return new HttpResponse(null, { status: 204 });\n }\n return new HttpResponse(null, { status: 581 });\n }),\n http.put(`${deploymentsApiUrl}/deployments/:deploymentId/status`, async ({ params: { deploymentId }, request }) => {\n const { status } = await request.json();\n return new HttpResponse(JSON.stringify({}), {\n status:\n status === 'aborted' &&\n [...mockApiResponses.deployments.byStatus.pending.deploymentIds, ...mockApiResponses.deployments.byStatus.inprogress.deploymentIds].includes(\n deploymentId\n )\n ? 200\n : 528\n });\n }),\n http.get(`${deploymentsApiUrl}/deployments/:deploymentId/devices/list`, ({ params: { deploymentId } }) => {\n if (deploymentId === createdDeployment.id) {\n return new HttpResponse(JSON.stringify(Object.values(createdDeployment.devices)), {\n headers: { [headerNames.total]: Object.keys(createdDeployment.devices).length }\n });\n } else if (mockApiResponses.deployments.byId[deploymentId]) {\n return new HttpResponse(JSON.stringify(Object.values(mockApiResponses.deployments.byId[deploymentId].devices)), {\n headers: { [headerNames.total]: Object.keys(mockApiResponses.deployments.byId[deploymentId].devices).length }\n });\n }\n return new HttpResponse(null, { status: 529 });\n }),\n http.get(`${deploymentsApiUrl}/config`, () => HttpResponse.json(defaultDeploymentConfig)),\n http.put(`${deploymentsApiUrl}/config/binary_delta`, async ({ request }) => {\n const { xdelta_args = {} } = await request.json();\n if (xdelta_args.source_window_size === 55) {\n return new HttpResponse(null, { status: 530 });\n }\n return new HttpResponse(null, { status: 200 });\n }),\n http.get(`${deploymentsApiUrl}/deployments/devices/:deviceId`, ({ params: { deviceId } }) => {\n if (deviceId === mockApiResponses.devices.byId.a1.id) {\n return new HttpResponse(\n JSON.stringify([\n {\n id: createdDeployment.id + 'something',\n deployment: { ...createdDeployment, id: mockApiResponses.deployments.byId.d1.id, status: 'inprogress' },\n device: {\n created: '2019-01-01T12:35:00.000Z',\n finished: '2019-01-01T12:40:00.000Z',\n status: 'noartifact',\n id: 'something',\n image: { ...mockApiResponses.releases.byId.r1 }\n },\n log: true,\n attempts: 1,\n delta_job_id: ''\n }\n ]),\n {\n headers: { [headerNames.total]: 34 }\n }\n );\n }\n return new HttpResponse(null, { status: 529 });\n }),\n http.delete(`${deploymentsApiUrl}/deployments/devices/:deviceId/history`, () => new HttpResponse(null, { status: 204 })),\n http.get(`/api/management/v1alpha1/deployments/deployments/:deploymentId/devices/:deviceId/log/explain`, ({ params: { deploymentId, deviceId } }) => {\n if (deploymentId === mockApiResponses.deployments.byId.d1.id && deviceId === mockApiResponses.devices.byId.a1.id) {\n const mockAnalysis = `## Summary\nThe deployment failed during the artifact download phase. The device was unable to establish a secure connection to the artifact repository.\n\n## Key Issues\n1. **Network connectivity issues** - Connection timeout occurred\n2. **SSL/TLS certificate verification failed** - Invalid certificate chain\n3. **Artifact verification failed** - Checksum mismatch detected\n\n## Recommendations\n- Check network connectivity between device and artifact repository\n- Verify SSL certificates are properly configured\n- Ensure artifact integrity before deployment`;\n return HttpResponse.text(mockAnalysis);\n }\n if (deploymentId === 'rate-limited-deployment') {\n return new HttpResponse(JSON.stringify({ error: 'Rate limit exceeded' }), { status: 429 });\n }\n if (deploymentId === 'error-deployment') {\n return new HttpResponse(JSON.stringify({ error: 'Analysis failed' }), { status: 500 });\n }\n return new HttpResponse(null, { status: 404 });\n })\n];\n"],"mappings":"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"}