@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "@testing-library/jest-dom";
|
|
2
|
-
import { render, screen
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
3
|
import React, { ReactElement } from "react";
|
|
4
4
|
import {
|
|
5
5
|
afterEach,
|
|
@@ -12,19 +12,18 @@ import {
|
|
|
12
12
|
|
|
13
13
|
/*
|
|
14
14
|
* UserElement can only show an email the caller actually asked the API for,
|
|
15
|
-
* and an avatar it was given an id for.
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* and an avatar it was given an id for. The notification-log tables passed
|
|
16
|
+
* `selectMoreFields={{user: {name}}}`: BaseModelTable's getSelectFields
|
|
17
|
+
* ASSIGNS selectMoreFields over the select the columns built, rather than
|
|
18
|
+
* merging into it, so the narrower one won and only the name was ever fetched.
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* select the columns built, rather than merging into it, so the narrower
|
|
22
|
-
* one won and only the name was ever fetched.
|
|
23
|
-
* - the team compliance table hand-builds its user object and left out the
|
|
24
|
-
* id, so the avatar route could not be built at all.
|
|
20
|
+
* That is invisible in a screenshot of a seeded dev project (short names, a
|
|
21
|
+
* default avatar) and silent in every other suite, so it is pinned here.
|
|
25
22
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
23
|
+
* The other call site this suite used to pin - the team compliance status
|
|
24
|
+
* table, which hand-builds its user object - is Enterprise Edition code since
|
|
25
|
+
* the Community / Enterprise split; its tests moved with it to
|
|
26
|
+
* ee/Tests/UI/TeamCompliance/TeamCompliance.test.tsx.
|
|
28
27
|
*/
|
|
29
28
|
|
|
30
29
|
const BLANK_PROFILE_PIC: string = "data:image/svg+xml;base64,////YXZhdGFy";
|
|
@@ -84,16 +83,12 @@ import TelegramLogsTable from "../../../../App/FeatureSet/Dashboard/src/Componen
|
|
|
84
83
|
import WebhookLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WebhookLogsTable";
|
|
85
84
|
import WhatsAppLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WhatsAppLogsTable";
|
|
86
85
|
import WorkspaceLogsTable from "../../../../App/FeatureSet/Dashboard/src/Components/NotificationLogs/WorkspaceLogsTable";
|
|
87
|
-
import TeamComplianceStatusTable from "../../../../App/FeatureSet/Dashboard/src/Components/Team/TeamComplianceStatusTable";
|
|
88
|
-
import API from "../../../UI/Utils/API/API";
|
|
89
|
-
import ModelAPI from "../../../UI/Utils/ModelAPI/ModelAPI";
|
|
90
86
|
import ProjectUtil from "../../../UI/Utils/Project";
|
|
91
87
|
import ObjectID from "../../../Types/ObjectID";
|
|
92
88
|
|
|
93
89
|
const PROJECT_ID: ObjectID = new ObjectID(
|
|
94
90
|
"00000000-0000-4000-8000-000000000001",
|
|
95
91
|
);
|
|
96
|
-
const TEAM_ID: ObjectID = new ObjectID("00000000-0000-4000-8000-000000000002");
|
|
97
92
|
const USER_ID: string = "00000000-0000-4000-8000-000000000003";
|
|
98
93
|
|
|
99
94
|
const NOTIFICATION_LOG_TABLES: Array<{
|
|
@@ -207,78 +202,3 @@ describe("notification log tables", () => {
|
|
|
207
202
|
},
|
|
208
203
|
);
|
|
209
204
|
});
|
|
210
|
-
|
|
211
|
-
describe("team compliance status table", () => {
|
|
212
|
-
const complianceResponse: {
|
|
213
|
-
teamId: string;
|
|
214
|
-
teamName: string;
|
|
215
|
-
complianceSettings: Array<{ ruleType: string; enabled: boolean }>;
|
|
216
|
-
userComplianceStatuses: Array<{
|
|
217
|
-
userId: string;
|
|
218
|
-
userName: string;
|
|
219
|
-
userEmail: string;
|
|
220
|
-
isCompliant: boolean;
|
|
221
|
-
nonCompliantRules: Array<{ ruleType: string; reason: string }>;
|
|
222
|
-
}>;
|
|
223
|
-
} = {
|
|
224
|
-
teamId: TEAM_ID.toString(),
|
|
225
|
-
teamName: "On-Call",
|
|
226
|
-
complianceSettings: [
|
|
227
|
-
{ ruleType: "HasNotificationEmailMethod", enabled: true },
|
|
228
|
-
],
|
|
229
|
-
userComplianceStatuses: [
|
|
230
|
-
{
|
|
231
|
-
userId: USER_ID,
|
|
232
|
-
userName: "Jane Doe",
|
|
233
|
-
userEmail: "jane@acme.com",
|
|
234
|
-
isCompliant: false,
|
|
235
|
-
nonCompliantRules: [
|
|
236
|
-
{
|
|
237
|
-
ruleType: "HasNotificationEmailMethod",
|
|
238
|
-
reason: "No email notification method",
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
},
|
|
242
|
-
],
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
beforeEach(async () => {
|
|
246
|
-
jest.spyOn(ModelAPI, "getCommonHeaders").mockReturnValue({});
|
|
247
|
-
jest
|
|
248
|
-
.spyOn(API, "get")
|
|
249
|
-
.mockResolvedValue({ data: complianceResponse } as never);
|
|
250
|
-
|
|
251
|
-
render(<TeamComplianceStatusTable teamId={TEAM_ID} />);
|
|
252
|
-
|
|
253
|
-
await waitFor(() => {
|
|
254
|
-
expect(screen.getByText("Jane Doe")).toBeInTheDocument();
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
afterEach(() => {
|
|
259
|
-
jest.restoreAllMocks();
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
test("shows the member's email beside their name", () => {
|
|
263
|
-
expect(screen.getByTestId("user-email")).toHaveTextContent("jane@acme.com");
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
/*
|
|
267
|
-
* The row is hand-built from the compliance payload. Without the id the
|
|
268
|
-
* avatar route cannot be built and every member falls back to the blank
|
|
269
|
-
* picture, which reads as "nobody has a photo" rather than as a bug.
|
|
270
|
-
*/
|
|
271
|
-
test("builds the avatar from the member's own id", () => {
|
|
272
|
-
expect(screen.getAllByRole("img")[0]).toHaveAttribute(
|
|
273
|
-
"src",
|
|
274
|
-
`/api/user/profile-picture/${USER_ID}`,
|
|
275
|
-
);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
test("still shows why the member is non-compliant", () => {
|
|
279
|
-
expect(screen.getByText("Non-Compliant")).toBeInTheDocument();
|
|
280
|
-
expect(
|
|
281
|
-
screen.getByText(/No email notification method/),
|
|
282
|
-
).toBeInTheDocument();
|
|
283
|
-
});
|
|
284
|
-
});
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { act, cleanup, render, screen } from "@testing-library/react";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import {
|
|
7
|
+
afterEach,
|
|
8
|
+
beforeEach,
|
|
9
|
+
describe,
|
|
10
|
+
expect,
|
|
11
|
+
jest,
|
|
12
|
+
test,
|
|
13
|
+
} from "@jest/globals";
|
|
14
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
15
|
+
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
16
|
+
import { JSONArray } from "../../../Types/JSON";
|
|
17
|
+
import API from "../../../UI/Utils/API/API";
|
|
18
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
19
|
+
import StatusPageUtil from "../../../../App/FeatureSet/StatusPage/src/Utils/StatusPage";
|
|
20
|
+
import UserUtil from "../../../../App/FeatureSet/StatusPage/src/Utils/User";
|
|
21
|
+
import SsoPage from "../../../../App/FeatureSet/StatusPage/src/Pages/Accounts/SSO";
|
|
22
|
+
import { getJestSpyOn } from "../../Spy";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Status page > "Log in with SSO". It lists the page's SAML and OIDC
|
|
26
|
+
* providers. On the Community Edition status page SSO does not exist and the
|
|
27
|
+
* server lists none (design v2 section 0), and a page can also simply have no
|
|
28
|
+
* enabled provider. When BOTH lists come back empty the page says single
|
|
29
|
+
* sign-on is not available and links back to the password sign-in - and that
|
|
30
|
+
* is the only message it shows: not also the SAML list's "No items found."
|
|
31
|
+
* and the OIDC list's "No SSO Providers Configured or Enabled".
|
|
32
|
+
*
|
|
33
|
+
* The lists are the real ModelList, fetching through a stubbed API.post, so
|
|
34
|
+
* what is asserted is what a visitor would see.
|
|
35
|
+
*
|
|
36
|
+
* Translations resolve against the StatusPage's real en.json and NEVER fall
|
|
37
|
+
* back to a call's defaultValue: a key missing from the locales renders as
|
|
38
|
+
* the bare key, so these tests fail instead of passing on the fallback text.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
jest.mock("react-i18next", () => {
|
|
42
|
+
const english: Record<string, unknown> = jest.requireActual(
|
|
43
|
+
"../../../../App/FeatureSet/StatusPage/src/Locales/en.json",
|
|
44
|
+
) as Record<string, unknown>;
|
|
45
|
+
|
|
46
|
+
type TranslateOptions = Record<string, unknown> & {
|
|
47
|
+
keySeparator?: string | false;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const translate: (key: string, options?: TranslateOptions) => string = (
|
|
51
|
+
key: string,
|
|
52
|
+
options?: TranslateOptions,
|
|
53
|
+
): string => {
|
|
54
|
+
const segments: Array<string> =
|
|
55
|
+
options?.keySeparator === false ? [key] : key.split(".");
|
|
56
|
+
let node: unknown = english;
|
|
57
|
+
|
|
58
|
+
for (const part of segments) {
|
|
59
|
+
node =
|
|
60
|
+
node !== null && typeof node === "object"
|
|
61
|
+
? (node as Record<string, unknown>)[part]
|
|
62
|
+
: undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (typeof node !== "string") {
|
|
66
|
+
return key;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return node.replace(
|
|
70
|
+
/\{\{(\w+)\}\}/g,
|
|
71
|
+
(_placeholder: string, name: string): string => {
|
|
72
|
+
return String(options?.[name] ?? "");
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
useTranslation: () => {
|
|
79
|
+
return { t: translate };
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
type ProviderRow = { _id: string; name: string };
|
|
85
|
+
|
|
86
|
+
const STATUS_PAGE_ID: ObjectID = new ObjectID(
|
|
87
|
+
"11111111-1111-4111-8111-111111111111",
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const LOCALES_DIR: string = path.resolve(
|
|
91
|
+
__dirname,
|
|
92
|
+
"..",
|
|
93
|
+
"..",
|
|
94
|
+
"..",
|
|
95
|
+
"..",
|
|
96
|
+
"App",
|
|
97
|
+
"FeatureSet",
|
|
98
|
+
"StatusPage",
|
|
99
|
+
"src",
|
|
100
|
+
"Locales",
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const NOT_AVAILABLE: string =
|
|
104
|
+
"Single sign-on is not available for this status page. Sign in with your email and password instead.";
|
|
105
|
+
const BACK_TO_SIGN_IN: string = "Back to sign in";
|
|
106
|
+
// The two empty states the lists used to add on top of the notice.
|
|
107
|
+
const MODEL_LIST_FALLBACK: string = "No items found.";
|
|
108
|
+
const NO_PROVIDERS: string = "No SSO Providers Configured or Enabled";
|
|
109
|
+
|
|
110
|
+
const OKTA: ProviderRow = {
|
|
111
|
+
_id: "22222222-2222-4222-8222-222222222222",
|
|
112
|
+
name: "Okta",
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
let samlProviders: Array<ProviderRow> | Error = [];
|
|
116
|
+
let oidcProviders: Array<ProviderRow> | Error = [];
|
|
117
|
+
let lookedUp: Array<string> = [];
|
|
118
|
+
|
|
119
|
+
const readLocale: (file: string) => Record<string, any> = (
|
|
120
|
+
file: string,
|
|
121
|
+
): Record<string, any> => {
|
|
122
|
+
return JSON.parse(
|
|
123
|
+
fs.readFileSync(path.join(LOCALES_DIR, file), "utf8"),
|
|
124
|
+
) as Record<string, any>;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const renderPage: () => Promise<void> = async (): Promise<void> => {
|
|
128
|
+
await act(async () => {
|
|
129
|
+
render(
|
|
130
|
+
<SsoPage
|
|
131
|
+
statusPageName="Customer Status"
|
|
132
|
+
logoFileId={new ObjectID(STATUS_PAGE_ID.toString())}
|
|
133
|
+
/>,
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const providerLists: () => HTMLElement = (): HTMLElement => {
|
|
139
|
+
return screen.getByTestId("status-page-sso-provider-lists");
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
describe("Status page SSO sign-in when no provider can be offered", () => {
|
|
143
|
+
let isPreview: boolean = false;
|
|
144
|
+
|
|
145
|
+
beforeEach(() => {
|
|
146
|
+
isPreview = false;
|
|
147
|
+
samlProviders = [];
|
|
148
|
+
oidcProviders = [];
|
|
149
|
+
lookedUp = [];
|
|
150
|
+
|
|
151
|
+
getJestSpyOn(StatusPageUtil, "getStatusPageId").mockReturnValue(
|
|
152
|
+
STATUS_PAGE_ID,
|
|
153
|
+
);
|
|
154
|
+
getJestSpyOn(StatusPageUtil, "isPrivateStatusPage").mockReturnValue(true);
|
|
155
|
+
getJestSpyOn(StatusPageUtil, "requiresMasterPassword").mockReturnValue(
|
|
156
|
+
false,
|
|
157
|
+
);
|
|
158
|
+
getJestSpyOn(StatusPageUtil, "getSafeRedirectUrl").mockReturnValue(null);
|
|
159
|
+
getJestSpyOn(StatusPageUtil, "isPreviewPage").mockImplementation(
|
|
160
|
+
(): boolean => {
|
|
161
|
+
return isPreview;
|
|
162
|
+
},
|
|
163
|
+
);
|
|
164
|
+
getJestSpyOn(UserUtil, "isLoggedIn").mockReturnValue(false);
|
|
165
|
+
getJestSpyOn(Navigation, "navigate").mockImplementation(() => {});
|
|
166
|
+
getJestSpyOn(API, "getFriendlyMessage").mockReturnValue(
|
|
167
|
+
"Could not load the SAML providers.",
|
|
168
|
+
);
|
|
169
|
+
getJestSpyOn(API, "post").mockImplementation(
|
|
170
|
+
async (options: {
|
|
171
|
+
url: { toString: () => string };
|
|
172
|
+
}): Promise<HTTPResponse<JSONArray>> => {
|
|
173
|
+
const url: string = options.url.toString();
|
|
174
|
+
lookedUp.push(url);
|
|
175
|
+
|
|
176
|
+
const answer: Array<ProviderRow> | Error = url.endsWith(
|
|
177
|
+
`/oidc/${STATUS_PAGE_ID.toString()}`,
|
|
178
|
+
)
|
|
179
|
+
? oidcProviders
|
|
180
|
+
: samlProviders;
|
|
181
|
+
|
|
182
|
+
if (answer instanceof Error) {
|
|
183
|
+
throw answer;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return new HTTPResponse<JSONArray>(200, answer, {});
|
|
187
|
+
},
|
|
188
|
+
);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
afterEach(() => {
|
|
192
|
+
cleanup();
|
|
193
|
+
jest.restoreAllMocks();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test("both lists empty (the Community Edition): explains and links back to sign-in", async () => {
|
|
197
|
+
await renderPage();
|
|
198
|
+
|
|
199
|
+
const notice: HTMLElement = await screen.findByTestId(
|
|
200
|
+
"status-page-sso-unavailable",
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
expect(notice).toHaveTextContent(NOT_AVAILABLE);
|
|
204
|
+
expect(screen.getByText(BACK_TO_SIGN_IN).closest("a")).toHaveAttribute(
|
|
205
|
+
"href",
|
|
206
|
+
"/login",
|
|
207
|
+
);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("both lists empty: the notice is the only message on the page", async () => {
|
|
211
|
+
await renderPage();
|
|
212
|
+
|
|
213
|
+
expect(
|
|
214
|
+
await screen.findByTestId("status-page-sso-unavailable"),
|
|
215
|
+
).toBeVisible();
|
|
216
|
+
expect(screen.getAllByText(NOT_AVAILABLE)).toHaveLength(1);
|
|
217
|
+
expect(screen.queryByText(MODEL_LIST_FALLBACK)).not.toBeInTheDocument();
|
|
218
|
+
expect(screen.queryByText(NO_PROVIDERS)).not.toBeInTheDocument();
|
|
219
|
+
|
|
220
|
+
// Both lists did load (and stay mounted), but take no room on the page.
|
|
221
|
+
expect(lookedUp).toHaveLength(2);
|
|
222
|
+
expect(providerLists()).toHaveAttribute("hidden");
|
|
223
|
+
expect(providerLists()).not.toBeVisible();
|
|
224
|
+
expect(providerLists()).toHaveTextContent("");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("the notice's strings come from the locale files, not the fallback text", async () => {
|
|
228
|
+
await renderPage();
|
|
229
|
+
|
|
230
|
+
const english: Record<string, any> = readLocale("en.json");
|
|
231
|
+
|
|
232
|
+
expect(english["accounts"]["sso"]["notAvailable"]).toBe(NOT_AVAILABLE);
|
|
233
|
+
expect(english["accounts"]["sso"]["backToLogin"]).toBe(BACK_TO_SIGN_IN);
|
|
234
|
+
// A key missing from en.json would render as the key itself.
|
|
235
|
+
expect(
|
|
236
|
+
screen.queryByText("accounts.sso.notAvailable"),
|
|
237
|
+
).not.toBeInTheDocument();
|
|
238
|
+
expect(
|
|
239
|
+
screen.queryByText("accounts.sso.backToLogin"),
|
|
240
|
+
).not.toBeInTheDocument();
|
|
241
|
+
expect(screen.getByText(BACK_TO_SIGN_IN)).toBeInTheDocument();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("every StatusPage locale translates both strings", () => {
|
|
245
|
+
const english: Record<string, any> = readLocale("en.json");
|
|
246
|
+
const locales: Array<string> = fs
|
|
247
|
+
.readdirSync(LOCALES_DIR)
|
|
248
|
+
.filter((file: string) => {
|
|
249
|
+
return file.endsWith(".json") && file !== "en.json";
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
expect(locales).toHaveLength(16);
|
|
253
|
+
|
|
254
|
+
for (const file of locales) {
|
|
255
|
+
const sso: Record<string, unknown> = readLocale(file)["accounts"]["sso"];
|
|
256
|
+
|
|
257
|
+
for (const key of ["notAvailable", "backToLogin"]) {
|
|
258
|
+
const value: unknown = sso[key];
|
|
259
|
+
|
|
260
|
+
expect([file, key, typeof value]).toEqual([file, key, "string"]);
|
|
261
|
+
expect((value as string).trim()).not.toBe("");
|
|
262
|
+
expect([file, key, value]).not.toEqual([
|
|
263
|
+
file,
|
|
264
|
+
key,
|
|
265
|
+
english["accounts"]["sso"][key],
|
|
266
|
+
]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("on a preview page the link goes back to the preview's sign-in", async () => {
|
|
272
|
+
isPreview = true;
|
|
273
|
+
|
|
274
|
+
await renderPage();
|
|
275
|
+
|
|
276
|
+
expect(screen.getByText(BACK_TO_SIGN_IN).closest("a")).toHaveAttribute(
|
|
277
|
+
"href",
|
|
278
|
+
`/status-page/${STATUS_PAGE_ID.toString()}/login`,
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test.each([
|
|
283
|
+
["a SAML provider", "saml"],
|
|
284
|
+
["an OIDC provider", "oidc"],
|
|
285
|
+
])(
|
|
286
|
+
"with %s it lists it and shows no notice, and no empty message for the other list",
|
|
287
|
+
async (_label: string, protocol: string) => {
|
|
288
|
+
if (protocol === "saml") {
|
|
289
|
+
samlProviders = [OKTA];
|
|
290
|
+
} else {
|
|
291
|
+
oidcProviders = [OKTA];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
await renderPage();
|
|
295
|
+
|
|
296
|
+
expect(await screen.findByText("Okta")).toBeVisible();
|
|
297
|
+
expect(providerLists()).not.toHaveAttribute("hidden");
|
|
298
|
+
expect(
|
|
299
|
+
screen.queryByTestId("status-page-sso-unavailable"),
|
|
300
|
+
).not.toBeInTheDocument();
|
|
301
|
+
expect(screen.queryByText(MODEL_LIST_FALLBACK)).not.toBeInTheDocument();
|
|
302
|
+
expect(screen.queryByText(NO_PROVIDERS)).not.toBeInTheDocument();
|
|
303
|
+
},
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
test("a list that failed to load is not taken for 'no providers'", async () => {
|
|
307
|
+
samlProviders = new Error("boom");
|
|
308
|
+
|
|
309
|
+
await renderPage();
|
|
310
|
+
|
|
311
|
+
expect(
|
|
312
|
+
await screen.findByText("Could not load the SAML providers."),
|
|
313
|
+
).toBeVisible();
|
|
314
|
+
expect(providerLists()).not.toHaveAttribute("hidden");
|
|
315
|
+
expect(
|
|
316
|
+
screen.queryByTestId("status-page-sso-unavailable"),
|
|
317
|
+
).not.toBeInTheDocument();
|
|
318
|
+
});
|
|
319
|
+
});
|