@oneuptime/common 13.0.8 → 14.0.0
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/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- 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/Index.ts +2 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- 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/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/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 +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -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/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- 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/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/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/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/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/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- 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/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +181 -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/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -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/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/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- 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/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- 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/Graphs/DayUptimeGraph.tsx +123 -15
- 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/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- 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/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/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/Index.js +2 -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/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/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- 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/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/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 +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- 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/MonitorCriteriaEvaluator.js +449 -261
- 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/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/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/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/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.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/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/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
|
@@ -12,6 +12,13 @@ import EmailTemplateType from "../../../Types/Email/EmailTemplateType";
|
|
|
12
12
|
import HashedString from "../../../Types/HashedString";
|
|
13
13
|
import ObjectID from "../../../Types/ObjectID";
|
|
14
14
|
import { getJestSpyOn } from "../../Spy";
|
|
15
|
+
import {
|
|
16
|
+
createLicenseSnapshotWithStatus,
|
|
17
|
+
installFakeEnterpriseModule,
|
|
18
|
+
uninstallEnterpriseModule,
|
|
19
|
+
} from "../Enterprise/FakeEnterpriseModule";
|
|
20
|
+
import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
|
|
21
|
+
import logger from "../../../Server/Utils/Logger";
|
|
15
22
|
import {
|
|
16
23
|
afterEach,
|
|
17
24
|
beforeEach,
|
|
@@ -21,6 +28,28 @@ import {
|
|
|
21
28
|
test,
|
|
22
29
|
} from "@jest/globals";
|
|
23
30
|
|
|
31
|
+
/*
|
|
32
|
+
* A status page's "require SSO" is an Enterprise Edition control: honoured
|
|
33
|
+
* while SSO is active (EnterpriseEdition.isFeatureActive(SSO)), relaxed on the
|
|
34
|
+
* Community Edition and on an Enterprise install whose license lapsed, where
|
|
35
|
+
* status page SSO login does not exist or refuses. Billing and the edition are
|
|
36
|
+
* pinned so the suite tests the same thing locally and in CI (whose
|
|
37
|
+
* config.env sets BILLING_ENABLED=true).
|
|
38
|
+
*/
|
|
39
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
40
|
+
const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
|
|
41
|
+
jest.requireActual(
|
|
42
|
+
"../Enterprise/TestBillingFlag",
|
|
43
|
+
) as typeof import("../Enterprise/TestBillingFlag");
|
|
44
|
+
|
|
45
|
+
return billingFlag.withLiveBillingFlag(
|
|
46
|
+
jest.requireActual("../../../Server/EnvironmentConfig") as Record<
|
|
47
|
+
string,
|
|
48
|
+
unknown
|
|
49
|
+
>,
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
24
53
|
class TestService extends Service {
|
|
25
54
|
public async completeCreation(
|
|
26
55
|
user: StatusPagePrivateUser,
|
|
@@ -49,6 +78,8 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
|
|
|
49
78
|
beforeEach(() => {
|
|
50
79
|
jest.useFakeTimers();
|
|
51
80
|
jest.setSystemTime(FROZEN_NOW);
|
|
81
|
+
setTestBillingEnabled(false);
|
|
82
|
+
installFakeEnterpriseModule();
|
|
52
83
|
|
|
53
84
|
service = new TestService();
|
|
54
85
|
statusPage = new StatusPage();
|
|
@@ -86,6 +117,8 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
|
|
|
86
117
|
afterEach(() => {
|
|
87
118
|
jest.useRealTimers();
|
|
88
119
|
jest.restoreAllMocks();
|
|
120
|
+
uninstallEnterpriseModule();
|
|
121
|
+
setTestBillingEnabled(false);
|
|
89
122
|
});
|
|
90
123
|
|
|
91
124
|
test.each([false, undefined])(
|
|
@@ -112,6 +145,67 @@ describe("StatusPagePrivateUserService invitation login policy", () => {
|
|
|
112
145
|
},
|
|
113
146
|
);
|
|
114
147
|
|
|
148
|
+
test("the requirement still holds on the Enterprise Edition during the grace period", async () => {
|
|
149
|
+
installFakeEnterpriseModule({
|
|
150
|
+
snapshot: createLicenseSnapshotWithStatus("grace"),
|
|
151
|
+
});
|
|
152
|
+
statusPage.requireSsoForLogin = true;
|
|
153
|
+
|
|
154
|
+
await expect(service.completeCreation(user)).resolves.toBe(user);
|
|
155
|
+
|
|
156
|
+
expect(update).not.toHaveBeenCalled();
|
|
157
|
+
expect(sendMail).not.toHaveBeenCalled();
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test.each(["expired", "missing", "invalid"] as const)(
|
|
161
|
+
"with a lapsed (%s) license a page that required SSO gets a usable password invitation, as on the Community Edition",
|
|
162
|
+
async (status: "expired" | "missing" | "invalid") => {
|
|
163
|
+
getJestSpyOn(logger, "warn").mockImplementation((): void => {
|
|
164
|
+
return undefined;
|
|
165
|
+
});
|
|
166
|
+
installFakeEnterpriseModule({
|
|
167
|
+
snapshot: createLicenseSnapshotWithStatus(status),
|
|
168
|
+
});
|
|
169
|
+
statusPage.requireSsoForLogin = true;
|
|
170
|
+
|
|
171
|
+
await expect(service.completeCreation(user)).resolves.toBe(user);
|
|
172
|
+
|
|
173
|
+
// Status page SSO refuses while the license is lapsed: without a password link the user could not sign in.
|
|
174
|
+
expect(update).toHaveBeenCalledTimes(1);
|
|
175
|
+
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
176
|
+
expect(sendMail).toHaveBeenCalledWith(
|
|
177
|
+
expect.objectContaining({
|
|
178
|
+
templateType: EmailTemplateType.StatusPageWelcomeEmail,
|
|
179
|
+
}),
|
|
180
|
+
expect.anything(),
|
|
181
|
+
);
|
|
182
|
+
},
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
test.each([false, true])(
|
|
186
|
+
"on the Community Edition (billing=%p) a page that required SSO still gets a usable password invitation",
|
|
187
|
+
async (billing: boolean) => {
|
|
188
|
+
setTestBillingEnabled(billing);
|
|
189
|
+
uninstallEnterpriseModule();
|
|
190
|
+
statusPage.requireSsoForLogin = true;
|
|
191
|
+
|
|
192
|
+
await expect(service.completeCreation(user)).resolves.toBe(user);
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* Status page SSO does not exist on the Community Edition, so without a
|
|
196
|
+
* password link the invited user would have no way to sign in at all.
|
|
197
|
+
*/
|
|
198
|
+
expect(update).toHaveBeenCalledTimes(1);
|
|
199
|
+
expect(sendMail).toHaveBeenCalledTimes(1);
|
|
200
|
+
expect(sendMail).toHaveBeenCalledWith(
|
|
201
|
+
expect.objectContaining({
|
|
202
|
+
templateType: EmailTemplateType.StatusPageWelcomeEmail,
|
|
203
|
+
}),
|
|
204
|
+
expect.anything(),
|
|
205
|
+
);
|
|
206
|
+
},
|
|
207
|
+
);
|
|
208
|
+
|
|
115
209
|
test("SSO sign-ups do not create an unused password-reset credential", async () => {
|
|
116
210
|
user.isSsoUser = true;
|
|
117
211
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
1
2
|
import DatabaseConfig from "../../../Server/DatabaseConfig";
|
|
2
3
|
import { EncryptionSecret } from "../../../Server/EnvironmentConfig";
|
|
3
4
|
import MailService from "../../../Server/Services/MailService";
|
|
@@ -928,6 +929,40 @@ describe("UserService -- master-admin authentication management", () => {
|
|
|
928
929
|
expect(first).not.toBe(second);
|
|
929
930
|
});
|
|
930
931
|
|
|
932
|
+
test("mints the token from the CSPRNG, never ObjectID's non-crypto fallback", async () => {
|
|
933
|
+
/*
|
|
934
|
+
* The token is a bearer secret: whoever holds it can set the password.
|
|
935
|
+
* ObjectID.generate() falls back to Math.random() when no Web Crypto
|
|
936
|
+
* API is present, so the token comes from node:crypto directly.
|
|
937
|
+
*/
|
|
938
|
+
const randomUUIDSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
|
|
939
|
+
crypto,
|
|
940
|
+
"randomUUID",
|
|
941
|
+
);
|
|
942
|
+
const objectIdSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
|
|
943
|
+
ObjectID,
|
|
944
|
+
"generate",
|
|
945
|
+
);
|
|
946
|
+
|
|
947
|
+
resolveUser(buildUser({ id: userId, email: "user@example.com" }));
|
|
948
|
+
|
|
949
|
+
try {
|
|
950
|
+
await UserService.sendPasswordResetLink({ userId: userId });
|
|
951
|
+
|
|
952
|
+
const tokenInEmail: string = sentLink().split("/reset-password/")[1]!;
|
|
953
|
+
|
|
954
|
+
expect(randomUUIDSpy).toHaveBeenCalledTimes(1);
|
|
955
|
+
expect(tokenInEmail).toBe(randomUUIDSpy.mock.results[0]!.value);
|
|
956
|
+
expect(tokenInEmail).toMatch(
|
|
957
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,
|
|
958
|
+
);
|
|
959
|
+
expect(objectIdSpy).not.toHaveBeenCalled();
|
|
960
|
+
} finally {
|
|
961
|
+
randomUUIDSpy.mockRestore();
|
|
962
|
+
objectIdSpy.mockRestore();
|
|
963
|
+
}
|
|
964
|
+
});
|
|
965
|
+
|
|
931
966
|
test("the link points at the ordinary /accounts/reset-password page", async () => {
|
|
932
967
|
/*
|
|
933
968
|
* There is deliberately no admin-specific redemption route: the link an
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import UserService from "../../../Server/Services/UserService";
|
|
2
|
-
import
|
|
2
|
+
import EnterpriseEdition from "../../../Server/Enterprise/EnterpriseEdition";
|
|
3
3
|
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
4
4
|
import User from "../../../Models/DatabaseModels/User";
|
|
5
5
|
import Email from "../../../Types/Email";
|
|
6
6
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
7
7
|
import ObjectID from "../../../Types/ObjectID";
|
|
8
8
|
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
9
|
+
import FakeEnterpriseModule, {
|
|
10
|
+
installFakeEnterpriseModule,
|
|
11
|
+
uninstallEnterpriseModule,
|
|
12
|
+
} from "../Enterprise/FakeEnterpriseModule";
|
|
13
|
+
import { setTestBillingEnabled } from "../Enterprise/TestBillingFlag";
|
|
9
14
|
import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
|
|
10
15
|
|
|
11
16
|
/*
|
|
@@ -21,6 +26,11 @@ import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
|
|
|
21
26
|
* else; a check on the invitation would have left signup and SSO as open doors
|
|
22
27
|
* beside it.
|
|
23
28
|
*
|
|
29
|
+
* The limit itself is the Enterprise license client's (ee/Server/License); core
|
|
30
|
+
* asks it through EnterpriseEdition.assertSeatAvailableForNewUser, which is a
|
|
31
|
+
* no-op on the Community Edition. What the license client decides (billing,
|
|
32
|
+
* license status, the live user count) is tested in ee/Tests/Server/License.
|
|
33
|
+
*
|
|
24
34
|
* The single most important assertion in this file is the isRoot one. Team
|
|
25
35
|
* invitations create the invited user with `props: { isRoot: true }`
|
|
26
36
|
* (TeamMemberService.onBeforeCreate), so the usual "internal writes bypass
|
|
@@ -28,17 +38,20 @@ import { beforeEach, afterEach, describe, expect, it } from "@jest/globals";
|
|
|
28
38
|
* asked for.
|
|
29
39
|
*/
|
|
30
40
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
// CI's config.env sets BILLING_ENABLED=true; this suite pins it per test.
|
|
42
|
+
jest.mock("../../../Server/EnvironmentConfig", () => {
|
|
43
|
+
const billingFlag: typeof import("../Enterprise/TestBillingFlag") =
|
|
44
|
+
jest.requireActual(
|
|
45
|
+
"../Enterprise/TestBillingFlag",
|
|
46
|
+
) as typeof import("../Enterprise/TestBillingFlag");
|
|
47
|
+
|
|
48
|
+
return billingFlag.withLiveBillingFlag(
|
|
49
|
+
jest.requireActual("../../../Server/EnvironmentConfig") as Record<
|
|
50
|
+
string,
|
|
51
|
+
unknown
|
|
52
|
+
>,
|
|
53
|
+
);
|
|
54
|
+
});
|
|
42
55
|
|
|
43
56
|
type OnBeforeCreateFunction = (createBy: CreateBy<User>) => Promise<unknown>;
|
|
44
57
|
|
|
@@ -71,37 +84,53 @@ const makeCreateBy: MakeCreateByFunction = (
|
|
|
71
84
|
} as unknown as CreateBy<User>;
|
|
72
85
|
};
|
|
73
86
|
|
|
74
|
-
type AssertSeatMockFunction = () => jest.Mock;
|
|
75
|
-
|
|
76
|
-
const assertSeatMock: AssertSeatMockFunction = (): jest.Mock => {
|
|
77
|
-
return EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser as unknown as jest.Mock;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
87
|
describe("UserService - the enterprise seat limit", () => {
|
|
88
|
+
let fake: FakeEnterpriseModule;
|
|
89
|
+
|
|
81
90
|
beforeEach(() => {
|
|
82
91
|
jest.clearAllMocks();
|
|
83
|
-
|
|
92
|
+
setTestBillingEnabled(false);
|
|
93
|
+
fake = installFakeEnterpriseModule();
|
|
84
94
|
UserService.countBy = jest.fn().mockResolvedValue(new PositiveNumber(7));
|
|
85
95
|
});
|
|
86
96
|
|
|
87
97
|
afterEach(() => {
|
|
98
|
+
uninstallEnterpriseModule();
|
|
99
|
+
setTestBillingEnabled(false);
|
|
88
100
|
jest.restoreAllMocks();
|
|
89
101
|
});
|
|
90
102
|
|
|
91
|
-
it("
|
|
103
|
+
it("asks the Enterprise license client before creating a user", async () => {
|
|
104
|
+
const assertSpy: jest.SpyInstance = jest.spyOn(
|
|
105
|
+
EnterpriseEdition,
|
|
106
|
+
"assertSeatAvailableForNewUser",
|
|
107
|
+
);
|
|
108
|
+
|
|
92
109
|
await onBeforeCreate(makeCreateBy());
|
|
93
110
|
|
|
94
|
-
expect(
|
|
111
|
+
expect(assertSpy).toHaveBeenCalledTimes(1);
|
|
112
|
+
expect(assertSpy).toHaveBeenCalledWith();
|
|
113
|
+
expect(fake.licensing.seatChecks).toBe(1);
|
|
95
114
|
});
|
|
96
115
|
|
|
97
116
|
it("refuses the create when there is no seat for the new user", async () => {
|
|
98
|
-
|
|
117
|
+
fake.licensing.seatError = new BadDataException("No seats left");
|
|
99
118
|
|
|
100
119
|
await expect(onBeforeCreate(makeCreateBy())).rejects.toBeInstanceOf(
|
|
101
120
|
BadDataException,
|
|
102
121
|
);
|
|
103
122
|
});
|
|
104
123
|
|
|
124
|
+
it("passes the license client's refusal through unchanged", async () => {
|
|
125
|
+
fake.licensing.seatError = new BadDataException(
|
|
126
|
+
"This OneUptime installation has reached the 10-user limit of its enterprise license.",
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
await expect(onBeforeCreate(makeCreateBy())).rejects.toThrow(
|
|
130
|
+
"reached the 10-user limit",
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
105
134
|
/*
|
|
106
135
|
* The one that matters. TeamMemberService creates the invited user as root,
|
|
107
136
|
* so an isRoot exemption would exempt invitations — and inviting users past
|
|
@@ -116,7 +145,21 @@ describe("UserService - the enterprise seat limit", () => {
|
|
|
116
145
|
async (_label: string, props: Record<string, unknown>) => {
|
|
117
146
|
await onBeforeCreate(makeCreateBy(props));
|
|
118
147
|
|
|
119
|
-
expect(
|
|
148
|
+
expect(fake.licensing.seatChecks).toBe(1);
|
|
149
|
+
},
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
it.each([
|
|
153
|
+
["a root write", { isRoot: true }],
|
|
154
|
+
["a master admin", { isMasterAdmin: true }],
|
|
155
|
+
])(
|
|
156
|
+
"refuses %s when the license is full",
|
|
157
|
+
async (_label: string, props: Record<string, unknown>) => {
|
|
158
|
+
fake.licensing.seatError = new BadDataException("No seats left");
|
|
159
|
+
|
|
160
|
+
await expect(onBeforeCreate(makeCreateBy(props))).rejects.toBeInstanceOf(
|
|
161
|
+
BadDataException,
|
|
162
|
+
);
|
|
120
163
|
},
|
|
121
164
|
);
|
|
122
165
|
|
|
@@ -126,7 +169,7 @@ describe("UserService - the enterprise seat limit", () => {
|
|
|
126
169
|
* that, a rejected create would still have done work; more importantly the
|
|
127
170
|
* ordering pins that nothing was inserted ahead of the check later on.
|
|
128
171
|
*/
|
|
129
|
-
|
|
172
|
+
fake.licensing.seatError = new BadDataException("No seats left");
|
|
130
173
|
|
|
131
174
|
const createBy: CreateBy<User> = makeCreateBy();
|
|
132
175
|
(createBy.data as unknown as Record<string, unknown>)["clickIds"] = {
|
|
@@ -136,47 +179,42 @@ describe("UserService - the enterprise seat limit", () => {
|
|
|
136
179
|
await expect(onBeforeCreate(createBy)).rejects.toBeInstanceOf(
|
|
137
180
|
BadDataException,
|
|
138
181
|
);
|
|
182
|
+
expect(
|
|
183
|
+
(createBy.data as unknown as Record<string, unknown>)["clickIds"],
|
|
184
|
+
).toEqual({ gclid: "abc" });
|
|
139
185
|
});
|
|
140
186
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const call: Record<string, unknown> = assertSeatMock().mock
|
|
149
|
-
.calls[0]![0] as Record<string, unknown>;
|
|
150
|
-
|
|
151
|
-
return call["getLocalUserCount"] as GetLocalUserCountFunction;
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
it("counts every user on this installation, not just the caller's project", async () => {
|
|
155
|
-
await onBeforeCreate(makeCreateBy());
|
|
187
|
+
/*
|
|
188
|
+
* Counting users is the license client's business, and only when a limit
|
|
189
|
+
* applies. The create path of every user on the installation must not pay
|
|
190
|
+
* for a count in core.
|
|
191
|
+
*/
|
|
192
|
+
it("does not count users itself", async () => {
|
|
193
|
+
await onBeforeCreate(makeCreateBy());
|
|
156
194
|
|
|
157
|
-
|
|
195
|
+
expect(UserService.countBy).not.toHaveBeenCalled();
|
|
196
|
+
});
|
|
158
197
|
|
|
159
|
-
|
|
198
|
+
describe("on the Community Edition", () => {
|
|
199
|
+
beforeEach(() => {
|
|
200
|
+
uninstallEnterpriseModule();
|
|
201
|
+
});
|
|
160
202
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
).
|
|
203
|
+
it("has no seat limit at all", async () => {
|
|
204
|
+
await expect(onBeforeCreate(makeCreateBy())).resolves.toBeDefined();
|
|
205
|
+
expect(UserService.countBy).not.toHaveBeenCalled();
|
|
206
|
+
});
|
|
164
207
|
|
|
165
|
-
|
|
166
|
-
expect(
|
|
167
|
-
true,
|
|
168
|
-
);
|
|
208
|
+
it("has no seat limit for root writes either", async () => {
|
|
209
|
+
await expect(
|
|
210
|
+
onBeforeCreate(makeCreateBy({ isRoot: true })),
|
|
211
|
+
).resolves.toBeDefined();
|
|
169
212
|
});
|
|
170
213
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
* Community Edition, and on a licence with no seat limit, it must never
|
|
174
|
-
* run at all. This is the create path of every user on the installation.
|
|
175
|
-
*/
|
|
176
|
-
it("does not count users unless the seat check asks for it", async () => {
|
|
177
|
-
await onBeforeCreate(makeCreateBy());
|
|
214
|
+
it("has no seat limit with billing on", async () => {
|
|
215
|
+
setTestBillingEnabled(true);
|
|
178
216
|
|
|
179
|
-
expect(
|
|
217
|
+
await expect(onBeforeCreate(makeCreateBy())).resolves.toBeDefined();
|
|
180
218
|
});
|
|
181
219
|
});
|
|
182
220
|
});
|