@oneuptime/common 12.0.9 → 12.0.11

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 (262) hide show
  1. package/Models/DatabaseModels/NetworkDevice.ts +44 -0
  2. package/Models/DatabaseModels/NetworkDeviceLink.ts +116 -0
  3. package/Models/DatabaseModels/RunnerJob.ts +17 -2
  4. package/Server/API/LlmProviderAPI.ts +8 -0
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.ts +52 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  7. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +240 -0
  8. package/Server/Services/NetworkDeviceLinkService.ts +338 -2
  9. package/Server/Services/NetworkDeviceService.ts +265 -12
  10. package/Server/Services/RunnerJobService.ts +24 -1
  11. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +19 -5
  12. package/Server/Types/Database/JSONColumnQuery.ts +42 -4
  13. package/Server/Utils/LLM/LLMService.ts +108 -19
  14. package/Server/Utils/Monitor/MonitorAlert.ts +22 -115
  15. package/Server/Utils/Monitor/MonitorIncident.ts +7 -337
  16. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +27 -2
  17. package/Server/Utils/Monitor/SeriesResourceLabels.ts +32 -0
  18. package/Server/Utils/Monitor/SeriesResourceLinker.ts +469 -0
  19. package/Server/Utils/SSRFProtection.ts +5 -4
  20. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +186 -38
  21. package/Tests/App/AdminDashboard/AdminUsersBulkAddToProject.test.tsx +955 -0
  22. package/Tests/App/AdminDashboard/BulkAddUsersToProject.test.ts +778 -0
  23. package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +1051 -0
  24. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +420 -112
  25. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +81 -6
  26. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +543 -0
  27. package/Tests/App/Dashboard/PayAsYouGoFreePlan.test.ts +125 -0
  28. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +612 -0
  29. package/Tests/App/Dashboard/SloWidgetChartRendering.test.tsx +536 -0
  30. package/Tests/App/Dashboard/UserElementEmail.test.tsx +447 -0
  31. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +284 -0
  32. package/Tests/Models/AnalyticsModels/CommonModel.test.ts +312 -0
  33. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +250 -0
  34. package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +46 -18
  35. package/Tests/Server/Services/NetworkDeviceLabelRuleRun.test.ts +618 -0
  36. package/Tests/Server/Services/NetworkDeviceLinkParentValidation.test.ts +1043 -0
  37. package/Tests/Server/Services/NetworkSiteAssignmentRuleRun.test.ts +706 -0
  38. package/Tests/Server/Services/RunnerJobEnqueue.test.ts +412 -0
  39. package/Tests/Server/Types/Billing/PayAsYouGoMeteredPricing.test.ts +125 -0
  40. package/Tests/Server/Types/Database/JSONColumnQuery.test.ts +508 -0
  41. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +2 -2
  42. package/Tests/Server/Utils/AI/LLMServiceRetryPolicy.test.ts +450 -0
  43. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +556 -0
  44. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +547 -0
  45. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +30 -0
  46. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +699 -0
  47. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +55 -0
  48. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +668 -0
  49. package/Tests/Types/API/URLMalformedTolerance.test.ts +301 -0
  50. package/Tests/Types/API/URLTelScheme.test.ts +261 -0
  51. package/Tests/Types/API/URLUnsupportedScheme.test.ts +148 -0
  52. package/Tests/Types/Billing/PayAsYouGoPricing.test.ts +64 -0
  53. package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +107 -0
  54. package/Tests/Types/Monitor/MonitorType.test.ts +62 -0
  55. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +184 -0
  56. package/Tests/Types/Runbook/RunbookStepType.test.ts +124 -0
  57. package/Tests/Types/Workflow/BaseModelComponents.test.ts +17 -0
  58. package/Tests/UI/Components/Button.test.tsx +279 -0
  59. package/Tests/UI/Components/Charts/ChartXAxisDataKey.test.tsx +256 -0
  60. package/Tests/UI/Components/Charts/DataPointUtil.test.ts +323 -0
  61. package/Tests/UI/Components/DictionaryValuePlaceholderAndSuggestions.test.tsx +595 -0
  62. package/Tests/UI/Components/Icon.test.tsx +57 -0
  63. package/Tests/UI/Components/List.test.tsx +20 -3
  64. package/Tests/UI/Components/LogsSavedViewsDropdown.test.tsx +304 -0
  65. package/Tests/UI/Components/LogsViewerClearSavedView.test.tsx +179 -0
  66. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +349 -1
  67. package/Tests/UI/Components/Pagination.test.tsx +721 -146
  68. package/Tests/UI/Components/PaginationIntegration.test.tsx +386 -0
  69. package/Tests/UI/Components/PaginationUtil.test.ts +417 -0
  70. package/Tests/UI/Components/TelemetrySavedViewsDropdown.test.tsx +343 -0
  71. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnControl.test.ts +289 -0
  72. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnOperators.test.ts +271 -0
  73. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnRow.test.ts +119 -0
  74. package/Tests/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.test.ts +968 -0
  75. package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +766 -0
  76. package/Tests/UI/Utils/RunNetworkRule.test.ts +320 -0
  77. package/Tests/Utils/APIRetryPolicy.test.ts +823 -0
  78. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +502 -0
  79. package/Tests/Utils/Monitor/NetworkTopologyDeclaredHierarchy.test.ts +759 -0
  80. package/Tests/Utils/NetworkAutomation/RuleRunSummary.test.ts +286 -0
  81. package/Tests/Utils/Schema/BaseSchema.test.ts +651 -0
  82. package/Types/API/Protocol.ts +9 -0
  83. package/Types/API/URL.ts +286 -20
  84. package/Types/Billing/PayAsYouGoPricing.ts +47 -0
  85. package/Types/CustomField/CustomFieldType.ts +28 -0
  86. package/Types/Monitor/MonitorType.ts +11 -0
  87. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  88. package/Types/NetworkAutomation/RuleRunResult.ts +121 -0
  89. package/Types/Runbook/RunbookStepType.ts +23 -0
  90. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +7 -0
  91. package/UI/Components/Button/Button.tsx +14 -22
  92. package/UI/Components/Charts/Area/AreaChart.tsx +4 -2
  93. package/UI/Components/Charts/Bar/BarChart.tsx +4 -2
  94. package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +13 -0
  95. package/UI/Components/Charts/Line/LineChart.tsx +4 -2
  96. package/UI/Components/Charts/Types/XAxis/XAxis.ts +6 -0
  97. package/UI/Components/Charts/Utils/DataPoint.ts +15 -12
  98. package/UI/Components/Dictionary/Dictionary.tsx +4 -39
  99. package/UI/Components/Icon/Icon.tsx +1 -1
  100. package/UI/Components/LogsViewer/LogsViewer.tsx +5 -1
  101. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +8 -0
  102. package/UI/Components/LogsViewer/components/LogsPagination.tsx +29 -91
  103. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +2 -0
  104. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +66 -1
  105. package/UI/Components/ModelTable/CustomFieldColumns.tsx +55 -0
  106. package/UI/Components/Pagination/Pagination.tsx +373 -328
  107. package/UI/Components/Pagination/PaginationUtil.ts +263 -0
  108. package/UI/Components/Pagination/Screenshots/README.md +15 -0
  109. package/UI/Components/Pagination/Screenshots/pagination-before-after.png +0 -0
  110. package/UI/Components/Pagination/Screenshots/pagination-go-to-page-modal.png +0 -0
  111. package/UI/Components/Pagination/Screenshots/pagination-long-list.png +0 -0
  112. package/UI/Components/Pagination/Screenshots/pagination-mobile.png +0 -0
  113. package/UI/Components/Pagination/Screenshots/pagination-telemetry.png +0 -0
  114. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +66 -1
  115. package/UI/Components/TelemetryViewer/components/TelemetryPagination.tsx +38 -92
  116. package/UI/Components/TextArea/TextArea.tsx +3 -0
  117. package/UI/Components/Workflow/ArgumentsForm.tsx +18 -1
  118. package/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.tsx +177 -0
  119. package/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.tsx +243 -0
  120. package/UI/Components/Workflow/ColumnEditor/ColumnControl.ts +255 -0
  121. package/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.tsx +178 -0
  122. package/UI/Components/Workflow/ColumnEditor/ColumnOperators.ts +206 -0
  123. package/UI/Components/Workflow/ColumnEditor/ColumnRow.ts +157 -0
  124. package/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.ts +517 -0
  125. package/UI/Components/Workflow/ColumnEditor/ColumnValueInput.tsx +482 -0
  126. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +131 -0
  127. package/UI/Components/Workflow/ColumnEditor/ModelRecordForm.tsx +163 -0
  128. package/UI/Components/Workflow/ModelColumnEditor.tsx +284 -100
  129. package/UI/Utils/NetworkAutomation/RunNetworkRule.ts +122 -0
  130. package/Utils/API.ts +243 -36
  131. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +45 -0
  132. package/Utils/Monitor/NetworkTopologyUtil.ts +42 -2
  133. package/Utils/NetworkAutomation/RuleRunSummary.ts +147 -0
  134. package/build/dist/Models/DatabaseModels/NetworkDevice.js +45 -0
  135. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  136. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +115 -0
  137. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -1
  138. package/build/dist/Models/DatabaseModels/RunnerJob.js +17 -2
  139. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  140. package/build/dist/Server/API/LlmProviderAPI.js +9 -1
  141. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  142. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.js +33 -0
  143. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.js.map +1 -0
  144. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  146. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +202 -0
  147. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  148. package/build/dist/Server/Services/NetworkDeviceLinkService.js +253 -1
  149. package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -1
  150. package/build/dist/Server/Services/NetworkDeviceService.js +223 -12
  151. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  152. package/build/dist/Server/Services/RunnerJobService.js +20 -2
  153. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  154. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +12 -5
  155. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  156. package/build/dist/Server/Types/Database/JSONColumnQuery.js +40 -4
  157. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
  158. package/build/dist/Server/Utils/LLM/LLMService.js +78 -22
  159. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  160. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -98
  161. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  162. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +7 -254
  163. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  164. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +14 -2
  165. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  166. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +27 -0
  167. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  168. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +285 -0
  169. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -0
  170. package/build/dist/Server/Utils/SSRFProtection.js +5 -4
  171. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  172. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +128 -35
  173. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  174. package/build/dist/Types/API/Protocol.js +9 -0
  175. package/build/dist/Types/API/Protocol.js.map +1 -1
  176. package/build/dist/Types/API/URL.js +241 -18
  177. package/build/dist/Types/API/URL.js.map +1 -1
  178. package/build/dist/Types/Billing/PayAsYouGoPricing.js +41 -0
  179. package/build/dist/Types/Billing/PayAsYouGoPricing.js.map +1 -0
  180. package/build/dist/Types/CustomField/CustomFieldType.js +26 -0
  181. package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
  182. package/build/dist/Types/Monitor/MonitorType.js +10 -0
  183. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  184. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +39 -0
  185. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -0
  186. package/build/dist/Types/Runbook/RunbookStepType.js +21 -0
  187. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  188. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
  189. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  190. package/build/dist/UI/Components/Button/Button.js +10 -16
  191. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  192. package/build/dist/UI/Components/Charts/Area/AreaChart.js +2 -1
  193. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  194. package/build/dist/UI/Components/Charts/Bar/BarChart.js +2 -1
  195. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  196. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +12 -0
  197. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
  198. package/build/dist/UI/Components/Charts/Line/LineChart.js +2 -1
  199. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  200. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +17 -10
  201. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  202. package/build/dist/UI/Components/Dictionary/Dictionary.js +4 -18
  203. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  204. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  205. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  206. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +3 -3
  207. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  208. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +5 -1
  209. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  210. package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js +14 -44
  211. package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js.map +1 -1
  212. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
  213. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  214. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +20 -2
  215. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  216. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +42 -0
  217. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  218. package/build/dist/UI/Components/Pagination/Pagination.js +174 -199
  219. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  220. package/build/dist/UI/Components/Pagination/PaginationUtil.js +160 -0
  221. package/build/dist/UI/Components/Pagination/PaginationUtil.js.map +1 -0
  222. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +20 -2
  223. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  224. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js +23 -47
  225. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js.map +1 -1
  226. package/build/dist/UI/Components/TextArea/TextArea.js +1 -1
  227. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  228. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +14 -2
  229. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  230. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js +86 -0
  231. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnDropdown.js.map +1 -0
  232. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js +119 -0
  233. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js.map +1 -0
  234. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js +206 -0
  235. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js.map +1 -0
  236. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js +57 -0
  237. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js.map +1 -0
  238. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnOperators.js +150 -0
  239. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnOperators.js.map +1 -0
  240. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRow.js +67 -0
  241. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRow.js.map +1 -0
  242. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.js +309 -0
  243. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.js.map +1 -0
  244. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js +204 -0
  245. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js.map +1 -0
  246. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +66 -0
  247. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -0
  248. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js +83 -0
  249. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js.map +1 -0
  250. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +187 -68
  251. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
  252. package/build/dist/UI/Utils/NetworkAutomation/RunNetworkRule.js +75 -0
  253. package/build/dist/UI/Utils/NetworkAutomation/RunNetworkRule.js.map +1 -0
  254. package/build/dist/Utils/API.js +175 -34
  255. package/build/dist/Utils/API.js.map +1 -1
  256. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +37 -0
  257. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  258. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +25 -3
  259. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  260. package/build/dist/Utils/NetworkAutomation/RuleRunSummary.js +78 -0
  261. package/build/dist/Utils/NetworkAutomation/RuleRunSummary.js.map +1 -0
  262. package/package.json +1 -1
@@ -0,0 +1,286 @@
1
+ import RuleRunSummary from "../../../Utils/NetworkAutomation/RuleRunSummary";
2
+ import {
3
+ LabelRuleRunResult,
4
+ SiteAssignmentRuleRunResult,
5
+ } from "../../../Types/NetworkAutomation/RuleRunResult";
6
+ import { describe, expect, it } from "@jest/globals";
7
+
8
+ /*
9
+ * Contract under test - the sentences a "Run now" reports back with.
10
+ *
11
+ * The interesting case is not the happy one. A rule run that changes nothing
12
+ * is the norm once a rule has been run once, and "0 devices assigned" with no
13
+ * reason attached reads as a broken button. Every way a matched device can be
14
+ * left alone therefore has to name itself and, where the operator can do
15
+ * something about it, say what.
16
+ */
17
+
18
+ function siteRun(
19
+ overrides: Partial<SiteAssignmentRuleRunResult> = {},
20
+ ): SiteAssignmentRuleRunResult {
21
+ return {
22
+ devicesEvaluated: 0,
23
+ devicesMatched: 0,
24
+ devicesAssigned: 0,
25
+ devicesAlreadyInRuleSite: 0,
26
+ devicesSkippedAlreadyInAnotherSite: 0,
27
+ devicesClaimedByHigherPriorityRule: 0,
28
+ devicesFailed: 0,
29
+ isTruncated: false,
30
+ ...overrides,
31
+ };
32
+ }
33
+
34
+ function labelRun(
35
+ overrides: Partial<LabelRuleRunResult> = {},
36
+ ): LabelRuleRunResult {
37
+ return {
38
+ devicesEvaluated: 0,
39
+ devicesMatched: 0,
40
+ devicesLabeled: 0,
41
+ labelsAttached: 0,
42
+ labelsFailed: 0,
43
+ isTruncated: false,
44
+ ...overrides,
45
+ };
46
+ }
47
+
48
+ describe("RuleRunSummary.describeSiteAssignmentRun", () => {
49
+ it("leads with what changed", () => {
50
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
51
+ siteRun({
52
+ devicesEvaluated: 40,
53
+ devicesMatched: 12,
54
+ devicesAssigned: 12,
55
+ }),
56
+ );
57
+
58
+ expect(summary).toContain("Assigned 12 devices to this rule's site.");
59
+ });
60
+
61
+ it("uses the singular for a single device", () => {
62
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
63
+ siteRun({ devicesEvaluated: 1, devicesMatched: 1, devicesAssigned: 1 }),
64
+ );
65
+
66
+ expect(summary).toContain("Assigned 1 device to this rule's site.");
67
+ expect(summary).not.toContain("1 devices");
68
+ });
69
+
70
+ /*
71
+ * The whole point of the counters: a run that assigned nothing has to say
72
+ * how much it looked at and how much it matched, or the operator cannot
73
+ * tell a rule that does not match from a rule with nothing left to do.
74
+ */
75
+ it("explains a run that assigned nothing", () => {
76
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
77
+ siteRun({ devicesEvaluated: 40, devicesMatched: 0 }),
78
+ );
79
+
80
+ expect(summary).toContain("No devices were reassigned.");
81
+ expect(summary).toContain("matched 0 devices out of the 40");
82
+ });
83
+
84
+ it("says when the matched devices were already in this rule's site", () => {
85
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
86
+ siteRun({
87
+ devicesEvaluated: 40,
88
+ devicesMatched: 12,
89
+ devicesAlreadyInRuleSite: 12,
90
+ }),
91
+ );
92
+
93
+ expect(summary).toContain(
94
+ "12 devices already belonged to this rule's site",
95
+ );
96
+ });
97
+
98
+ // The skip the operator can undo - so the summary names the switch.
99
+ it("points at the overwrite option when devices were left in another site", () => {
100
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
101
+ siteRun({
102
+ devicesEvaluated: 40,
103
+ devicesMatched: 12,
104
+ devicesSkippedAlreadyInAnotherSite: 12,
105
+ }),
106
+ );
107
+
108
+ expect(summary).toContain("already belong to another site");
109
+ expect(summary).toContain(
110
+ "Move devices that are already assigned to a site",
111
+ );
112
+ });
113
+
114
+ // The skip the operator fixes by running the OTHER rule.
115
+ it("explains a device claimed by a higher-priority rule", () => {
116
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
117
+ siteRun({
118
+ devicesEvaluated: 40,
119
+ devicesMatched: 3,
120
+ devicesClaimedByHigherPriorityRule: 3,
121
+ }),
122
+ );
123
+
124
+ expect(summary).toContain("matched a higher-priority rule as well");
125
+ expect(summary).toContain("Run that rule to place them.");
126
+ });
127
+
128
+ it("reports failures", () => {
129
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
130
+ siteRun({
131
+ devicesEvaluated: 40,
132
+ devicesMatched: 4,
133
+ devicesAssigned: 3,
134
+ devicesFailed: 1,
135
+ }),
136
+ );
137
+
138
+ expect(summary).toContain("1 device could not be updated");
139
+ });
140
+
141
+ it("tells the operator to run again after a truncated run", () => {
142
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
143
+ siteRun({
144
+ devicesEvaluated: 10000,
145
+ devicesMatched: 10,
146
+ devicesAssigned: 10,
147
+ isTruncated: true,
148
+ }),
149
+ );
150
+
151
+ expect(summary).toContain("Only the first 10000 devices were evaluated");
152
+ expect(summary).toContain("Run the rule again");
153
+ });
154
+
155
+ // A run can hit several of these at once; none of them may swallow another.
156
+ it("reports every applicable reason in one summary", () => {
157
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
158
+ siteRun({
159
+ devicesEvaluated: 100,
160
+ devicesMatched: 10,
161
+ devicesAssigned: 4,
162
+ devicesAlreadyInRuleSite: 2,
163
+ devicesSkippedAlreadyInAnotherSite: 2,
164
+ devicesClaimedByHigherPriorityRule: 1,
165
+ devicesFailed: 1,
166
+ }),
167
+ );
168
+
169
+ expect(summary).toContain("Assigned 4 devices");
170
+ expect(summary).toContain("2 devices already belonged");
171
+ expect(summary).toContain("already belong to another site");
172
+ expect(summary).toContain("higher-priority rule");
173
+ expect(summary).toContain("could not be updated");
174
+ });
175
+
176
+ it("stays silent about buckets that are empty", () => {
177
+ const summary: string = RuleRunSummary.describeSiteAssignmentRun(
178
+ siteRun({
179
+ devicesEvaluated: 40,
180
+ devicesMatched: 12,
181
+ devicesAssigned: 12,
182
+ }),
183
+ );
184
+
185
+ expect(summary).not.toContain("higher-priority");
186
+ expect(summary).not.toContain("could not be updated");
187
+ expect(summary).not.toContain("Only the first");
188
+ });
189
+ });
190
+
191
+ describe("RuleRunSummary.describeLabelRun", () => {
192
+ it("leads with what was labelled", () => {
193
+ const summary: string = RuleRunSummary.describeLabelRun(
194
+ labelRun({
195
+ devicesEvaluated: 40,
196
+ devicesMatched: 12,
197
+ devicesLabeled: 12,
198
+ labelsAttached: 24,
199
+ }),
200
+ );
201
+
202
+ expect(summary).toContain("Labelled 12 devices (24 labels attached).");
203
+ });
204
+
205
+ it("uses the singular for a single device and a single label", () => {
206
+ const summary: string = RuleRunSummary.describeLabelRun(
207
+ labelRun({
208
+ devicesEvaluated: 1,
209
+ devicesMatched: 1,
210
+ devicesLabeled: 1,
211
+ labelsAttached: 1,
212
+ }),
213
+ );
214
+
215
+ expect(summary).toContain("Labelled 1 device (1 label attached).");
216
+ });
217
+
218
+ /*
219
+ * Matching everything and attaching nothing is the signature of a rule that
220
+ * has already been run. Saying so is the difference between "it worked, and
221
+ * there was nothing left to do" and "it did not work".
222
+ */
223
+ it("explains a rule that has already been applied", () => {
224
+ const summary: string = RuleRunSummary.describeLabelRun(
225
+ labelRun({ devicesEvaluated: 40, devicesMatched: 12, devicesLabeled: 0 }),
226
+ );
227
+
228
+ expect(summary).toContain("No labels were attached.");
229
+ expect(summary).toContain("matched 12 devices out of the 40");
230
+ expect(summary).toContain(
231
+ "Every matching device already carries this rule's labels",
232
+ );
233
+ });
234
+
235
+ // Nothing matched is a different answer, and must not claim otherwise.
236
+ it("does not claim devices are already labelled when nothing matched", () => {
237
+ const summary: string = RuleRunSummary.describeLabelRun(
238
+ labelRun({ devicesEvaluated: 40, devicesMatched: 0 }),
239
+ );
240
+
241
+ expect(summary).toContain("No labels were attached.");
242
+ expect(summary).not.toContain("already carries");
243
+ });
244
+
245
+ it("reports failures", () => {
246
+ const summary: string = RuleRunSummary.describeLabelRun(
247
+ labelRun({
248
+ devicesEvaluated: 40,
249
+ devicesMatched: 5,
250
+ devicesLabeled: 4,
251
+ labelsAttached: 4,
252
+ labelsFailed: 1,
253
+ }),
254
+ );
255
+
256
+ expect(summary).toContain("1 label could not be attached");
257
+ });
258
+
259
+ it("tells the operator to run again after a truncated run", () => {
260
+ const summary: string = RuleRunSummary.describeLabelRun(
261
+ labelRun({
262
+ devicesEvaluated: 10000,
263
+ devicesMatched: 10,
264
+ devicesLabeled: 10,
265
+ labelsAttached: 10,
266
+ isTruncated: true,
267
+ }),
268
+ );
269
+
270
+ expect(summary).toContain("Only the first 10000 devices were evaluated");
271
+ });
272
+
273
+ it("stays silent about buckets that are empty", () => {
274
+ const summary: string = RuleRunSummary.describeLabelRun(
275
+ labelRun({
276
+ devicesEvaluated: 40,
277
+ devicesMatched: 12,
278
+ devicesLabeled: 12,
279
+ labelsAttached: 12,
280
+ }),
281
+ );
282
+
283
+ expect(summary).not.toContain("could not be attached");
284
+ expect(summary).not.toContain("Only the first");
285
+ });
286
+ });