@oneuptime/common 13.0.0 → 13.0.1
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/Alert.ts +55 -0
- package/Models/DatabaseModels/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +91 -29
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +143 -0
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +29 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +5 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +580 -0
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +11 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +4 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +64 -26
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +113 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +2 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +136 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { act, cleanup, render, screen } from "@testing-library/react";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import DiscoveryScanProgress, {
|
|
5
|
+
formatDiscoveryDuration,
|
|
6
|
+
} from "../../../../App/FeatureSet/Dashboard/src/Components/NetworkDevice/DiscoveryScanProgress";
|
|
7
|
+
import NetworkDeviceDiscoveryScan from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
|
|
8
|
+
|
|
9
|
+
type ScanOverrides = {
|
|
10
|
+
[Key in keyof NetworkDeviceDiscoveryScan]?:
|
|
11
|
+
| NetworkDeviceDiscoveryScan[Key]
|
|
12
|
+
| undefined;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function scan(overrides: ScanOverrides = {}): NetworkDeviceDiscoveryScan {
|
|
16
|
+
return Object.assign(
|
|
17
|
+
new NetworkDeviceDiscoveryScan(),
|
|
18
|
+
{
|
|
19
|
+
name: "Core switches",
|
|
20
|
+
cidr: "10.240-249.0-255.220-225",
|
|
21
|
+
status: "In Progress",
|
|
22
|
+
startedAt: new Date("2026-09-09T12:00:00Z"),
|
|
23
|
+
scannedHostCount: 1024,
|
|
24
|
+
respondedHostCount: 0,
|
|
25
|
+
},
|
|
26
|
+
overrides,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
jest.useFakeTimers({ doNotFake: ["performance"] });
|
|
32
|
+
jest.setSystemTime(new Date("2026-09-09T12:02:10Z"));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
cleanup();
|
|
37
|
+
jest.useRealTimers();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("Discovery scan progress", () => {
|
|
41
|
+
test("shows completed addresses even when no host has responded", () => {
|
|
42
|
+
render(<DiscoveryScanProgress scan={scan()} />);
|
|
43
|
+
const bar: HTMLElement = screen.getByRole("progressbar", {
|
|
44
|
+
name: /Core switches .*address sweep progress/,
|
|
45
|
+
});
|
|
46
|
+
expect(bar).toHaveAttribute("aria-valuenow", "6");
|
|
47
|
+
expect(bar).toHaveAttribute("aria-valuemin", "0");
|
|
48
|
+
expect(bar).toHaveAttribute("aria-valuemax", "100");
|
|
49
|
+
expect(
|
|
50
|
+
screen.getByText("1,024 of 15,360 addresses swept"),
|
|
51
|
+
).toBeInTheDocument();
|
|
52
|
+
expect(screen.getByText("Running for 2m 10s")).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("elapsed time keeps moving between progress reports and stops when complete", () => {
|
|
56
|
+
const { rerender } = render(<DiscoveryScanProgress scan={scan()} />);
|
|
57
|
+
act(() => {
|
|
58
|
+
jest.advanceTimersByTime(5000);
|
|
59
|
+
});
|
|
60
|
+
expect(screen.getByText("Running for 2m 15s")).toBeInTheDocument();
|
|
61
|
+
rerender(
|
|
62
|
+
<DiscoveryScanProgress
|
|
63
|
+
scan={scan({
|
|
64
|
+
status: "Completed",
|
|
65
|
+
completedAt: new Date("2026-09-09T12:02:14Z"),
|
|
66
|
+
})}
|
|
67
|
+
/>,
|
|
68
|
+
);
|
|
69
|
+
act(() => {
|
|
70
|
+
jest.advanceTimersByTime(60000);
|
|
71
|
+
});
|
|
72
|
+
expect(screen.getByText("Finished in 2m 14s")).toBeInTheDocument();
|
|
73
|
+
expect(screen.queryByRole("progressbar")).not.toBeInTheDocument();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("a just-started or older probe gets an indeterminate bar, not invented progress", () => {
|
|
77
|
+
render(
|
|
78
|
+
<DiscoveryScanProgress
|
|
79
|
+
scan={scan({
|
|
80
|
+
scannedHostCount: undefined,
|
|
81
|
+
respondedHostCount: undefined,
|
|
82
|
+
})}
|
|
83
|
+
/>,
|
|
84
|
+
);
|
|
85
|
+
expect(screen.getByRole("progressbar")).not.toHaveAttribute(
|
|
86
|
+
"aria-valuenow",
|
|
87
|
+
);
|
|
88
|
+
expect(
|
|
89
|
+
screen.getByText("Waiting for the first progress update"),
|
|
90
|
+
).toBeInTheDocument();
|
|
91
|
+
expect(screen.queryByText("0%")).not.toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test("a newly claimed recurrence waits for this run's progress instead of showing old 100% coverage", () => {
|
|
95
|
+
const { rerender } = render(
|
|
96
|
+
<DiscoveryScanProgress
|
|
97
|
+
scan={scan({
|
|
98
|
+
scannedHostCount: 15360,
|
|
99
|
+
statusMessage: "Scan started. Waiting for the first progress update.",
|
|
100
|
+
})}
|
|
101
|
+
/>,
|
|
102
|
+
);
|
|
103
|
+
expect(screen.getByRole("progressbar")).not.toHaveAttribute(
|
|
104
|
+
"aria-valuenow",
|
|
105
|
+
);
|
|
106
|
+
expect(screen.queryByText("Final checks")).not.toBeInTheDocument();
|
|
107
|
+
rerender(
|
|
108
|
+
<DiscoveryScanProgress
|
|
109
|
+
scan={scan({
|
|
110
|
+
scannedHostCount: 256,
|
|
111
|
+
statusMessage: "Scan in progress: checking ping reachability.",
|
|
112
|
+
})}
|
|
113
|
+
/>,
|
|
114
|
+
);
|
|
115
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
116
|
+
"aria-valuenow",
|
|
117
|
+
"1",
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("zero reported addresses is real zero progress", () => {
|
|
122
|
+
render(<DiscoveryScanProgress scan={scan({ scannedHostCount: 0 })} />);
|
|
123
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
124
|
+
"aria-valuenow",
|
|
125
|
+
"0",
|
|
126
|
+
);
|
|
127
|
+
expect(screen.getByText("0 of 15,360 addresses swept")).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test.each([15360, 20000])(
|
|
131
|
+
"reaching %s addresses keeps final checks visibly running",
|
|
132
|
+
(count: number) => {
|
|
133
|
+
render(
|
|
134
|
+
<DiscoveryScanProgress scan={scan({ scannedHostCount: count })} />,
|
|
135
|
+
);
|
|
136
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
137
|
+
"aria-valuenow",
|
|
138
|
+
"100",
|
|
139
|
+
);
|
|
140
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
141
|
+
"aria-valuetext",
|
|
142
|
+
expect.stringContaining("Final checks are still running"),
|
|
143
|
+
);
|
|
144
|
+
expect(screen.getByText("Final checks")).toBeInTheDocument();
|
|
145
|
+
expect(screen.queryByText("Completed")).not.toBeInTheDocument();
|
|
146
|
+
},
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
test.each([
|
|
150
|
+
undefined,
|
|
151
|
+
null,
|
|
152
|
+
-1,
|
|
153
|
+
Number.NaN,
|
|
154
|
+
Number.POSITIVE_INFINITY,
|
|
155
|
+
"1024",
|
|
156
|
+
])(
|
|
157
|
+
"invalid or missing count %s never becomes a percentage",
|
|
158
|
+
(count: unknown) => {
|
|
159
|
+
render(
|
|
160
|
+
<DiscoveryScanProgress
|
|
161
|
+
scan={scan({
|
|
162
|
+
scannedHostCount: count,
|
|
163
|
+
} as Partial<NetworkDeviceDiscoveryScan>)}
|
|
164
|
+
/>,
|
|
165
|
+
);
|
|
166
|
+
expect(screen.getByRole("progressbar")).not.toHaveAttribute(
|
|
167
|
+
"aria-valuenow",
|
|
168
|
+
);
|
|
169
|
+
expect(
|
|
170
|
+
screen.queryByText(/NaN|Infinity|undefined|null/),
|
|
171
|
+
).not.toBeInTheDocument();
|
|
172
|
+
},
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
test("an unknown target still reports a known address count without a denominator", () => {
|
|
176
|
+
render(<DiscoveryScanProgress scan={scan({ cidr: "not-a-target" })} />);
|
|
177
|
+
expect(screen.getByRole("progressbar")).not.toHaveAttribute(
|
|
178
|
+
"aria-valuenow",
|
|
179
|
+
);
|
|
180
|
+
expect(screen.getByText("1,024 addresses swept")).toBeInTheDocument();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("CIDR totals use the same usable-address rules as the scanner", () => {
|
|
184
|
+
render(
|
|
185
|
+
<DiscoveryScanProgress
|
|
186
|
+
scan={scan({ cidr: "10.0.0.0/24", scannedHostCount: 127 })}
|
|
187
|
+
/>,
|
|
188
|
+
);
|
|
189
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
190
|
+
"aria-valuenow",
|
|
191
|
+
"50",
|
|
192
|
+
);
|
|
193
|
+
expect(screen.getByText("127 of 254 addresses swept")).toBeInTheDocument();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test("a queued recurrence never shows the preceding run's counts or duration", () => {
|
|
197
|
+
render(
|
|
198
|
+
<DiscoveryScanProgress
|
|
199
|
+
scan={scan({
|
|
200
|
+
status: "Pending",
|
|
201
|
+
completedAt: new Date("2026-09-09T12:01:00Z"),
|
|
202
|
+
scannedHostCount: 15360,
|
|
203
|
+
})}
|
|
204
|
+
/>,
|
|
205
|
+
);
|
|
206
|
+
expect(screen.getByText("Queued")).toBeInTheDocument();
|
|
207
|
+
expect(screen.getByText("15,360 addresses queued")).toBeInTheDocument();
|
|
208
|
+
expect(screen.queryByRole("progressbar")).not.toBeInTheDocument();
|
|
209
|
+
expect(
|
|
210
|
+
screen.queryByText(/Running for|Finished in|addresses swept/),
|
|
211
|
+
).not.toBeInTheDocument();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test("failure preserves partial coverage and a stopped duration without implying completion", () => {
|
|
215
|
+
render(
|
|
216
|
+
<DiscoveryScanProgress
|
|
217
|
+
scan={scan({
|
|
218
|
+
status: "Failed",
|
|
219
|
+
completedAt: new Date("2026-09-09T12:01:45Z"),
|
|
220
|
+
})}
|
|
221
|
+
/>,
|
|
222
|
+
);
|
|
223
|
+
expect(screen.getByText("Failed")).toBeInTheDocument();
|
|
224
|
+
expect(
|
|
225
|
+
screen.getByText("1,024 of 15,360 addresses swept"),
|
|
226
|
+
).toBeInTheDocument();
|
|
227
|
+
expect(screen.getByText("Stopped after 1m 45s")).toBeInTheDocument();
|
|
228
|
+
expect(screen.queryByRole("progressbar")).not.toBeInTheDocument();
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test.each([undefined, new Date("invalid"), new Date("2026-09-09T13:00:00Z")])(
|
|
232
|
+
"missing, invalid and future start dates never invent an elapsed duration",
|
|
233
|
+
(startedAt: Date | undefined) => {
|
|
234
|
+
render(<DiscoveryScanProgress scan={scan({ startedAt })} />);
|
|
235
|
+
expect(screen.queryByText(/Running for/)).not.toBeInTheDocument();
|
|
236
|
+
},
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
test("an old completed row needs no timestamps or progress fields to render", () => {
|
|
240
|
+
render(
|
|
241
|
+
<DiscoveryScanProgress
|
|
242
|
+
scan={scan({
|
|
243
|
+
status: "Completed",
|
|
244
|
+
startedAt: undefined,
|
|
245
|
+
scannedHostCount: undefined,
|
|
246
|
+
})}
|
|
247
|
+
/>,
|
|
248
|
+
);
|
|
249
|
+
expect(screen.getByText("Completed")).toBeInTheDocument();
|
|
250
|
+
expect(
|
|
251
|
+
screen.queryByText(/Waiting for|Finished in/),
|
|
252
|
+
).not.toBeInTheDocument();
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test.each([
|
|
256
|
+
[0, "0s"],
|
|
257
|
+
[59000, "59s"],
|
|
258
|
+
[61000, "1m 1s"],
|
|
259
|
+
[7200000, "2h 0m"],
|
|
260
|
+
[90061000, "25h 1m"],
|
|
261
|
+
])(
|
|
262
|
+
"formats %s milliseconds as %s",
|
|
263
|
+
(milliseconds: number | string, expected: number | string) => {
|
|
264
|
+
expect(formatDiscoveryDuration(Number(milliseconds))).toBe(expected);
|
|
265
|
+
},
|
|
266
|
+
);
|
|
267
|
+
});
|
|
@@ -1354,18 +1354,24 @@ describe("Name identifies the scan in the list", () => {
|
|
|
1354
1354
|
* column did. It reads exactly as it did before — the target, on the first
|
|
1355
1355
|
* line, with nothing above it.
|
|
1356
1356
|
*/
|
|
1357
|
-
test("an unnamed scan
|
|
1357
|
+
test("an unnamed scan still leads with its target before metadata", async () => {
|
|
1358
1358
|
await renderPage();
|
|
1359
1359
|
|
|
1360
|
-
expect(
|
|
1361
|
-
"10.114.167.11-38"
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1360
|
+
expect(
|
|
1361
|
+
renderScanCell({ cidr: "10.114.167.11-38" }).startsWith(
|
|
1362
|
+
"10.114.167.11-38",
|
|
1363
|
+
),
|
|
1364
|
+
).toBe(true);
|
|
1365
|
+
expect(
|
|
1366
|
+
renderScanCell({ name: "", cidr: "10.114.167.11-38" }).startsWith(
|
|
1367
|
+
"10.114.167.11-38",
|
|
1368
|
+
),
|
|
1369
|
+
).toBe(true);
|
|
1370
|
+
expect(
|
|
1371
|
+
renderScanCell({ name: " ", cidr: "10.114.167.11-38" }).startsWith(
|
|
1372
|
+
"10.114.167.11-38",
|
|
1373
|
+
),
|
|
1374
|
+
).toBe(true);
|
|
1369
1375
|
});
|
|
1370
1376
|
|
|
1371
1377
|
test("a blank name never renders as an empty line above the target", async () => {
|
|
@@ -1376,7 +1382,7 @@ describe("Name identifies the scan in the list", () => {
|
|
|
1376
1382
|
cidr: "192.168.1.0/24",
|
|
1377
1383
|
});
|
|
1378
1384
|
|
|
1379
|
-
expect(cell.trim()
|
|
1385
|
+
expect(cell.trim().startsWith("192.168.1.0/24")).toBe(true);
|
|
1380
1386
|
});
|
|
1381
1387
|
|
|
1382
1388
|
test("a stored name is tidied up on the way out, not rendered raw", async () => {
|
|
@@ -1655,22 +1661,19 @@ describe("Scan Target is reachable as a column, not only as a filter", () => {
|
|
|
1655
1661
|
* through) rather than by reading the flag, so it fails if the rule that
|
|
1656
1662
|
* honours the flag changes too.
|
|
1657
1663
|
*/
|
|
1658
|
-
test("
|
|
1664
|
+
test("the target stays optional in the compact default layout", async () => {
|
|
1659
1665
|
await renderPage();
|
|
1660
1666
|
|
|
1661
1667
|
expect(columnByTitle("Scan Target").isHiddenByDefault).toBe(true);
|
|
1662
1668
|
|
|
1663
1669
|
expect(visibleColumnTitles(null)).toEqual([
|
|
1664
1670
|
"Scan",
|
|
1665
|
-
"Probe",
|
|
1666
1671
|
"Status",
|
|
1667
1672
|
"Responded Hosts",
|
|
1668
|
-
"Recurrence",
|
|
1669
|
-
"Started",
|
|
1670
1673
|
]);
|
|
1671
1674
|
});
|
|
1672
1675
|
|
|
1673
|
-
test("a viewer who switches it on gets it, between Scan and
|
|
1676
|
+
test("a viewer who switches it on gets it, between Scan and Status", async () => {
|
|
1674
1677
|
await renderPage();
|
|
1675
1678
|
|
|
1676
1679
|
const preference: ColumnPreference = {
|
|
@@ -1681,11 +1684,8 @@ describe("Scan Target is reachable as a column, not only as a filter", () => {
|
|
|
1681
1684
|
expect(visibleColumnTitles(preference)).toEqual([
|
|
1682
1685
|
"Scan",
|
|
1683
1686
|
"Scan Target",
|
|
1684
|
-
"Probe",
|
|
1685
1687
|
"Status",
|
|
1686
1688
|
"Responded Hosts",
|
|
1687
|
-
"Recurrence",
|
|
1688
|
-
"Started",
|
|
1689
1689
|
]);
|
|
1690
1690
|
});
|
|
1691
1691
|
|
|
@@ -2665,41 +2665,11 @@ describe("Scan Target says how big the sweep is while it is being typed", () =>
|
|
|
2665
2665
|
});
|
|
2666
2666
|
|
|
2667
2667
|
/*
|
|
2668
|
-
*
|
|
2669
|
-
*
|
|
2670
|
-
*
|
|
2671
|
-
*
|
|
2672
|
-
*
|
|
2673
|
-
* (RETIRE_RUN_PAYLOAD in
|
|
2674
|
-
* Common/Server/Services/NetworkDeviceDiscoveryScanService.ts) writes a
|
|
2675
|
-
* 156-character sentence into statusMessage explaining why the results
|
|
2676
|
-
* vanished. The Responded Hosts cell renders that sentence. Every desktop body
|
|
2677
|
-
* <td> in Common/UI/Components/Table/TableRow.tsx declares `whitespace-nowrap`,
|
|
2678
|
-
* and `white-space` is an INHERITED property — so the nowrap reached the div
|
|
2679
|
-
* this page rendered inside the cell no matter what classes that div carried.
|
|
2680
|
-
* The div carried `max-w-md`, which capped the BOX while the LINE inside it
|
|
2681
|
-
* stayed unbreakable, so the sentence ran straight out of the cell and painted
|
|
2682
|
-
* over the Recurrence and Started cells beside it. A max-width paired with a
|
|
2683
|
-
* nowrap does not contain long text; it is precisely what turns "the table
|
|
2684
|
-
* gets wider" into "the text lands on top of its neighbours".
|
|
2685
|
-
*
|
|
2686
|
-
* THE FIX, and therefore what is asserted here: the wrapping is asked for at
|
|
2687
|
-
* COLUMN level (`wrapContent`, with an optional `wrapMaxWidthClassName`), the
|
|
2688
|
-
* renderer emits `whitespace-normal break-words` on the <td> and the width cap
|
|
2689
|
-
* on its content div, and the inner `max-w-md` this page used to spell by hand
|
|
2690
|
-
* is DELETED rather than left in place beside the new option.
|
|
2691
|
-
*
|
|
2692
|
-
* HOW IT IS ASSERTED. jsdom performs no layout whatsoever — no
|
|
2693
|
-
* getBoundingClientRect, no computed `white-space`, no column widths, no
|
|
2694
|
-
* overflow — so the overlap itself is not observable in any test that could
|
|
2695
|
-
* live in this repo. Every assertion below is therefore a configuration,
|
|
2696
|
-
* class, attribute, DOM-shape or text assertion: the flags the page declares,
|
|
2697
|
-
* the classes the real TableRow helpers derive from those flags, and the
|
|
2698
|
-
* markup the cell renders for the exact row the issue was filed about. The
|
|
2699
|
-
* negative ones matter as much as the positive ones — a `max-w-*` left behind
|
|
2700
|
-
* inside the cell re-creates the original pairing exactly, and a wrap flag
|
|
2701
|
-
* that spread to the timestamp and badge columns would be a page-wide restyle
|
|
2702
|
-
* wearing this fix's name.
|
|
2668
|
+
* Long probe messages must remain readable without overlapping adjacent
|
|
2669
|
+
* columns (#3585). Discovery now places them beneath the scan identity in a
|
|
2670
|
+
* disclosure (#3672), leaving room for live progress and row actions. These
|
|
2671
|
+
* assertions preserve the original containment guarantee through that change;
|
|
2672
|
+
* the browser suite measures the resulting widths and horizontal overflow.
|
|
2703
2673
|
*/
|
|
2704
2674
|
describe("long status messages wrap inside their own column (issue #3585)", () => {
|
|
2705
2675
|
/*
|
|
@@ -2760,197 +2730,75 @@ describe("long status messages wrap inside their own column (issue #3585)", () =
|
|
|
2760
2730
|
capturedTableProps = null;
|
|
2761
2731
|
});
|
|
2762
2732
|
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
expect(columnByTitle("Responded Hosts").wrapContent).toBe(true);
|
|
2774
|
-
});
|
|
2775
|
-
|
|
2776
|
-
/*
|
|
2777
|
-
* And the flag has to REACH the markup. Asserted through the two helpers
|
|
2778
|
-
* TableRow and TableSkeletonRows render with, rather than by restating the
|
|
2779
|
-
* class strings this test would like them to produce: the claim is "this
|
|
2780
|
-
* column's cell wraps", and the code that decides that is what is asked.
|
|
2781
|
-
*/
|
|
2782
|
-
test("that flag makes the rendered cell a wrapping one, not a nowrap one", async () => {
|
|
2783
|
-
await renderPage();
|
|
2784
|
-
|
|
2785
|
-
const className: string = cellClassNameFor("Responded Hosts");
|
|
2786
|
-
|
|
2787
|
-
expect(className).toContain("whitespace-normal");
|
|
2788
|
-
expect(className).toContain("break-words");
|
|
2789
|
-
/*
|
|
2790
|
-
* The inherited declaration that caused #3585. Its absence here is the
|
|
2791
|
-
* whole point: it is unset on the cell, so it is unset on every element
|
|
2792
|
-
* getElement returns beneath it.
|
|
2793
|
-
*/
|
|
2794
|
-
expect(className).not.toContain("whitespace-nowrap");
|
|
2795
|
-
});
|
|
2733
|
+
test.each(["Scan", "Status", "Responded Hosts", "Probe", "Recurrence"])(
|
|
2734
|
+
"%s contains multiline content without inheriting nowrap",
|
|
2735
|
+
async (title: string) => {
|
|
2736
|
+
await renderPage();
|
|
2737
|
+
expect(columnByTitle(title).wrapContent).toBe(true);
|
|
2738
|
+
expect(cellClassNameFor(title)).toContain("whitespace-normal");
|
|
2739
|
+
expect(cellClassNameFor(title)).toContain("break-words");
|
|
2740
|
+
expect(cellClassNameFor(title)).not.toContain("whitespace-nowrap");
|
|
2741
|
+
},
|
|
2742
|
+
);
|
|
2796
2743
|
|
|
2797
|
-
|
|
2798
|
-
* The width cap is not spelled on this column, so it takes the shared
|
|
2799
|
-
* default — one place to change if 28rem turns out to be wrong for prose,
|
|
2800
|
-
* rather than a number copied into every column that holds a sentence. The
|
|
2801
|
-
* contentClassName check is the other half: the cap now arrives through the
|
|
2802
|
-
* wrap option, and a hand-written `max-w-*` sitting beside it would be
|
|
2803
|
-
* resolved by stylesheet order rather than by intent.
|
|
2804
|
-
*/
|
|
2805
|
-
test("it takes the shared default width cap rather than naming one", async () => {
|
|
2744
|
+
test("the scan explanation has a wider cap than the compact result count", async () => {
|
|
2806
2745
|
await renderPage();
|
|
2807
|
-
|
|
2808
|
-
const column: CapturedColumn = columnByTitle("Responded Hosts");
|
|
2809
|
-
|
|
2810
|
-
expect(column.wrapMaxWidthClassName).toBeUndefined();
|
|
2811
|
-
expect(column.contentClassName).toBeUndefined();
|
|
2812
|
-
|
|
2813
2746
|
expect(
|
|
2814
2747
|
getTableCellContentClassName<NetworkDeviceDiscoveryScan>(
|
|
2815
|
-
tableColumnFor("
|
|
2748
|
+
tableColumnFor("Scan"),
|
|
2816
2749
|
),
|
|
2817
|
-
).toBe("max-w-
|
|
2818
|
-
});
|
|
2819
|
-
|
|
2820
|
-
/*
|
|
2821
|
-
* Recurrence wraps too, and narrower. The same RETIRE_RUN_PAYLOAD write that
|
|
2822
|
-
* sets the status message also sets status Pending and nextScanAt NULL, so
|
|
2823
|
-
* the row that reports #3585 renders a sentence in this cell as well — and
|
|
2824
|
-
* this column's headline is "Every 60 min", so it has no business being as
|
|
2825
|
-
* wide as the results cell.
|
|
2826
|
-
*/
|
|
2827
|
-
test("the Recurrence column wraps, capped narrower than Responded Hosts", async () => {
|
|
2828
|
-
await renderPage();
|
|
2829
|
-
|
|
2830
|
-
const column: CapturedColumn = columnByTitle("Recurrence");
|
|
2831
|
-
|
|
2832
|
-
expect(column.wrapContent).toBe(true);
|
|
2833
|
-
expect(column.wrapMaxWidthClassName).toBe("max-w-xs");
|
|
2834
|
-
|
|
2750
|
+
).toBe("max-w-sm");
|
|
2835
2751
|
expect(
|
|
2836
2752
|
getTableCellContentClassName<NetworkDeviceDiscoveryScan>(
|
|
2837
|
-
tableColumnFor("
|
|
2753
|
+
tableColumnFor("Responded Hosts"),
|
|
2838
2754
|
),
|
|
2839
2755
|
).toBe("max-w-xs");
|
|
2840
|
-
expect(cellClassNameFor("Recurrence")).toContain("whitespace-normal");
|
|
2841
2756
|
});
|
|
2842
2757
|
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
* it must not be "fixed" by being allowed to wrap: a timestamp folded onto
|
|
2846
|
-
* two lines is a regression of its own, and `whitespace-nowrap` on date
|
|
2847
|
-
* cells is what keeps "Mar 12 2026, 16:05" whole.
|
|
2848
|
-
*/
|
|
2849
|
-
test("the Started timestamp is left on its single line", async () => {
|
|
2850
|
-
await renderPage();
|
|
2851
|
-
|
|
2852
|
-
expect(columnByTitle("Started").wrapContent).toBeFalsy();
|
|
2853
|
-
expect(cellClassNameFor("Started")).toContain("whitespace-nowrap");
|
|
2854
|
-
});
|
|
2855
|
-
|
|
2856
|
-
/*
|
|
2857
|
-
* The scope check. Two columns hold prose; the rest hold a name, an entity,
|
|
2858
|
-
* a badge and an address, and every one of them still gets the default
|
|
2859
|
-
* single-line cell. This is what separates a targeted fix from "the whole
|
|
2860
|
-
* table now wraps", which is a much larger visual change than #3585 asked
|
|
2861
|
-
* for and which no screenshot in the issue would justify.
|
|
2862
|
-
*/
|
|
2863
|
-
test.each(["Scan", "Probe", "Status", "Scan Target"])(
|
|
2864
|
-
"the %s column is untouched and still renders on one line",
|
|
2758
|
+
test.each(["Started", "Scan Target"])(
|
|
2759
|
+
"the optional %s value stays on one line",
|
|
2865
2760
|
async (title: string) => {
|
|
2866
2761
|
await renderPage();
|
|
2867
|
-
|
|
2868
2762
|
expect(columnByTitle(title).wrapContent).toBeFalsy();
|
|
2869
|
-
expect(columnByTitle(title).wrapMaxWidthClassName).toBeUndefined();
|
|
2870
2763
|
expect(cellClassNameFor(title)).toContain("whitespace-nowrap");
|
|
2871
2764
|
},
|
|
2872
2765
|
);
|
|
2873
2766
|
|
|
2874
|
-
|
|
2875
|
-
* The page's one pre-existing contentClassName, left exactly as it was. It
|
|
2876
|
-
* is a type/colour class with no width in it, which is the only kind of
|
|
2877
|
-
* contentClassName that was ever safe on a nowrap cell — and the migration
|
|
2878
|
-
* of the wrap idiom must not have gone rewriting the ones that were fine.
|
|
2879
|
-
*/
|
|
2880
|
-
test("the one pre-existing contentClassName on this page is unchanged", async () => {
|
|
2767
|
+
test("the optional target retains the table's ordinary text styling", async () => {
|
|
2881
2768
|
await renderPage();
|
|
2882
|
-
|
|
2883
2769
|
expect(columnByTitle("Scan Target").contentClassName).toBe(
|
|
2884
2770
|
"text-sm text-gray-900",
|
|
2885
2771
|
);
|
|
2886
2772
|
});
|
|
2887
2773
|
|
|
2888
|
-
|
|
2889
|
-
* The rule that makes the class of bug in #3585 unspellable on this page: a
|
|
2890
|
-
* width cap may only arrive through `wrapMaxWidthClassName`, which the
|
|
2891
|
-
* renderer emits ONLY together with `whitespace-normal`. A `max-w-*` written
|
|
2892
|
-
* into a contentClassName is the pairing that overlaps, whichever column it
|
|
2893
|
-
* is written on, so no column here may hold one.
|
|
2894
|
-
*/
|
|
2895
|
-
test("no column caps its width through contentClassName", async () => {
|
|
2774
|
+
test("column width caps go through the wrapping renderer", async () => {
|
|
2896
2775
|
await renderPage();
|
|
2897
|
-
|
|
2898
2776
|
const columns: Array<CapturedColumn> = capturedTableProps?.columns || [];
|
|
2899
|
-
|
|
2900
2777
|
expect(columns.length).toBeGreaterThan(0);
|
|
2901
|
-
|
|
2902
2778
|
for (const column of columns) {
|
|
2903
2779
|
expect(column.contentClassName || "").not.toContain("max-w-");
|
|
2904
2780
|
}
|
|
2905
2781
|
});
|
|
2906
2782
|
|
|
2907
|
-
|
|
2908
|
-
* THE ROW FROM THE ISSUE. An operator edits a scan, the server retires the
|
|
2909
|
-
* run, and this is the cell they are looking at. The sentence has to be
|
|
2910
|
-
* there in full — the fix wraps it, it does not truncate it, and nothing
|
|
2911
|
-
* about #3585 justifies hiding what happened to the results — and the hover
|
|
2912
|
-
* tooltip that predates the fix has to survive it, because the same cell
|
|
2913
|
-
* still carries probe explanations far longer than this one.
|
|
2914
|
-
*/
|
|
2915
|
-
test("the retired-run sentence renders in full, and still on a tooltip", async () => {
|
|
2916
|
-
await renderPage();
|
|
2917
|
-
|
|
2918
|
-
const container: HTMLElement = renderRespondedHostsCell(RETIRED_SCAN);
|
|
2919
|
-
|
|
2920
|
-
expect(container.textContent).toContain(RETIRE_MESSAGE);
|
|
2921
|
-
expect(container.querySelector(`[title="${RETIRE_MESSAGE}"]`)).toBeTruthy();
|
|
2922
|
-
});
|
|
2923
|
-
|
|
2924
|
-
/*
|
|
2925
|
-
* The negative half, and the one that would catch a "fix" that only added
|
|
2926
|
-
* the option without cleaning up after it. The inner `max-w-md` had to be
|
|
2927
|
-
* DELETED, not supplemented: leaving it re-creates the exact capped-box
|
|
2928
|
-
* pairing that caused the overlap, and it would now sit inside a cell that
|
|
2929
|
-
* ALSO has a cap — two `max-w-*` on nested elements, resolved by stylesheet
|
|
2930
|
-
* order rather than by intent.
|
|
2931
|
-
*
|
|
2932
|
-
* (No layout is being measured here — jsdom has none. This asserts that the
|
|
2933
|
-
* markup which made the overlap possible is gone.)
|
|
2934
|
-
*/
|
|
2935
|
-
test("nothing inside the cell caps its own width any more", async () => {
|
|
2783
|
+
test("the entire retired-run explanation remains available in expandable scan details", async () => {
|
|
2936
2784
|
await renderPage();
|
|
2937
|
-
|
|
2938
|
-
const
|
|
2939
|
-
|
|
2940
|
-
expect(
|
|
2785
|
+
const container: HTMLElement = renderCellContainer("name", RETIRED_SCAN);
|
|
2786
|
+
const details: HTMLDetailsElement | null =
|
|
2787
|
+
container.querySelector("details");
|
|
2788
|
+
expect(details).not.toBeNull();
|
|
2789
|
+
expect(details?.querySelector("summary")?.textContent).toContain(
|
|
2790
|
+
RETIRE_MESSAGE,
|
|
2791
|
+
);
|
|
2792
|
+
expect(details?.querySelector("summary")?.textContent).toContain(
|
|
2793
|
+
"Show details",
|
|
2794
|
+
);
|
|
2795
|
+
expect(details?.querySelector("p")?.textContent).toBe(RETIRE_MESSAGE);
|
|
2941
2796
|
});
|
|
2942
2797
|
|
|
2943
|
-
|
|
2944
|
-
* The reporting branch, which is the cell as it renders on a normal day. The
|
|
2945
|
-
* three things it says all predate #3585 and all have issues of their own
|
|
2946
|
-
* behind them — the headline count, the ping-only tally (#3445) and the
|
|
2947
|
-
* probe's explanation (#3287) — so this is the regression test for "the
|
|
2948
|
-
* layout change quietly dropped a line".
|
|
2949
|
-
*/
|
|
2950
|
-
test("a reported scan still says everything it said before", async () => {
|
|
2798
|
+
test("counts and ping-only hosts stay visible with their explanation in the scan column", async () => {
|
|
2951
2799
|
await renderPage();
|
|
2952
|
-
|
|
2953
|
-
|
|
2800
|
+
const reportedScan: Partial<NetworkDeviceDiscoveryScan> = {
|
|
2801
|
+
status: "Completed",
|
|
2954
2802
|
respondedHostCount: 0,
|
|
2955
2803
|
scannedHostCount: 254,
|
|
2956
2804
|
discoveredDevices: [
|
|
@@ -2958,31 +2806,21 @@ describe("long status messages wrap inside their own column (issue #3585)", () =
|
|
|
2958
2806
|
{ ipAddress: "10.0.0.9", snmpReachable: false },
|
|
2959
2807
|
],
|
|
2960
2808
|
statusMessage: RETIRE_MESSAGE,
|
|
2961
|
-
} as unknown as Partial<NetworkDeviceDiscoveryScan
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
expect(
|
|
2965
|
-
|
|
2966
|
-
expect(
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
expect(container.querySelector(`[title="${RETIRE_MESSAGE}"]`)).toBeTruthy();
|
|
2970
|
-
|
|
2971
|
-
expect(container.querySelectorAll("[class*='max-w-']")).toHaveLength(0);
|
|
2809
|
+
} as unknown as Partial<NetworkDeviceDiscoveryScan>;
|
|
2810
|
+
const results: HTMLElement = renderRespondedHostsCell(reportedScan);
|
|
2811
|
+
expect(results.textContent).toContain("0 of 254 hosts");
|
|
2812
|
+
expect(results.textContent).toContain("+ 2 alive without SNMP");
|
|
2813
|
+
expect(results.textContent).not.toContain(RETIRE_MESSAGE);
|
|
2814
|
+
expect(renderCellContainer("name", reportedScan).textContent).toContain(
|
|
2815
|
+
RETIRE_MESSAGE,
|
|
2816
|
+
);
|
|
2972
2817
|
});
|
|
2973
2818
|
|
|
2974
|
-
|
|
2975
|
-
* And the empty branch: a scan with nothing to report and nothing to explain
|
|
2976
|
-
* is still a bare em-dash, exactly like every other empty cell on this
|
|
2977
|
-
* table.
|
|
2978
|
-
*/
|
|
2979
|
-
test("a scan with nothing to say still renders a bare em-dash", async () => {
|
|
2819
|
+
test("an unreported row explains that no results have arrived", async () => {
|
|
2980
2820
|
await renderPage();
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
expect(container.textContent).toBe("—");
|
|
2985
|
-
expect(container.querySelectorAll("[class*='max-w-']")).toHaveLength(0);
|
|
2821
|
+
expect(renderRespondedHostsCell({}).textContent).toBe(
|
|
2822
|
+
"No discovery results were reported.",
|
|
2823
|
+
);
|
|
2986
2824
|
});
|
|
2987
2825
|
|
|
2988
2826
|
/*
|