@oneuptime/common 13.0.7 → 13.0.8

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 (463) hide show
  1. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
  2. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
  3. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
  4. package/Server/API/AIBillingAPI.ts +1 -0
  5. package/Server/API/AIInsightAPI.ts +1 -4
  6. package/Server/API/AIInvestigationAPI.ts +1 -4
  7. package/Server/API/AIReadinessAPI.ts +4 -5
  8. package/Server/API/AlertAPI.ts +1 -0
  9. package/Server/API/AutoRemediationAPI.ts +1 -4
  10. package/Server/API/BaseAPI.ts +13 -0
  11. package/Server/API/BaseAnalyticsAPI.ts +80 -9
  12. package/Server/API/BillingAPI.ts +2 -0
  13. package/Server/API/BillingInvoiceAPI.ts +1 -0
  14. package/Server/API/BillingPaymentMethodAPI.ts +2 -0
  15. package/Server/API/CodeFixRunAPI.ts +1 -3
  16. package/Server/API/CommonAPI.ts +68 -4
  17. package/Server/API/DashboardAPI.ts +12 -12
  18. package/Server/API/GlobalConfigAPI.ts +17 -0
  19. package/Server/API/IncidentAPI.ts +2 -0
  20. package/Server/API/IncidentEpisodeAPI.ts +1 -0
  21. package/Server/API/NotificationAPI.ts +1 -0
  22. package/Server/API/OnCallCalendarAPI.ts +4 -5
  23. package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
  24. package/Server/API/OnCallReadinessAPI.ts +4 -1
  25. package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
  26. package/Server/API/ProjectAPI.ts +1 -0
  27. package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
  28. package/Server/API/StatusPageAPI.ts +161 -32
  29. package/Server/API/TeamMemberAPI.ts +3 -0
  30. package/Server/API/UserCallAPI.ts +2 -0
  31. package/Server/API/UserEmailAPI.ts +2 -0
  32. package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
  33. package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
  34. package/Server/API/UserSlackAPI.ts +1 -0
  35. package/Server/API/UserSmsAPI.ts +2 -0
  36. package/Server/API/UserTotpAuthAPI.ts +1 -0
  37. package/Server/API/UserWebAuthnAPI.ts +2 -0
  38. package/Server/API/UserWebhookAPI.ts +1 -0
  39. package/Server/API/UserWhatsAppAPI.ts +2 -0
  40. package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
  41. package/Server/Middleware/UserAuthorization.ts +79 -5
  42. package/Server/Services/ApiKeyPermissionService.ts +101 -4
  43. package/Server/Services/DatabaseService.ts +245 -0
  44. package/Server/Services/DetectionRuleService.ts +5 -4
  45. package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
  46. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
  47. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
  48. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
  49. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
  50. package/Server/Services/PayAsYouGoBillingService.ts +23 -28
  51. package/Server/Services/ProjectService.ts +18 -0
  52. package/Server/Services/RumSessionPinService.ts +274 -22
  53. package/Server/Services/TeamPermissionService.ts +120 -26
  54. package/Server/Services/ThreatIntelFeedService.ts +6 -3
  55. package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
  56. package/Server/Types/Database/Permissions/Index.ts +75 -11
  57. package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
  58. package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
  59. package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
  60. package/Server/Utils/MasterAdminPageAccess.ts +61 -0
  61. package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
  62. package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
  63. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
  64. package/Server/Utils/Realtime.ts +163 -45
  65. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
  66. package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
  67. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
  68. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
  69. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
  70. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
  71. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
  72. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
  73. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
  74. package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
  75. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
  76. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
  77. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
  78. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
  79. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
  80. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
  81. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
  82. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
  83. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
  84. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
  85. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
  86. package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
  87. package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
  88. package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
  89. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
  90. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
  91. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
  92. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
  93. package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
  94. package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
  95. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
  96. package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
  97. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
  98. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
  99. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
  100. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
  101. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
  102. package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
  103. package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
  104. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
  105. package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
  106. package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
  107. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
  108. package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
  109. package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
  110. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
  111. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
  112. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
  113. package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
  114. package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
  115. package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
  116. package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
  117. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
  118. package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
  119. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
  120. package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
  121. package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
  122. package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
  123. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
  124. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
  125. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
  126. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
  127. package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
  128. package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
  129. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
  130. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
  131. package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
  132. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
  133. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
  134. package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
  135. package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
  136. package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
  137. package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
  138. package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
  139. package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
  140. package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
  141. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
  142. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
  143. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
  144. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
  145. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
  146. package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
  147. package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
  148. package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
  149. package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
  150. package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
  151. package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
  152. package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
  153. package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
  154. package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
  155. package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
  156. package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
  157. package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
  158. package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
  159. package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
  160. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
  161. package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
  162. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
  163. package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
  164. package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
  165. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
  166. package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
  167. package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
  168. package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
  169. package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
  170. package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
  171. package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
  172. package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
  173. package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
  174. package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
  175. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
  176. package/Tests/Server/Utils/Realtime.test.ts +502 -0
  177. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
  178. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
  179. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
  180. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
  181. package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
  182. package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
  183. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
  184. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
  185. package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
  186. package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
  187. package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
  188. package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
  189. package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
  190. package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
  191. package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
  192. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
  193. package/Tests/Types/Call/CallProvider.test.ts +528 -0
  194. package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
  195. package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
  196. package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
  197. package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
  198. package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
  199. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
  200. package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
  201. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
  202. package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
  203. package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
  204. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
  205. package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
  206. package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
  207. package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
  208. package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
  209. package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
  210. package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
  211. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
  212. package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
  213. package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
  214. package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
  215. package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
  216. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  217. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  218. package/Tests/UI/Utils/Cookie.test.ts +440 -0
  219. package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
  220. package/Tests/UI/Utils/Navigation.test.ts +33 -0
  221. package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
  222. package/Tests/UI/Utils/Realtime.test.ts +759 -0
  223. package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
  224. package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
  225. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
  226. package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
  227. package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
  228. package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
  229. package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
  230. package/Types/Realtime/EventName.ts +11 -0
  231. package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
  232. package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
  233. package/Types/SecurityEvent/SigmaRule.ts +51 -0
  234. package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
  235. package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
  236. package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
  237. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  238. package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
  239. package/UI/Components/EventItem/EventItem.tsx +12 -1
  240. package/UI/Components/Forms/BasicForm.tsx +151 -126
  241. package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
  242. package/UI/Components/Forms/Fields/FormField.tsx +10 -4
  243. package/UI/Components/Forms/FormSummary.tsx +7 -0
  244. package/UI/Components/Forms/Types/Field.ts +10 -0
  245. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
  246. package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
  247. package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
  248. package/UI/Components/ModelTable/TableView.tsx +1 -1
  249. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
  250. package/UI/Components/Tooltip/Tooltip.tsx +8 -1
  251. package/UI/Utils/API/API.ts +173 -12
  252. package/UI/Utils/API/RequestOptions.ts +11 -0
  253. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
  254. package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
  255. package/UI/Utils/Navigation.ts +9 -0
  256. package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
  257. package/UI/Utils/Realtime.ts +176 -30
  258. package/Utils/API.ts +14 -5
  259. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
  260. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
  261. package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
  262. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
  263. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
  264. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
  265. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
  266. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
  267. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
  268. package/build/dist/Server/API/AIBillingAPI.js +1 -1
  269. package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
  270. package/build/dist/Server/API/AIInsightAPI.js +1 -4
  271. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  272. package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
  273. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  274. package/build/dist/Server/API/AIReadinessAPI.js +1 -3
  275. package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
  276. package/build/dist/Server/API/AlertAPI.js +1 -1
  277. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  278. package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
  279. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  280. package/build/dist/Server/API/BaseAPI.js +12 -0
  281. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  282. package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
  283. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  284. package/build/dist/Server/API/BillingAPI.js +2 -2
  285. package/build/dist/Server/API/BillingAPI.js.map +1 -1
  286. package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
  287. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  288. package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
  289. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  290. package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
  291. package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
  292. package/build/dist/Server/API/CommonAPI.js +50 -5
  293. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  294. package/build/dist/Server/API/DashboardAPI.js +12 -12
  295. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  296. package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
  297. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  298. package/build/dist/Server/API/IncidentAPI.js +2 -2
  299. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  300. package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
  301. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  302. package/build/dist/Server/API/NotificationAPI.js +1 -1
  303. package/build/dist/Server/API/NotificationAPI.js.map +1 -1
  304. package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
  305. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
  306. package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
  307. package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
  308. package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
  309. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
  310. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
  311. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
  312. package/build/dist/Server/API/ProjectAPI.js +1 -1
  313. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  314. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
  315. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  316. package/build/dist/Server/API/StatusPageAPI.js +125 -33
  317. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  318. package/build/dist/Server/API/TeamMemberAPI.js +3 -3
  319. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  320. package/build/dist/Server/API/UserCallAPI.js +2 -2
  321. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  322. package/build/dist/Server/API/UserEmailAPI.js +2 -2
  323. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  324. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
  325. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  326. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
  327. package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
  328. package/build/dist/Server/API/UserSlackAPI.js +1 -1
  329. package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
  330. package/build/dist/Server/API/UserSmsAPI.js +2 -2
  331. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  332. package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
  333. package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
  334. package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
  335. package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
  336. package/build/dist/Server/API/UserWebhookAPI.js +1 -1
  337. package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
  338. package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
  339. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  340. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
  341. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
  343. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  344. package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
  345. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  346. package/build/dist/Server/Services/DatabaseService.js +171 -0
  347. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  348. package/build/dist/Server/Services/DetectionRuleService.js +4 -4
  349. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  350. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
  351. package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
  352. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
  353. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  354. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
  355. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  356. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
  357. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  358. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
  359. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  360. package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
  361. package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
  362. package/build/dist/Server/Services/ProjectService.js +17 -0
  363. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  364. package/build/dist/Server/Services/RumSessionPinService.js +180 -16
  365. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  366. package/build/dist/Server/Services/TeamPermissionService.js +89 -27
  367. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  368. package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
  369. package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
  370. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
  371. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  372. package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
  373. package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
  374. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
  375. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  376. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
  377. package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
  378. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
  379. package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
  380. package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
  381. package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
  382. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  384. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
  385. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  386. package/build/dist/Server/Utils/Realtime.js +126 -37
  387. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  388. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
  389. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  390. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
  391. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
  392. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
  393. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  394. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
  395. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
  396. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
  397. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
  398. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
  399. package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
  400. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
  401. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
  402. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
  403. package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
  404. package/build/dist/Types/Realtime/EventName.js +10 -0
  405. package/build/dist/Types/Realtime/EventName.js.map +1 -1
  406. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
  407. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  408. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
  409. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
  410. package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
  411. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
  412. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
  413. package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
  414. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
  415. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  416. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
  417. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  418. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
  419. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  420. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
  421. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  422. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  423. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  424. package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
  425. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  426. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
  427. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
  428. package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
  429. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  430. package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
  431. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  432. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
  433. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  434. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
  435. package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
  436. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
  437. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  438. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  439. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  440. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
  441. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  442. package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
  443. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  444. package/build/dist/UI/Utils/API/API.js +143 -19
  445. package/build/dist/UI/Utils/API/API.js.map +1 -1
  446. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
  447. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  448. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
  449. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  450. package/build/dist/UI/Utils/Navigation.js +8 -0
  451. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  452. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
  453. package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
  454. package/build/dist/UI/Utils/Realtime.js +120 -15
  455. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  456. package/build/dist/Utils/API.js +13 -5
  457. package/build/dist/Utils/API.js.map +1 -1
  458. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
  459. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  460. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
  461. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
  462. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
  463. package/package.json +1 -1
@@ -0,0 +1,307 @@
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, waitFor } from "@testing-library/react";
11
+ import * as React from "react";
12
+ import { MemoryRouter } from "react-router-dom";
13
+
14
+ /*
15
+ * The incident and scheduled maintenance wizards end on a summary that lists
16
+ * what each step picked. The "Resources Affected" step uses one picker that
17
+ * writes to every resource relation the page hands it, but its summary is
18
+ * hand-written per page - so a resource type the picker offers can be left
19
+ * out of it. Podman hosts were: pick only Podman hosts and the summary said
20
+ * "No resources affected", although the selection saved fine.
21
+ *
22
+ * The invariant pinned here: every resource prop the editor picker is given
23
+ * shows up in the summary. It drives the real pages, with ModelForm mocked to
24
+ * capture the fields it is handed (as MonitorCreateFromMonitorBackedDevice
25
+ * does), reads the resource props off the picker element the step renders,
26
+ * and renders the step's summary once per prop with only that type selected.
27
+ * A resource type added to a page's picker later is picked up without edits
28
+ * here.
29
+ */
30
+
31
+ type CapturedField = {
32
+ stepId?: string | undefined;
33
+ getCustomElement?:
34
+ | ((
35
+ values: Record<string, unknown>,
36
+ elementProps: Record<string, unknown>,
37
+ ) => React.ReactElement)
38
+ | undefined;
39
+ getSummaryElement?:
40
+ | ((item: Record<string, unknown>) => React.ReactElement)
41
+ | undefined;
42
+ };
43
+
44
+ type CapturedFormProps = {
45
+ fields: Array<CapturedField>;
46
+ };
47
+
48
+ let capturedForm: CapturedFormProps | null = null;
49
+
50
+ jest.mock("../../../UI/Components/Forms/ModelForm", () => {
51
+ // Only the component is stubbed: the pages import FormType from here too.
52
+ const actual: Record<string, unknown> = jest.requireActual(
53
+ "../../../UI/Components/Forms/ModelForm",
54
+ ) as Record<string, unknown>;
55
+
56
+ return {
57
+ __esModule: true,
58
+ ...actual,
59
+ default: (props: CapturedFormProps): React.ReactElement => {
60
+ capturedForm = props;
61
+ return <div data-testid="model-form" />;
62
+ },
63
+ };
64
+ });
65
+
66
+ /*
67
+ * The monitor summary looks its monitors up by id. Off the network, it
68
+ * renders how many ids it was given so the count is still observable.
69
+ */
70
+ jest.mock(
71
+ "../../../../App/FeatureSet/Dashboard/src/Components/Monitor/FetchMonitors",
72
+ () => {
73
+ return {
74
+ __esModule: true,
75
+ default: (props: { monitorIds: Array<unknown> }): React.ReactElement => {
76
+ return <div>{`${props.monitorIds.length} monitor ids`}</div>;
77
+ },
78
+ };
79
+ },
80
+ );
81
+
82
+ import AffectedResourcesPicker, {
83
+ AffectedResourcesPayload,
84
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/AffectedResources/AffectedResourcesPicker";
85
+ import IncidentCreate from "../../../../App/FeatureSet/Dashboard/src/Pages/Incidents/Create";
86
+ import ScheduledMaintenanceCreate from "../../../../App/FeatureSet/Dashboard/src/Pages/ScheduledMaintenanceEvents/Create";
87
+ import PageComponentProps from "../../../../App/FeatureSet/Dashboard/src/Pages/PageComponentProps";
88
+ import Project from "../../../Models/DatabaseModels/Project";
89
+ import Route from "../../../Types/API/Route";
90
+ import ObjectID from "../../../Types/ObjectID";
91
+ import Navigation from "../../../UI/Utils/Navigation";
92
+ import ProjectUtil from "../../../UI/Utils/Project";
93
+
94
+ type ResourceProp = Exclude<
95
+ keyof AffectedResourcesPayload,
96
+ "__affectedResourcesPayload"
97
+ >;
98
+
99
+ /*
100
+ * Every relation the picker can write. A Record keyed by the payload's own
101
+ * fields, so a resource type added to the picker fails to compile here until
102
+ * it is listed.
103
+ */
104
+ const RESOURCE_PROPS: Record<ResourceProp, true> = {
105
+ monitors: true,
106
+ hosts: true,
107
+ kubernetesClusters: true,
108
+ dockerHosts: true,
109
+ podmanHosts: true,
110
+ proxmoxClusters: true,
111
+ vmwareVCenters: true,
112
+ cephClusters: true,
113
+ dockerSwarmClusters: true,
114
+ iotFleets: true,
115
+ networkSites: true,
116
+ services: true,
117
+ };
118
+
119
+ const RESOURCE_PROP_NAMES: Array<ResourceProp> = Object.keys(
120
+ RESOURCE_PROPS,
121
+ ) as Array<ResourceProp>;
122
+
123
+ const NOTHING_SELECTED_PATTERN: RegExp = /No resources affected/;
124
+
125
+ /*
126
+ * The selection size the per-type check uses, as a standalone number. Not \b:
127
+ * textContent runs a heading into the count after it ("Monitors3 monitor ids").
128
+ */
129
+ const COUNT_OF_THREE_PATTERN: RegExp = /(^|\D)3(\D|$)/;
130
+
131
+ type PageUnderTest = {
132
+ name: string;
133
+ component: React.FunctionComponent<PageComponentProps>;
134
+ route: string;
135
+ };
136
+
137
+ const PAGES: Array<PageUnderTest> = [
138
+ {
139
+ name: "incident create",
140
+ component: IncidentCreate,
141
+ route: "/dashboard/incidents/create",
142
+ },
143
+ {
144
+ name: "scheduled maintenance create",
145
+ component: ScheduledMaintenanceCreate,
146
+ route: "/dashboard/scheduled-maintenance-events/create",
147
+ },
148
+ ];
149
+
150
+ type PickerStep = {
151
+ resourceProps: Array<ResourceProp>;
152
+ getSummaryElement: (item: Record<string, unknown>) => React.ReactElement;
153
+ };
154
+
155
+ async function openForm(page: PageUnderTest): Promise<CapturedFormProps> {
156
+ const project: Project = new Project();
157
+
158
+ render(
159
+ <MemoryRouter>
160
+ <page.component
161
+ pageRoute={new Route(page.route)}
162
+ currentProject={project}
163
+ hasPaymentMethod={true}
164
+ />
165
+ </MemoryRouter>,
166
+ );
167
+
168
+ await waitFor(() => {
169
+ expect(capturedForm).not.toBeNull();
170
+ });
171
+
172
+ return capturedForm!;
173
+ }
174
+
175
+ /** The fields whose editor is the picker and that render a summary. */
176
+ function findPickerSteps(form: CapturedFormProps): Array<PickerStep> {
177
+ const emptySelection: Record<string, unknown> = {};
178
+ for (const prop of RESOURCE_PROP_NAMES) {
179
+ emptySelection[prop] = [];
180
+ }
181
+
182
+ const steps: Array<PickerStep> = [];
183
+
184
+ for (const field of form.fields) {
185
+ if (!field.getCustomElement || !field.getSummaryElement) {
186
+ continue;
187
+ }
188
+
189
+ const editor: React.ReactElement = field.getCustomElement(emptySelection, {
190
+ onChange: (): void => {},
191
+ });
192
+
193
+ if (editor.type !== AffectedResourcesPicker) {
194
+ continue;
195
+ }
196
+
197
+ const editorProps: Record<string, unknown> = editor.props as Record<
198
+ string,
199
+ unknown
200
+ >;
201
+
202
+ steps.push({
203
+ resourceProps: RESOURCE_PROP_NAMES.filter((prop: ResourceProp) => {
204
+ return prop in editorProps;
205
+ }),
206
+ getSummaryElement: field.getSummaryElement,
207
+ });
208
+ }
209
+
210
+ return steps;
211
+ }
212
+
213
+ function renderSummary(
214
+ step: PickerStep,
215
+ item: Record<string, unknown>,
216
+ ): string {
217
+ const { container } = render(step.getSummaryElement(item));
218
+ const text: string = container.textContent || "";
219
+ cleanup();
220
+ return text;
221
+ }
222
+
223
+ function ids(count: number): Array<string> {
224
+ return Array.from({ length: count }, () => {
225
+ return ObjectID.generate().toString();
226
+ });
227
+ }
228
+
229
+ describe("the Resources Affected summary step", () => {
230
+ beforeEach(() => {
231
+ capturedForm = null;
232
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(null);
233
+ jest.spyOn(Navigation, "getQueryStringByName").mockReturnValue(null);
234
+ });
235
+
236
+ afterEach(() => {
237
+ cleanup();
238
+ jest.restoreAllMocks();
239
+ });
240
+
241
+ describe.each(PAGES)("on the $name page", (page: PageUnderTest) => {
242
+ test("finds the picker step, so the checks below are not vacuous", async () => {
243
+ const steps: Array<PickerStep> = findPickerSteps(await openForm(page));
244
+
245
+ expect(steps).toHaveLength(1);
246
+ expect(steps[0]!.resourceProps).toEqual(
247
+ expect.arrayContaining(["monitors", "podmanHosts"]),
248
+ );
249
+ });
250
+
251
+ test("counts a selection of every resource type the picker offers", async () => {
252
+ const steps: Array<PickerStep> = findPickerSteps(await openForm(page));
253
+ const missing: Array<string> = [];
254
+
255
+ for (const step of steps) {
256
+ for (const prop of step.resourceProps) {
257
+ const text: string = renderSummary(step, { [prop]: ids(3) });
258
+
259
+ if (
260
+ NOTHING_SELECTED_PATTERN.test(text) ||
261
+ !COUNT_OF_THREE_PATTERN.test(text)
262
+ ) {
263
+ missing.push(`${prop}: "${text}"`);
264
+ }
265
+ }
266
+ }
267
+
268
+ expect(missing).toEqual([]);
269
+ });
270
+
271
+ test("says so when nothing is selected", async () => {
272
+ const [step] = findPickerSteps(await openForm(page));
273
+
274
+ expect(renderSummary(step!, {})).toMatch(NOTHING_SELECTED_PATTERN);
275
+ });
276
+
277
+ test("names Podman hosts, singular and plural", async () => {
278
+ const [step] = findPickerSteps(await openForm(page));
279
+
280
+ expect(renderSummary(step!, { podmanHosts: ids(1) })).toContain(
281
+ "1 Podman host",
282
+ );
283
+ expect(renderSummary(step!, { podmanHosts: ids(1) })).not.toContain(
284
+ "1 Podman hosts",
285
+ );
286
+ expect(renderSummary(step!, { podmanHosts: ids(2) })).toContain(
287
+ "2 Podman hosts",
288
+ );
289
+ });
290
+
291
+ test("lists Podman hosts alongside the other resource types", async () => {
292
+ const [step] = findPickerSteps(await openForm(page));
293
+
294
+ const text: string = renderSummary(step!, {
295
+ monitors: ids(1),
296
+ dockerHosts: ids(2),
297
+ podmanHosts: ids(4),
298
+ services: ids(1),
299
+ });
300
+
301
+ expect(text).toContain("1 monitor ids");
302
+ expect(text).toContain("2 Docker hosts");
303
+ expect(text).toContain("4 Podman hosts");
304
+ expect(text).toContain("1 service");
305
+ });
306
+ });
307
+ });
@@ -0,0 +1,131 @@
1
+ import "@testing-library/jest-dom";
2
+ import {
3
+ cleanup,
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ within,
8
+ } from "@testing-library/react";
9
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
10
+ import React from "react";
11
+ import { Mock } from "jest-mock";
12
+ import ArgumentsForm from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Canvas/ArgumentsForm";
13
+ import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
14
+ import DashboardTableComponent, {
15
+ TableGroupByAttribute,
16
+ } from "../../../Types/Dashboard/DashboardComponents/DashboardTableComponent";
17
+ import DashboardTableComponentUtil from "../../../Utils/Dashboard/Components/DashboardTableComponent";
18
+ import { JSONObject } from "../../../Types/JSON";
19
+
20
+ /*
21
+ * The table widget's "Group By Attributes" picker offers the project's
22
+ * telemetry attribute keys, and that list only covers keys seen in the last
23
+ * day (capped, alphabetically). A widget grouped by an attribute emitted less
24
+ * often - a weekly batch job - has a saved key the list is missing. The picker
25
+ * used to show no chip for it, and since the dropdown only reports the chips it
26
+ * shows, the next add or remove saved the widget without that key or its
27
+ * custom header, while "Column headers" still listed it.
28
+ */
29
+
30
+ const LISTED_ATTRIBUTES: Array<string> = ["host.name", "service.name"];
31
+
32
+ const SAVED_GROUP_BY: Array<TableGroupByAttribute> = [
33
+ { key: "batch.job.name", header: "Job" },
34
+ { key: "service.name", header: "Service" },
35
+ ];
36
+
37
+ type OnFormChangeMock = Mock<(component: DashboardBaseComponent) => void>;
38
+
39
+ function renderTableSettings(): OnFormChangeMock {
40
+ const table: DashboardTableComponent =
41
+ DashboardTableComponentUtil.getDefaultComponent();
42
+ table.arguments.groupByAttributes = SAVED_GROUP_BY;
43
+
44
+ const onFormChange: OnFormChangeMock =
45
+ jest.fn<(component: DashboardBaseComponent) => void>();
46
+
47
+ render(
48
+ <ArgumentsForm
49
+ component={table}
50
+ metrics={{ metricTypes: [], telemetryAttributes: LISTED_ATTRIBUTES }}
51
+ onFormChange={onFormChange}
52
+ />,
53
+ );
54
+
55
+ return onFormChange;
56
+ }
57
+
58
+ function removeChipButton(label: string): HTMLElement {
59
+ return screen.getByRole("button", { name: `Remove ${label}` });
60
+ }
61
+
62
+ function groupByPicker(): HTMLElement {
63
+ return within(
64
+ screen.getByText("Group By Attributes").parentElement as HTMLElement,
65
+ ).getByRole("combobox");
66
+ }
67
+
68
+ function lastSavedGroupBy(
69
+ onFormChange: OnFormChangeMock,
70
+ ): Array<TableGroupByAttribute> {
71
+ const lastCall: [DashboardBaseComponent] | undefined =
72
+ onFormChange.mock.calls[onFormChange.mock.calls.length - 1];
73
+ expect(lastCall).toBeDefined();
74
+
75
+ return (lastCall![0].arguments as JSONObject)[
76
+ "groupByAttributes"
77
+ ] as unknown as Array<TableGroupByAttribute>;
78
+ }
79
+
80
+ afterEach(() => {
81
+ cleanup();
82
+ });
83
+
84
+ describe("Table widget group-by picker with a key missing from the attribute list", () => {
85
+ test("shows a chip for a saved key the attribute list is missing", () => {
86
+ renderTableSettings();
87
+
88
+ expect(removeChipButton("batch.job.name")).toBeInTheDocument();
89
+ expect(removeChipButton("service.name")).toBeInTheDocument();
90
+ expect(screen.getByDisplayValue("Job")).toBeInTheDocument();
91
+ });
92
+
93
+ test("removing a different chip keeps the unlisted key and its header", () => {
94
+ const onFormChange: OnFormChangeMock = renderTableSettings();
95
+
96
+ fireEvent.click(removeChipButton("service.name"));
97
+
98
+ expect(lastSavedGroupBy(onFormChange)).toEqual([
99
+ { key: "batch.job.name", header: "Job" },
100
+ ]);
101
+ expect(removeChipButton("batch.job.name")).toBeInTheDocument();
102
+ expect(
103
+ screen.queryByRole("button", { name: "Remove service.name" }),
104
+ ).not.toBeInTheDocument();
105
+ expect(screen.getByDisplayValue("Job")).toBeInTheDocument();
106
+ });
107
+
108
+ test("adding a new key keeps the unlisted key and its header", () => {
109
+ const onFormChange: OnFormChangeMock = renderTableSettings();
110
+
111
+ fireEvent.keyDown(groupByPicker(), { key: "ArrowDown" });
112
+ const option: HTMLElement = screen.getByRole("option", {
113
+ name: "host.name",
114
+ });
115
+ fireEvent.mouseDown(option);
116
+ fireEvent.click(option);
117
+
118
+ const saved: Array<TableGroupByAttribute> = lastSavedGroupBy(onFormChange);
119
+ expect(saved).toHaveLength(3);
120
+ expect(saved).toEqual(
121
+ expect.arrayContaining([
122
+ { key: "batch.job.name", header: "Job" },
123
+ { key: "service.name", header: "Service" },
124
+ { key: "host.name" },
125
+ ]),
126
+ );
127
+ expect(removeChipButton("batch.job.name")).toBeInTheDocument();
128
+ expect(removeChipButton("host.name")).toBeInTheDocument();
129
+ expect(screen.getByDisplayValue("Job")).toBeInTheDocument();
130
+ });
131
+ });
@@ -27,7 +27,7 @@ const getMock: MockFunction = getJestMockFunction();
27
27
  const countMock: MockFunction = getJestMockFunction();
28
28
  const currentProjectIdMock: MockFunction = getJestMockFunction();
29
29
 
30
- jest.mock("../../../Utils/API", () => {
30
+ jest.mock("../../../UI/Utils/API/API", () => {
31
31
  return {
32
32
  __esModule: true,
33
33
  default: {
@@ -11,7 +11,10 @@ import DashboardMonitorListComponentElement, {
11
11
  ComponentProps,
12
12
  } from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Components/DashboardMonitorListComponent";
13
13
  import DashboardVariableSelector from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Toolbar/DashboardVariableSelector";
14
- import { setPublicDashboardContext } from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Utils/PublicDashboardContext";
14
+ import {
15
+ PublicDashboardContext,
16
+ setPublicDashboardContext,
17
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Dashboard/Utils/PublicDashboardContext";
15
18
  import DashboardMonitorListComponentUtil from "../../../Utils/Dashboard/Components/DashboardMonitorListComponent";
16
19
  import DashboardVariable, {
17
20
  DashboardVariableType,
@@ -36,6 +39,9 @@ const DASHBOARD_ID: ObjectID = new ObjectID(
36
39
  const UNIT_660: string = "06600000-0000-4000-8000-000000000000";
37
40
  const UNIT_661: string = "06610000-0000-4000-8000-000000000000";
38
41
  const NETWORK: string = "00000000-0000-4000-8000-000000000001";
42
+ // Stands in for the public dashboard's API class; ModelAPI is mocked here.
43
+ const PUBLIC_API_CLIENT: PublicDashboardContext["apiClient"] =
44
+ {} as unknown as PublicDashboardContext["apiClient"];
39
45
 
40
46
  jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
41
47
  return {
@@ -411,6 +417,7 @@ describe("MonitorList project label variables", () => {
411
417
  postJSON: async () => {
412
418
  throw new Error("Unexpected public request");
413
419
  },
420
+ apiClient: PUBLIC_API_CLIENT,
414
421
  });
415
422
  const input: ComponentProps = props({
416
423
  variables: [
@@ -424,6 +431,7 @@ describe("MonitorList project label variables", () => {
424
431
  expect(options["overrideRequestUrl"].toString()).toContain(
425
432
  `/resource-list/${DASHBOARD_ID.toString()}/monitor`,
426
433
  );
434
+ expect(options["apiClient"]).toBe(PUBLIC_API_CLIENT);
427
435
  expect(options["additionalRequestBody"]).toEqual({
428
436
  componentId: input.componentId.toString(),
429
437
  variables: [
@@ -467,6 +467,30 @@ describe("dashboard variable All contract", () => {
467
467
 
468
468
  expect(screen.getByRole("combobox")).toHaveValue("eu-1");
469
469
  });
470
+
471
+ test("a TelemetryAttribute Default missing from the values does not read All", async () => {
472
+ /*
473
+ * The attribute values list is capped, and the Default is free text,
474
+ * so the Default can be missing from it. The widgets still filter by
475
+ * the Default, so the select has to show it. The mocked public API
476
+ * returns no values at all.
477
+ */
478
+ const variable: DashboardVariable = makeVariable({
479
+ type: DashboardVariableType.TelemetryAttribute,
480
+ customListValues: undefined,
481
+ attributeKey: ATTRIBUTE_KEY,
482
+ defaultValue: "prod",
483
+ });
484
+
485
+ renderPublic(variable);
486
+
487
+ await waitFor(() => {
488
+ expect(screen.getByRole("combobox")).not.toBeDisabled();
489
+ });
490
+ expect(screen.getByRole("combobox")).toHaveValue("prod");
491
+ expect(screen.getByRole("combobox")).toHaveDisplayValue("prod");
492
+ expect(isUnfiltered(variable)).toBe(false);
493
+ });
470
494
  });
471
495
 
472
496
  /*