@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.
Files changed (333) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Monitor.ts +3 -2
  4. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  5. package/Scripts/generate-service-worker.js +65 -4
  6. package/Server/API/BaseAPI.ts +26 -5
  7. package/Server/API/GlobalConfigAPI.ts +228 -462
  8. package/Server/API/ProjectOIDC.ts +25 -16
  9. package/Server/API/ProjectSSO.ts +24 -16
  10. package/Server/API/StatusPageAPI.ts +100 -42
  11. package/Server/API/TeamMemberAPI.ts +10 -1
  12. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  13. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  14. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  15. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  16. package/Server/EnvironmentConfig.ts +147 -2
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  19. package/Server/Middleware/UserAuthorization.ts +38 -16
  20. package/Server/Services/AuditLogService.ts +84 -1079
  21. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  22. package/Server/Services/GlobalConfigService.ts +80 -1
  23. package/Server/Services/MonitorProbeService.ts +116 -20
  24. package/Server/Services/MonitorService.ts +56 -4
  25. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  26. package/Server/Services/MonitorTemplateService.ts +26 -0
  27. package/Server/Services/ProjectService.ts +284 -0
  28. package/Server/Services/RumSessionPinService.ts +25 -6
  29. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  30. package/Server/Services/StatusPageService.ts +78 -1
  31. package/Server/Services/TeamMemberService.ts +11 -0
  32. package/Server/Services/TeamService.ts +10 -0
  33. package/Server/Services/UserService.ts +10 -17
  34. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  35. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  36. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  37. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  38. package/Server/Types/Markdown.ts +41 -0
  39. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  40. package/Server/Utils/EditionEnforcement.ts +233 -0
  41. package/Server/Utils/FrontendEnvironment.ts +41 -2
  42. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  43. package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
  44. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  45. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
  46. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  47. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  48. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  49. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  50. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  51. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  52. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  53. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  54. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  55. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  56. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  57. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  58. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  59. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  60. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  61. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  62. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  63. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  64. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  65. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  66. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  67. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  68. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  69. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  70. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  71. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  72. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  73. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  74. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  75. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  76. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  77. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  78. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  79. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  80. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  81. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  82. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  83. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  84. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  85. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  86. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  87. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  88. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  89. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  90. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  91. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  92. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  93. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  95. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  96. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  97. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  98. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  99. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  100. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  101. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  102. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  103. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  104. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  105. package/Tests/Server/Types/Markdown.test.ts +181 -0
  106. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  107. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  108. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  109. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  110. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  111. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  112. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
  113. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  114. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  115. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  116. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  117. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  118. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  119. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  120. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  121. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  122. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  123. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  124. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  125. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  126. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  127. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  128. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  129. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  130. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  131. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  132. package/Types/API/Hostname.ts +63 -16
  133. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  134. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  135. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  136. package/Types/Database/CanonicalModelInstance.ts +102 -0
  137. package/Types/Database/TableColumn.ts +20 -6
  138. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  139. package/Types/IP/IPv6.ts +6 -1
  140. package/Types/Monitor/MonitorStep.ts +6 -1
  141. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  142. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  143. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  144. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  145. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  146. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  147. package/UI/Components/ModelList/ModelList.tsx +11 -1
  148. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  149. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  150. package/UI/esbuild-enterprise.js +263 -0
  151. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  152. package/Utils/HostAddressUtil.ts +94 -0
  153. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  154. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  155. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  156. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  157. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  158. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  159. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  161. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  162. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  163. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  164. package/build/dist/Server/API/BaseAPI.js +26 -5
  165. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  166. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  167. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  168. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  169. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  170. package/build/dist/Server/API/ProjectSSO.js +24 -16
  171. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  172. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  173. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  174. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  175. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  176. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  177. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  178. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  179. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  180. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  181. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  182. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  183. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  184. package/build/dist/Server/EnvironmentConfig.js +84 -2
  185. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  190. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  191. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  192. package/build/dist/Server/Services/AuditLogService.js +71 -740
  193. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  194. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  195. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  196. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  197. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  198. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  199. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  200. package/build/dist/Server/Services/MonitorService.js +45 -4
  201. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  202. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  203. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  204. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  205. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  206. package/build/dist/Server/Services/ProjectService.js +214 -0
  207. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  208. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  209. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  210. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  211. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  212. package/build/dist/Server/Services/StatusPageService.js +71 -0
  213. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  214. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  215. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  216. package/build/dist/Server/Services/TeamService.js +9 -0
  217. package/build/dist/Server/Services/TeamService.js.map +1 -1
  218. package/build/dist/Server/Services/UserService.js +10 -16
  219. package/build/dist/Server/Services/UserService.js.map +1 -1
  220. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  221. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  222. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  223. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  224. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  225. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  226. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  227. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  228. package/build/dist/Server/Types/Markdown.js +31 -0
  229. package/build/dist/Server/Types/Markdown.js.map +1 -1
  230. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  231. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  232. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  233. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  234. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  235. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  236. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  237. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  238. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
  239. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  240. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  241. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  242. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
  243. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  245. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  246. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  247. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  248. package/build/dist/Types/API/Hostname.js +59 -11
  249. package/build/dist/Types/API/Hostname.js.map +1 -1
  250. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  251. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  252. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  253. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  254. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  255. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  256. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  257. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  258. package/build/dist/Types/Database/TableColumn.js +19 -6
  259. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  260. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  261. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  262. package/build/dist/Types/IP/IPv6.js +6 -1
  263. package/build/dist/Types/IP/IPv6.js.map +1 -1
  264. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  265. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  266. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  267. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  268. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  269. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  270. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  271. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  272. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  273. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  274. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  275. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  276. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  277. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  278. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  279. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  280. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  281. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  282. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  283. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  284. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  285. package/build/dist/Utils/HostAddressUtil.js +80 -0
  286. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  287. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  288. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  289. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  290. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  291. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  292. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  293. package/jest.config.json +3 -1
  294. package/package.json +1 -1
  295. package/test-setup.sh +103 -34
  296. package/tsconfig.json +13 -0
  297. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  298. package/Server/API/TeamComplianceAPI.ts +0 -158
  299. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  300. package/Server/Services/TeamComplianceService.ts +0 -733
  301. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  302. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  303. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  304. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  305. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  306. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  307. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  308. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  309. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  310. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  311. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  312. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  313. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  314. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  315. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  316. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  317. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  318. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  319. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  320. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  321. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  322. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  323. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  324. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  325. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  326. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  327. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  328. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  329. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  330. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  331. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  332. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  333. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,217 @@
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 { cleanup, render, screen } from "@testing-library/react";
11
+ import React, { ReactElement } from "react";
12
+
13
+ /*
14
+ * Admin Dashboard > Settings > Authentication has the instance-wide "Require
15
+ * SSO for Login" toggle. SSO login is part of the Enterprise Edition, which
16
+ * the cloud (billing on) also runs, so the toggle is offered there. On the
17
+ * Community Edition the server does not enforce the setting (design v2
18
+ * section 0), so the page does not offer it as if it did something: it says
19
+ * the setting is an Enterprise Edition feature, that it is not enforced here,
20
+ * and that a saved value is kept.
21
+ *
22
+ * Billing and the edition are pinned in every test: CI's config.env sets
23
+ * BILLING_ENABLED=true.
24
+ */
25
+
26
+ let billingEnabledForTest: boolean = false;
27
+ let enterpriseEditionForTest: boolean = false;
28
+
29
+ jest.mock("../../../UI/Config", () => {
30
+ const actual: Record<string, unknown> = jest.requireActual(
31
+ "../../../UI/Config",
32
+ ) as Record<string, unknown>;
33
+
34
+ const mocked: Record<string, unknown> = { ...actual };
35
+
36
+ Object.defineProperty(mocked, "BILLING_ENABLED", {
37
+ get: (): boolean => {
38
+ return billingEnabledForTest;
39
+ },
40
+ });
41
+
42
+ Object.defineProperty(mocked, "IS_ENTERPRISE_EDITION", {
43
+ get: (): boolean => {
44
+ return enterpriseEditionForTest;
45
+ },
46
+ });
47
+
48
+ return mocked;
49
+ });
50
+
51
+ interface CardModelDetailFormField {
52
+ field: Record<string, boolean>;
53
+ description?: string | undefined;
54
+ }
55
+
56
+ interface CardModelDetailProps {
57
+ name: string;
58
+ cardProps: { title: string };
59
+ formFields: Array<CardModelDetailFormField>;
60
+ }
61
+
62
+ // Each settings card, reduced to its name, the columns its form edits and their descriptions.
63
+ jest.mock("../../../UI/Components/ModelDetail/CardModelDetail", () => {
64
+ return {
65
+ __esModule: true,
66
+ default: (props: CardModelDetailProps): ReactElement => {
67
+ return (
68
+ <section data-testid={`card-${props.name}`}>
69
+ <h2>{props.cardProps.title}</h2>
70
+ {props.formFields.map((formField: CardModelDetailFormField) => {
71
+ const column: string = Object.keys(formField.field)[0] || "";
72
+ return (
73
+ <span key={column} data-testid={`edits-${column}`}>
74
+ {column}
75
+ <span data-testid={`describes-${column}`}>
76
+ {formField.description || ""}
77
+ </span>
78
+ </span>
79
+ );
80
+ })}
81
+ </section>
82
+ );
83
+ },
84
+ };
85
+ });
86
+
87
+ jest.mock("../../../UI/Components/Page/Page", () => {
88
+ const react: typeof React = jest.requireActual("react") as typeof React;
89
+
90
+ return {
91
+ __esModule: true,
92
+ default: (props: { children?: React.ReactNode }) => {
93
+ return react.createElement("div", null, props.children);
94
+ },
95
+ };
96
+ });
97
+
98
+ jest.mock(
99
+ "../../../../App/FeatureSet/AdminDashboard/src/Pages/Settings/SideMenu",
100
+ () => {
101
+ return {
102
+ __esModule: true,
103
+ default: (): null => {
104
+ return null;
105
+ },
106
+ };
107
+ },
108
+ );
109
+
110
+ jest.mock("react-i18next", () => {
111
+ return {
112
+ useTranslation: () => {
113
+ return {
114
+ t: (key: string): string => {
115
+ return key;
116
+ },
117
+ };
118
+ },
119
+ };
120
+ });
121
+
122
+ import AuthenticationSettings from "../../../../App/FeatureSet/AdminDashboard/src/Pages/Settings/Authentication/Index";
123
+
124
+ const CE_NOTICE: RegExp =
125
+ /Requiring SSO for login is part of the OneUptime Enterprise Edition\. This server runs the Community Edition/;
126
+
127
+ /*
128
+ * On a self-hosted Enterprise Edition whose license lapsed (after the trial or
129
+ * the grace period) SSO sign-in stops, so "Require SSO" is not enforced
130
+ * either - an admin turning it on must not believe it holds regardless.
131
+ */
132
+ const LAPSE_NOTE: RegExp =
133
+ /not enforced while the Enterprise license is missing or expired \(after the 14-day trial, or 30 days after a license expires\), because SSO sign-in stops then too: users sign in with their password until a license is activated/;
134
+
135
+ // The toggle's description before the license could switch SSO off.
136
+ const RETIRED_TOGGLE_DESCRIPTION: string =
137
+ "When enabled, all users must sign in with SSO to access any project on this server. Master admins are exempt so they can always recover from a misconfigured SSO. A project's own SSO settings still apply on top of this.";
138
+
139
+ describe("Admin Dashboard authentication settings: Require SSO for Login", () => {
140
+ beforeEach(() => {
141
+ billingEnabledForTest = false;
142
+ enterpriseEditionForTest = false;
143
+ });
144
+
145
+ afterEach(() => {
146
+ cleanup();
147
+ billingEnabledForTest = false;
148
+ enterpriseEditionForTest = false;
149
+ });
150
+
151
+ test("the Community Edition shows why the setting is not available instead of the toggle", () => {
152
+ render(<AuthenticationSettings />);
153
+
154
+ expect(screen.queryByTestId("card-SSO Settings")).not.toBeInTheDocument();
155
+ expect(
156
+ screen.queryByTestId("edits-requireSsoForLogin"),
157
+ ).not.toBeInTheDocument();
158
+ expect(screen.getByText("Single Sign-On (SSO)")).toBeInTheDocument();
159
+ expect(screen.getByText(CE_NOTICE)).toBeInTheDocument();
160
+ expect(
161
+ screen.getByText(/A value saved earlier is kept/),
162
+ ).toBeInTheDocument();
163
+ });
164
+
165
+ test.each([
166
+ ["the Enterprise Edition", true, false],
167
+ ["the cloud (billing on)", false, true],
168
+ ["the cloud on the Enterprise image", true, true],
169
+ ])(
170
+ "%s offers the toggle",
171
+ (_label: string, enterprise: boolean, billing: boolean) => {
172
+ enterpriseEditionForTest = enterprise;
173
+ billingEnabledForTest = billing;
174
+
175
+ render(<AuthenticationSettings />);
176
+
177
+ expect(screen.getByTestId("card-SSO Settings")).toBeInTheDocument();
178
+ expect(
179
+ screen.getByTestId("edits-requireSsoForLogin"),
180
+ ).toBeInTheDocument();
181
+ expect(screen.queryByText(CE_NOTICE)).not.toBeInTheDocument();
182
+ },
183
+ );
184
+
185
+ test("the toggle says it is not enforced once the Enterprise license lapses", () => {
186
+ enterpriseEditionForTest = true;
187
+
188
+ render(<AuthenticationSettings />);
189
+
190
+ expect(
191
+ screen.getByTestId("describes-requireSsoForLogin"),
192
+ ).toHaveTextContent(LAPSE_NOTE);
193
+ });
194
+
195
+ test("the lapse check rejects the description the toggle had before (negative control)", () => {
196
+ expect(LAPSE_NOTE.test(RETIRED_TOGGLE_DESCRIPTION)).toBe(false);
197
+ });
198
+
199
+ test.each([
200
+ [false, false],
201
+ [true, false],
202
+ [false, true],
203
+ ])(
204
+ "the other authentication settings stay on every edition (IS_ENTERPRISE_EDITION=%p, billing=%p)",
205
+ (enterprise: boolean, billing: boolean) => {
206
+ enterpriseEditionForTest = enterprise;
207
+ billingEnabledForTest = billing;
208
+
209
+ render(<AuthenticationSettings />);
210
+
211
+ expect(screen.getByTestId("edits-disableSignup")).toBeInTheDocument();
212
+ expect(
213
+ screen.getByTestId("edits-disableUserProjectCreation"),
214
+ ).toBeInTheDocument();
215
+ },
216
+ );
217
+ });
@@ -0,0 +1,357 @@
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, screen } from "@testing-library/react";
11
+ import React, { FunctionComponent, ReactElement } from "react";
12
+
13
+ /*
14
+ * The Admin Dashboard's Enterprise plugin door and the component every
15
+ * enterprise admin shell renders.
16
+ *
17
+ * The admin dashboard has no project and no plan: a screen is shown when this
18
+ * is the Enterprise Edition (the effective edition the server writes into
19
+ * env.js) AND this bundle includes the plugin, and the upsell card otherwise.
20
+ * A shell with its own rule - the license server pages exist on OneUptime
21
+ * Cloud only - passes isEligible.
22
+ *
23
+ * Billing and the edition are pinned in every test: CI's config.env sets
24
+ * BILLING_ENABLED=true, and the admin rule must not depend on it.
25
+ */
26
+
27
+ let billingEnabledForTest: boolean = false;
28
+ let enterpriseEditionForTest: boolean = false;
29
+
30
+ jest.mock("../../../UI/Config", () => {
31
+ const actual: Record<string, unknown> = jest.requireActual(
32
+ "../../../UI/Config",
33
+ ) as Record<string, unknown>;
34
+
35
+ const mocked: Record<string, unknown> = { ...actual };
36
+
37
+ Object.defineProperty(mocked, "BILLING_ENABLED", {
38
+ get: (): boolean => {
39
+ return billingEnabledForTest;
40
+ },
41
+ });
42
+
43
+ Object.defineProperty(mocked, "IS_ENTERPRISE_EDITION", {
44
+ get: (): boolean => {
45
+ return enterpriseEditionForTest;
46
+ },
47
+ });
48
+
49
+ return mocked;
50
+ });
51
+
52
+ import EnterprisePluginPage from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/EnterprisePluginPage";
53
+ import { getAdminDashboardPlugins } from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/Plugins";
54
+ import {
55
+ ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS,
56
+ AdminDashboardEnterprisePlugins,
57
+ EnterprisePluginComponent,
58
+ } from "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/EnterprisePlugins";
59
+ import IconProp from "../../../Types/Icon/IconProp";
60
+
61
+ const UPSELL: {
62
+ title: string;
63
+ description: string;
64
+ featureName: string;
65
+ benefits: Array<{ icon: IconProp; title: string; subtitle: string }>;
66
+ } = {
67
+ title: "Global SSO",
68
+ description: "Instance-wide SAML providers.",
69
+ featureName: "Global SAML Single Sign On",
70
+ benefits: [
71
+ {
72
+ icon: IconProp.Lock,
73
+ title: "One sign-in for every project",
74
+ subtitle: "Point every project at your IdP once.",
75
+ },
76
+ ],
77
+ };
78
+
79
+ const FakeGlobalSSOList: FunctionComponent = (): ReactElement => {
80
+ return <div data-testid="fake-global-sso" />;
81
+ };
82
+
83
+ let lazyLoads: number = 0;
84
+ let releaseLazyPlugin: (() => void) | null = null;
85
+
86
+ const makeLazyPlugin: (
87
+ holdUntilReleased: boolean,
88
+ ) => EnterprisePluginComponent = (
89
+ holdUntilReleased: boolean,
90
+ ): EnterprisePluginComponent => {
91
+ return React.lazy(async (): Promise<{ default: FunctionComponent }> => {
92
+ lazyLoads += 1;
93
+
94
+ if (holdUntilReleased) {
95
+ await new Promise<void>((resolve: () => void) => {
96
+ releaseLazyPlugin = resolve;
97
+ });
98
+ }
99
+
100
+ return { default: FakeGlobalSSOList };
101
+ });
102
+ };
103
+
104
+ beforeEach(() => {
105
+ billingEnabledForTest = false;
106
+ enterpriseEditionForTest = false;
107
+ lazyLoads = 0;
108
+ releaseLazyPlugin = null;
109
+ });
110
+
111
+ afterEach(() => {
112
+ cleanup();
113
+ });
114
+
115
+ describe("EnterprisePluginPage (Admin Dashboard)", () => {
116
+ test.each([
117
+ ["self-hosted", false],
118
+ ["OneUptime Cloud", true],
119
+ ])(
120
+ "renders the plugin on the Enterprise Edition (%s)",
121
+ (_label: string, billingEnabled: boolean) => {
122
+ billingEnabledForTest = billingEnabled;
123
+ enterpriseEditionForTest = true;
124
+
125
+ render(
126
+ <EnterprisePluginPage plugin={FakeGlobalSSOList} upsell={UPSELL} />,
127
+ );
128
+
129
+ expect(screen.getByTestId("fake-global-sso")).toBeInTheDocument();
130
+ expect(
131
+ screen.queryByText("Global SAML Single Sign On"),
132
+ ).not.toBeInTheDocument();
133
+ },
134
+ );
135
+
136
+ test.each([
137
+ ["self-hosted", false],
138
+ ["OneUptime Cloud", true],
139
+ ])(
140
+ "shows the edition upsell on the Community Edition, and never downloads the plugin (%s)",
141
+ (_label: string, billingEnabled: boolean) => {
142
+ billingEnabledForTest = billingEnabled;
143
+ enterpriseEditionForTest = false;
144
+
145
+ render(
146
+ <EnterprisePluginPage plugin={makeLazyPlugin(false)} upsell={UPSELL} />,
147
+ );
148
+
149
+ expect(
150
+ screen.getByText("Global SAML Single Sign On"),
151
+ ).toBeInTheDocument();
152
+ expect(
153
+ screen.getAllByText("Learn about Enterprise Edition"),
154
+ ).toHaveLength(2);
155
+ expect(screen.queryByTestId("fake-global-sso")).not.toBeInTheDocument();
156
+ expect(lazyLoads).toBe(0);
157
+ },
158
+ );
159
+
160
+ test("shows the upsell on the Enterprise Edition when the bundle has no plugin", () => {
161
+ enterpriseEditionForTest = true;
162
+
163
+ render(<EnterprisePluginPage plugin={undefined} upsell={UPSELL} />);
164
+
165
+ expect(screen.getByText("Global SAML Single Sign On")).toBeInTheDocument();
166
+ });
167
+
168
+ test("a lazy plugin shows the in-card loader, then the plugin", async () => {
169
+ enterpriseEditionForTest = true;
170
+
171
+ render(
172
+ <EnterprisePluginPage plugin={makeLazyPlugin(true)} upsell={UPSELL} />,
173
+ );
174
+
175
+ expect(await screen.findByTestId("component-loader")).toBeInTheDocument();
176
+
177
+ await act(async () => {
178
+ releaseLazyPlugin?.();
179
+ });
180
+
181
+ expect(await screen.findByTestId("fake-global-sso")).toBeInTheDocument();
182
+ expect(lazyLoads).toBe(1);
183
+ });
184
+
185
+ test("uses a caller's loading element while the plugin downloads", async () => {
186
+ enterpriseEditionForTest = true;
187
+
188
+ render(
189
+ <EnterprisePluginPage
190
+ plugin={makeLazyPlugin(true)}
191
+ upsell={UPSELL}
192
+ loadingElement={<div data-testid="custom-loading" />}
193
+ />,
194
+ );
195
+
196
+ expect(await screen.findByTestId("custom-loading")).toBeInTheDocument();
197
+
198
+ await act(async () => {
199
+ releaseLazyPlugin?.();
200
+ });
201
+
202
+ expect(await screen.findByTestId("fake-global-sso")).toBeInTheDocument();
203
+ });
204
+
205
+ test("isEligible overrides the edition, both ways", () => {
206
+ // A Cloud-only screen on a self-hosted Enterprise install stays hidden.
207
+ enterpriseEditionForTest = true;
208
+ const { unmount } = render(
209
+ <EnterprisePluginPage
210
+ plugin={FakeGlobalSSOList}
211
+ upsell={UPSELL}
212
+ isEligible={false}
213
+ />,
214
+ );
215
+ expect(screen.queryByTestId("fake-global-sso")).not.toBeInTheDocument();
216
+ unmount();
217
+
218
+ enterpriseEditionForTest = false;
219
+ render(
220
+ <EnterprisePluginPage
221
+ plugin={FakeGlobalSSOList}
222
+ upsell={UPSELL}
223
+ isEligible={true}
224
+ />,
225
+ );
226
+ expect(screen.getByTestId("fake-global-sso")).toBeInTheDocument();
227
+ });
228
+
229
+ test("renderUpsell replaces the shared card", () => {
230
+ enterpriseEditionForTest = false;
231
+
232
+ render(
233
+ <EnterprisePluginPage
234
+ plugin={FakeGlobalSSOList}
235
+ renderUpsell={(): ReactElement => {
236
+ return <div data-testid="health-upsell">Health upsell</div>;
237
+ }}
238
+ />,
239
+ );
240
+
241
+ expect(screen.getByTestId("health-upsell")).toBeInTheDocument();
242
+ expect(
243
+ screen.queryByText("Learn about Enterprise Edition"),
244
+ ).not.toBeInTheDocument();
245
+ });
246
+ });
247
+
248
+ describe("the Community admin plugin door (what this jest config resolves)", () => {
249
+ test("getAdminDashboardPlugins() is the empty Community stub", () => {
250
+ const plugins: AdminDashboardEnterprisePlugins = getAdminDashboardPlugins();
251
+
252
+ expect(plugins).toEqual({});
253
+ expect(plugins.buildMarker).toBeUndefined();
254
+
255
+ for (const key of ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS) {
256
+ expect([key, plugins[key]]).toEqual([key, undefined]);
257
+ }
258
+ });
259
+
260
+ test("names every screen a plugin can provide, once", () => {
261
+ expect([...ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS].sort()).toEqual(
262
+ [
263
+ "EnterpriseLicenseView",
264
+ "EnterpriseLicensesList",
265
+ "GlobalOIDCList",
266
+ "GlobalOIDCView",
267
+ "GlobalSSOList",
268
+ "GlobalSSOView",
269
+ "HealthClickhouseCluster",
270
+ "HealthLogs",
271
+ "HealthOverview",
272
+ "HealthPostgres",
273
+ "HealthQueryConsole",
274
+ "HealthQueues",
275
+ "HealthRedis",
276
+ "HealthTelemetry",
277
+ "LicenseManager",
278
+ ].sort(),
279
+ );
280
+ expect(new Set(ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS).size).toBe(
281
+ ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS.length,
282
+ );
283
+ });
284
+
285
+ /*
286
+ * The instance log is Community content (the audit trail of ClickHouse
287
+ * capacity notifications and pruning) that core renders on every edition.
288
+ * No core shell reads a plugin for it, so the contract has no key an ee
289
+ * plugin could fill in and have silently ignored.
290
+ */
291
+ test("has no key for the instance log", () => {
292
+ expect([...ADMIN_DASHBOARD_ENTERPRISE_PLUGIN_KEYS]).not.toContain(
293
+ "HealthInstanceLogs",
294
+ );
295
+ });
296
+
297
+ test("a shell reading the real door on a Community build shows the upsell even on the Enterprise Edition", () => {
298
+ enterpriseEditionForTest = true;
299
+
300
+ render(
301
+ <EnterprisePluginPage
302
+ plugin={getAdminDashboardPlugins().GlobalSSOList}
303
+ upsell={UPSELL}
304
+ />,
305
+ );
306
+
307
+ expect(screen.getByText("Global SAML Single Sign On")).toBeInTheDocument();
308
+ });
309
+ });
310
+
311
+ describe("the admin plugin door with other plugin modules", () => {
312
+ beforeEach(() => {
313
+ jest.resetModules();
314
+ });
315
+
316
+ afterEach(() => {
317
+ jest.dontMock("@oneuptime/ee-admin-dashboard");
318
+ jest.resetModules();
319
+ });
320
+
321
+ test("hands back the Enterprise plugin object as is", async () => {
322
+ const enterprisePlugins: AdminDashboardEnterprisePlugins = {
323
+ buildMarker: "ONEUPTIME_EE_ADMIN_DASHBOARD_PLUGIN_v1",
324
+ GlobalSSOList: FakeGlobalSSOList,
325
+ };
326
+
327
+ jest.doMock("@oneuptime/ee-admin-dashboard", () => {
328
+ return { __esModule: true, default: enterprisePlugins };
329
+ });
330
+
331
+ const door: {
332
+ getAdminDashboardPlugins: () => AdminDashboardEnterprisePlugins;
333
+ } = await import(
334
+ "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/Plugins"
335
+ );
336
+
337
+ expect(door.getAdminDashboardPlugins()).toBe(enterprisePlugins);
338
+ });
339
+
340
+ test("fails loudly, naming the rule, when read before the plugin module finished loading", async () => {
341
+ jest.doMock("@oneuptime/ee-admin-dashboard", () => {
342
+ return { __esModule: true, default: undefined };
343
+ });
344
+
345
+ const door: {
346
+ getAdminDashboardPlugins: () => AdminDashboardEnterprisePlugins;
347
+ } = await import(
348
+ "../../../../App/FeatureSet/AdminDashboard/src/Enterprise/Plugins"
349
+ );
350
+
351
+ expect(() => {
352
+ return door.getAdminDashboardPlugins();
353
+ }).toThrow(
354
+ "getAdminDashboardPlugins() ran before the Enterprise plugin module finished loading. Call it inside a render or function body, never at module top level.",
355
+ );
356
+ });
357
+ });