@oneuptime/common 13.0.8 → 14.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/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/BaseAPI.ts +26 -5
- package/Server/API/GlobalConfigAPI.ts +228 -462
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/StatusPageAPI.ts +100 -42
- package/Server/API/TeamMemberAPI.ts +10 -1
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +59 -6
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/ProjectService.ts +284 -0
- package/Server/Services/RumSessionPinService.ts +25 -6
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +183 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Server/API/BaseAPI.js +26 -5
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +93 -43
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +8 -1
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +48 -6
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +214 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +24 -6
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import AllModelTypes from "../../../Models/DatabaseModels/Index";
|
|
2
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
3
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
4
|
+
import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
|
|
5
|
+
import StatusPage from "../../../Models/DatabaseModels/StatusPage";
|
|
6
|
+
import UserEmail from "../../../Models/DatabaseModels/UserEmail";
|
|
7
|
+
import { ColumnAccessControl } from "../../../Types/BaseDatabase/AccessControl";
|
|
8
|
+
import ColumnBillingAccessControl from "../../../Types/BaseDatabase/ColumnBillingAccessControl";
|
|
9
|
+
import { getColumnAccessControlForAllColumns } from "../../../Types/Database/AccessControl/ColumnAccessControl";
|
|
10
|
+
import { getColumnBillingAccessControlForAllColumns } from "../../../Types/Database/AccessControl/ColumnBillingAccessControl";
|
|
11
|
+
import { getOwnerOnlyColumns } from "../../../Types/Database/AccessControl/OwnerOnlyColumn";
|
|
12
|
+
import Dictionary from "../../../Types/Dictionary";
|
|
13
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
14
|
+
import { describe, expect, test } from "@jest/globals";
|
|
15
|
+
import { getMetadataArgsStorage } from "typeorm";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* WHY THIS FILE EXISTS - do not delete these as "obvious" assertions.
|
|
19
|
+
*
|
|
20
|
+
* Every "which columns does this model have" lookup answers the question by
|
|
21
|
+
* enumerating an INSTANCE's own keys, and caches the answer per CLASS, for the
|
|
22
|
+
* whole process. So the FIRST instance to ask used to define what the class is
|
|
23
|
+
* for everybody after it.
|
|
24
|
+
*
|
|
25
|
+
* BaseAPI.createItem deleted `_id` off the live model instance it handed to
|
|
26
|
+
* the service, and DatabaseService.create asks that instance for its columns
|
|
27
|
+
* (generateDefaultValues) before any permission check runs. One POST - even a
|
|
28
|
+
* POST that was refused - could therefore teach the process that a model has
|
|
29
|
+
* no `_id` column, and DatabaseBaseModel.toJSONObject serializes a row by
|
|
30
|
+
* iterating exactly that cached list, so every response for that model lost
|
|
31
|
+
* its id from then on. To any caller, on any route, including plain reads as
|
|
32
|
+
* root: the row still carried its real `_id` in memory and the SQL projection
|
|
33
|
+
* still selected it. The id was dropped on the way out, and it stayed a 200
|
|
34
|
+
* because `_id` is in ColumnPermissions.getExcludedColumnNames().
|
|
35
|
+
*
|
|
36
|
+
* The tests below do the mutation on purpose. No caller in the tree does it
|
|
37
|
+
* any more, and that is not what is being protected: the invariant is that it
|
|
38
|
+
* CANNOT MATTER who asks first or what they did to their own instance. Each
|
|
39
|
+
* test uses a different model class, because these caches are per class and
|
|
40
|
+
* per process - a class another test has already asked about has a warm cache
|
|
41
|
+
* and would pass vacuously.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
describe("column metadata does not depend on which instance asked first", () => {
|
|
45
|
+
test("getTableColumns: a mutilated instance asking first cannot strip _id from the class", () => {
|
|
46
|
+
const mutilated: ProjectSCIM = new ProjectSCIM();
|
|
47
|
+
|
|
48
|
+
// exactly what BaseAPI.createItem used to do before calling the service
|
|
49
|
+
delete (mutilated as unknown as Record<string, unknown>)["_id"];
|
|
50
|
+
expect(Object.keys(mutilated)).not.toContain("_id");
|
|
51
|
+
|
|
52
|
+
// the mutilated instance is the FIRST to ask, on a cold cache
|
|
53
|
+
expect(mutilated.getTableColumns().columns).toContain("_id");
|
|
54
|
+
|
|
55
|
+
// ...and a fresh instance of the same class is unharmed
|
|
56
|
+
expect(new ProjectSCIM().getTableColumns().columns).toContain("_id");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("getTableColumns: a row still serializes with its _id after such a create", () => {
|
|
60
|
+
/*
|
|
61
|
+
* The assertion that matches the reported symptom: POST /api/project-scim
|
|
62
|
+
* answered 200 with every column except "_id", and a get-list selecting
|
|
63
|
+
* {_id, name} came back as {name} alone.
|
|
64
|
+
*/
|
|
65
|
+
const mutilated: Monitor = new Monitor();
|
|
66
|
+
delete (mutilated as unknown as Record<string, unknown>)["_id"];
|
|
67
|
+
mutilated.getTableColumns();
|
|
68
|
+
|
|
69
|
+
const row: Monitor = new Monitor();
|
|
70
|
+
row._id = "22222222-2222-4222-8222-222222222222";
|
|
71
|
+
row.name = "a monitor";
|
|
72
|
+
|
|
73
|
+
const json: JSONObject = BaseModel.toJSONObject(row, Monitor);
|
|
74
|
+
|
|
75
|
+
expect(json["_id"]).toBe("22222222-2222-4222-8222-222222222222");
|
|
76
|
+
expect(json["name"]).toBe("a monitor");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getColumnAccessControlForAllColumns is instance-independent", () => {
|
|
80
|
+
const mutilated: StatusPage = new StatusPage();
|
|
81
|
+
delete (mutilated as unknown as Record<string, unknown>)["name"];
|
|
82
|
+
|
|
83
|
+
const fromMutilated: Dictionary<ColumnAccessControl> =
|
|
84
|
+
getColumnAccessControlForAllColumns(mutilated);
|
|
85
|
+
|
|
86
|
+
expect(fromMutilated["name"]).toBeDefined();
|
|
87
|
+
expect(
|
|
88
|
+
getColumnAccessControlForAllColumns(new StatusPage())["name"],
|
|
89
|
+
).toBeDefined();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("getColumnBillingAccessControlForAllColumns is instance-independent", () => {
|
|
93
|
+
const mutilated: StatusPage = new StatusPage();
|
|
94
|
+
delete (mutilated as unknown as Record<string, unknown>)["customCSS"];
|
|
95
|
+
|
|
96
|
+
const fromMutilated: Dictionary<ColumnBillingAccessControl> =
|
|
97
|
+
getColumnBillingAccessControlForAllColumns(mutilated);
|
|
98
|
+
|
|
99
|
+
expect(fromMutilated["customCSS"]).toBeDefined();
|
|
100
|
+
expect(
|
|
101
|
+
getColumnBillingAccessControlForAllColumns(new StatusPage())["customCSS"],
|
|
102
|
+
).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("getOwnerOnlyColumns is instance-independent", () => {
|
|
106
|
+
/*
|
|
107
|
+
* This one is a permission list, not a projection: a marked column that
|
|
108
|
+
* goes unreported is a column OwnerOnlyColumnPermission stops protecting.
|
|
109
|
+
*/
|
|
110
|
+
const mutilated: UserEmail = new UserEmail();
|
|
111
|
+
delete (mutilated as unknown as Record<string, unknown>)["email"];
|
|
112
|
+
|
|
113
|
+
expect(getOwnerOnlyColumns(mutilated)).toContain("email");
|
|
114
|
+
expect(getOwnerOnlyColumns(new UserEmail())).toContain("email");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("mutating an instance after the class has been read changes nothing either", () => {
|
|
118
|
+
const first: UserEmail = new UserEmail();
|
|
119
|
+
expect(first.getTableColumns().columns).toContain("_id");
|
|
120
|
+
|
|
121
|
+
delete (first as unknown as Record<string, unknown>)["_id"];
|
|
122
|
+
|
|
123
|
+
expect(first.getTableColumns().columns).toContain("_id");
|
|
124
|
+
expect(new UserEmail().getTableColumns().columns).toContain("_id");
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* The premise of the fix: metadata enumeration reads a freshly constructed
|
|
130
|
+
* instance of the caller's class, so every model must be no-arg constructible
|
|
131
|
+
* and must expose every column it declares on a fresh instance (the class
|
|
132
|
+
* bodies do that with `= undefined` initializers). If a model is ever added
|
|
133
|
+
* that breaks either half, it would silently lose columns everywhere -
|
|
134
|
+
* responses, selects, permissions - so assert it for all of them at once.
|
|
135
|
+
*/
|
|
136
|
+
describe("every database model supports canonical-instance enumeration", () => {
|
|
137
|
+
test("all models are no-arg constructible and declare no column that a fresh instance lacks", () => {
|
|
138
|
+
const columnsByTarget: Map<unknown, Array<string>> = new Map();
|
|
139
|
+
|
|
140
|
+
const record: (target: unknown, propertyName: string) => void = (
|
|
141
|
+
target: unknown,
|
|
142
|
+
propertyName: string,
|
|
143
|
+
): void => {
|
|
144
|
+
const list: Array<string> = columnsByTarget.get(target) || [];
|
|
145
|
+
list.push(propertyName);
|
|
146
|
+
columnsByTarget.set(target, list);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
for (const column of getMetadataArgsStorage().columns) {
|
|
150
|
+
record(column.target, column.propertyName);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
for (const relation of getMetadataArgsStorage().relations) {
|
|
154
|
+
record(relation.target, relation.propertyName);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const constructFailures: Array<string> = [];
|
|
158
|
+
const missingKeys: Array<string> = [];
|
|
159
|
+
|
|
160
|
+
for (const modelType of AllModelTypes) {
|
|
161
|
+
let instance: BaseModel | null = null;
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
instance = new modelType();
|
|
165
|
+
} catch (err) {
|
|
166
|
+
constructFailures.push(`${modelType.name}: ${(err as Error).message}`);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const ownKeys: Set<string> = new Set(Object.keys(instance));
|
|
171
|
+
|
|
172
|
+
// inherited columns count too, so walk the constructor chain
|
|
173
|
+
let ctor: unknown = modelType;
|
|
174
|
+
|
|
175
|
+
while (ctor && ctor !== Function.prototype) {
|
|
176
|
+
for (const propertyName of columnsByTarget.get(ctor) || []) {
|
|
177
|
+
if (!ownKeys.has(propertyName)) {
|
|
178
|
+
missingKeys.push(`${modelType.name}.${propertyName}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
ctor = Object.getPrototypeOf(ctor);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
expect(constructFailures).toEqual([]);
|
|
187
|
+
expect(missingKeys).toEqual([]);
|
|
188
|
+
expect(AllModelTypes.length).toBeGreaterThan(400);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* What the edition dialog must say about an Enterprise license lapse. Shared
|
|
3
|
+
* by the core EditionLabel suite and ee/Tests/UI/License, which renders the
|
|
4
|
+
* same dialog with the Enterprise license manager.
|
|
5
|
+
*
|
|
6
|
+
* When the license lapses (after the trial or the grace period), single
|
|
7
|
+
* sign-on (SAML and OIDC), SCIM provisioning and audit logging stop - the
|
|
8
|
+
* Community Edition's behaviour - and "Require SSO" stops being enforced at
|
|
9
|
+
* the same moment, so nobody is locked out: users sign in with their
|
|
10
|
+
* password. Everything resumes as soon as a license is activated. The trial
|
|
11
|
+
* and grace notices must say so BEFORE it happens, and the lapsed notice must
|
|
12
|
+
* say what is off.
|
|
13
|
+
*
|
|
14
|
+
* The dialog used to promise the opposite ("SSO, SCIM and audit logging never
|
|
15
|
+
* stop"), so the checks reject that copy too. Plain functions over text, with
|
|
16
|
+
* no jest dependency, so a test can prove each check fails on the wrong copy.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// Before the lapse: the trial and grace notices, after "Without a valid license (...), ".
|
|
20
|
+
export const LAPSE_WARNING_PHRASES: ReadonlyArray<string> = [
|
|
21
|
+
"single sign-on (SAML and OIDC) stops",
|
|
22
|
+
'"Require SSO" is no longer enforced, so users sign in with their password',
|
|
23
|
+
"SCIM provisioning stops",
|
|
24
|
+
"audit logging stops recording",
|
|
25
|
+
"enterprise configuration becomes read-only",
|
|
26
|
+
"the enterprise admin dashboards are locked",
|
|
27
|
+
"Everything resumes as soon as a license is activated",
|
|
28
|
+
"core monitoring is never affected",
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// After the lapse: the license-required notice (expired, missing, invalid).
|
|
32
|
+
export const LAPSED_STATE_PHRASES: ReadonlyArray<string> = [
|
|
33
|
+
"Single sign-on (SAML and OIDC) and SCIM provisioning are off",
|
|
34
|
+
'"Require SSO" is not enforced, so users sign in with their password',
|
|
35
|
+
"SCIM requests are refused",
|
|
36
|
+
"Audit logging is not recording",
|
|
37
|
+
"Enterprise configuration is read-only",
|
|
38
|
+
"Everything resumes, without a restart, as soon as a valid license is added",
|
|
39
|
+
"core monitoring is never affected",
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// The soft-enforcement promises the dialog made before. None may come back.
|
|
43
|
+
export const RETIRED_SOFT_ENFORCEMENT_COPY: ReadonlyArray<RegExp> = [
|
|
44
|
+
/never stop/i,
|
|
45
|
+
/already configured keeps working/i,
|
|
46
|
+
/configured stops working/i,
|
|
47
|
+
/keeps? working as configured/i,
|
|
48
|
+
/never (?:silently )?weakens?/i,
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
// The copy the dialog shipped before the owner's decision, verbatim.
|
|
52
|
+
export const RETIRED_NOTICE_EXAMPLES: ReadonlyArray<string> = [
|
|
53
|
+
"Without a valid license (after the 14-day grace period), enterprise configuration becomes read-only and the enterprise admin dashboards are locked. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
|
|
54
|
+
"Without a valid license (after the 14-day trial), enterprise configuration becomes read-only and the enterprise admin dashboards are locked. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
|
|
55
|
+
"The Enterprise license expired and its grace period is over. Enterprise configuration is read-only and the enterprise admin dashboards are locked until a valid license is added. Everything you already configured keeps working — SSO, SCIM and audit logging never stop — and core monitoring is never affected.",
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
type CopyCheck = (text: string | null | undefined) => Array<string>;
|
|
59
|
+
|
|
60
|
+
// Whitespace-normalized, so a check does not depend on how JSX wraps a line.
|
|
61
|
+
const normalize: (text: string | null | undefined) => string = (
|
|
62
|
+
text: string | null | undefined,
|
|
63
|
+
): string => {
|
|
64
|
+
return (text || "").replace(/\s+/g, " ").trim();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const copyProblems: (
|
|
68
|
+
text: string | null | undefined,
|
|
69
|
+
requiredPhrases: ReadonlyArray<string>,
|
|
70
|
+
) => Array<string> = (
|
|
71
|
+
text: string | null | undefined,
|
|
72
|
+
requiredPhrases: ReadonlyArray<string>,
|
|
73
|
+
): Array<string> => {
|
|
74
|
+
const flat: string = normalize(text);
|
|
75
|
+
const problems: Array<string> = [];
|
|
76
|
+
|
|
77
|
+
for (const phrase of requiredPhrases) {
|
|
78
|
+
if (!flat.includes(phrase)) {
|
|
79
|
+
problems.push(`missing: ${phrase}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
for (const retired of RETIRED_SOFT_ENFORCEMENT_COPY) {
|
|
84
|
+
if (retired.test(flat)) {
|
|
85
|
+
problems.push(`retired: ${retired.source}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return problems;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// What is wrong with a trial or grace notice (empty when it is right).
|
|
93
|
+
export const lapseWarningProblems: CopyCheck = (
|
|
94
|
+
text: string | null | undefined,
|
|
95
|
+
): Array<string> => {
|
|
96
|
+
return copyProblems(text, LAPSE_WARNING_PHRASES);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// What is wrong with the notice shown once the license has lapsed.
|
|
100
|
+
export const lapsedStateProblems: CopyCheck = (
|
|
101
|
+
text: string | null | undefined,
|
|
102
|
+
): Array<string> => {
|
|
103
|
+
return copyProblems(text, LAPSED_STATE_PHRASES);
|
|
104
|
+
};
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import { act, cleanup, render } from "@testing-library/react";
|
|
11
|
+
import React, { ReactElement } from "react";
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import path from "path";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* The core Header (Admin Dashboard) and Footer (Dashboard) hand their edition
|
|
17
|
+
* pill the Enterprise plugin's LicenseManager, read from the plugin door
|
|
18
|
+
* inside render. With the Community stub - which is what this jest config
|
|
19
|
+
* resolves the plugin specifiers to - they hand it nothing, and the pill
|
|
20
|
+
* shows the license status only.
|
|
21
|
+
*
|
|
22
|
+
* EditionLabel is replaced with a probe that records the prop, and each door
|
|
23
|
+
* with one that returns whatever the test sets (the real Community stub by
|
|
24
|
+
* default). This is core, and must pass with ee/ deleted.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const receivedManagers: Array<unknown> = [];
|
|
28
|
+
|
|
29
|
+
jest.mock("../../../UI/Components/EditionLabel/EditionLabel", () => {
|
|
30
|
+
return {
|
|
31
|
+
__esModule: true,
|
|
32
|
+
default: (props: { licenseManager?: unknown }): ReactElement => {
|
|
33
|
+
receivedManagers.push(props.licenseManager);
|
|
34
|
+
|
|
35
|
+
return <span data-testid="edition-label" />;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
jest.mock("../../../UI/Images/logos/OneUptimeSVG/3-transparent.svg", () => {
|
|
41
|
+
return "data:image/svg+xml;base64,bG9nbw==";
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
jest.mock("react-i18next", () => {
|
|
45
|
+
return {
|
|
46
|
+
useTranslation: () => {
|
|
47
|
+
return {
|
|
48
|
+
t: (key: string): string => {
|
|
49
|
+
return key;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
jest.mock("../../../UI/Utils/User", () => {
|
|
57
|
+
return {
|
|
58
|
+
__esModule: true,
|
|
59
|
+
default: {
|
|
60
|
+
isMasterAdmin: (): boolean => {
|
|
61
|
+
return true;
|
|
62
|
+
},
|
|
63
|
+
isLoggedIn: (): boolean => {
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
jest.mock(
|
|
71
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/LanguageSwitcher/LanguageSwitcher",
|
|
72
|
+
() => {
|
|
73
|
+
return {
|
|
74
|
+
__esModule: true,
|
|
75
|
+
default: (): ReactElement => {
|
|
76
|
+
return <span data-testid="language-switcher" />;
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
let mockAdminPlugins: Record<string, unknown> = {};
|
|
83
|
+
let mockDashboardPlugins: Record<string, unknown> = {};
|
|
84
|
+
let adminDoorReads: number = 0;
|
|
85
|
+
let dashboardDoorReads: number = 0;
|
|
86
|
+
|
|
87
|
+
jest.mock(
|
|
88
|
+
"../../../../App/FeatureSet/AdminDashboard/src/Enterprise/Plugins",
|
|
89
|
+
() => {
|
|
90
|
+
return {
|
|
91
|
+
getAdminDashboardPlugins: (): Record<string, unknown> => {
|
|
92
|
+
adminDoorReads += 1;
|
|
93
|
+
return mockAdminPlugins;
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
jest.mock("../../../../App/FeatureSet/Dashboard/src/Enterprise/Plugins", () => {
|
|
100
|
+
return {
|
|
101
|
+
getDashboardPlugins: (): Record<string, unknown> => {
|
|
102
|
+
dashboardDoorReads += 1;
|
|
103
|
+
return mockDashboardPlugins;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
import AdminCommunityPlugins from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/CommunityPlugins";
|
|
109
|
+
import DashboardCommunityPlugins from "../../../../App/FeatureSet/Dashboard/src/Enterprise/CommunityPlugins";
|
|
110
|
+
import AdminDashboardHeader from "../../../../App/FeatureSet/AdminDashboard/src/Components/Header/Header";
|
|
111
|
+
import DashboardFooter from "../../../../App/FeatureSet/Dashboard/src/Components/Footer/Footer";
|
|
112
|
+
import { ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS } from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/EnterprisePlugins";
|
|
113
|
+
import { DASHBOARD_ENTERPRISE_PLUGIN_KEYS } from "../../../../App/FeatureSet/Dashboard/src/Enterprise/EnterprisePlugins";
|
|
114
|
+
|
|
115
|
+
const FakeAdminLicenseManager: () => ReactElement = (): ReactElement => {
|
|
116
|
+
return <span />;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const FakeDashboardLicenseManager: () => ReactElement = (): ReactElement => {
|
|
120
|
+
return <span />;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const APP_DIR: string = path.resolve(__dirname, "..", "..", "..", "..", "App");
|
|
124
|
+
|
|
125
|
+
interface Caller {
|
|
126
|
+
name: string;
|
|
127
|
+
file: string;
|
|
128
|
+
render: () => void;
|
|
129
|
+
setPlugins: (plugins: Record<string, unknown>) => void;
|
|
130
|
+
communityStub: Record<string, unknown>;
|
|
131
|
+
fake: () => ReactElement;
|
|
132
|
+
doorReads: () => number;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const CALLERS: Array<Caller> = [
|
|
136
|
+
{
|
|
137
|
+
name: "the Admin Dashboard header",
|
|
138
|
+
file: path.join(
|
|
139
|
+
APP_DIR,
|
|
140
|
+
"FeatureSet/AdminDashboard/src/Components/Header/Header.tsx",
|
|
141
|
+
),
|
|
142
|
+
render: (): void => {
|
|
143
|
+
render(<AdminDashboardHeader />);
|
|
144
|
+
},
|
|
145
|
+
setPlugins: (plugins: Record<string, unknown>): void => {
|
|
146
|
+
mockAdminPlugins = plugins;
|
|
147
|
+
},
|
|
148
|
+
communityStub: AdminCommunityPlugins as Record<string, unknown>,
|
|
149
|
+
fake: FakeAdminLicenseManager,
|
|
150
|
+
doorReads: (): number => {
|
|
151
|
+
return adminDoorReads;
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "the Dashboard footer",
|
|
156
|
+
file: path.join(
|
|
157
|
+
APP_DIR,
|
|
158
|
+
"FeatureSet/Dashboard/src/Components/Footer/Footer.tsx",
|
|
159
|
+
),
|
|
160
|
+
render: (): void => {
|
|
161
|
+
render(<DashboardFooter />);
|
|
162
|
+
},
|
|
163
|
+
setPlugins: (plugins: Record<string, unknown>): void => {
|
|
164
|
+
mockDashboardPlugins = plugins;
|
|
165
|
+
},
|
|
166
|
+
communityStub: DashboardCommunityPlugins as Record<string, unknown>,
|
|
167
|
+
fake: FakeDashboardLicenseManager,
|
|
168
|
+
doorReads: (): number => {
|
|
169
|
+
return dashboardDoorReads;
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
beforeEach(() => {
|
|
175
|
+
receivedManagers.length = 0;
|
|
176
|
+
adminDoorReads = 0;
|
|
177
|
+
dashboardDoorReads = 0;
|
|
178
|
+
mockAdminPlugins = AdminCommunityPlugins as Record<string, unknown>;
|
|
179
|
+
mockDashboardPlugins = DashboardCommunityPlugins as Record<string, unknown>;
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
afterEach(() => {
|
|
183
|
+
cleanup();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
describe("LicenseManager is a key of both plugin contracts", () => {
|
|
187
|
+
test("the Admin Dashboard's", () => {
|
|
188
|
+
expect(ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS).toContain("LicenseManager");
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test("the Dashboard's", () => {
|
|
192
|
+
expect(DASHBOARD_ENTERPRISE_PLUGIN_KEYS).toContain("LicenseManager");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("and neither Community stub provides it", () => {
|
|
196
|
+
expect(
|
|
197
|
+
(AdminCommunityPlugins as Record<string, unknown>)["LicenseManager"],
|
|
198
|
+
).toBeUndefined();
|
|
199
|
+
expect(
|
|
200
|
+
(DashboardCommunityPlugins as Record<string, unknown>)["LicenseManager"],
|
|
201
|
+
).toBeUndefined();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
describe.each(CALLERS)("$name", (caller: Caller) => {
|
|
206
|
+
test("passes the plugin's LicenseManager to the edition pill", async () => {
|
|
207
|
+
caller.setPlugins({ LicenseManager: caller.fake });
|
|
208
|
+
|
|
209
|
+
await act(async () => {
|
|
210
|
+
caller.render();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
expect(receivedManagers).toContain(caller.fake);
|
|
214
|
+
expect(
|
|
215
|
+
receivedManagers.every((value: unknown): boolean => {
|
|
216
|
+
return value === caller.fake;
|
|
217
|
+
}),
|
|
218
|
+
).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test("passes nothing with the Community stub (negative control)", async () => {
|
|
222
|
+
caller.setPlugins(caller.communityStub);
|
|
223
|
+
|
|
224
|
+
await act(async () => {
|
|
225
|
+
caller.render();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(receivedManagers.length).toBeGreaterThan(0);
|
|
229
|
+
expect(
|
|
230
|
+
receivedManagers.every((value: unknown): boolean => {
|
|
231
|
+
return value === undefined;
|
|
232
|
+
}),
|
|
233
|
+
).toBe(true);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("reads the door while rendering, not when the module loads", async () => {
|
|
237
|
+
// The module was imported above; no render has happened yet.
|
|
238
|
+
expect(caller.doorReads()).toBe(0);
|
|
239
|
+
|
|
240
|
+
await act(async () => {
|
|
241
|
+
caller.render();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
expect(caller.doorReads()).toBeGreaterThan(0);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test("names the prop in its source, so the wiring is not a coincidence", () => {
|
|
248
|
+
const source: string = fs.readFileSync(caller.file, "utf8");
|
|
249
|
+
|
|
250
|
+
expect(source).toMatch(
|
|
251
|
+
/licenseManager=\{get(AdminDashboard|Dashboard)Plugins\(\)\.LicenseManager\}/,
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
});
|