@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.
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +13 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +17 -0
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +161 -32
- package/Server/API/TeamMemberAPI.ts +3 -0
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +79 -5
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +18 -0
- package/Server/Services/RumSessionPinService.ts +274 -22
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +24 -28
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +95 -68
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +28 -3
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +761 -0
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +321 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +140 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +175 -17
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +89 -1
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +12 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/Utils/API.ts +14 -5
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +12 -0
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +125 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +3 -3
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +64 -4
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +180 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +14 -13
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +11 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- 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 {
|
|
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
|
/*
|