@oneuptime/common 12.0.34 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/Models/DatabaseModels/GlobalConfig.ts +12 -12
  2. package/Models/DatabaseModels/InventoryItem.ts +44 -1
  3. package/Models/DatabaseModels/NetworkDevice.ts +126 -0
  4. package/Server/EnvironmentConfig.ts +47 -16
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  7. package/Server/Infrastructure/Redis.ts +8 -8
  8. package/Server/Infrastructure/Status.ts +10 -4
  9. package/Server/Services/DatabaseService.ts +65 -13
  10. package/Server/Services/InventoryItemService.ts +31 -1
  11. package/Server/Services/MonitorTemplateService.ts +140 -19
  12. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +349 -41
  13. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
  14. package/Server/Services/NetworkDeviceService.ts +69 -0
  15. package/Server/Services/UserNotificationRuleService.ts +76 -25
  16. package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
  17. package/Server/Types/Database/QueryUtil.ts +56 -0
  18. package/Server/Types/Markdown.ts +93 -1
  19. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
  20. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +10 -1
  21. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
  22. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
  23. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
  24. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +202 -37
  25. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
  26. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
  27. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
  28. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
  29. package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
  30. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
  31. package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
  32. package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
  33. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
  34. package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
  35. package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
  36. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
  37. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
  38. package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
  39. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
  40. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
  41. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
  42. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
  43. package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
  44. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
  45. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
  46. package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
  47. package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
  48. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
  49. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
  50. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
  51. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
  52. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
  53. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
  54. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
  55. package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
  56. package/Tests/Models/InventoryItemStatus.test.ts +147 -0
  57. package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
  58. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
  59. package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
  60. package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
  61. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
  62. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
  63. package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
  64. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
  65. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
  66. package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
  67. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
  68. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
  69. package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
  70. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
  71. package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
  72. package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
  73. package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
  74. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
  75. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
  76. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
  77. package/Tests/Server/Types/Markdown.test.ts +194 -1
  78. package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
  79. package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
  80. package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
  81. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
  82. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  83. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
  84. package/Tests/Server/Utils/EventLoop.test.ts +359 -0
  85. package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
  86. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
  87. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
  88. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
  90. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
  91. package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
  92. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +224 -10
  93. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
  94. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
  95. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
  96. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
  97. package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
  98. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
  99. package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
  100. package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
  101. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
  102. package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
  103. package/Tests/Types/JSONFunctions.test.ts +40 -0
  104. package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
  105. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
  106. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
  107. package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
  108. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
  109. package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
  110. package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
  111. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
  112. package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
  113. package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
  114. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  115. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
  116. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
  117. package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
  118. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
  119. package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
  120. package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
  121. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
  122. package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
  123. package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
  124. package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
  125. package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
  126. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  127. package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
  128. package/Types/Dashboard/DashboardVariable.ts +8 -0
  129. package/Types/JSON.ts +4 -0
  130. package/Types/JSONFunctions.ts +16 -0
  131. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  132. package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
  133. package/Types/SerializableObjectDictionary.ts +4 -0
  134. package/Types/Telemetry/InventoryLiveness.ts +56 -0
  135. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
  136. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
  137. package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
  138. package/UI/esbuild-config.js +6 -0
  139. package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
  140. package/Utils/Dashboard/LabelVariable.ts +152 -0
  141. package/Utils/Dashboard/VariableUrlState.ts +27 -5
  142. package/Utils/MetricUnitUtil.ts +34 -0
  143. package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
  144. package/Utils/Monitor/MetricValueFormatter.ts +342 -0
  145. package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
  146. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
  147. package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
  148. package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
  149. package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
  150. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
  152. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
  154. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  155. package/build/dist/Server/EnvironmentConfig.js +44 -12
  156. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  157. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
  158. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
  159. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  160. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  161. package/build/dist/Server/Infrastructure/Redis.js +8 -8
  162. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  163. package/build/dist/Server/Infrastructure/Status.js +10 -4
  164. package/build/dist/Server/Infrastructure/Status.js.map +1 -1
  165. package/build/dist/Server/Services/DatabaseService.js +58 -13
  166. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  167. package/build/dist/Server/Services/InventoryItemService.js +28 -1
  168. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  169. package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
  170. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  171. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +270 -37
  172. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  173. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
  174. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  175. package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
  176. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  177. package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
  178. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  179. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
  180. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  181. package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
  182. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  183. package/build/dist/Server/Types/Markdown.js +75 -0
  184. package/build/dist/Server/Types/Markdown.js.map +1 -1
  185. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
  186. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  187. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +10 -1
  188. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  189. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
  190. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  191. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
  192. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  193. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
  194. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  195. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +166 -35
  196. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  197. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
  198. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  199. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
  200. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  201. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
  202. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  203. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
  204. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  205. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
  206. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
  207. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
  208. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  209. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
  210. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  211. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
  212. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  213. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
  214. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
  215. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  216. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  217. package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
  218. package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
  219. package/build/dist/Types/JSON.js +1 -0
  220. package/build/dist/Types/JSON.js.map +1 -1
  221. package/build/dist/Types/JSONFunctions.js +13 -0
  222. package/build/dist/Types/JSONFunctions.js.map +1 -1
  223. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
  224. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  225. package/build/dist/Types/SerializableObjectDictionary.js +4 -0
  226. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  227. package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
  228. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
  229. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
  230. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  231. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
  232. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  233. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
  234. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
  235. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
  236. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
  237. package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
  238. package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
  239. package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
  240. package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
  241. package/build/dist/Utils/MetricUnitUtil.js +26 -0
  242. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  243. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
  244. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
  245. package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
  246. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
  247. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
  248. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
  249. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
  250. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  251. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
  252. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  253. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
  254. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
  255. package/jest.config.json +2 -0
  256. package/package.json +1 -1
  257. package/test-setup.sh +9 -9
  258. package/tsconfig.json +51 -11
  259. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
@@ -0,0 +1,273 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ afterEach,
4
+ beforeEach,
5
+ describe,
6
+ expect,
7
+ jest,
8
+ test,
9
+ } from "@jest/globals";
10
+ import { cleanup, render, screen, waitFor } from "@testing-library/react";
11
+ import * as React from "react";
12
+ import { MemoryRouter } from "react-router-dom";
13
+
14
+ /*
15
+ * The device Overview's "Connected to" card, RENDERED.
16
+ *
17
+ * The lookup util has its own unit tests (App/Tests/Dashboard) for which
18
+ * rows are the device and which of them is the cable. What only a render
19
+ * can pin is what the card DOES with the answer: the switch is a link to
20
+ * its own device page, the port and VLAN are the ones from the chosen row,
21
+ * the evidence line says which key matched, and the empty state - two
22
+ * different sentences, for "nothing found" and for "nothing to look up
23
+ * by" - carries the Settings link the operator needs next.
24
+ */
25
+
26
+ let deviceRow: NetworkDevice | null = null;
27
+ let endpointRows: Array<NetworkEndpoint> = [];
28
+ let listQueries: Array<Record<string, unknown>> = [];
29
+
30
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
31
+ return {
32
+ __esModule: true,
33
+ default: {
34
+ getItem: (): Promise<unknown> => {
35
+ return Promise.resolve(deviceRow);
36
+ },
37
+ getList: (request: {
38
+ modelType: { name: string };
39
+ query: Record<string, unknown>;
40
+ }): Promise<unknown> => {
41
+ /*
42
+ * The card also reads the DEVICE table, for the other devices that
43
+ * could claim the same rows. None exist here; only the endpoint
44
+ * queries are the ones these tests reason about.
45
+ */
46
+ if (request.modelType.name !== "NetworkEndpoint") {
47
+ return Promise.resolve({ data: [], count: 0, skip: 0, limit: 50 });
48
+ }
49
+ listQueries.push(request.query);
50
+ return Promise.resolve({
51
+ data: endpointRows,
52
+ count: endpointRows.length,
53
+ skip: 0,
54
+ limit: 50,
55
+ });
56
+ },
57
+ },
58
+ };
59
+ });
60
+
61
+ import DeviceAttachmentCard from "../../../../App/FeatureSet/Dashboard/src/Components/NetworkDevice/DeviceAttachmentCard";
62
+ import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
63
+ import RouteMap, {
64
+ RouteUtil,
65
+ } from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
66
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
67
+ import NetworkEndpoint from "../../../Models/DatabaseModels/NetworkEndpoint";
68
+ import Route from "../../../Types/API/Route";
69
+ import ObjectID from "../../../Types/ObjectID";
70
+
71
+ /*
72
+ * Below the imports on purpose: the jest.mock factory above is hoisted, which
73
+ * leaves the imports evaluated after any module-level constant that precedes
74
+ * them, and constructing an ObjectID up there runs before the class exists.
75
+ */
76
+ const DEVICE_ID: ObjectID = new ObjectID(
77
+ "22222222-2222-4222-8222-222222222222",
78
+ );
79
+ const SWITCH_ID: ObjectID = new ObjectID(
80
+ "33333333-3333-4333-8333-333333333333",
81
+ );
82
+ const SITE_ID: ObjectID = new ObjectID("44444444-4444-4444-8444-444444444444");
83
+
84
+ const REGISTER_MAC: string = "aa:bb:cc:dd:ee:ff";
85
+
86
+ function device(data: {
87
+ hostname: string;
88
+ macAddress?: string | undefined;
89
+ }): NetworkDevice {
90
+ const row: NetworkDevice = new NetworkDevice();
91
+ row.id = DEVICE_ID;
92
+ row.name = "Register 3";
93
+ row.hostname = data.hostname;
94
+ row.siteId = SITE_ID;
95
+
96
+ if (data.macAddress !== undefined) {
97
+ row.macAddress = data.macAddress;
98
+ }
99
+
100
+ return row;
101
+ }
102
+
103
+ /** The register as the store switch's forwarding table reported it. */
104
+ function learnedEndpoint(data: {
105
+ macAddress: string;
106
+ ipAddress?: string | undefined;
107
+ portName?: string | undefined;
108
+ vlanId?: number | undefined;
109
+ }): NetworkEndpoint {
110
+ const endpoint: NetworkEndpoint = new NetworkEndpoint();
111
+ endpoint._id = "55555555-5555-4555-8555-555555555555";
112
+ endpoint.macAddress = data.macAddress;
113
+ endpoint.siteId = SITE_ID;
114
+ endpoint.attachedNetworkDeviceId = SWITCH_ID;
115
+ endpoint.attachedInterfaceIndex = 7;
116
+ endpoint.lastSeenAt = new Date();
117
+
118
+ const attached: NetworkDevice = new NetworkDevice();
119
+ attached._id = SWITCH_ID.toString();
120
+ attached.name = "Store switch";
121
+ endpoint.attachedNetworkDevice = attached;
122
+
123
+ if (data.ipAddress !== undefined) {
124
+ endpoint.ipAddress = data.ipAddress;
125
+ }
126
+
127
+ if (data.portName !== undefined) {
128
+ endpoint.attachedPortName = data.portName;
129
+ }
130
+
131
+ if (data.vlanId !== undefined) {
132
+ endpoint.vlanId = data.vlanId;
133
+ }
134
+
135
+ return endpoint;
136
+ }
137
+
138
+ async function renderCard(): Promise<HTMLElement> {
139
+ render(
140
+ <MemoryRouter>
141
+ <DeviceAttachmentCard modelId={DEVICE_ID} />
142
+ </MemoryRouter>,
143
+ );
144
+
145
+ const content: HTMLElement = screen.getByTestId("device-attachment-card");
146
+
147
+ await waitFor(() => {
148
+ expect(
149
+ content.querySelector('[data-testid="component-loader"]'),
150
+ ).toBeNull();
151
+ expect(
152
+ content.querySelector('[data-testid="device-attachment-empty"]') ||
153
+ content.querySelector('[data-testid="device-attachment-port"]'),
154
+ ).not.toBeNull();
155
+ });
156
+
157
+ return content;
158
+ }
159
+
160
+ const SWITCH_HREF: string = RouteUtil.populateRouteParams(
161
+ RouteMap[PageMap.NETWORK_DEVICE_VIEW] as Route,
162
+ { modelId: SWITCH_ID },
163
+ ).toString();
164
+
165
+ const SETTINGS_HREF: string = RouteUtil.populateRouteParams(
166
+ RouteMap[PageMap.NETWORK_DEVICE_VIEW_SETTINGS] as Route,
167
+ { modelId: DEVICE_ID },
168
+ ).toString();
169
+
170
+ describe("the device Overview Connected to card", () => {
171
+ beforeEach(() => {
172
+ deviceRow = null;
173
+ endpointRows = [];
174
+ listQueries = [];
175
+ });
176
+
177
+ afterEach(() => {
178
+ cleanup();
179
+ jest.clearAllMocks();
180
+ });
181
+
182
+ test("names the switch as a link, with the port and VLAN the switch learned", async () => {
183
+ deviceRow = device({ hostname: "10.0.12.41", macAddress: REGISTER_MAC });
184
+ endpointRows = [
185
+ learnedEndpoint({
186
+ macAddress: REGISTER_MAC,
187
+ ipAddress: "10.0.12.41",
188
+ portName: "Gi1/0/7",
189
+ vlanId: 20,
190
+ }),
191
+ ];
192
+
193
+ const content: HTMLElement = await renderCard();
194
+
195
+ const link: HTMLElement = screen.getByTestId(
196
+ "device-attachment-switch-link",
197
+ );
198
+ expect(link).toHaveTextContent("Store switch");
199
+ expect(link.querySelector("a")?.getAttribute("href")).toBe(SWITCH_HREF);
200
+
201
+ expect(screen.getByTestId("device-attachment-port")).toHaveTextContent(
202
+ "Gi1/0/7",
203
+ );
204
+ expect(screen.getByTestId("device-attachment-vlan")).toHaveTextContent(
205
+ "20",
206
+ );
207
+ expect(content).toHaveTextContent(REGISTER_MAC);
208
+ expect(content).toHaveTextContent("Matched by MAC address");
209
+ expect(content).toHaveTextContent("Last seen");
210
+
211
+ expect(
212
+ content.querySelector('[data-testid="device-attachment-empty"]'),
213
+ ).toBeNull();
214
+ });
215
+
216
+ test("a device known only by its IP address is matched by address, and shows the MAC the switch learned", async () => {
217
+ deviceRow = device({ hostname: "10.0.12.41" });
218
+ endpointRows = [
219
+ learnedEndpoint({
220
+ macAddress: REGISTER_MAC,
221
+ ipAddress: "10.0.12.41",
222
+ vlanId: 20,
223
+ }),
224
+ ];
225
+
226
+ const content: HTMLElement = await renderCard();
227
+
228
+ // Scoped to the device's site on the server: an address is a key inside a site.
229
+ expect(listQueries).toHaveLength(1);
230
+ expect(listQueries[0]?.["ipAddress"]).toBe("10.0.12.41");
231
+ expect(listQueries[0]?.["siteId"]?.toString()).toBe(SITE_ID.toString());
232
+ expect(content).toHaveTextContent("Matched by IP address");
233
+ expect(content).toHaveTextContent(REGISTER_MAC);
234
+ // No port name on the row: the interface index stands in.
235
+ expect(screen.getByTestId("device-attachment-port")).toHaveTextContent(
236
+ "ifIndex 7",
237
+ );
238
+ });
239
+
240
+ test("no matching row is the empty state, pointing at Settings", async () => {
241
+ deviceRow = device({ hostname: "10.0.12.41", macAddress: REGISTER_MAC });
242
+ endpointRows = [];
243
+
244
+ const content: HTMLElement = await renderCard();
245
+
246
+ const empty: HTMLElement = screen.getByTestId("device-attachment-empty");
247
+ expect(empty).toHaveTextContent("Collect Connected Endpoints");
248
+ expect(empty).toHaveTextContent("No switch at this site has reported");
249
+ expect(empty.querySelector("a")?.getAttribute("href")).toBe(SETTINGS_HREF);
250
+
251
+ expect(
252
+ content.querySelector('[data-testid="device-attachment-switch-link"]'),
253
+ ).toBeNull();
254
+ });
255
+
256
+ test("a device with neither a MAC nor an IP hostname is told what to add", async () => {
257
+ deviceRow = device({ hostname: "register-03.store.example" });
258
+
259
+ const content: HTMLElement = await renderCard();
260
+
261
+ // Nothing to look up by, so nothing was looked up.
262
+ expect(listQueries).toEqual([]);
263
+
264
+ const empty: HTMLElement = screen.getByTestId("device-attachment-empty");
265
+ expect(empty).toHaveTextContent("nothing to look this device up by");
266
+ expect(empty).toHaveTextContent("Give it a MAC address");
267
+ expect(empty.querySelector("a")?.getAttribute("href")).toBe(SETTINGS_HREF);
268
+
269
+ expect(
270
+ content.querySelector('[data-testid="device-attachment-switch-link"]'),
271
+ ).toBeNull();
272
+ });
273
+ });