@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,381 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Contract under test — writing an auto-import rule hands the project's
|
|
3
|
+
* recent discovery results back to the auto-import sweep (OneUptime issue
|
|
4
|
+
* #3487).
|
|
5
|
+
*
|
|
6
|
+
* The sweep only ever looks at results nothing has evaluated yet, so a rule
|
|
7
|
+
* written after a scan finished reaches nothing until that scan reports
|
|
8
|
+
* again — never, for the one-shot scans a project starts with. The operator
|
|
9
|
+
* then has a rule that visibly does nothing and a "Run Now" button they have
|
|
10
|
+
* to remember to press, which is the complaint the issue was filed as.
|
|
11
|
+
*
|
|
12
|
+
* What these tests pin is WHICH writes are worth a sweep, because both
|
|
13
|
+
* mistakes are quiet: too few and the rule goes on doing nothing, too many
|
|
14
|
+
* and every rename of a rule re-reads every recent scan in the project.
|
|
15
|
+
*
|
|
16
|
+
* - a new enabled import rule re-arms; a disabled one and an exclusion one
|
|
17
|
+
* do not, because neither can newly claim a host;
|
|
18
|
+
* - an edit re-arms only when it changed what the rule CLAIMS (criteria,
|
|
19
|
+
* ping-only hosts, the enable toggle, the monitor template) — never for
|
|
20
|
+
* a rename;
|
|
21
|
+
* - the decision is made from the rule as the DATABASE holds it after the
|
|
22
|
+
* write, not from the payload, whose booleans arrive from a form as
|
|
23
|
+
* strings;
|
|
24
|
+
* - one re-arm per project however many rules a single update touched;
|
|
25
|
+
* - and a re-arm that fails is logged, never raised: it must not fail an
|
|
26
|
+
* otherwise valid rule save.
|
|
27
|
+
*
|
|
28
|
+
* The engine is stubbed at the MODULE level: the re-arm itself has its own
|
|
29
|
+
* suite (AutoImportRuleRearmRecentScans.test.ts), and the real module would
|
|
30
|
+
* pull the whole device/monitor write path — and Postgres with it — into a
|
|
31
|
+
* suite about hooks.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
jest.mock(
|
|
35
|
+
"../../../Server/Services/NetworkDeviceAutoImportRuleEngineService",
|
|
36
|
+
() => {
|
|
37
|
+
return {
|
|
38
|
+
__esModule: true,
|
|
39
|
+
default: {
|
|
40
|
+
rearmRecentScansForRuleChange: jest.fn(),
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
jest.mock("../../../Server/Utils/Logger", () => {
|
|
47
|
+
return {
|
|
48
|
+
__esModule: true,
|
|
49
|
+
default: {
|
|
50
|
+
debug: jest.fn(),
|
|
51
|
+
info: jest.fn(),
|
|
52
|
+
warn: jest.fn(),
|
|
53
|
+
error: jest.fn(),
|
|
54
|
+
trace: jest.fn(),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
import NetworkDeviceAutoImportRuleService from "../../../Server/Services/NetworkDeviceAutoImportRuleService";
|
|
60
|
+
import NetworkDeviceAutoImportRuleEngineService from "../../../Server/Services/NetworkDeviceAutoImportRuleEngineService";
|
|
61
|
+
import MonitorTemplateService from "../../../Server/Services/MonitorTemplateService";
|
|
62
|
+
import NetworkAlertPolicyService from "../../../Server/Services/NetworkAlertPolicyService";
|
|
63
|
+
import logger from "../../../Server/Utils/Logger";
|
|
64
|
+
import NetworkDeviceAutoImportRule from "../../../Models/DatabaseModels/NetworkDeviceAutoImportRule";
|
|
65
|
+
import MonitorTemplate from "../../../Models/DatabaseModels/MonitorTemplate";
|
|
66
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
67
|
+
import UpdateBy from "../../../Server/Types/Database/UpdateBy";
|
|
68
|
+
import { OnCreate, OnUpdate } from "../../../Server/Types/Database/Hooks";
|
|
69
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
70
|
+
import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
|
|
71
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
72
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
73
|
+
import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";
|
|
74
|
+
|
|
75
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
76
|
+
"22222222-2222-4222-8222-222222222222",
|
|
77
|
+
);
|
|
78
|
+
const OTHER_PROJECT_ID: ObjectID = new ObjectID(
|
|
79
|
+
"44444444-4444-4444-8444-444444444444",
|
|
80
|
+
);
|
|
81
|
+
const RULE_ID: ObjectID = new ObjectID("77777777-7777-4777-8777-777777777777");
|
|
82
|
+
const OTHER_RULE_ID: ObjectID = new ObjectID(
|
|
83
|
+
"66666666-6666-4666-8666-666666666666",
|
|
84
|
+
);
|
|
85
|
+
const TEMPLATE_ID: ObjectID = new ObjectID(
|
|
86
|
+
"11111111-1111-4111-8111-111111111111",
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const rearmMock: jest.Mock =
|
|
90
|
+
NetworkDeviceAutoImportRuleEngineService.rearmRecentScansForRuleChange as unknown as jest.Mock;
|
|
91
|
+
const loggerErrorMock: jest.Mock = logger.error as unknown as jest.Mock;
|
|
92
|
+
|
|
93
|
+
function makeRule(
|
|
94
|
+
overrides: Partial<NetworkDeviceAutoImportRule> = {},
|
|
95
|
+
): NetworkDeviceAutoImportRule {
|
|
96
|
+
const rule: NetworkDeviceAutoImportRule = new NetworkDeviceAutoImportRule();
|
|
97
|
+
rule.id = RULE_ID;
|
|
98
|
+
rule.projectId = PROJECT_ID;
|
|
99
|
+
rule.ipMatchTarget = "10.0.0.0/24";
|
|
100
|
+
rule.isEnabled = true;
|
|
101
|
+
Object.assign(rule, overrides);
|
|
102
|
+
|
|
103
|
+
return rule;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function createSucceeds(
|
|
107
|
+
createdItem: NetworkDeviceAutoImportRule,
|
|
108
|
+
tenantId?: ObjectID,
|
|
109
|
+
): Promise<void> {
|
|
110
|
+
const onCreate: OnCreate<NetworkDeviceAutoImportRule> = {
|
|
111
|
+
createBy: {
|
|
112
|
+
data: createdItem,
|
|
113
|
+
props: tenantId ? { tenantId: tenantId } : { isRoot: true },
|
|
114
|
+
} as CreateBy<NetworkDeviceAutoImportRule>,
|
|
115
|
+
carryForward: null,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
await (NetworkDeviceAutoImportRuleService as any).onCreateSuccess(
|
|
119
|
+
onCreate,
|
|
120
|
+
createdItem,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/*
|
|
125
|
+
* One update, start to finish: onBeforeUpdate decides whether the save
|
|
126
|
+
* changed what the rule claims and carries that forward, and onUpdateSuccess
|
|
127
|
+
* acts on it. Running BOTH is the point — a plan that is computed and never
|
|
128
|
+
* carried, or carried and never read, is exactly the kind of break that
|
|
129
|
+
* leaves the feature silently doing nothing.
|
|
130
|
+
*/
|
|
131
|
+
async function updateSucceeds(data: {
|
|
132
|
+
payload: Record<string, unknown>;
|
|
133
|
+
rulesAfterUpdate: Array<NetworkDeviceAutoImportRule>;
|
|
134
|
+
updatedItemIds?: Array<ObjectID>;
|
|
135
|
+
}): Promise<void> {
|
|
136
|
+
jest
|
|
137
|
+
.spyOn(NetworkDeviceAutoImportRuleService, "findBy")
|
|
138
|
+
.mockResolvedValue(data.rulesAfterUpdate);
|
|
139
|
+
|
|
140
|
+
const updateBy: UpdateBy<NetworkDeviceAutoImportRule> = {
|
|
141
|
+
query: { _id: RULE_ID.toString() },
|
|
142
|
+
data: data.payload,
|
|
143
|
+
props: { isRoot: true },
|
|
144
|
+
} as unknown as UpdateBy<NetworkDeviceAutoImportRule>;
|
|
145
|
+
|
|
146
|
+
const onUpdate: OnUpdate<NetworkDeviceAutoImportRule> = await (
|
|
147
|
+
NetworkDeviceAutoImportRuleService as any
|
|
148
|
+
).onBeforeUpdate(updateBy);
|
|
149
|
+
|
|
150
|
+
await (NetworkDeviceAutoImportRuleService as any).onUpdateSuccess(
|
|
151
|
+
onUpdate,
|
|
152
|
+
data.updatedItemIds ||
|
|
153
|
+
data.rulesAfterUpdate.map((rule: NetworkDeviceAutoImportRule) => {
|
|
154
|
+
return rule.id!;
|
|
155
|
+
}),
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// The project ids handed to the engine, in call order.
|
|
160
|
+
function rearmedProjectIds(): Array<string> {
|
|
161
|
+
return rearmMock.mock.calls.map((args: Array<unknown>): string => {
|
|
162
|
+
return (args[0] as { projectId: ObjectID }).projectId.toString();
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
describe("Writing an auto-import rule re-arms the project's recent scan results", () => {
|
|
167
|
+
beforeEach(() => {
|
|
168
|
+
jest.clearAllMocks();
|
|
169
|
+
rearmMock.mockResolvedValue(0);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
afterEach(() => {
|
|
173
|
+
jest.restoreAllMocks();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe("on create", () => {
|
|
177
|
+
it("re-arms the project of a new enabled import rule", async () => {
|
|
178
|
+
await createSucceeds(makeRule());
|
|
179
|
+
|
|
180
|
+
expect(rearmedProjectIds()).toEqual([PROJECT_ID.toString()]);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
/*
|
|
184
|
+
* The column defaults to true, so a create that never mentions it is an
|
|
185
|
+
* enabled rule — and the saved row a hook is handed need not carry every
|
|
186
|
+
* defaulted column.
|
|
187
|
+
*/
|
|
188
|
+
it("re-arms when the create never mentioned the enable toggle", async () => {
|
|
189
|
+
const rule: NetworkDeviceAutoImportRule = makeRule();
|
|
190
|
+
delete rule.isEnabled;
|
|
191
|
+
|
|
192
|
+
await createSucceeds(rule);
|
|
193
|
+
|
|
194
|
+
expect(rearmMock).toHaveBeenCalledTimes(1);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("does not re-arm for a rule created disabled", async () => {
|
|
198
|
+
await createSucceeds(makeRule({ isEnabled: false }));
|
|
199
|
+
|
|
200
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
* An exclusion rule only vetoes what other rules claim. It can never
|
|
205
|
+
* take a host that was not already taken, so re-reading the project's
|
|
206
|
+
* scans on its account is work with no possible outcome.
|
|
207
|
+
*/
|
|
208
|
+
it("does not re-arm for a new exclusion rule", async () => {
|
|
209
|
+
await createSucceeds(makeRule({ isExclusion: true }));
|
|
210
|
+
|
|
211
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it("falls back to the tenant of the write when the row carries no projectId", async () => {
|
|
215
|
+
const rule: NetworkDeviceAutoImportRule = makeRule();
|
|
216
|
+
delete rule.projectId;
|
|
217
|
+
|
|
218
|
+
await createSucceeds(rule, OTHER_PROJECT_ID);
|
|
219
|
+
|
|
220
|
+
expect(rearmedProjectIds()).toEqual([OTHER_PROJECT_ID.toString()]);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("returns the created rule and logs, rather than failing the save, when the re-arm fails", async () => {
|
|
224
|
+
rearmMock.mockRejectedValue(new Error("connection terminated"));
|
|
225
|
+
|
|
226
|
+
const rule: NetworkDeviceAutoImportRule = makeRule();
|
|
227
|
+
|
|
228
|
+
await expect(createSucceeds(rule)).resolves.toBeUndefined();
|
|
229
|
+
|
|
230
|
+
// The detached rejection is handled on the next tick.
|
|
231
|
+
await Promise.resolve();
|
|
232
|
+
await Promise.resolve();
|
|
233
|
+
|
|
234
|
+
expect(loggerErrorMock).toHaveBeenCalledTimes(1);
|
|
235
|
+
expect(String(loggerErrorMock.mock.calls[0]![0])).toContain(
|
|
236
|
+
"connection terminated",
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe("on update", () => {
|
|
242
|
+
it("re-arms when the rule's match criteria change", async () => {
|
|
243
|
+
await updateSucceeds({
|
|
244
|
+
payload: { ipMatchTarget: "10.0.0.0/8" },
|
|
245
|
+
rulesAfterUpdate: [makeRule({ ipMatchTarget: "10.0.0.0/8" })],
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
expect(rearmedProjectIds()).toEqual([PROJECT_ID.toString()]);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it("re-arms when a disabled rule is switched on", async () => {
|
|
252
|
+
await updateSucceeds({
|
|
253
|
+
payload: { isEnabled: true },
|
|
254
|
+
rulesAfterUpdate: [makeRule({ isEnabled: true })],
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
expect(rearmMock).toHaveBeenCalledTimes(1);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* Ping-only hosts are a whole class of discovered host the rule either
|
|
262
|
+
* claims or does not — reach, even though it is not one of the pattern
|
|
263
|
+
* criteria the validator groups together.
|
|
264
|
+
*/
|
|
265
|
+
it("re-arms when the rule starts including ping-only hosts", async () => {
|
|
266
|
+
await updateSucceeds({
|
|
267
|
+
payload: { includePingOnlyHosts: true },
|
|
268
|
+
rulesAfterUpdate: [makeRule({ includePingOnlyHosts: true })],
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
expect(rearmMock).toHaveBeenCalledTimes(1);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
/*
|
|
275
|
+
* Attaching a template backfills a monitor onto devices this rule
|
|
276
|
+
* already imported, so the sweep has real work even though no new device
|
|
277
|
+
* will be created.
|
|
278
|
+
*/
|
|
279
|
+
it("re-arms when a monitor template is attached", async () => {
|
|
280
|
+
const monitorTemplate: MonitorTemplate = new MonitorTemplate();
|
|
281
|
+
monitorTemplate.projectId = PROJECT_ID;
|
|
282
|
+
monitorTemplate.monitorType = MonitorType.NetworkDevice;
|
|
283
|
+
const step: MonitorStep = new MonitorStep();
|
|
284
|
+
step.data!.networkDeviceMonitor = {
|
|
285
|
+
networkDeviceId: ObjectID.generate().toString(),
|
|
286
|
+
monitorInterfaces: true,
|
|
287
|
+
oids: [],
|
|
288
|
+
};
|
|
289
|
+
monitorTemplate.monitorSteps = new MonitorSteps();
|
|
290
|
+
monitorTemplate.monitorSteps.data = {
|
|
291
|
+
monitorStepsInstanceArray: [step],
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
jest
|
|
295
|
+
.spyOn(MonitorTemplateService, "findOneById")
|
|
296
|
+
.mockResolvedValue(monitorTemplate);
|
|
297
|
+
jest.spyOn(NetworkAlertPolicyService, "findBy").mockResolvedValue([]);
|
|
298
|
+
|
|
299
|
+
await updateSucceeds({
|
|
300
|
+
payload: { monitorTemplateId: TEMPLATE_ID },
|
|
301
|
+
rulesAfterUpdate: [makeRule({ monitorTemplateId: TEMPLATE_ID })],
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
expect(rearmMock).toHaveBeenCalledTimes(1);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it("does not re-arm when the save only renamed the rule", async () => {
|
|
308
|
+
const findBySpy: jest.SpyInstance = jest
|
|
309
|
+
.spyOn(NetworkDeviceAutoImportRuleService, "findBy")
|
|
310
|
+
.mockResolvedValue([makeRule()]);
|
|
311
|
+
|
|
312
|
+
await updateSucceeds({
|
|
313
|
+
payload: { name: "Access switches", description: "Ground floor" },
|
|
314
|
+
rulesAfterUpdate: [makeRule()],
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
318
|
+
/*
|
|
319
|
+
* And it costs nothing: a cosmetic edit must not read the rules back
|
|
320
|
+
* either, or every rename in a big project pays for a query.
|
|
321
|
+
*/
|
|
322
|
+
expect(findBySpy).not.toHaveBeenCalled();
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
/*
|
|
326
|
+
* The toggle a form posts is a string, and the rule the operator sees is
|
|
327
|
+
* the ROW. A save that switched the rule off must not re-arm on the
|
|
328
|
+
* strength of its own payload mentioning isEnabled.
|
|
329
|
+
*/
|
|
330
|
+
it("does not re-arm when the rule ends up disabled", async () => {
|
|
331
|
+
await updateSucceeds({
|
|
332
|
+
payload: { isEnabled: false },
|
|
333
|
+
rulesAfterUpdate: [makeRule({ isEnabled: false })],
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it("does not re-arm when the rule ends up an exclusion rule", async () => {
|
|
340
|
+
await updateSucceeds({
|
|
341
|
+
payload: { isExclusion: true },
|
|
342
|
+
rulesAfterUpdate: [makeRule({ isExclusion: true })],
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it("re-arms each project once, however many of its rules one update matched", async () => {
|
|
349
|
+
await updateSucceeds({
|
|
350
|
+
payload: { ipMatchTarget: "10.0.0.0/8" },
|
|
351
|
+
rulesAfterUpdate: [
|
|
352
|
+
makeRule(),
|
|
353
|
+
makeRule({ id: OTHER_RULE_ID }),
|
|
354
|
+
makeRule({ id: OTHER_RULE_ID, projectId: OTHER_PROJECT_ID }),
|
|
355
|
+
],
|
|
356
|
+
updatedItemIds: [RULE_ID, OTHER_RULE_ID],
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
expect(rearmedProjectIds()).toEqual([
|
|
360
|
+
PROJECT_ID.toString(),
|
|
361
|
+
OTHER_PROJECT_ID.toString(),
|
|
362
|
+
]);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it("does nothing when the update matched no rows", async () => {
|
|
366
|
+
const findBySpy: jest.SpyInstance = jest
|
|
367
|
+
.spyOn(NetworkDeviceAutoImportRuleService, "findBy")
|
|
368
|
+
.mockResolvedValue([]);
|
|
369
|
+
|
|
370
|
+
await updateSucceeds({
|
|
371
|
+
payload: { ipMatchTarget: "10.0.0.0/8" },
|
|
372
|
+
rulesAfterUpdate: [],
|
|
373
|
+
updatedItemIds: [],
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
expect(rearmMock).not.toHaveBeenCalled();
|
|
377
|
+
// onBeforeUpdate's own validation read is the only one.
|
|
378
|
+
expect(findBySpy).toHaveBeenCalledTimes(1);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
});
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Service as BillingPaymentMethodService } from "../../../Server/Services/BillingPaymentMethodService";
|
|
2
|
+
import BillingService, {
|
|
3
|
+
PaymentMethod,
|
|
4
|
+
} from "../../../Server/Services/BillingService";
|
|
5
|
+
import ProjectService from "../../../Server/Services/ProjectService";
|
|
6
|
+
import PayAsYouGoBillingService from "../../../Server/Services/PayAsYouGoBillingService";
|
|
7
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
8
|
+
import { getJestSpyOn } from "../../Spy";
|
|
9
|
+
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
|
10
|
+
|
|
11
|
+
jest.mock("stripe", () => {
|
|
12
|
+
return jest.fn(() => {
|
|
13
|
+
return {};
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const PROJECT_ID: ObjectID = ObjectID.generate();
|
|
18
|
+
const CUSTOMER_ID: string = "cus_sync_test";
|
|
19
|
+
|
|
20
|
+
const CARD: PaymentMethod = {
|
|
21
|
+
id: "pm_card",
|
|
22
|
+
type: "visa",
|
|
23
|
+
last4Digits: "4242",
|
|
24
|
+
isDefault: true,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type SettledFunction = () => Promise<void>;
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Lets both callers get past their own awaits and reach the shared sync before
|
|
31
|
+
* anything is asserted, without leaning on a fixed sleep.
|
|
32
|
+
*/
|
|
33
|
+
const settle: SettledFunction = async (): Promise<void> => {
|
|
34
|
+
for (let i: number = 0; i < 20; i++) {
|
|
35
|
+
await Promise.resolve();
|
|
36
|
+
}
|
|
37
|
+
await new Promise((resolve: (value: void) => void) => {
|
|
38
|
+
setTimeout(resolve, 5);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* One billing page render issues two BillingPaymentMethod list requests at the
|
|
44
|
+
* same time - the table, and the unfiltered count next to it - and every list
|
|
45
|
+
* re-syncs the model from Stripe with five provider reads before it answers.
|
|
46
|
+
* That doubled the provider traffic for a single page view, and pointed two
|
|
47
|
+
* concurrent hard-delete-then-reinsert passes at the same rows.
|
|
48
|
+
*/
|
|
49
|
+
describe("BillingPaymentMethodService provider sync", () => {
|
|
50
|
+
let service: BillingPaymentMethodService;
|
|
51
|
+
let getPaymentMethods: jest.Mock;
|
|
52
|
+
let deleteBy: jest.Mock;
|
|
53
|
+
let create: jest.Mock;
|
|
54
|
+
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
jest.restoreAllMocks();
|
|
57
|
+
service = new BillingPaymentMethodService();
|
|
58
|
+
|
|
59
|
+
getJestSpyOn(ProjectService, "findOneById").mockResolvedValue({
|
|
60
|
+
id: PROJECT_ID,
|
|
61
|
+
paymentProviderCustomerId: CUSTOMER_ID,
|
|
62
|
+
} as never);
|
|
63
|
+
|
|
64
|
+
// Slow enough that a second caller is guaranteed to arrive mid-read.
|
|
65
|
+
getPaymentMethods = getJestSpyOn(
|
|
66
|
+
BillingService,
|
|
67
|
+
"getPaymentMethods",
|
|
68
|
+
).mockImplementation((): Promise<Array<PaymentMethod>> => {
|
|
69
|
+
return new Promise((resolve: (value: Array<PaymentMethod>) => void) => {
|
|
70
|
+
setTimeout(() => {
|
|
71
|
+
return resolve([CARD]);
|
|
72
|
+
}, 40);
|
|
73
|
+
});
|
|
74
|
+
}) as unknown as jest.Mock;
|
|
75
|
+
|
|
76
|
+
deleteBy = getJestSpyOn(service, "deleteBy").mockResolvedValue(
|
|
77
|
+
undefined as never,
|
|
78
|
+
) as unknown as jest.Mock;
|
|
79
|
+
create = getJestSpyOn(service, "create").mockResolvedValue(
|
|
80
|
+
undefined as never,
|
|
81
|
+
) as unknown as jest.Mock;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
type OnBeforeFind = (findBy: unknown) => Promise<unknown>;
|
|
85
|
+
|
|
86
|
+
const find: () => Promise<unknown> = (): Promise<unknown> => {
|
|
87
|
+
return (service as unknown as { onBeforeFind: OnBeforeFind }).onBeforeFind({
|
|
88
|
+
props: { tenantId: PROJECT_ID },
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
it("reads the provider once for two overlapping list requests", async () => {
|
|
93
|
+
const first: Promise<unknown> = find();
|
|
94
|
+
const second: Promise<unknown> = find();
|
|
95
|
+
|
|
96
|
+
await Promise.all([first, second]);
|
|
97
|
+
|
|
98
|
+
expect(getPaymentMethods).toHaveBeenCalledTimes(1);
|
|
99
|
+
// And only one delete-then-reinsert pass touched the rows.
|
|
100
|
+
expect(deleteBy).toHaveBeenCalledTimes(1);
|
|
101
|
+
expect(create).toHaveBeenCalledTimes(1);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("gives both overlapping callers the same answer", async () => {
|
|
105
|
+
const [a, b]: Array<unknown> = await Promise.all([find(), find()]);
|
|
106
|
+
|
|
107
|
+
expect((a as { carryForward: Array<PaymentMethod> }).carryForward).toEqual([
|
|
108
|
+
CARD,
|
|
109
|
+
]);
|
|
110
|
+
expect((b as { carryForward: Array<PaymentMethod> }).carryForward).toEqual([
|
|
111
|
+
CARD,
|
|
112
|
+
]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("does not cache past the in-flight window, so a newly added card is seen", async () => {
|
|
116
|
+
await find();
|
|
117
|
+
expect(getPaymentMethods).toHaveBeenCalledTimes(1);
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* A later, non-overlapping request must go back to the provider. This is
|
|
121
|
+
* the "add a card, then look at the table" path, so a cache here would
|
|
122
|
+
* show the user a table that does not contain the card they just added.
|
|
123
|
+
*/
|
|
124
|
+
await find();
|
|
125
|
+
expect(getPaymentMethods).toHaveBeenCalledTimes(2);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* This is what makes the admission path's denial cache safe to have at all.
|
|
130
|
+
* The billing page reads this table immediately after a card is added, so
|
|
131
|
+
* clearing the authorization here is what lets ingest be admitted on the
|
|
132
|
+
* next batch instead of at the end of the denial TTL. Nothing else asserts
|
|
133
|
+
* it, and dropping it would reintroduce a delay nobody would connect back
|
|
134
|
+
* to this line.
|
|
135
|
+
*/
|
|
136
|
+
it("clears the project's cached authorization once the provider has been read", async () => {
|
|
137
|
+
const invalidate: jest.SpiedFunction<
|
|
138
|
+
typeof PayAsYouGoBillingService.invalidate
|
|
139
|
+
> = getJestSpyOn(PayAsYouGoBillingService, "invalidate").mockReturnValue(
|
|
140
|
+
undefined,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
await find();
|
|
144
|
+
|
|
145
|
+
expect(invalidate).toHaveBeenCalledTimes(1);
|
|
146
|
+
expect(invalidate.mock.calls[0]![0]!.toString()).toBe(
|
|
147
|
+
PROJECT_ID.toString(),
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it("does not clear the cached authorization when the provider read fails", async () => {
|
|
152
|
+
const invalidate: jest.SpiedFunction<
|
|
153
|
+
typeof PayAsYouGoBillingService.invalidate
|
|
154
|
+
> = getJestSpyOn(PayAsYouGoBillingService, "invalidate").mockReturnValue(
|
|
155
|
+
undefined,
|
|
156
|
+
);
|
|
157
|
+
getPaymentMethods.mockRejectedValueOnce(new Error("provider unreachable"));
|
|
158
|
+
|
|
159
|
+
await expect(find()).rejects.toThrow("provider unreachable");
|
|
160
|
+
|
|
161
|
+
// A failed read learned nothing, so it must not claim the cache is stale.
|
|
162
|
+
expect(invalidate).not.toHaveBeenCalled();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("does not strand later callers when a provider read fails", async () => {
|
|
166
|
+
getPaymentMethods.mockRejectedValueOnce(new Error("provider unreachable"));
|
|
167
|
+
|
|
168
|
+
await expect(find()).rejects.toThrow("provider unreachable");
|
|
169
|
+
await settle();
|
|
170
|
+
|
|
171
|
+
// The failed sync must not be left in flight for every request after it.
|
|
172
|
+
await find();
|
|
173
|
+
expect(getPaymentMethods).toHaveBeenCalledTimes(2);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
@@ -39,6 +39,17 @@ import SubscriptionPlan from "../../../Types/Billing/SubscriptionPlan";
|
|
|
39
39
|
import SubscriptionStatus from "../../../Types/Billing/SubscriptionStatus";
|
|
40
40
|
import OneUptimeDate from "../../../Types/Date";
|
|
41
41
|
|
|
42
|
+
jest.mock("../../../Server/Services/PayAsYouGoBillingService", () => {
|
|
43
|
+
return {
|
|
44
|
+
__esModule: true,
|
|
45
|
+
default: {
|
|
46
|
+
requireMeteredSubscriptionPayment: jest.fn(async (): Promise<void> => {
|
|
47
|
+
return;
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
|
|
42
53
|
describe("BillingService", () => {
|
|
43
54
|
let billingService: BillingService;
|
|
44
55
|
const customer: CustomerData = getCustomerData();
|
|
@@ -1233,30 +1244,34 @@ describe("BillingService", () => {
|
|
|
1233
1244
|
|
|
1234
1245
|
describe("hasPaymentMethods", () => {
|
|
1235
1246
|
it("should return true if the customer has payment methods", async () => {
|
|
1236
|
-
|
|
1237
|
-
getJestMockFunction().mockResolvedValue(
|
|
1247
|
+
mockStripe.paymentMethods.list =
|
|
1248
|
+
getJestMockFunction().mockResolvedValue({
|
|
1249
|
+
data: mockPaymentMethods,
|
|
1250
|
+
});
|
|
1238
1251
|
|
|
1239
1252
|
const result: boolean =
|
|
1240
1253
|
await billingService.hasPaymentMethods(customerId);
|
|
1241
1254
|
|
|
1242
1255
|
expect(result).toBeTruthy();
|
|
1243
|
-
expect(
|
|
1244
|
-
customerId,
|
|
1245
|
-
|
|
1256
|
+
expect(mockStripe.paymentMethods.list).toHaveBeenCalledWith({
|
|
1257
|
+
customer: customerId,
|
|
1258
|
+
type: "card",
|
|
1259
|
+
limit: 1,
|
|
1260
|
+
});
|
|
1261
|
+
expect(mockStripe.paymentMethods.list).toHaveBeenCalledTimes(1);
|
|
1246
1262
|
});
|
|
1247
1263
|
|
|
1248
1264
|
it("should return false if the customer does not have payment methods", async () => {
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1265
|
+
mockStripe.paymentMethods.list =
|
|
1266
|
+
getJestMockFunction().mockResolvedValue({
|
|
1267
|
+
data: [],
|
|
1268
|
+
});
|
|
1252
1269
|
|
|
1253
1270
|
const result: boolean =
|
|
1254
1271
|
await billingService.hasPaymentMethods(customerId);
|
|
1255
1272
|
|
|
1256
1273
|
expect(result).toBeFalsy();
|
|
1257
|
-
expect(
|
|
1258
|
-
customerId,
|
|
1259
|
-
);
|
|
1274
|
+
expect(mockStripe.paymentMethods.list).toHaveBeenCalledTimes(4);
|
|
1260
1275
|
});
|
|
1261
1276
|
});
|
|
1262
1277
|
|