@oneuptime/common 14.0.13 → 14.0.14
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/AlertGroupingRule.ts +10 -6
- package/Models/DatabaseModels/File.ts +41 -2
- package/Models/DatabaseModels/Form.ts +126 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +10 -6
- package/Models/DatabaseModels/LogDropFilter.ts +1 -0
- package/Models/DatabaseModels/LogPipeline.ts +1 -0
- package/Models/DatabaseModels/LogScrubRule.ts +14 -8
- package/Models/DatabaseModels/MetricRecordingRule.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +4 -2
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +22 -9
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +6 -1
- package/Models/DatabaseModels/StatusPage.ts +8 -4
- package/Models/DatabaseModels/TraceDropFilter.ts +1 -0
- package/Models/DatabaseModels/TracePipeline.ts +1 -0
- package/Models/DatabaseModels/TraceRecordingRule.ts +2 -1
- package/Models/DatabaseModels/TraceScrubRule.ts +14 -8
- package/Models/DatabaseModels/UserOnCallLog.ts +4 -2
- package/Server/API/CustomDomainRoutes.ts +251 -0
- package/Server/API/DashboardAPI.ts +33 -4
- package/Server/API/DashboardDomainAPI.ts +63 -93
- package/Server/API/StatusPageAPI.ts +92 -0
- package/Server/API/StatusPageDomainAPI.ts +59 -96
- package/Server/Infrastructure/GlobalCache.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/AlertGroupingEngineService.ts +48 -70
- package/Server/Services/AlertGroupingRuleService.ts +38 -0
- package/Server/Services/CephClusterService.ts +25 -0
- package/Server/Services/CloudResourceService.ts +42 -0
- package/Server/Services/DashboardDomainService.ts +640 -214
- package/Server/Services/DashboardService.ts +30 -8
- package/Server/Services/DatabaseService.ts +143 -12
- package/Server/Services/DockerHostService.ts +60 -0
- package/Server/Services/DockerSwarmClusterService.ts +25 -0
- package/Server/Services/FileService.ts +60 -0
- package/Server/Services/FormService.ts +212 -2
- package/Server/Services/GlobalOidcService.ts +10 -0
- package/Server/Services/GlobalSsoService.ts +10 -0
- package/Server/Services/HostService.ts +58 -0
- package/Server/Services/IncidentGroupingEngineService.ts +48 -70
- package/Server/Services/IncidentGroupingRuleService.ts +38 -0
- package/Server/Services/IoTFleetService.ts +26 -0
- package/Server/Services/KubernetesClusterService.ts +64 -0
- package/Server/Services/LabelService.ts +6 -17
- package/Server/Services/LogScrubRuleService.ts +50 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +264 -0
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +9 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +24 -29
- package/Server/Services/OnCallSetupReminderService.ts +41 -40
- package/Server/Services/PodmanHostService.ts +60 -0
- package/Server/Services/ProfileAggregationService.ts +38 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +76 -3
- package/Server/Services/ProjectOidcService.ts +20 -0
- package/Server/Services/ProjectSsoService.ts +20 -0
- package/Server/Services/ProxmoxClusterService.ts +25 -0
- package/Server/Services/RumApplicationService.ts +45 -0
- package/Server/Services/ScheduledMaintenanceService.ts +9 -23
- package/Server/Services/ServerlessFunctionService.ts +47 -0
- package/Server/Services/ServiceService.ts +33 -10
- package/Server/Services/StatusPageDomainService.ts +622 -213
- package/Server/Services/StatusPageOidcService.ts +20 -0
- package/Server/Services/StatusPageResourceService.ts +89 -34
- package/Server/Services/StatusPageService.ts +270 -54
- package/Server/Services/StatusPageSsoService.ts +20 -0
- package/Server/Services/TraceScrubRuleService.ts +50 -0
- package/Server/Services/UserIncomingCallNumberService.ts +28 -14
- package/Server/Services/VMwareVCenterService.ts +25 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +3 -3
- package/Server/Utils/Greenlock/CertificateOrder.ts +482 -0
- package/Server/Utils/Greenlock/CertificateOrderBudget.ts +134 -0
- package/Server/Utils/Greenlock/CertificateOrderFailures.ts +288 -0
- package/Server/Utils/Greenlock/CertificateOrderLock.ts +163 -0
- package/Server/Utils/Greenlock/CertificateOrderOutcome.ts +29 -0
- package/Server/Utils/Greenlock/CertificateOwners.ts +72 -0
- package/Server/Utils/Greenlock/CertificateReissueOrder.ts +99 -0
- package/Server/Utils/Greenlock/CustomDomainOrders.ts +397 -0
- package/Server/Utils/Greenlock/Greenlock.ts +839 -203
- package/Server/Utils/Rules/GroupingRuleEpisodeOwners.ts +551 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +8 -1
- package/Server/Utils/ScrubRuleValidation.ts +248 -0
- package/Server/Utils/StatusPage/AffectedStatusPageResources.ts +138 -0
- package/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.ts +294 -0
- package/Server/Utils/Telemetry/DiscoveredResourceCreate.ts +275 -0
- package/Server/Utils/Telemetry/DiscoveredResourceUpdate.ts +217 -0
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +8 -2
- package/Tests/App/Accounts/FormPage.test.tsx +238 -0
- package/Tests/App/Accounts/FormUtils.test.ts +108 -0
- package/Tests/App/AdminDashboard/AdminAddToProjectMembersTeam.test.tsx +1087 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +140 -138
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +144 -145
- package/Tests/App/AdminDashboard/AdminSettingsFormsOnePage.test.tsx +907 -0
- package/Tests/App/AdminDashboard/AdminSettingsSwitches.test.tsx +906 -0
- package/Tests/App/AdminDashboard/AdminSmtpSettingsForm.test.tsx +823 -0
- package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +341 -368
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +199 -54
- package/Tests/App/AdminDashboard/ProjectScopedTeamsPicker.test.tsx +991 -0
- package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +147 -90
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +224 -104
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +302 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +408 -152
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +55 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +206 -115
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +32 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +206 -71
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/AnnouncementCreateForm.test.tsx +1208 -0
- package/Tests/App/Dashboard/AnnouncementEditAndTemplateForms.test.tsx +693 -0
- package/Tests/App/Dashboard/AnnouncementFormsStructure.test.ts +546 -0
- package/Tests/App/Dashboard/AnnouncementStatusPageSuggestions.test.tsx +425 -0
- package/Tests/App/Dashboard/AnnouncementsTableCreateLinks.test.tsx +267 -0
- package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +68 -51
- package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +11 -9
- package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +24 -16
- package/Tests/App/Dashboard/BulkChangeStateModalOnePage.test.tsx +333 -0
- package/Tests/App/Dashboard/CardDescriptionsSayWhatFor.test.tsx +307 -0
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +18 -4
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +7 -2
- package/Tests/App/Dashboard/ColorFieldsPrefilledPages.test.tsx +453 -0
- package/Tests/App/Dashboard/CreateFromRecordBreadcrumbs.test.ts +272 -0
- package/Tests/App/Dashboard/CreateFromRecordLinks.test.tsx +495 -0
- package/Tests/App/Dashboard/CreateFromRecordPages.test.tsx +1026 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +65 -23
- package/Tests/App/Dashboard/CriteriaName.test.ts +5 -1
- package/Tests/App/Dashboard/CustomDomainCreateFlow.test.tsx +516 -0
- package/Tests/App/Dashboard/CustomDomainDnsSetupModal.test.tsx +547 -0
- package/Tests/App/Dashboard/CustomDomainsPages.test.tsx +1077 -0
- package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +2 -2
- package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +12 -6
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +1 -1
- package/Tests/App/Dashboard/CustomSmtpConfigForm.test.tsx +969 -0
- package/Tests/App/Dashboard/DashboardBlankCanvasAddWidget.test.tsx +425 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +400 -0
- package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +4 -3
- package/Tests/App/Dashboard/DashboardCreateForm.test.ts +375 -0
- package/Tests/App/Dashboard/DashboardCreateFromTemplate.test.tsx +727 -0
- package/Tests/App/Dashboard/DashboardEmptyCanvasAddWidget.test.tsx +86 -0
- package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +99 -9
- package/Tests/App/Dashboard/DashboardSharingCard.test.tsx +1226 -0
- package/Tests/App/Dashboard/DashboardSharingEntryPoints.test.tsx +383 -0
- package/Tests/App/Dashboard/DashboardSharingPage.test.tsx +478 -0
- package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +90 -34
- package/Tests/App/Dashboard/DeclareIncidentMonitorsApart.test.tsx +1028 -0
- package/Tests/App/Dashboard/DefaultSsoTeams.test.tsx +215 -0
- package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +3 -3
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +15 -12
- package/Tests/App/Dashboard/DiscoveredResourceCreateForms.test.tsx +936 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardGroup.test.tsx +720 -0
- package/Tests/App/Dashboard/EpisodeMemberRoleAssignmentsFormField.test.tsx +331 -0
- package/Tests/App/Dashboard/EpisodePostmortemPage.test.tsx +327 -0
- package/Tests/App/Dashboard/EscalationRuleForm.test.ts +2 -2
- package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +6 -2
- package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +8 -4
- package/Tests/App/Dashboard/EventMeasurements.test.ts +1175 -0
- package/Tests/App/Dashboard/EventMeasurementsCard.test.tsx +993 -0
- package/Tests/App/Dashboard/EventNoteComposerDialog.test.tsx +939 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +34 -1
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +186 -1
- package/Tests/App/Dashboard/EventSettingsSwitchPages.test.tsx +625 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +6 -2
- package/Tests/App/Dashboard/FeedNoteComposerDialog.test.tsx +1327 -0
- package/Tests/App/Dashboard/FeedNoteDialogHelpers.ts +109 -0
- package/Tests/App/Dashboard/FilterChipClearButton.test.tsx +356 -0
- package/Tests/App/Dashboard/FormBrandingSection.test.tsx +504 -0
- package/Tests/App/Dashboard/FormBrandingValues.test.ts +255 -0
- package/Tests/App/Dashboard/FormBuilderParts.test.tsx +38 -1
- package/Tests/App/Dashboard/FormBuilderUi.test.tsx +176 -2
- package/Tests/App/Dashboard/FormMappingCard.test.tsx +33 -13
- package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +1 -1
- package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +30 -7
- package/Tests/App/Dashboard/GlobalProbesOnNewMonitorsCard.test.tsx +258 -0
- package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +653 -37
- package/Tests/App/Dashboard/GroupingRulePages.test.tsx +218 -9
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +52 -4
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +230 -338
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +227 -295
- package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +157 -181
- package/Tests/App/Dashboard/IncidentPostmortemPage.test.tsx +775 -0
- package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +379 -15
- package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +148 -32
- package/Tests/App/Dashboard/IncidentTemplateInitialState.test.tsx +430 -0
- package/Tests/App/Dashboard/IncidentTemplateMonitorsApart.test.tsx +492 -0
- package/Tests/App/Dashboard/IncomingCallEscalationOneStep.test.tsx +830 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleForm.test.ts +510 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleFormGuard.test.ts +378 -0
- package/Tests/App/Dashboard/IngestionKeyForm.test.ts +664 -0
- package/Tests/App/Dashboard/IngestionKeySelectorCreate.test.tsx +523 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +130 -9
- package/Tests/App/Dashboard/IpAllowlistCopy.test.ts +122 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +19 -3
- package/Tests/App/Dashboard/KubernetesMetricsSetupEmptyState.test.tsx +275 -0
- package/Tests/App/Dashboard/KubernetesMetricsSetupHints.test.tsx +720 -0
- package/Tests/App/Dashboard/LabelsFormField.test.tsx +18 -13
- package/Tests/App/Dashboard/LegacyDefaultAssigneeNote.test.tsx +359 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +10 -10
- package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +42 -20
- package/Tests/App/Dashboard/MeasurementForms.test.tsx +191 -5
- package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +2 -0
- package/Tests/App/Dashboard/MeasurementSetup.test.ts +5 -2
- package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +38 -12
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +34 -11
- package/Tests/App/Dashboard/MetricAndRecordingRuleFormsRender.test.tsx +1206 -0
- package/Tests/App/Dashboard/MetricResultsState.test.ts +248 -0
- package/Tests/App/Dashboard/MetricViewResultsState.test.tsx +404 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +77 -27
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +5 -8
- package/Tests/App/Dashboard/MonitorCriteriaHeaderControls.test.tsx +228 -0
- package/Tests/App/Dashboard/MonitorCriteriaIncidentRoles.test.tsx +411 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +5 -1
- package/Tests/App/Dashboard/MonitorFormIncidentRoles.test.tsx +460 -0
- package/Tests/App/Dashboard/MonitorIntervalRedirect.test.tsx +299 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +243 -2
- package/Tests/App/Dashboard/MonitorProbesAndIntervalPage.test.tsx +638 -0
- package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitoringIntervalCard.test.tsx +493 -0
- package/Tests/App/Dashboard/MonitoringSwitch.test.tsx +597 -0
- package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +4 -5
- package/Tests/App/Dashboard/NotificationChannelOffSwitchLists.test.tsx +636 -0
- package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +8 -4
- package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +1 -1
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +54 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +43 -24
- package/Tests/App/Dashboard/OnCallRulesRedirects.test.tsx +530 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +158 -74
- package/Tests/App/Dashboard/OnCallRulesTabs.test.tsx +511 -0
- package/Tests/App/Dashboard/OnCallScheduleAddLayerDefaults.test.tsx +236 -0
- package/Tests/App/Dashboard/OnCallScheduleCreateFormGuard.test.ts +633 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +13 -2
- package/Tests/App/Dashboard/OnCallScheduleWhoTakesTurns.test.tsx +771 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedSettingsForm.test.tsx +357 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +16 -6
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +112 -23
- package/Tests/App/Dashboard/PageSearchIndexCoversMenus.test.tsx +594 -0
- package/Tests/App/Dashboard/PageSearchIndexCoversRoutes.test.tsx +271 -0
- package/Tests/App/Dashboard/PageSearchRanking.test.tsx +373 -0
- package/Tests/App/Dashboard/PostmortemPageParts.test.tsx +548 -0
- package/Tests/App/Dashboard/ProbeAgreementCard.test.tsx +483 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +9 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +282 -404
- package/Tests/App/Dashboard/ProjectAiSettingsSwitchPages.test.tsx +1414 -0
- package/Tests/App/Dashboard/ProjectNotificationChannels.test.tsx +1191 -0
- package/Tests/App/Dashboard/ProjectSettingsSwitchCards.test.tsx +603 -0
- package/Tests/App/Dashboard/RemindersCard.test.tsx +477 -0
- package/Tests/App/Dashboard/ResourceDetailsCard.test.tsx +458 -0
- package/Tests/App/Dashboard/ResourceRuleForm.test.ts +525 -0
- package/Tests/App/Dashboard/ResourceRuleFormsRender.test.tsx +803 -0
- package/Tests/App/Dashboard/RoleAccess.test.ts +753 -0
- package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +13 -6
- package/Tests/App/Dashboard/RouteUtilPageRoute.test.ts +116 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +1 -1
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +172 -219
- package/Tests/App/Dashboard/RunbookStepHeaderControls.test.tsx +269 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +45 -85
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +16 -23
- package/Tests/App/Dashboard/ScheduledMaintenanceAffectedResourcesEditForm.test.tsx +485 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +27 -2
- package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +65 -28
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +208 -309
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +36 -53
- package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +83 -14
- package/Tests/App/Dashboard/ScheduledMaintenanceMonitorsApart.test.tsx +1085 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +378 -25
- package/Tests/App/Dashboard/ScheduledMaintenanceStatusPageSuggestions.test.tsx +513 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +31 -9
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateMonitorsApart.test.tsx +760 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +11 -13
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +228 -69
- package/Tests/App/Dashboard/SelectedProjectSwitches.test.tsx +359 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1 -1
- package/Tests/App/Dashboard/SessionReplayAllowedCard.test.tsx +297 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +7 -1
- package/Tests/App/Dashboard/ShortFormsOnePage.test.tsx +591 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +253 -6
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +99 -0
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +3 -1
- package/Tests/App/Dashboard/SloSettings.test.tsx +257 -4
- package/Tests/App/Dashboard/SsoPages.test.tsx +448 -52
- package/Tests/App/Dashboard/StateChangeDialogsFolded.test.tsx +695 -0
- package/Tests/App/Dashboard/StateChangeFormFields.test.ts +376 -0
- package/Tests/App/Dashboard/StatusPageAccessCard.test.tsx +1088 -0
- package/Tests/App/Dashboard/StatusPageAccessCopy.test.ts +450 -0
- package/Tests/App/Dashboard/StatusPageAccessMenu.test.tsx +137 -0
- package/Tests/App/Dashboard/StatusPageAccessPage.test.tsx +458 -0
- package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +30 -86
- package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +28 -15
- package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +949 -14
- package/Tests/App/Dashboard/StatusPagePrivateUsersNotice.test.tsx +233 -0
- package/Tests/App/Dashboard/StatusPageReportsCard.test.tsx +1001 -0
- package/Tests/App/Dashboard/StatusPageRequireSsoCard.test.tsx +247 -0
- package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +4 -17
- package/Tests/App/Dashboard/StatusPageSuggestions.test.tsx +930 -0
- package/Tests/App/Dashboard/StatusPageSwitchCardPages.test.tsx +335 -0
- package/Tests/App/Dashboard/TeamBlockPermissionsRedirect.test.tsx +332 -0
- package/Tests/App/Dashboard/TeamCreateForm.test.ts +206 -0
- package/Tests/App/Dashboard/TeamViewPermissions.test.tsx +713 -0
- package/Tests/App/Dashboard/TeamViewSideMenuBlockPermissions.test.tsx +113 -0
- package/Tests/App/Dashboard/TeamsCreateAccess.test.tsx +799 -0
- package/Tests/App/Dashboard/TelemetryDataRuleForms.test.ts +655 -0
- package/Tests/App/Dashboard/TelemetryDataRuleFormsRender.test.tsx +1014 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +6 -3
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +446 -446
- package/Tests/App/Dashboard/TelemetryMonitorFiltersFold.test.tsx +613 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +37 -2
- package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +3 -3
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +338 -0
- package/Tests/App/Dashboard/TwilioConfigFirstDefault.test.tsx +786 -0
- package/Tests/App/Dashboard/UpcomingShiftGetCover.test.tsx +306 -0
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +36 -11
- package/Tests/App/Dashboard/UserOverrideForm.test.ts +505 -0
- package/Tests/App/Dashboard/UserOverrideFormGuard.test.ts +334 -0
- package/Tests/App/Dashboard/UserOverrideWhoIsAway.test.tsx +999 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +33 -11
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +49 -4
- package/Tests/App/Dashboard/UsersPageEmptyState.test.tsx +245 -0
- package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +13 -6
- package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +0 -2
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +108 -86
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +397 -0
- package/Tests/App/StatusPage/StatusPageResourceForm.test.tsx +931 -0
- package/Tests/App/StatusPage/StatusPageSubscribeOnePage.test.tsx +686 -0
- package/Tests/DialogActionRules.ts +16 -5
- package/Tests/Helpers/CardHeaderScan.ts +258 -0
- package/Tests/Helpers/FormStepsScan.ts +576 -11
- package/Tests/Helpers/MonitorGroupStatusPageRows.ts +237 -0
- package/Tests/Helpers/NestedControls.ts +184 -0
- package/Tests/Helpers/NestedControlsScan.ts +414 -0
- package/Tests/Helpers/SteppedFooterScan.ts +722 -0
- package/Tests/Models/DatabaseModels/FormModel.test.ts +31 -7
- package/Tests/Models/DatabaseModels/UserOverrideColumnDescriptions.test.ts +123 -0
- package/Tests/Models/TelemetryDataRuleColumnDefaults.test.ts +239 -0
- package/Tests/ResponsiveFlexLayout.test.ts +111 -0
- package/Tests/ResponsiveFlexLayout.ts +165 -0
- package/Tests/Server/API/DashboardDomainOrderSslAPI.test.ts +372 -0
- package/Tests/Server/API/DashboardDomainVerifyCnameAPI.test.ts +921 -0
- package/Tests/Server/API/DashboardSharingPublicRoutes.test.ts +559 -0
- package/Tests/Server/API/FormBrandingPublicRoutes.test.ts +680 -0
- package/Tests/Server/API/ProjectAPICreateWithTenantHeader.test.ts +300 -0
- package/Tests/Server/API/ProjectCreateTestHelpers.ts +211 -0
- package/Tests/Server/API/ProjectCreateWithTenantHeaderPostgres.test.ts +387 -0
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +29 -12
- package/Tests/Server/API/StatusPageDomainVerifyCnameAPI.test.ts +1090 -0
- package/Tests/Server/API/StatusPageMasterPageAccess.test.ts +254 -0
- package/Tests/Server/API/StatusPageReportScheduleWrites.test.ts +829 -0
- package/Tests/Server/API/StatusPageUptimeSettingsWrites.test.ts +417 -0
- package/Tests/Server/API/StatusPagesListingMonitorsAPI.test.ts +1029 -0
- package/Tests/Server/API/StatusPagesListingMonitorsRoute.test.ts +286 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +52 -1
- package/Tests/Server/Services/CustomDomainCertificateLifecycle.test.ts +1559 -0
- package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +186 -16
- package/Tests/Server/Services/DashboardAccessChoice.test.ts +657 -0
- package/Tests/Server/Services/DashboardCreateFromTemplate.test.ts +200 -0
- package/Tests/Server/Services/DashboardDomainCertificateSweeps.test.ts +1142 -0
- package/Tests/Server/Services/DiscoveredResourceCreate.test.ts +864 -0
- package/Tests/Server/Services/DiscoveredResourceUpdate.test.ts +822 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +3 -4
- package/Tests/Server/Services/FileServiceProject.test.ts +345 -0
- package/Tests/Server/Services/FormBranding.test.ts +982 -0
- package/Tests/Server/Services/FormPublicForm.test.ts +15 -0
- package/Tests/Server/Services/GroupingRuleEpisodeOwners.test.ts +857 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +297 -1
- package/Tests/Server/Services/MachinePickedColors.test.ts +202 -0
- package/Tests/Server/Services/OidcProviderCreateDefaults.test.ts +252 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayer.test.ts +799 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayerPlans.test.ts +172 -0
- package/Tests/Server/Services/OnCallDutyPolicyUserOverrideWhoIsAway.test.ts +571 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +35 -13
- package/Tests/Server/Services/OnCallUndeliverablePageRulesLink.test.ts +217 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +213 -4
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefault.test.ts +699 -0
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefaultBilling.test.ts +247 -0
- package/Tests/Server/Services/SamlProviderCreateDefaults.test.ts +255 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberMonitorGroups.test.ts +333 -0
- package/Tests/Server/Services/ScrubRuleSaveValidation.test.ts +947 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +17 -4
- package/Tests/Server/Services/StatusPageAccessChoice.test.ts +548 -0
- package/Tests/Server/Services/StatusPageDomainCertificateSweeps.test.ts +1238 -0
- package/Tests/Server/Services/TeamCreateAccessGrant.test.ts +607 -0
- package/Tests/Server/Services/TwilioConfigSendersGuard.test.ts +249 -0
- package/Tests/Server/Services/VerificationCodesUseProjectTwilioConfig.test.ts +264 -0
- package/Tests/Server/Types/Database/Permissions/FormBrandingColumns.test.ts +270 -0
- package/Tests/Server/Utils/Greenlock/CertificateCleanup.test.ts +526 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrder.test.ts +1062 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderBudget.test.ts +243 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderFailures.test.ts +293 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderLock.test.ts +152 -0
- package/Tests/Server/Utils/Greenlock/CertificateOwnersGuard.test.ts +119 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalOwnership.test.ts +1170 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSafety.test.ts +368 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +188 -11
- package/Tests/Server/Utils/Greenlock/CustomDomainOrders.test.ts +723 -0
- package/Tests/Server/Utils/Greenlock/InMemoryRedis.ts +189 -0
- package/Tests/Server/Utils/Greenlock/NginxAcmeCertificatesToDisk.test.ts +242 -0
- package/Tests/Server/Utils/Greenlock/NginxCustomCertificatesToDisk.test.ts +305 -0
- package/Tests/Server/Utils/Greenlock/OrderCertGuards.test.ts +583 -0
- package/Tests/Server/Utils/Greenlock/OrderCertStorage.test.ts +203 -0
- package/Tests/Server/Utils/StatusPage/AffectedStatusPageResources.test.ts +700 -0
- package/Tests/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.test.ts +744 -0
- package/Tests/Types/CustomDomain/CustomDomainCertificates.test.ts +106 -0
- package/Tests/Types/CustomDomain/CustomDomainVerification.test.ts +94 -0
- package/Tests/Types/Dashboard/DashboardAccess.test.ts +460 -0
- package/Tests/Types/Filter/FilterConditionUtil.test.ts +59 -0
- package/Tests/Types/Form/FormBranding.test.ts +760 -0
- package/Tests/Types/IncomingCall/IncomingCallRingTime.test.ts +80 -0
- package/Tests/Types/NotificationRule/OnCallRuleKind.test.ts +271 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleFirstLayer.test.ts +300 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleLayerDefaults.test.ts +316 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideCoverRequest.test.ts +257 -0
- package/Tests/Types/SSO/OidcProviderDefaults.test.ts +474 -0
- package/Tests/Types/SSO/SamlProviderDefaults.test.ts +150 -0
- package/Tests/Types/SSO/SsoProviderDefaults.test.ts +181 -0
- package/Tests/Types/StatusPage/StatusPageAccess.test.ts +393 -0
- package/Tests/Types/StatusPage/StatusPagesListingMonitors.test.ts +149 -0
- package/Tests/Types/Telemetry/ScrubRule.test.ts +375 -0
- package/Tests/UI/Components/AdvancedPageSection.test.tsx +201 -61
- package/Tests/UI/Components/BasicFormModalSteps.test.tsx +129 -153
- package/Tests/UI/Components/Card.test.tsx +354 -367
- package/Tests/UI/Components/CardHeaderActionsGuard.test.tsx +605 -0
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +23 -8
- package/Tests/UI/Components/CardModelDetailOnBeforeUpdate.test.tsx +224 -0
- package/Tests/UI/Components/CardModelDetailPageButtons.test.tsx +231 -0
- package/Tests/UI/Components/ChoiceRows.test.tsx +365 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +341 -5
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +655 -64
- package/Tests/UI/Components/Detail/DetailCreatedOnIdLine.test.tsx +669 -0
- package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +34 -7
- package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +71 -0
- package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +26 -7
- package/Tests/UI/Components/Detail/DetailRecordLine.test.tsx +326 -0
- package/Tests/UI/Components/Detail/DetailRecordTime.test.ts +324 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +7 -3
- package/Tests/UI/Components/Dropdown/DropdownChange.test.ts +163 -0
- package/Tests/UI/Components/EntityDropdown.test.tsx +103 -1
- package/Tests/UI/Components/EntityDropdownClearButton.test.tsx +638 -0
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +6 -6
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +21 -4
- package/Tests/UI/Components/EntityDropdownQuery.test.tsx +411 -0
- package/Tests/UI/Components/EntityDropdownQueryHelpers.test.ts +131 -0
- package/Tests/UI/Components/FilePicker.test.tsx +220 -1
- package/Tests/UI/Components/FoldedSection/FoldedSection.test.tsx +582 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionDarkMode.test.ts +197 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionItem.test.ts +247 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionQueries.ts +86 -0
- package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +358 -32
- package/Tests/UI/Components/Forms/AnchoredFieldPopupPlacement.test.tsx +195 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +187 -23
- package/Tests/UI/Components/Forms/BasicFormFillsInOnShow.test.tsx +246 -0
- package/Tests/UI/Components/Forms/BasicFormFooterSetValue.test.tsx +283 -0
- package/Tests/UI/Components/Forms/BasicFormPrimaryActionLastStep.test.tsx +780 -0
- package/Tests/UI/Components/Forms/BasicFormSingleStep.test.tsx +232 -0
- package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +7 -4
- package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +4 -3
- package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +252 -7
- package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +247 -7
- package/Tests/UI/Components/Forms/DiscoveredResourceCreateFormsGuard.test.ts +492 -0
- package/Tests/UI/Components/Forms/FilterConditionOnlyWithTwoFiltersGuard.test.ts +333 -0
- package/Tests/UI/Components/Forms/FoldedEditorWidthTiming.test.tsx +127 -0
- package/Tests/UI/Components/Forms/FoldedSectionsGuard.test.ts +523 -0
- package/Tests/UI/Components/Forms/FollowPickName.test.ts +88 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownChange.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +237 -2
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +181 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +110 -86
- package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +101 -96
- package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +559 -10
- package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +56 -4
- package/Tests/UI/Components/Forms/MetricAndRecordingRuleFormsGuard.test.ts +400 -0
- package/Tests/UI/Components/Forms/ModelFormColorDefaults.test.tsx +659 -0
- package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +108 -4
- package/Tests/UI/Components/Forms/ModelFormDropdownQuery.test.tsx +403 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +126 -0
- package/Tests/UI/Components/Forms/ModelFormSinglePickPeoplePicker.test.tsx +453 -0
- package/Tests/UI/Components/Forms/OidcProviderFormsGuard.test.ts +321 -0
- package/Tests/UI/Components/Forms/OneIncidentRolePickerGuard.test.ts +823 -0
- package/Tests/UI/Components/Forms/OneSwitchCardsGuard.test.ts +739 -0
- package/Tests/UI/Components/Forms/OpenFormSections.test.tsx +169 -0
- package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +21 -9
- package/Tests/UI/Components/Forms/PrimaryActionLastStepGuard.test.ts +478 -0
- package/Tests/UI/Components/Forms/ProjectTeamFormsGuard.test.ts +240 -0
- package/Tests/UI/Components/Forms/ResourceDetailsOnePlaceGuard.test.ts +936 -0
- package/Tests/UI/Components/Forms/ResourceRuleFormsGuard.test.ts +527 -0
- package/Tests/UI/Components/Forms/SamlProviderFormsGuard.test.ts +387 -0
- package/Tests/UI/Components/Forms/SmallWizardsOnePageGuard.test.ts +331 -0
- package/Tests/UI/Components/Forms/SmtpConfigFormsGuard.test.ts +470 -0
- package/Tests/UI/Components/Forms/StateChangeDialogsFoldTheNote.test.ts +322 -0
- package/Tests/UI/Components/Forms/StatusPageResourceFormsGuard.test.ts +381 -0
- package/Tests/UI/Components/Forms/SteppedFormFooter.test.ts +225 -0
- package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +82 -40
- package/Tests/UI/Components/Forms/SwitchCardsGuard.test.ts +339 -0
- package/Tests/UI/Components/Forms/TelemetryDataRuleFormsGuard.test.ts +383 -0
- package/Tests/UI/Components/Forms/UniqueName.test.ts +163 -0
- package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +131 -11
- package/Tests/UI/Components/Forms/Utils/CreateFormColorDefaults.test.ts +373 -0
- package/Tests/UI/Components/Forms/Utils/FoldedFormFields.test.ts +482 -0
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +32 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +51 -7
- package/Tests/UI/Components/ModalSecondaryButton.test.tsx +60 -3
- package/Tests/UI/Components/ModelFormDraftValues.test.tsx +255 -0
- package/Tests/UI/Components/ModelPageHeaderChanged.test.tsx +293 -0
- package/Tests/UI/Components/ModelSwitchCard.test.tsx +813 -0
- package/Tests/UI/Components/ModelSwitchEvents.test.ts +188 -0
- package/Tests/UI/Components/ModelSwitchRow.test.tsx +861 -0
- package/Tests/UI/Components/ModelSwitchUtil.test.ts +239 -0
- package/Tests/UI/Components/ModelSwitchesCard.test.tsx +699 -0
- package/Tests/UI/Components/NavBar.test.tsx +41 -2
- package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +12 -0
- package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +197 -30
- package/Tests/UI/Components/NavBarMenuFolding.test.tsx +221 -39
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +15 -10
- package/Tests/UI/Components/NestedControlsGuard.test.ts +300 -0
- package/Tests/UI/Components/PageBreadcrumbOverride.test.tsx +202 -0
- package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +269 -5
- package/Tests/UI/Components/PeoplePicker/PeoplePickerChange.test.tsx +414 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerExcludePicks.test.tsx +582 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePick.test.tsx +519 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePickTypes.test.ts +174 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +8 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +14 -6
- package/Tests/UI/Components/RuleRun/RuleViewDescription.test.tsx +107 -0
- package/Tests/UI/Components/SaveStatus.test.tsx +81 -0
- package/Tests/UI/Components/SmtpConfig/SmtpConfigFormFields.test.ts +1078 -0
- package/Tests/UI/Components/Sso/OidcProviderForm.test.tsx +608 -0
- package/Tests/UI/Components/Sso/OidcProviderFormFields.test.ts +698 -0
- package/Tests/UI/Components/Sso/SamlProviderForm.test.tsx +583 -0
- package/Tests/UI/Components/Sso/SamlProviderFormFields.test.ts +619 -0
- package/Tests/UI/Components/SteppedEditFormSave.test.tsx +199 -141
- package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +143 -0
- package/Tests/UI/Components/UseSaveModelSwitch.test.tsx +409 -0
- package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +3 -3
- package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +83 -27
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +7 -2
- package/Tests/UI/Components/useSaveOnChange.test.tsx +341 -0
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +75 -5
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +97 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +12 -39
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -6
- package/Tests/{App/Dashboard → UI/Utils}/DefaultInviteTeam.test.ts +126 -4
- package/Tests/UI/Utils/GrantablePermission.test.ts +172 -0
- package/Tests/UI/Utils/PermissionGateColumnUpdate.test.ts +211 -0
- package/Tests/UI/Utils/TranslateTemplate.test.ts +31 -0
- package/Tests/Utils/DistinctColor.test.ts +446 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +14 -2
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +1 -1
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +2 -2
- package/Tests/Utils/Slo/SloHealth.test.ts +28 -6
- package/Tests/Utils/StatusPage/ReportSchedule.test.ts +867 -0
- package/Tests/Utils/Telemetry/DiscoveredResourceName.test.ts +189 -0
- package/Tests/Utils/WordMatch.test.ts +104 -0
- package/Types/BrandColors.ts +10 -0
- package/Types/CustomDomain/CustomDomainCertificates.ts +128 -0
- package/Types/CustomDomain/CustomDomainVerification.ts +78 -0
- package/Types/Dashboard/DashboardAccess.ts +250 -0
- package/Types/Dashboard/DashboardTemplates.ts +33 -0
- package/Types/Filter/FilterConditionUtil.ts +29 -0
- package/Types/Form/FormBranding.ts +475 -0
- package/Types/Form/FormPublic.ts +26 -0
- package/Types/IncomingCall/IncomingCallRingTime.ts +48 -0
- package/Types/Log/LogScrubField.ts +14 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +1 -1
- package/Types/NotificationRule/OnCallRuleKind.ts +194 -0
- package/Types/OnCallDutyPolicy/FirstResponders.ts +3 -32
- package/Types/OnCallDutyPolicy/MiscDataId.ts +38 -0
- package/Types/OnCallDutyPolicy/ScheduleFirstLayer.ts +165 -0
- package/Types/OnCallDutyPolicy/ScheduleLayerDefaults.ts +160 -0
- package/Types/OnCallDutyPolicy/UserOverrideCoverRequest.ts +148 -0
- package/Types/SSO/OidcProviderDefaults.ts +282 -0
- package/Types/SSO/SamlProviderDefaults.ts +77 -0
- package/Types/SSO/SsoProviderDefaults.ts +101 -0
- package/Types/StatusPage/StatusPageAccess.ts +215 -0
- package/Types/StatusPage/StatusPagesListingMonitors.ts +150 -0
- package/Types/Telemetry/ScrubRule.ts +240 -0
- package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +59 -29
- package/UI/Components/Card/Card.tsx +139 -80
- package/UI/Components/ChoiceRows/ChoiceRows.tsx +249 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +28 -12
- package/UI/Components/CommandPalette/PaletteFilter.ts +962 -75
- package/UI/Components/CommandPalette/PaletteRow.tsx +35 -3
- package/UI/Components/CommandPalette/Types.ts +37 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +6 -0
- package/UI/Components/Detail/Detail.tsx +52 -15
- package/UI/Components/Detail/DetailRecordLine.tsx +96 -0
- package/UI/Components/Detail/DetailRecordTime.ts +196 -0
- package/UI/Components/Dropdown/DropdownChange.ts +198 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +270 -106
- package/UI/Components/EntityDropdown/EntityDropdownQuery.ts +119 -0
- package/UI/Components/FilePicker/FilePicker.tsx +90 -6
- package/UI/Components/FoldedSection/FoldedSection.tsx +370 -0
- package/UI/Components/FoldedSection/FoldedSectionItem.ts +141 -0
- package/UI/Components/FoldedSection/FoldedSectionTitles.ts +39 -0
- package/UI/Components/FormModal/BasicFormModal.tsx +40 -67
- package/UI/Components/Forms/BasicForm.tsx +218 -119
- package/UI/Components/Forms/BasicModelForm.tsx +0 -2
- package/UI/Components/Forms/CollapsibleFormSection.tsx +108 -18
- package/UI/Components/Forms/Fields/FormField.tsx +62 -15
- package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +1 -5
- package/UI/Components/Forms/FormSummary.tsx +5 -3
- package/UI/Components/Forms/ModelForm.tsx +123 -16
- package/UI/Components/Forms/Types/Field.ts +98 -16
- package/UI/Components/Forms/Utils/AdvancedFormSection.ts +102 -31
- package/UI/Components/Forms/Utils/CreateFormDefaults.ts +158 -17
- package/UI/Components/Forms/Utils/FoldedFormFields.ts +393 -0
- package/UI/Components/Forms/Utils/FollowPickName.ts +52 -0
- package/UI/Components/Forms/Utils/FormModalWidth.ts +35 -4
- package/UI/Components/Forms/Utils/OpenFormSections.ts +104 -0
- package/UI/Components/Forms/Utils/SteppedFormFooter.ts +151 -0
- package/UI/Components/Forms/Utils/UniqueName.ts +81 -0
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +22 -3
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +6 -5
- package/UI/Components/Modal/ModalFooter.tsx +10 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +33 -8
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +44 -58
- package/UI/Components/ModelSwitch/ModelSwitchCard.tsx +305 -0
- package/UI/Components/ModelSwitch/ModelSwitchEvents.ts +109 -0
- package/UI/Components/ModelSwitch/ModelSwitchRow.tsx +438 -0
- package/UI/Components/ModelSwitch/ModelSwitchUtil.ts +120 -0
- package/UI/Components/ModelSwitch/ModelSwitchesCard.tsx +265 -0
- package/UI/Components/ModelSwitch/useSaveModelSwitch.ts +144 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
- package/UI/Components/ModelTable/ModelTable.tsx +5 -0
- package/UI/Components/Navbar/NavBar.tsx +10 -9
- package/UI/Components/Navbar/NavBarMenuCatalog.ts +57 -22
- package/UI/Components/Navbar/NavBarMenuModal.tsx +17 -13
- package/UI/Components/Navbar/NavBarMobileMenu.tsx +40 -23
- package/UI/Components/Page/ModelHeaderEvents.ts +75 -0
- package/UI/Components/Page/ModelPage.tsx +21 -1
- package/UI/Components/Page/Page.tsx +68 -13
- package/UI/Components/PeoplePicker/PeoplePicker.tsx +150 -45
- package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +193 -4
- package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +37 -10
- package/UI/Components/PublicForm/PublicFormFavicon.ts +99 -0
- package/UI/Components/PublicForm/PublicFormLogo.tsx +81 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +5 -3
- package/UI/Components/RuleRun/RuleView.tsx +2 -5
- package/UI/Components/SaveStatus/SaveStatus.tsx +76 -0
- package/UI/Components/SaveStatus/useSaveOnChange.ts +178 -0
- package/UI/Components/SmtpConfig/SmtpConfigFormFields.ts +815 -0
- package/UI/Components/Sso/OidcProviderFormFields.ts +481 -0
- package/UI/Components/Sso/SamlProviderFormFields.ts +322 -0
- package/UI/Components/Sso/SsoProviderFormFields.ts +331 -0
- package/UI/Components/Table/TableEmptyState.tsx +39 -5
- package/UI/Components/Workflow/ArgumentsForm.tsx +21 -78
- package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +18 -145
- package/UI/Components/Workflow/WorkflowLogModal.tsx +1 -3
- package/UI/Types/UseAnchoredFieldPopup.ts +46 -4
- package/UI/Utils/DefaultInviteTeam.ts +306 -0
- package/UI/Utils/GrantablePermission.ts +46 -0
- package/UI/Utils/PermissionGate.ts +80 -7
- package/UI/Utils/TranslateTemplate.ts +22 -0
- package/Utils/DistinctColor.ts +223 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +47 -2
- package/Utils/Slo/SloHealth.ts +9 -3
- package/Utils/StatusPage/ReportSchedule.ts +462 -0
- package/Utils/Telemetry/DiscoveredResourceName.ts +95 -0
- package/Utils/WordMatch.ts +185 -0
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/File.js +47 -1
- package/build/dist/Models/DatabaseModels/File.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Form.js +125 -0
- package/build/dist/Models/DatabaseModels/Form.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogPipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +20 -9
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +6 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TracePipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Server/API/CustomDomainRoutes.js +124 -0
- package/build/dist/Server/API/CustomDomainRoutes.js.map +1 -0
- package/build/dist/Server/API/DashboardAPI.js +22 -4
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardDomainAPI.js +56 -49
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +101 -39
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js +52 -51
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +63 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +44 -61
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +23 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +39 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +510 -172
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +22 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +114 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +51 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +23 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/FileService.js +45 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/FormService.js +158 -14
- package/build/dist/Server/Services/FormService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcService.js +9 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoService.js +9 -0
- package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +50 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +45 -62
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +23 -0
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +54 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +6 -16
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/LogScrubRuleService.js +31 -0
- package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +202 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +7 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +17 -24
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +32 -38
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +51 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +34 -0
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +53 -3
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOidcService.js +28 -0
- package/build/dist/Server/Services/ProjectOidcService.js.map +1 -1
- package/build/dist/Server/Services/ProjectSsoService.js +28 -0
- package/build/dist/Server/Services/ProjectSsoService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +42 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +18 -26
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +44 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +30 -4
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +495 -174
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOidcService.js +28 -0
- package/build/dist/Server/Services/StatusPageOidcService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +82 -46
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +174 -45
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSsoService.js +28 -0
- package/build/dist/Server/Services/StatusPageSsoService.js.map +1 -1
- package/build/dist/Server/Services/TraceScrubRuleService.js +31 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +20 -10
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +23 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +3 -3
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js +353 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js +119 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js +208 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js +111 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js +30 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js +52 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js +80 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js +296 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +595 -146
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js +366 -0
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +7 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/ScrubRuleValidation.js +127 -0
- package/build/dist/Server/Utils/ScrubRuleValidation.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js +97 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js +195 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js +177 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js +129 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +8 -2
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -1
- package/build/dist/Types/BrandColors.js +9 -0
- package/build/dist/Types/BrandColors.js.map +1 -1
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js +71 -0
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js.map +1 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js +58 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js +157 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +26 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Filter/FilterConditionUtil.js +24 -0
- package/build/dist/Types/Filter/FilterConditionUtil.js.map +1 -0
- package/build/dist/Types/Form/FormBranding.js +266 -0
- package/build/dist/Types/Form/FormBranding.js.map +1 -0
- package/build/dist/Types/Form/FormPublic.js +6 -0
- package/build/dist/Types/Form/FormPublic.js.map +1 -1
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js +37 -0
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js.map +1 -0
- package/build/dist/Types/Log/LogScrubField.js +15 -0
- package/build/dist/Types/Log/LogScrubField.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js +134 -0
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +2 -23
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js +30 -0
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js +113 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js +95 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js +99 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js.map +1 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js +189 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js +55 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js +67 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js +132 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js +84 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js.map +1 -0
- package/build/dist/Types/Telemetry/ScrubRule.js +180 -0
- package/build/dist/Types/Telemetry/ScrubRule.js.map +1 -0
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +9 -7
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +81 -35
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js +54 -0
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +25 -12
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +632 -64
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +7 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +26 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Detail/DetailRecordLine.js +32 -0
- package/build/dist/UI/Components/Detail/DetailRecordLine.js.map +1 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js +134 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js +102 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js.map +1 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +134 -57
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js +78 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js.map +1 -0
- package/build/dist/UI/Components/FilePicker/FilePicker.js +55 -6
- package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js +139 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js +58 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js +34 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js.map +1 -0
- package/build/dist/UI/Components/FormModal/BasicFormModal.js +29 -45
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +148 -89
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +49 -10
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +25 -11
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +2 -5
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +5 -3
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +72 -14
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +80 -23
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +91 -9
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js +243 -0
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +25 -5
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js +71 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js +56 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +17 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +8 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +19 -6
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +33 -43
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js +151 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js +54 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js +201 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js +60 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js +116 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js +68 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +3 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +21 -10
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +10 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +17 -9
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js +43 -0
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js.map +1 -0
- package/build/dist/UI/Components/Page/ModelPage.js +19 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +31 -13
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +62 -20
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +98 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +35 -14
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -1
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js +66 -0
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js.map +1 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js +38 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +5 -3
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleView.js +2 -2
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js +46 -0
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js.map +1 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js +98 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js.map +1 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js +503 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js +283 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js +182 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js +208 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Table/TableEmptyState.js +17 -4
- package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +17 -52
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +7 -89
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +22 -3
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/DefaultInviteTeam.js +207 -0
- package/build/dist/UI/Utils/DefaultInviteTeam.js.map +1 -0
- package/build/dist/UI/Utils/GrantablePermission.js +31 -0
- package/build/dist/UI/Utils/GrantablePermission.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +54 -3
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/TranslateTemplate.js +16 -0
- package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
- package/build/dist/Utils/DistinctColor.js +151 -0
- package/build/dist/Utils/DistinctColor.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +12 -1
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +9 -3
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/StatusPage/ReportSchedule.js +304 -0
- package/build/dist/Utils/StatusPage/ReportSchedule.js.map +1 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js +65 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js.map +1 -0
- package/build/dist/Utils/WordMatch.js +115 -0
- package/build/dist/Utils/WordMatch.js.map +1 -0
- package/package.json +1 -1
- package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +0 -109
- package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +0 -382
- package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +0 -729
- package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +0 -571
- package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +0 -566
- package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +0 -284
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +0 -132
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +0 -1
|
@@ -0,0 +1,1085 @@
|
|
|
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 {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
configure,
|
|
14
|
+
fireEvent,
|
|
15
|
+
render,
|
|
16
|
+
screen,
|
|
17
|
+
waitFor,
|
|
18
|
+
within,
|
|
19
|
+
} from "@testing-library/react";
|
|
20
|
+
import userEvent from "@testing-library/user-event";
|
|
21
|
+
import { UserEvent } from "@testing-library/user-event/dist/types/setup/setup";
|
|
22
|
+
import React from "react";
|
|
23
|
+
import { MemoryRouter } from "react-router-dom";
|
|
24
|
+
import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* Create Scheduled Maintenance Event's Resources Affected step, drawn for
|
|
28
|
+
* real - the page's own fields in the real ModelForm and BasicForm, the real
|
|
29
|
+
* pickers and the status page suggestions under the status page picker -
|
|
30
|
+
* with only the network, the clock, the permissions and the address stubbed.
|
|
31
|
+
*
|
|
32
|
+
* The maintainer, on the incident form (#4354), and the same question here:
|
|
33
|
+
*
|
|
34
|
+
* "we also need to have monitors and other affected resources as seperate
|
|
35
|
+
* things (so change monitor sttate to makes more sense), only show that
|
|
36
|
+
* dropdown if any monitor is selected."
|
|
37
|
+
*
|
|
38
|
+
* So the step asks for the event's monitors in a picker of their own, then
|
|
39
|
+
* "Change Monitor Status to" right under them - only once a monitor is
|
|
40
|
+
* picked, never folded - then the other affected resources, then the status
|
|
41
|
+
* pages and the one line about subscribers. And what is created is what the
|
|
42
|
+
* one picker created for the same picks: each pick in the column it always
|
|
43
|
+
* went to, and no monitor status without a monitor for it to change.
|
|
44
|
+
*
|
|
45
|
+
* Every event here walks to the review with Next and is created from there,
|
|
46
|
+
* as a person does.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
configure({ asyncUtilTimeout: 15000 });
|
|
50
|
+
|
|
51
|
+
jest.mock("../../../UI/Utils/Permission", () => {
|
|
52
|
+
const actualPermission: Record<string, unknown> = jest.requireActual(
|
|
53
|
+
"../../../Types/Permission",
|
|
54
|
+
) as Record<string, unknown>;
|
|
55
|
+
const PermissionEnum: Record<string, string> = actualPermission[
|
|
56
|
+
"default"
|
|
57
|
+
] as Record<string, string>;
|
|
58
|
+
const granted: Array<string> = [
|
|
59
|
+
PermissionEnum["ProjectOwner"]!,
|
|
60
|
+
PermissionEnum["User"]!,
|
|
61
|
+
PermissionEnum["Public"]!,
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
__esModule: true,
|
|
66
|
+
default: {
|
|
67
|
+
getAllPermissions: (): Array<string> => {
|
|
68
|
+
return granted;
|
|
69
|
+
},
|
|
70
|
+
getProjectPermissions: (): null => {
|
|
71
|
+
return null;
|
|
72
|
+
},
|
|
73
|
+
getGlobalPermissions: (): { globalPermissions: Array<string> } => {
|
|
74
|
+
return { globalPermissions: granted };
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// A project owner, not a master admin: the form shows what a person sees.
|
|
81
|
+
jest.mock("../../../UI/Utils/User", () => {
|
|
82
|
+
return {
|
|
83
|
+
__esModule: true,
|
|
84
|
+
default: {
|
|
85
|
+
isMasterAdmin: (): boolean => {
|
|
86
|
+
return false;
|
|
87
|
+
},
|
|
88
|
+
getUserId: (): null => {
|
|
89
|
+
return null;
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const getListMock: MockFunction = getJestMockFunction();
|
|
96
|
+
const getItemMock: MockFunction = getJestMockFunction();
|
|
97
|
+
const createOrUpdateMock: MockFunction = getJestMockFunction();
|
|
98
|
+
|
|
99
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
100
|
+
return {
|
|
101
|
+
__esModule: true,
|
|
102
|
+
default: {
|
|
103
|
+
getList: (...args: Array<unknown>): unknown => {
|
|
104
|
+
return getListMock(...args);
|
|
105
|
+
},
|
|
106
|
+
getItem: (...args: Array<unknown>): unknown => {
|
|
107
|
+
return getItemMock(...args);
|
|
108
|
+
},
|
|
109
|
+
count: async (): Promise<number> => {
|
|
110
|
+
return 0;
|
|
111
|
+
},
|
|
112
|
+
getCommonHeaders: (): Record<string, string> => {
|
|
113
|
+
return { tenantid: "project-1" };
|
|
114
|
+
},
|
|
115
|
+
createOrUpdate: (...args: Array<unknown>): unknown => {
|
|
116
|
+
return createOrUpdateMock(...args);
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
import ScheduledMaintenanceCreate from "../../../../App/FeatureSet/Dashboard/src/Pages/ScheduledMaintenanceEvents/Create";
|
|
123
|
+
import PageComponentProps from "../../../../App/FeatureSet/Dashboard/src/Pages/PageComponentProps";
|
|
124
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
125
|
+
import Host from "../../../Models/DatabaseModels/Host";
|
|
126
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
127
|
+
import MonitorStatus from "../../../Models/DatabaseModels/MonitorStatus";
|
|
128
|
+
import NetworkSite from "../../../Models/DatabaseModels/NetworkSite";
|
|
129
|
+
import ScheduledMaintenance from "../../../Models/DatabaseModels/ScheduledMaintenance";
|
|
130
|
+
import ScheduledMaintenanceTemplate from "../../../Models/DatabaseModels/ScheduledMaintenanceTemplate";
|
|
131
|
+
import StatusPage from "../../../Models/DatabaseModels/StatusPage";
|
|
132
|
+
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
133
|
+
import Route from "../../../Types/API/Route";
|
|
134
|
+
import Includes from "../../../Types/BaseDatabase/Includes";
|
|
135
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
136
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
137
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
138
|
+
import StatusPageEventType from "../../../Types/StatusPage/StatusPageEventType";
|
|
139
|
+
import StatusPagesListingMonitors from "../../../Types/StatusPage/StatusPagesListingMonitors";
|
|
140
|
+
import Timezone from "../../../Types/Timezone";
|
|
141
|
+
import API from "../../../UI/Utils/API/API";
|
|
142
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
143
|
+
import PermissionGate from "../../../UI/Utils/PermissionGate";
|
|
144
|
+
|
|
145
|
+
const NOW: Date = new Date("2026-10-04T09:20:00.000Z");
|
|
146
|
+
|
|
147
|
+
const MONITOR_ID: string = "33333333-3333-4333-8333-000000000001";
|
|
148
|
+
const OTHER_MONITOR_ID: string = "33333333-3333-4333-8333-000000000002";
|
|
149
|
+
const HOST_ID: string = "44444444-4444-4444-8444-000000000001";
|
|
150
|
+
const OTHER_HOST_ID: string = "44444444-4444-4444-8444-000000000002";
|
|
151
|
+
const SITE_ID: string = "45444444-4444-4444-8444-000000000001";
|
|
152
|
+
const UNDER_MAINTENANCE_ID: string = "55555555-5555-4555-8555-000000000001";
|
|
153
|
+
const DEGRADED_ID: string = "55555555-5555-4555-8555-000000000002";
|
|
154
|
+
const STATUS_PAGE_ID: string = "66666666-6666-4666-8666-000000000001";
|
|
155
|
+
const TEMPLATE_ID: string = "77777777-7777-4777-8777-000000000001";
|
|
156
|
+
const CREATED_ID: string = "99999999-9999-4999-8999-000000000001";
|
|
157
|
+
|
|
158
|
+
const EVENT_STATUS_DESCRIPTION: string =
|
|
159
|
+
"When the event starts, its monitors change to this status, and back to operational when it ends.";
|
|
160
|
+
|
|
161
|
+
const PAGE_PROPS: PageComponentProps = {
|
|
162
|
+
pageRoute: new Route(
|
|
163
|
+
"/dashboard/project/scheduled-maintenance-events/create",
|
|
164
|
+
),
|
|
165
|
+
currentProject: null,
|
|
166
|
+
hasPaymentMethod: true,
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
interface ModelRequest {
|
|
170
|
+
modelType: { new (): BaseModel };
|
|
171
|
+
id?: ObjectID;
|
|
172
|
+
select?: Record<string, unknown>;
|
|
173
|
+
query?: Record<string, unknown>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// The address the page is opened with.
|
|
177
|
+
let queryInUrl: Record<string, string> = {};
|
|
178
|
+
|
|
179
|
+
// What the server answers when the page looks a record up, by its ID.
|
|
180
|
+
let recordsOnServer: Record<string, BaseModel> = {};
|
|
181
|
+
|
|
182
|
+
let postMock: MockFunction;
|
|
183
|
+
|
|
184
|
+
function named<T extends BaseModel>(
|
|
185
|
+
modelType: { new (): T },
|
|
186
|
+
id: string,
|
|
187
|
+
name: string,
|
|
188
|
+
extra?: Record<string, unknown>,
|
|
189
|
+
): T {
|
|
190
|
+
const model: T = new modelType();
|
|
191
|
+
model._id = id;
|
|
192
|
+
(model as unknown as Record<string, unknown>)["name"] = name;
|
|
193
|
+
|
|
194
|
+
for (const [key, value] of Object.entries(extra || {})) {
|
|
195
|
+
(model as unknown as Record<string, unknown>)[key] = value;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return model;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function listOf(data: Array<BaseModel>): unknown {
|
|
202
|
+
return { data: data, count: data.length, skip: 0, limit: data.length };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// What the project has, by model: what a picker or dropdown lists.
|
|
206
|
+
function projectRecords(modelType: unknown): Array<BaseModel> {
|
|
207
|
+
if (modelType === Monitor) {
|
|
208
|
+
return [
|
|
209
|
+
named(Monitor, MONITOR_ID, "Checkout API"),
|
|
210
|
+
named(Monitor, OTHER_MONITOR_ID, "Payments API"),
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (modelType === Host) {
|
|
215
|
+
return [
|
|
216
|
+
named(Host, HOST_ID, "db-primary"),
|
|
217
|
+
named(Host, OTHER_HOST_ID, "db-replica"),
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (modelType === NetworkSite) {
|
|
222
|
+
return [named(NetworkSite, SITE_ID, "Frankfurt DC")];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (modelType === MonitorStatus) {
|
|
226
|
+
return [
|
|
227
|
+
named(MonitorStatus, DEGRADED_ID, "Degraded", { priority: 2 }),
|
|
228
|
+
named(MonitorStatus, UNDER_MAINTENANCE_ID, "Under Maintenance", {
|
|
229
|
+
priority: 3,
|
|
230
|
+
}),
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (modelType === StatusPage) {
|
|
235
|
+
return [named(StatusPage, STATUS_PAGE_ID, "Acme Public Status")];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// A list request, answered from the project's records - by ID when it asks so.
|
|
242
|
+
async function answerList(request: ModelRequest): Promise<unknown> {
|
|
243
|
+
const records: Array<BaseModel> = projectRecords(request.modelType);
|
|
244
|
+
const idQuery: unknown = request.query?.["_id"];
|
|
245
|
+
|
|
246
|
+
if (idQuery instanceof Includes) {
|
|
247
|
+
const ids: Array<string> = idQuery.values.map((value: unknown): string => {
|
|
248
|
+
return String(value);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
return listOf(
|
|
252
|
+
records.filter((record: BaseModel): boolean => {
|
|
253
|
+
return ids.includes(String(record._id));
|
|
254
|
+
}),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return listOf(records);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async function answerItem(request: ModelRequest): Promise<unknown> {
|
|
262
|
+
return recordsOnServer[request.id?.toString() || ""] || null;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// The models the page's pickers and dropdowns asked the API to list.
|
|
266
|
+
function listedModels(): Array<unknown> {
|
|
267
|
+
return getListMock.mock.calls.map((call: Array<unknown>): unknown => {
|
|
268
|
+
return (call[0] as ModelRequest).modelType;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function form(): HTMLElement {
|
|
273
|
+
return document.getElementById("create-scheduledMaintenance-form")!;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async function renderPage(): Promise<UserEvent> {
|
|
277
|
+
await act(async (): Promise<void> => {
|
|
278
|
+
render(
|
|
279
|
+
<MemoryRouter>
|
|
280
|
+
<ScheduledMaintenanceCreate {...PAGE_PROPS} />
|
|
281
|
+
</MemoryRouter>,
|
|
282
|
+
);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
// The form, once whatever the page looked up is in.
|
|
286
|
+
await screen.findByRole("navigation", { name: "Progress" });
|
|
287
|
+
|
|
288
|
+
// The window's defaults land in an effect after the fields are drawn.
|
|
289
|
+
await waitFor(() => {
|
|
290
|
+
const startsAt: HTMLInputElement | null = form().querySelector(
|
|
291
|
+
"input[type='datetime-local']",
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
expect(startsAt?.value || "").not.toBe("");
|
|
295
|
+
});
|
|
296
|
+
await act(async () => {
|
|
297
|
+
await new Promise<void>((resolve: () => void) => {
|
|
298
|
+
setTimeout(resolve, 0);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
return userEvent.setup({ delay: null });
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function currentStepTitle(): string {
|
|
306
|
+
const current: Element | null = screen
|
|
307
|
+
.getByRole("navigation", { name: "Progress" })
|
|
308
|
+
.querySelector("[aria-current='step']");
|
|
309
|
+
|
|
310
|
+
return (current?.textContent || "").trim();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async function goToNextStep(expectedTitle: string): Promise<void> {
|
|
314
|
+
fireEvent.click(screen.getByRole("button", { name: "Next", exact: true }));
|
|
315
|
+
|
|
316
|
+
await waitFor(() => {
|
|
317
|
+
expect(currentStepTitle()).toBe(expectedTitle);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// A title: all an event cannot be scheduled without.
|
|
322
|
+
async function openResourcesAffected(): Promise<void> {
|
|
323
|
+
const title: HTMLInputElement = within(form()).getByRole("textbox", {
|
|
324
|
+
name: "Title",
|
|
325
|
+
}) as HTMLInputElement;
|
|
326
|
+
|
|
327
|
+
if (!title.value) {
|
|
328
|
+
fireEvent.change(title, { target: { value: "Database upgrade" } });
|
|
329
|
+
await act(async () => {});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
await goToNextStep("Resources Affected");
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// From the step on screen to the review, with Next.
|
|
336
|
+
async function walkToTheReview(): Promise<void> {
|
|
337
|
+
for (let step: number = 0; step < 5; step++) {
|
|
338
|
+
if (currentStepTitle() === "Summary") {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const before: string = currentStepTitle();
|
|
343
|
+
|
|
344
|
+
fireEvent.click(screen.getByRole("button", { name: "Next", exact: true }));
|
|
345
|
+
|
|
346
|
+
await waitFor(() => {
|
|
347
|
+
expect(currentStepTitle()).not.toBe(before);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
expect(currentStepTitle()).toBe("Summary");
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// From the step on screen: walk to the review, and create there.
|
|
355
|
+
async function create(): Promise<ScheduledMaintenance> {
|
|
356
|
+
await walkToTheReview();
|
|
357
|
+
|
|
358
|
+
fireEvent.click(
|
|
359
|
+
screen.getByRole("button", { name: "Create Scheduled Maintenance Event" }),
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
await waitFor(() => {
|
|
363
|
+
expect(createOrUpdateMock).toHaveBeenCalledTimes(1);
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
return (
|
|
367
|
+
createOrUpdateMock.mock.calls[0]![0] as { model: ScheduledMaintenance }
|
|
368
|
+
).model;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function monitorsPicker(): HTMLElement {
|
|
372
|
+
return screen.getByRole("combobox", { name: /^Monitors/ });
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function otherResourcesPicker(): HTMLElement {
|
|
376
|
+
return screen.getByRole("combobox", { name: /^Other Affected Resources/ });
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// The field a control belongs to: the label naming it, and what is under it.
|
|
380
|
+
function fieldOf(control: HTMLElement): HTMLElement {
|
|
381
|
+
const labelId: string | null = control.getAttribute("aria-labelledby");
|
|
382
|
+
|
|
383
|
+
expect(labelId).toBeTruthy();
|
|
384
|
+
|
|
385
|
+
return document.getElementById(labelId!)!.parentElement as HTMLElement;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function monitorStatusLabel(): HTMLElement | null {
|
|
389
|
+
return screen.queryByText("Change Monitor Status to");
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// A dropdown opens on a click; its options are listed under it.
|
|
393
|
+
async function pickOption(
|
|
394
|
+
user: UserEvent,
|
|
395
|
+
combobox: HTMLElement,
|
|
396
|
+
optionText: string,
|
|
397
|
+
): Promise<void> {
|
|
398
|
+
await user.click(combobox);
|
|
399
|
+
const options: Array<HTMLElement> = await screen.findAllByText(optionText, {
|
|
400
|
+
exact: true,
|
|
401
|
+
});
|
|
402
|
+
await user.click(options[options.length - 1]!);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// A picker opens on a click and lists what it offers; a click on one picks it.
|
|
406
|
+
async function pickResource(
|
|
407
|
+
user: UserEvent,
|
|
408
|
+
picker: HTMLElement,
|
|
409
|
+
name: string,
|
|
410
|
+
): Promise<void> {
|
|
411
|
+
await user.click(picker);
|
|
412
|
+
await user.click(await screen.findByRole("option", { name: name }));
|
|
413
|
+
// The pick is written back a microtask later; its chip says it landed.
|
|
414
|
+
await screen.findByRole("button", { name: `Remove ${name}` });
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
async function pickMonitorStatus(
|
|
418
|
+
user: UserEvent,
|
|
419
|
+
statusName: string,
|
|
420
|
+
): Promise<void> {
|
|
421
|
+
await pickOption(
|
|
422
|
+
user,
|
|
423
|
+
await screen.findByRole("combobox", {
|
|
424
|
+
name: /^Change Monitor Status to/,
|
|
425
|
+
}),
|
|
426
|
+
statusName,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function isBefore(first: Node, second: Node): boolean {
|
|
431
|
+
return Boolean(
|
|
432
|
+
first.compareDocumentPosition(second) & Node.DOCUMENT_POSITION_FOLLOWING,
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function idsOf(items: unknown): Array<string> {
|
|
437
|
+
if (!Array.isArray(items)) {
|
|
438
|
+
return [];
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return items.map((item: unknown): string => {
|
|
442
|
+
if (typeof item === "string") {
|
|
443
|
+
return item;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const record: { _id?: unknown; id?: unknown } = item as {
|
|
447
|
+
_id?: unknown;
|
|
448
|
+
id?: unknown;
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
return String(record._id || record.id || "");
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Every affected-resource relation an event has, by the IDs it holds.
|
|
456
|
+
function resourcesOf(
|
|
457
|
+
event: ScheduledMaintenance,
|
|
458
|
+
): Record<string, Array<string>> {
|
|
459
|
+
return {
|
|
460
|
+
monitors: idsOf(event.monitors),
|
|
461
|
+
hosts: idsOf(event.hosts),
|
|
462
|
+
kubernetesClusters: idsOf(event.kubernetesClusters),
|
|
463
|
+
dockerHosts: idsOf(event.dockerHosts),
|
|
464
|
+
podmanHosts: idsOf(event.podmanHosts),
|
|
465
|
+
proxmoxClusters: idsOf(event.proxmoxClusters),
|
|
466
|
+
vmwareVCenters: idsOf(event.vmwareVCenters),
|
|
467
|
+
cephClusters: idsOf(event.cephClusters),
|
|
468
|
+
dockerSwarmClusters: idsOf(event.dockerSwarmClusters),
|
|
469
|
+
iotFleets: idsOf(event.iotFleets),
|
|
470
|
+
databaseServers: idsOf(event.databaseServers),
|
|
471
|
+
networkSites: idsOf(event.networkSites),
|
|
472
|
+
services: idsOf(event.services),
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function noResources(): Record<string, Array<string>> {
|
|
477
|
+
return {
|
|
478
|
+
monitors: [],
|
|
479
|
+
hosts: [],
|
|
480
|
+
kubernetesClusters: [],
|
|
481
|
+
dockerHosts: [],
|
|
482
|
+
podmanHosts: [],
|
|
483
|
+
proxmoxClusters: [],
|
|
484
|
+
vmwareVCenters: [],
|
|
485
|
+
cephClusters: [],
|
|
486
|
+
dockerSwarmClusters: [],
|
|
487
|
+
iotFleets: [],
|
|
488
|
+
databaseServers: [],
|
|
489
|
+
networkSites: [],
|
|
490
|
+
services: [],
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
function monitorStatusOf(event: ScheduledMaintenance): string | undefined {
|
|
495
|
+
return (
|
|
496
|
+
event.changeMonitorStatusTo?._id?.toString() ||
|
|
497
|
+
event.changeMonitorStatusToId?.toString()
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// A template the page is opened from: ?scheduledMaintenanceTemplateId=.
|
|
502
|
+
function template(data: {
|
|
503
|
+
monitors?: Array<Monitor>;
|
|
504
|
+
hosts?: Array<Host>;
|
|
505
|
+
changeMonitorStatusToId?: string;
|
|
506
|
+
}): void {
|
|
507
|
+
const model: ScheduledMaintenanceTemplate =
|
|
508
|
+
new ScheduledMaintenanceTemplate();
|
|
509
|
+
model._id = TEMPLATE_ID;
|
|
510
|
+
model.title = "Weekly database patching";
|
|
511
|
+
|
|
512
|
+
if (data.monitors) {
|
|
513
|
+
model.monitors = data.monitors;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (data.hosts) {
|
|
517
|
+
model.hosts = data.hosts;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
if (data.changeMonitorStatusToId) {
|
|
521
|
+
model.changeMonitorStatusToId = new ObjectID(data.changeMonitorStatusToId);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
recordsOnServer[TEMPLATE_ID] = model;
|
|
525
|
+
queryInUrl = { scheduledMaintenanceTemplateId: TEMPLATE_ID };
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// The status page listing answer: the one page shows every monitor asked about.
|
|
529
|
+
function listingAnswer(): HTTPResponse<JSONObject> {
|
|
530
|
+
return new HTTPResponse<JSONObject>(
|
|
531
|
+
200,
|
|
532
|
+
StatusPagesListingMonitors.toJSON({
|
|
533
|
+
statusPages: [
|
|
534
|
+
{ statusPageId: STATUS_PAGE_ID, name: "Acme Public Status" },
|
|
535
|
+
],
|
|
536
|
+
}),
|
|
537
|
+
{},
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
beforeEach(() => {
|
|
542
|
+
queryInUrl = {};
|
|
543
|
+
recordsOnServer = {
|
|
544
|
+
[HOST_ID]: named(Host, HOST_ID, "db-primary"),
|
|
545
|
+
[SITE_ID]: named(NetworkSite, SITE_ID, "Frankfurt DC"),
|
|
546
|
+
};
|
|
547
|
+
PermissionGate.clearPermissionPropsCache();
|
|
548
|
+
|
|
549
|
+
getListMock.mockReset().mockImplementation(answerList as never);
|
|
550
|
+
getItemMock.mockReset().mockImplementation(answerItem as never);
|
|
551
|
+
createOrUpdateMock.mockReset().mockImplementation(((data: {
|
|
552
|
+
model: BaseModel;
|
|
553
|
+
}): Promise<unknown> => {
|
|
554
|
+
return Promise.resolve({
|
|
555
|
+
data: {
|
|
556
|
+
...BaseModel.toJSON(data.model, ScheduledMaintenance),
|
|
557
|
+
_id: CREATED_ID,
|
|
558
|
+
},
|
|
559
|
+
});
|
|
560
|
+
}) as never);
|
|
561
|
+
|
|
562
|
+
postMock = getJestMockFunction();
|
|
563
|
+
postMock.mockImplementation(async (): Promise<HTTPResponse<JSONObject>> => {
|
|
564
|
+
return listingAnswer();
|
|
565
|
+
});
|
|
566
|
+
jest.spyOn(API, "post").mockImplementation(postMock as never);
|
|
567
|
+
|
|
568
|
+
jest.spyOn(OneUptimeDate, "getCurrentDate").mockReturnValue(NOW);
|
|
569
|
+
OneUptimeDate.setUserTimezone(Timezone.UTC);
|
|
570
|
+
jest
|
|
571
|
+
.spyOn(Navigation, "getQueryStringByName")
|
|
572
|
+
.mockImplementation((name: string): string | null => {
|
|
573
|
+
return queryInUrl[name] || null;
|
|
574
|
+
});
|
|
575
|
+
jest.spyOn(Navigation, "navigate").mockImplementation(() => {});
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
afterEach(() => {
|
|
579
|
+
cleanup();
|
|
580
|
+
jest.restoreAllMocks();
|
|
581
|
+
OneUptimeDate.setUserTimezone(null);
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
describe("Resources Affected: the monitors apart, and the status they change to right under them", () => {
|
|
585
|
+
test("asks for the monitors, then the other resources, each in a picker named by its own label", async () => {
|
|
586
|
+
await renderPage();
|
|
587
|
+
await openResourcesAffected();
|
|
588
|
+
|
|
589
|
+
const monitors: HTMLElement = monitorsPicker();
|
|
590
|
+
const others: HTMLElement = otherResourcesPicker();
|
|
591
|
+
|
|
592
|
+
expect(monitors).toHaveAttribute("placeholder", "Search monitors...");
|
|
593
|
+
// The other picker names what it searches, monitors not among them.
|
|
594
|
+
expect(others.getAttribute("placeholder")).toMatch(/^Search host, /);
|
|
595
|
+
expect(others.getAttribute("placeholder")).toContain("network site");
|
|
596
|
+
expect(others.getAttribute("placeholder")).not.toContain("monitor");
|
|
597
|
+
expect(isBefore(fieldOf(monitors), fieldOf(others))).toBe(true);
|
|
598
|
+
expect(
|
|
599
|
+
within(fieldOf(monitors)).getByText(
|
|
600
|
+
"Search and attach the monitors affected by this scheduled maintenance.",
|
|
601
|
+
),
|
|
602
|
+
).toBeVisible();
|
|
603
|
+
expect(
|
|
604
|
+
within(fieldOf(others)).getByText(
|
|
605
|
+
"Search and attach hosts, clusters, container hosts, databases, IoT fleets, network sites, or services affected by this scheduled maintenance. Attaching a network site covers every site beneath it.",
|
|
606
|
+
),
|
|
607
|
+
).toBeVisible();
|
|
608
|
+
|
|
609
|
+
// No monitor picked: nothing for a status to change.
|
|
610
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
611
|
+
// Both pickers come before the status pages and who hears.
|
|
612
|
+
expect(
|
|
613
|
+
isBefore(
|
|
614
|
+
fieldOf(others),
|
|
615
|
+
screen.getByText("Show event on these status pages", { exact: false }),
|
|
616
|
+
),
|
|
617
|
+
).toBe(true);
|
|
618
|
+
// ...and no field is titled "Resources Affected" any more: that is the step.
|
|
619
|
+
expect(
|
|
620
|
+
within(fieldOf(monitors)).queryByText("Resources Affected"),
|
|
621
|
+
).toBeNull();
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
test("picking a monitor brings Change Monitor Status to, right under the monitors and never folded; removing the last one takes it away", async () => {
|
|
625
|
+
const user: UserEvent = await renderPage();
|
|
626
|
+
|
|
627
|
+
await openResourcesAffected();
|
|
628
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
629
|
+
|
|
630
|
+
const status: HTMLElement = await screen.findByRole("combobox", {
|
|
631
|
+
name: /^Change Monitor Status to/,
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
// Under the monitors it acts on, above everything else.
|
|
635
|
+
expect(isBefore(fieldOf(monitorsPicker()), fieldOf(status))).toBe(true);
|
|
636
|
+
expect(isBefore(fieldOf(status), fieldOf(otherResourcesPicker()))).toBe(
|
|
637
|
+
true,
|
|
638
|
+
);
|
|
639
|
+
// On screen as soon as it is there: there is no More fields on the step.
|
|
640
|
+
expect(status).toBeVisible();
|
|
641
|
+
expect(screen.queryByRole("button", { name: "More fields" })).toBeNull();
|
|
642
|
+
// It says what a maintenance event does with it.
|
|
643
|
+
expect(
|
|
644
|
+
within(fieldOf(status)).getByText(EVENT_STATUS_DESCRIPTION),
|
|
645
|
+
).toBeVisible();
|
|
646
|
+
// It starts from nothing: no status is picked for the user.
|
|
647
|
+
expect(status).toHaveValue("");
|
|
648
|
+
|
|
649
|
+
await user.click(
|
|
650
|
+
screen.getByRole("button", { name: "Remove Checkout API" }),
|
|
651
|
+
);
|
|
652
|
+
|
|
653
|
+
await waitFor(() => {
|
|
654
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
655
|
+
});
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
test("a host or a network site picked among the other resources brings no monitor status", async () => {
|
|
659
|
+
const user: UserEvent = await renderPage();
|
|
660
|
+
|
|
661
|
+
await openResourcesAffected();
|
|
662
|
+
await pickResource(user, otherResourcesPicker(), "db-primary");
|
|
663
|
+
await pickResource(user, otherResourcesPicker(), "Frankfurt DC");
|
|
664
|
+
|
|
665
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
666
|
+
// The chips are the other picker's, not the monitors'.
|
|
667
|
+
for (const name of ["db-primary", "Frankfurt DC"]) {
|
|
668
|
+
expect(
|
|
669
|
+
within(fieldOf(otherResourcesPicker())).getByRole("button", {
|
|
670
|
+
name: `Remove ${name}`,
|
|
671
|
+
}),
|
|
672
|
+
).toBeInTheDocument();
|
|
673
|
+
}
|
|
674
|
+
expect(
|
|
675
|
+
within(fieldOf(monitorsPicker())).queryByRole("button", {
|
|
676
|
+
name: /^Remove /,
|
|
677
|
+
}),
|
|
678
|
+
).toBeNull();
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
test("the Monitors picker lists monitors alone, and the other picker everything but monitors", async () => {
|
|
682
|
+
const user: UserEvent = await renderPage();
|
|
683
|
+
|
|
684
|
+
await openResourcesAffected();
|
|
685
|
+
|
|
686
|
+
getListMock.mockClear();
|
|
687
|
+
await user.click(monitorsPicker());
|
|
688
|
+
await screen.findByRole("option", { name: "Checkout API" });
|
|
689
|
+
|
|
690
|
+
expect(new Set(listedModels())).toEqual(new Set([Monitor]));
|
|
691
|
+
|
|
692
|
+
// Closed again, and the other picker opened.
|
|
693
|
+
await user.keyboard("{Escape}");
|
|
694
|
+
getListMock.mockClear();
|
|
695
|
+
await user.click(otherResourcesPicker());
|
|
696
|
+
await screen.findByRole("option", { name: "db-primary" });
|
|
697
|
+
|
|
698
|
+
expect(listedModels()).toEqual(expect.arrayContaining([Host, NetworkSite]));
|
|
699
|
+
expect(listedModels()).not.toContain(Monitor);
|
|
700
|
+
expect(screen.queryByRole("option", { name: "Checkout API" })).toBeNull();
|
|
701
|
+
});
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
describe("what is created", () => {
|
|
705
|
+
/*
|
|
706
|
+
* The values the one "Resources Affected" picker sent for the same picks:
|
|
707
|
+
* the monitor in `monitors`, the host in `hosts`, the site in
|
|
708
|
+
* `networkSites`, the status and the status page each in their own column
|
|
709
|
+
* - nothing moved.
|
|
710
|
+
*/
|
|
711
|
+
test("a monitor, a host, a network site, a status and a status page: each stored where it always was", async () => {
|
|
712
|
+
const user: UserEvent = await renderPage();
|
|
713
|
+
|
|
714
|
+
await openResourcesAffected();
|
|
715
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
716
|
+
await pickMonitorStatus(user, "Under Maintenance");
|
|
717
|
+
await pickResource(user, otherResourcesPicker(), "db-primary");
|
|
718
|
+
await pickResource(user, otherResourcesPicker(), "Frankfurt DC");
|
|
719
|
+
await pickOption(
|
|
720
|
+
user,
|
|
721
|
+
screen.getByRole("combobox", {
|
|
722
|
+
name: /^Show event on these status pages/,
|
|
723
|
+
}),
|
|
724
|
+
"Acme Public Status",
|
|
725
|
+
);
|
|
726
|
+
|
|
727
|
+
const event: ScheduledMaintenance = await create();
|
|
728
|
+
|
|
729
|
+
expect(event.title).toBe("Database upgrade");
|
|
730
|
+
expect(resourcesOf(event)).toEqual({
|
|
731
|
+
...noResources(),
|
|
732
|
+
monitors: [MONITOR_ID],
|
|
733
|
+
hosts: [HOST_ID],
|
|
734
|
+
networkSites: [SITE_ID],
|
|
735
|
+
});
|
|
736
|
+
expect(monitorStatusOf(event)).toBe(UNDER_MAINTENANCE_ID);
|
|
737
|
+
expect(idsOf(event.statusPages)).toEqual([STATUS_PAGE_ID]);
|
|
738
|
+
// Subscribers hear as the folded line said, untouched.
|
|
739
|
+
expect(event.shouldStatusPageSubscribersBeNotifiedOnEventCreated).toBe(
|
|
740
|
+
true,
|
|
741
|
+
);
|
|
742
|
+
expect(
|
|
743
|
+
event.shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing,
|
|
744
|
+
).toBe(true);
|
|
745
|
+
expect(
|
|
746
|
+
event.shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded,
|
|
747
|
+
).toBe(true);
|
|
748
|
+
// And then the event's page.
|
|
749
|
+
await waitFor(() => {
|
|
750
|
+
expect(Navigation.navigate).toHaveBeenCalled();
|
|
751
|
+
});
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
test("created with nothing picked on the step: no resources and no status", async () => {
|
|
755
|
+
await renderPage();
|
|
756
|
+
await openResourcesAffected();
|
|
757
|
+
|
|
758
|
+
const event: ScheduledMaintenance = await create();
|
|
759
|
+
|
|
760
|
+
expect(resourcesOf(event)).toEqual(noResources());
|
|
761
|
+
expect(monitorStatusOf(event)).toBeUndefined();
|
|
762
|
+
expect(idsOf(event.statusPages)).toEqual([]);
|
|
763
|
+
});
|
|
764
|
+
|
|
765
|
+
test("each picker writes back only its own: a template's hosts stay when a monitor is picked, and its monitors when a host is", async () => {
|
|
766
|
+
template({
|
|
767
|
+
monitors: [named(Monitor, MONITOR_ID, "Checkout API")],
|
|
768
|
+
hosts: [named(Host, HOST_ID, "db-primary")],
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
const user: UserEvent = await renderPage();
|
|
772
|
+
|
|
773
|
+
await screen.findByDisplayValue("Weekly database patching");
|
|
774
|
+
await goToNextStep("Resources Affected");
|
|
775
|
+
|
|
776
|
+
await pickResource(user, monitorsPicker(), "Payments API");
|
|
777
|
+
await pickResource(user, otherResourcesPicker(), "db-replica");
|
|
778
|
+
|
|
779
|
+
const event: ScheduledMaintenance = await create();
|
|
780
|
+
|
|
781
|
+
expect(resourcesOf(event)).toEqual({
|
|
782
|
+
...noResources(),
|
|
783
|
+
monitors: [MONITOR_ID, OTHER_MONITOR_ID],
|
|
784
|
+
hosts: [HOST_ID, OTHER_HOST_ID],
|
|
785
|
+
});
|
|
786
|
+
});
|
|
787
|
+
|
|
788
|
+
test("no monitor picked: no monitor status is sent, not even the one the template set", async () => {
|
|
789
|
+
template({
|
|
790
|
+
hosts: [named(Host, HOST_ID, "db-primary")],
|
|
791
|
+
changeMonitorStatusToId: UNDER_MAINTENANCE_ID,
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
await renderPage();
|
|
795
|
+
|
|
796
|
+
await screen.findByDisplayValue("Weekly database patching");
|
|
797
|
+
await goToNextStep("Resources Affected");
|
|
798
|
+
|
|
799
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
800
|
+
|
|
801
|
+
const event: ScheduledMaintenance = await create();
|
|
802
|
+
|
|
803
|
+
expect(idsOf(event.hosts)).toEqual([HOST_ID]);
|
|
804
|
+
expect(monitorStatusOf(event)).toBeUndefined();
|
|
805
|
+
expect("changeMonitorStatusTo" in event).toBe(false);
|
|
806
|
+
expect("changeMonitorStatusToId" in event).toBe(false);
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
test("a template's monitors bring its status along, already picked, and both are sent", async () => {
|
|
810
|
+
template({
|
|
811
|
+
monitors: [named(Monitor, MONITOR_ID, "Checkout API")],
|
|
812
|
+
changeMonitorStatusToId: UNDER_MAINTENANCE_ID,
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
await renderPage();
|
|
816
|
+
|
|
817
|
+
await screen.findByDisplayValue("Weekly database patching");
|
|
818
|
+
await goToNextStep("Resources Affected");
|
|
819
|
+
|
|
820
|
+
// A picked dropdown reads as a button with its value, named by its label.
|
|
821
|
+
const status: HTMLElement = await screen.findByRole("button", {
|
|
822
|
+
name: /^Change Monitor Status to/,
|
|
823
|
+
});
|
|
824
|
+
|
|
825
|
+
await waitFor(() => {
|
|
826
|
+
expect(within(status).getByText("Under Maintenance")).toBeVisible();
|
|
827
|
+
});
|
|
828
|
+
expect(isBefore(fieldOf(monitorsPicker()), status)).toBe(true);
|
|
829
|
+
|
|
830
|
+
const event: ScheduledMaintenance = await create();
|
|
831
|
+
|
|
832
|
+
expect(idsOf(event.monitors)).toEqual([MONITOR_ID]);
|
|
833
|
+
expect(monitorStatusOf(event)).toBe(UNDER_MAINTENANCE_ID);
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
test("a template's status shows, already picked, once a monitor is picked, and is sent with it", async () => {
|
|
837
|
+
template({ changeMonitorStatusToId: DEGRADED_ID });
|
|
838
|
+
|
|
839
|
+
const user: UserEvent = await renderPage();
|
|
840
|
+
|
|
841
|
+
await screen.findByDisplayValue("Weekly database patching");
|
|
842
|
+
await goToNextStep("Resources Affected");
|
|
843
|
+
|
|
844
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
845
|
+
|
|
846
|
+
await pickResource(user, monitorsPicker(), "Payments API");
|
|
847
|
+
|
|
848
|
+
const status: HTMLElement = await screen.findByRole("button", {
|
|
849
|
+
name: /^Change Monitor Status to/,
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
await waitFor(() => {
|
|
853
|
+
expect(within(status).getByText("Degraded")).toBeVisible();
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
const event: ScheduledMaintenance = await create();
|
|
857
|
+
|
|
858
|
+
expect(idsOf(event.monitors)).toEqual([OTHER_MONITOR_ID]);
|
|
859
|
+
expect(monitorStatusOf(event)).toBe(DEGRADED_ID);
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
test("a status picked, then the last monitor removed: hidden, and not sent", async () => {
|
|
863
|
+
const user: UserEvent = await renderPage();
|
|
864
|
+
|
|
865
|
+
await openResourcesAffected();
|
|
866
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
867
|
+
await pickMonitorStatus(user, "Degraded");
|
|
868
|
+
|
|
869
|
+
await user.click(
|
|
870
|
+
screen.getByRole("button", { name: "Remove Checkout API" }),
|
|
871
|
+
);
|
|
872
|
+
|
|
873
|
+
await waitFor(() => {
|
|
874
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
const event: ScheduledMaintenance = await create();
|
|
878
|
+
|
|
879
|
+
expect(idsOf(event.monitors)).toEqual([]);
|
|
880
|
+
expect(monitorStatusOf(event)).toBeUndefined();
|
|
881
|
+
});
|
|
882
|
+
|
|
883
|
+
test("picked again, a monitor brings the status back as it was, and it is sent", async () => {
|
|
884
|
+
const user: UserEvent = await renderPage();
|
|
885
|
+
|
|
886
|
+
await openResourcesAffected();
|
|
887
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
888
|
+
await pickMonitorStatus(user, "Degraded");
|
|
889
|
+
|
|
890
|
+
await user.click(
|
|
891
|
+
screen.getByRole("button", { name: "Remove Checkout API" }),
|
|
892
|
+
);
|
|
893
|
+
await waitFor(() => {
|
|
894
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
await pickResource(user, monitorsPicker(), "Payments API");
|
|
898
|
+
|
|
899
|
+
const status: HTMLElement = await screen.findByRole("button", {
|
|
900
|
+
name: /^Change Monitor Status to/,
|
|
901
|
+
});
|
|
902
|
+
|
|
903
|
+
await waitFor(() => {
|
|
904
|
+
expect(within(status).getByText("Degraded")).toBeVisible();
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
const event: ScheduledMaintenance = await create();
|
|
908
|
+
|
|
909
|
+
expect(idsOf(event.monitors)).toEqual([OTHER_MONITOR_ID]);
|
|
910
|
+
expect(monitorStatusOf(event)).toBe(DEGRADED_ID);
|
|
911
|
+
});
|
|
912
|
+
});
|
|
913
|
+
|
|
914
|
+
describe("opened from a record's own Scheduled Maintenance tab", () => {
|
|
915
|
+
test("from a host's tab: the host is among the other resources, and no status is asked", async () => {
|
|
916
|
+
queryInUrl = { hostId: HOST_ID };
|
|
917
|
+
|
|
918
|
+
await renderPage();
|
|
919
|
+
await openResourcesAffected();
|
|
920
|
+
|
|
921
|
+
expect(
|
|
922
|
+
within(fieldOf(otherResourcesPicker())).getByRole("button", {
|
|
923
|
+
name: "Remove db-primary",
|
|
924
|
+
}),
|
|
925
|
+
).toBeInTheDocument();
|
|
926
|
+
expect(
|
|
927
|
+
within(fieldOf(monitorsPicker())).queryByRole("button", {
|
|
928
|
+
name: /^Remove /,
|
|
929
|
+
}),
|
|
930
|
+
).toBeNull();
|
|
931
|
+
expect(monitorStatusLabel()).toBeNull();
|
|
932
|
+
|
|
933
|
+
const event: ScheduledMaintenance = await create();
|
|
934
|
+
|
|
935
|
+
expect(resourcesOf(event)).toEqual({
|
|
936
|
+
...noResources(),
|
|
937
|
+
hosts: [HOST_ID],
|
|
938
|
+
});
|
|
939
|
+
});
|
|
940
|
+
|
|
941
|
+
test("from a network site's tab: the site is among the other resources", async () => {
|
|
942
|
+
queryInUrl = { networkSiteId: SITE_ID };
|
|
943
|
+
|
|
944
|
+
await renderPage();
|
|
945
|
+
await openResourcesAffected();
|
|
946
|
+
|
|
947
|
+
expect(
|
|
948
|
+
within(fieldOf(otherResourcesPicker())).getByRole("button", {
|
|
949
|
+
name: "Remove Frankfurt DC",
|
|
950
|
+
}),
|
|
951
|
+
).toBeInTheDocument();
|
|
952
|
+
|
|
953
|
+
const event: ScheduledMaintenance = await create();
|
|
954
|
+
|
|
955
|
+
expect(resourcesOf(event)).toEqual({
|
|
956
|
+
...noResources(),
|
|
957
|
+
networkSites: [SITE_ID],
|
|
958
|
+
});
|
|
959
|
+
});
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
describe("the status pages that show the monitors are still suggested", () => {
|
|
963
|
+
test("a monitor picked in the Monitors picker: its pages are suggested, one click adds one, and the event is created on it", async () => {
|
|
964
|
+
const user: UserEvent = await renderPage();
|
|
965
|
+
|
|
966
|
+
await openResourcesAffected();
|
|
967
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
968
|
+
|
|
969
|
+
const suggestions: HTMLElement = await screen.findByRole("group", {
|
|
970
|
+
name: "Status pages that show the affected monitor:",
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
// Asked about the picked monitor, for a maintenance event.
|
|
974
|
+
const request: Record<string, unknown> = postMock.mock.calls[
|
|
975
|
+
postMock.mock.calls.length - 1
|
|
976
|
+
]![0] as Record<string, unknown>;
|
|
977
|
+
|
|
978
|
+
expect(request["data"]).toEqual({
|
|
979
|
+
monitorIds: [MONITOR_ID],
|
|
980
|
+
eventType: StatusPageEventType.ScheduledEvent,
|
|
981
|
+
});
|
|
982
|
+
|
|
983
|
+
fireEvent.click(
|
|
984
|
+
within(suggestions).getByRole("button", {
|
|
985
|
+
name: "Add Acme Public Status",
|
|
986
|
+
}),
|
|
987
|
+
);
|
|
988
|
+
|
|
989
|
+
expect(
|
|
990
|
+
await screen.findByRole("button", { name: "Remove Acme Public Status" }),
|
|
991
|
+
).toBeInTheDocument();
|
|
992
|
+
|
|
993
|
+
const event: ScheduledMaintenance = await create();
|
|
994
|
+
|
|
995
|
+
expect(idsOf(event.monitors)).toEqual([MONITOR_ID]);
|
|
996
|
+
expect(idsOf(event.statusPages)).toEqual([STATUS_PAGE_ID]);
|
|
997
|
+
});
|
|
998
|
+
|
|
999
|
+
test("only other resources picked: nothing is asked, and nothing is suggested", async () => {
|
|
1000
|
+
const user: UserEvent = await renderPage();
|
|
1001
|
+
|
|
1002
|
+
await openResourcesAffected();
|
|
1003
|
+
await pickResource(user, otherResourcesPicker(), "db-primary");
|
|
1004
|
+
|
|
1005
|
+
// Longer than the suggestions wait for picking to settle.
|
|
1006
|
+
await act(async () => {
|
|
1007
|
+
await new Promise<void>((resolve: () => void) => {
|
|
1008
|
+
setTimeout(resolve, 600);
|
|
1009
|
+
});
|
|
1010
|
+
});
|
|
1011
|
+
|
|
1012
|
+
expect(postMock).not.toHaveBeenCalled();
|
|
1013
|
+
expect(screen.queryByTestId("status-page-suggestions-line")).toBeNull();
|
|
1014
|
+
});
|
|
1015
|
+
});
|
|
1016
|
+
|
|
1017
|
+
describe("the review step", () => {
|
|
1018
|
+
// The review's section for the step: its heading and the rows under it.
|
|
1019
|
+
async function reviewOfResourcesAffected(): Promise<HTMLElement> {
|
|
1020
|
+
await walkToTheReview();
|
|
1021
|
+
|
|
1022
|
+
return (await screen.findByRole("heading", { name: "Resources Affected" }))
|
|
1023
|
+
.parentElement as HTMLElement;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
test("names the monitors and the other resources apart, and asks no status without a monitor", async () => {
|
|
1027
|
+
const user: UserEvent = await renderPage();
|
|
1028
|
+
|
|
1029
|
+
await openResourcesAffected();
|
|
1030
|
+
await pickResource(user, otherResourcesPicker(), "db-primary");
|
|
1031
|
+
|
|
1032
|
+
const review: HTMLElement = await reviewOfResourcesAffected();
|
|
1033
|
+
|
|
1034
|
+
expect(
|
|
1035
|
+
within(review).getByText(
|
|
1036
|
+
"No monitors affected by this scheduled maintenance event.",
|
|
1037
|
+
),
|
|
1038
|
+
).toBeInTheDocument();
|
|
1039
|
+
expect(await within(review).findByText("db-primary")).toBeInTheDocument();
|
|
1040
|
+
// No monitor: no status to confirm.
|
|
1041
|
+
expect(within(review).queryByText("Change Monitor Status to")).toBeNull();
|
|
1042
|
+
// Who hears is still said in the section's line.
|
|
1043
|
+
expect(
|
|
1044
|
+
within(review).getByTestId("form-summary-section-summary"),
|
|
1045
|
+
).toBeInTheDocument();
|
|
1046
|
+
});
|
|
1047
|
+
|
|
1048
|
+
test("with a monitor, confirms the status it changes to - none picked included", async () => {
|
|
1049
|
+
const user: UserEvent = await renderPage();
|
|
1050
|
+
|
|
1051
|
+
await openResourcesAffected();
|
|
1052
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
1053
|
+
|
|
1054
|
+
const review: HTMLElement = await reviewOfResourcesAffected();
|
|
1055
|
+
|
|
1056
|
+
expect(await within(review).findByText("Checkout API")).toBeInTheDocument();
|
|
1057
|
+
expect(
|
|
1058
|
+
within(review).getByText("Change Monitor Status to"),
|
|
1059
|
+
).toBeInTheDocument();
|
|
1060
|
+
expect(
|
|
1061
|
+
within(review).getByText(
|
|
1062
|
+
"Status of the monitors will not be changed when this scheduled maintenance event starts.",
|
|
1063
|
+
),
|
|
1064
|
+
).toBeInTheDocument();
|
|
1065
|
+
expect(
|
|
1066
|
+
within(review).getByText(
|
|
1067
|
+
"No other resources affected by this scheduled maintenance event.",
|
|
1068
|
+
),
|
|
1069
|
+
).toBeInTheDocument();
|
|
1070
|
+
});
|
|
1071
|
+
|
|
1072
|
+
test("with a monitor and a status, names the status", async () => {
|
|
1073
|
+
const user: UserEvent = await renderPage();
|
|
1074
|
+
|
|
1075
|
+
await openResourcesAffected();
|
|
1076
|
+
await pickResource(user, monitorsPicker(), "Checkout API");
|
|
1077
|
+
await pickMonitorStatus(user, "Under Maintenance");
|
|
1078
|
+
|
|
1079
|
+
const review: HTMLElement = await reviewOfResourcesAffected();
|
|
1080
|
+
|
|
1081
|
+
expect(
|
|
1082
|
+
await within(review).findByText("Under Maintenance"),
|
|
1083
|
+
).toBeInTheDocument();
|
|
1084
|
+
});
|
|
1085
|
+
});
|