@oneuptime/common 12.0.28 → 12.0.30

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 (367) hide show
  1. package/Models/DatabaseModels/DashboardDomain.ts +43 -0
  2. package/Models/DatabaseModels/Index.ts +11 -0
  3. package/Models/DatabaseModels/MonitorTemplate.ts +15 -3
  4. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
  5. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
  6. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
  7. package/Models/DatabaseModels/StatusPageDomain.ts +43 -0
  8. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
  9. package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
  10. package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
  11. package/Server/API/DashboardDomainAPI.ts +74 -0
  12. package/Server/API/MicrosoftTeamsAPI.ts +81 -180
  13. package/Server/API/OnCallCalendarAPI.ts +2194 -0
  14. package/Server/API/StatusPageDomainAPI.ts +74 -0
  15. package/Server/EnvironmentConfig.ts +138 -0
  16. package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.ts +43 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.ts +40 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  21. package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
  22. package/Server/Middleware/ProjectAuthorization.ts +6 -1
  23. package/Server/Services/DashboardDomainService.ts +131 -0
  24. package/Server/Services/Index.ts +12 -0
  25. package/Server/Services/LogPipelineProcessorService.ts +88 -0
  26. package/Server/Services/MonitorTemplateService.ts +70 -11
  27. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
  28. package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
  29. package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
  30. package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
  31. package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
  32. package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
  33. package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
  34. package/Server/Services/StatusPageDomainService.ts +163 -3
  35. package/Server/Services/StatusPagePrivateUserSessionService.ts +197 -56
  36. package/Server/Services/TeamMemberService.ts +489 -1
  37. package/Server/Services/TeamService.ts +50 -0
  38. package/Server/Services/UserNotificationSettingService.ts +44 -1
  39. package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
  40. package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
  41. package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
  42. package/Server/Types/Domain.ts +17 -0
  43. package/Server/Utils/APIKey/AccessPermission.ts +24 -0
  44. package/Server/Utils/Greenlock/Greenlock.ts +156 -58
  45. package/Server/Utils/LogPipelineProcessorValidation.ts +112 -0
  46. package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
  47. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
  48. package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
  49. package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
  50. package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
  51. package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
  52. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
  53. package/Server/Utils/Response.ts +134 -0
  54. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +1094 -45
  55. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +153 -17
  56. package/Server/Utils/StartServer.ts +10 -0
  57. package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +23 -11
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +0 -170
  60. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.ts +158 -0
  61. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +23 -11
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +35 -13
  63. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +505 -0
  64. package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
  65. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
  66. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
  67. package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
  68. package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
  69. package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
  70. package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
  71. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
  72. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +106 -0
  73. package/Tests/App/StatusPage/StatusPageLoginCodeUtil.test.ts +84 -0
  74. package/Tests/App/StatusPage/StatusPageRedirectSafety.test.ts +119 -0
  75. package/Tests/Models/MonitorTemplateMonitorNameColumn.test.ts +258 -0
  76. package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
  77. package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
  78. package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
  79. package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
  80. package/Tests/Server/API/CustomDomainReissueSslAPI.test.ts +469 -0
  81. package/Tests/Server/API/Helpers.ts +8 -0
  82. package/Tests/Server/API/MicrosoftTeamsBotMessagesEndpoint.test.ts +729 -0
  83. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +26 -0
  84. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +402 -0
  85. package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
  86. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
  87. package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
  88. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +369 -0
  89. package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
  90. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -0
  91. package/Tests/Server/Services/AddCertificateReissueRequestedAtToDomainsMigration.test.ts +287 -0
  92. package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +477 -0
  93. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
  94. package/Tests/Server/Services/LogPipelineProcessorSaveValidation.test.ts +249 -0
  95. package/Tests/Server/Services/MonitorTemplateServiceBulkSync.test.ts +549 -0
  96. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +16 -3
  97. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +57 -0
  98. package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
  99. package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
  100. package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
  101. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +151 -15
  102. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +587 -0
  103. package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
  104. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
  105. package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
  106. package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
  107. package/Tests/Server/Types/Database/Permissions/ApiKeyFileAccess.test.ts +286 -0
  108. package/Tests/Server/Types/Database/Permissions/MonitorTemplateColumnAccess.test.ts +328 -0
  109. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
  110. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAndIsNull.test.ts +83 -0
  111. package/Tests/Server/Utils/AI/SRE/ConfidenceSignal.test.ts +377 -0
  112. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +16 -1
  113. package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +250 -0
  114. package/Tests/Server/Utils/LogPipelineProcessorValidation.test.ts +198 -0
  115. package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
  116. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
  117. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
  118. package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
  119. package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
  120. package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
  121. package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
  122. package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
  123. package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
  124. package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
  125. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +48 -9
  126. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsAuth.test.ts +726 -0
  127. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +74 -11
  128. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +1107 -0
  129. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +20 -3
  130. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +51 -11
  131. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +1246 -0
  132. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +961 -0
  133. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +653 -0
  134. package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
  135. package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +880 -0
  137. package/Tests/Types/API/HTTPResponse.test.ts +175 -0
  138. package/Tests/Types/API/Route.test.ts +36 -4
  139. package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
  140. package/Tests/Types/Database/DatabaseProperty.test.ts +171 -0
  141. package/Tests/Types/DateLocalShortDateTimeString.test.ts +518 -0
  142. package/Tests/Types/DateLocalTimeString.test.ts +259 -0
  143. package/Tests/Types/DateUserPrefers12HourFormat.test.ts +316 -0
  144. package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
  145. package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
  146. package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
  147. package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
  148. package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
  149. package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
  150. package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
  151. package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
  152. package/Tests/UI/Components/LogsHistogram.test.tsx +41 -2
  153. package/Tests/UI/Components/LogsViewerEmptyStateTimeRange.test.tsx +212 -0
  154. package/Tests/UI/Components/TelemetryChartClockFormat.test.tsx +359 -0
  155. package/Tests/UI/Components/TimeRangePickerClockFormat.test.tsx +422 -0
  156. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +146 -8
  157. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +520 -0
  158. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  159. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  160. package/Tests/UI/Utils/Navigation.test.ts +82 -0
  161. package/Tests/Utils/Array.test.ts +100 -0
  162. package/Tests/Utils/CertificateReissue.test.ts +225 -0
  163. package/Tests/Utils/Grok/Grok.test.ts +492 -0
  164. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +181 -13
  165. package/Types/API/Route.ts +20 -5
  166. package/Types/Calendar/ICalendar.ts +442 -0
  167. package/Types/Date.ts +143 -13
  168. package/Types/Email/EmailTemplateType.ts +2 -0
  169. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  170. package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
  171. package/Types/OnCallDutyPolicy/Layer.ts +190 -35
  172. package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
  173. package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
  174. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
  175. package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
  176. package/Types/Rum/SessionReplay.ts +62 -1
  177. package/UI/Components/Date/TimeRangePickerDropdown.tsx +9 -5
  178. package/UI/Components/LogsViewer/LogsViewer.tsx +12 -7
  179. package/UI/Components/LogsViewer/components/HistogramTooltip.tsx +18 -17
  180. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +21 -28
  181. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +2 -4
  182. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +2 -4
  183. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +17 -16
  184. package/UI/Utils/Navigation.ts +42 -0
  185. package/Utils/Array.ts +37 -0
  186. package/Utils/CertificateReissue.ts +128 -0
  187. package/Utils/Grok/Grok.ts +461 -0
  188. package/Utils/Grok/GrokPatterns.ts +118 -0
  189. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +58 -6
  190. package/build/dist/Models/DatabaseModels/DashboardDomain.js +44 -0
  191. package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/Index.js +11 -0
  193. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +17 -4
  195. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
  197. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
  200. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
  201. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
  202. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +44 -0
  203. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
  205. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
  207. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
  208. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
  209. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
  210. package/build/dist/Server/API/DashboardDomainAPI.js +43 -1
  211. package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
  212. package/build/dist/Server/API/MicrosoftTeamsAPI.js +74 -118
  213. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  214. package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
  215. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
  216. package/build/dist/Server/API/StatusPageDomainAPI.js +43 -1
  217. package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
  218. package/build/dist/Server/EnvironmentConfig.js +102 -0
  219. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  220. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
  221. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js +34 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js +28 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  230. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
  231. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
  232. package/build/dist/Server/Middleware/ProjectAuthorization.js +6 -1
  233. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  234. package/build/dist/Server/Services/DashboardDomainService.js +104 -0
  235. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  236. package/build/dist/Server/Services/Index.js +12 -0
  237. package/build/dist/Server/Services/Index.js.map +1 -1
  238. package/build/dist/Server/Services/LogPipelineProcessorService.js +65 -0
  239. package/build/dist/Server/Services/LogPipelineProcessorService.js.map +1 -1
  240. package/build/dist/Server/Services/MonitorTemplateService.js +57 -11
  241. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  242. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
  243. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  244. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
  245. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
  246. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
  247. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
  248. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
  249. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
  250. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
  251. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  252. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
  253. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
  254. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
  255. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
  256. package/build/dist/Server/Services/StatusPageDomainService.js +132 -3
  257. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  258. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +112 -32
  259. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  260. package/build/dist/Server/Services/TeamMemberService.js +396 -1
  261. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  262. package/build/dist/Server/Services/TeamService.js +43 -0
  263. package/build/dist/Server/Services/TeamService.js.map +1 -1
  264. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
  265. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  266. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
  267. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
  268. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
  269. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
  270. package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
  271. package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
  272. package/build/dist/Server/Types/Domain.js +16 -0
  273. package/build/dist/Server/Types/Domain.js.map +1 -1
  274. package/build/dist/Server/Utils/APIKey/AccessPermission.js +24 -0
  275. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  276. package/build/dist/Server/Utils/Greenlock/Greenlock.js +110 -35
  277. package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
  278. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js +77 -0
  279. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js.map +1 -0
  280. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
  281. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
  282. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
  283. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
  284. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
  285. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
  286. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
  287. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
  288. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
  289. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
  290. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
  291. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
  292. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
  293. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
  294. package/build/dist/Server/Utils/Response.js +97 -0
  295. package/build/dist/Server/Utils/Response.js.map +1 -1
  296. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +777 -36
  297. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  298. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +108 -17
  299. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  300. package/build/dist/Server/Utils/StartServer.js +9 -1
  301. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  302. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
  303. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  304. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +17 -6
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +0 -159
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js +128 -0
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js.map +1 -0
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +17 -6
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -13
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  314. package/build/dist/Types/API/Route.js +16 -5
  315. package/build/dist/Types/API/Route.js.map +1 -1
  316. package/build/dist/Types/Calendar/ICalendar.js +290 -0
  317. package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
  318. package/build/dist/Types/Date.js +115 -13
  319. package/build/dist/Types/Date.js.map +1 -1
  320. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  321. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  322. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  323. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  324. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
  325. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
  326. package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
  327. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  328. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
  329. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
  330. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
  331. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
  332. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
  333. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  334. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
  335. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
  336. package/build/dist/Types/Rum/SessionReplay.js +38 -0
  337. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  338. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +9 -5
  339. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -1
  340. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +12 -7
  341. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  342. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js +15 -14
  343. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js.map +1 -1
  344. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +17 -22
  345. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  346. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +2 -4
  347. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  348. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +2 -4
  349. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  350. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +15 -14
  351. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
  352. package/build/dist/UI/Utils/Navigation.js +30 -0
  353. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  354. package/build/dist/Utils/Array.js +25 -0
  355. package/build/dist/Utils/Array.js.map +1 -1
  356. package/build/dist/Utils/CertificateReissue.js +97 -0
  357. package/build/dist/Utils/CertificateReissue.js.map +1 -0
  358. package/build/dist/Utils/Grok/Grok.js +324 -0
  359. package/build/dist/Utils/Grok/Grok.js.map +1 -0
  360. package/build/dist/Utils/Grok/GrokPatterns.js +112 -0
  361. package/build/dist/Utils/Grok/GrokPatterns.js.map +1 -0
  362. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +63 -3
  363. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  364. package/package.json +1 -1
  365. package/UI/Utils/JsonWebToken.ts +0 -14
  366. package/build/dist/UI/Utils/JsonWebToken.js +0 -10
  367. package/build/dist/UI/Utils/JsonWebToken.js.map +0 -1
@@ -0,0 +1,505 @@
1
+ import "@testing-library/jest-dom";
2
+ import { cleanup, render, screen, waitFor } from "@testing-library/react";
3
+ import React, { ReactElement } from "react";
4
+ import { MemoryRouter } from "react-router-dom";
5
+ import {
6
+ afterEach,
7
+ beforeEach,
8
+ describe,
9
+ expect,
10
+ jest,
11
+ test,
12
+ } from "@jest/globals";
13
+
14
+ /*
15
+ * Issue #3491: the monitor list had no way to see or filter which template a
16
+ * monitor came from, so "which monitors did that template edit just change?"
17
+ * could only be answered by opening monitors one at a time — which does not
18
+ * survive a fleet of thousands sharing one template.
19
+ *
20
+ * The fix is a Template column and a Template chip on MonitorTable, and both
21
+ * fail invisibly:
22
+ *
23
+ * - a column whose `field` stops asking for the relation renders a blank cell
24
+ * on every row, exactly like a project with no templates;
25
+ * - a chip whose `queryField` stops naming the foreign key lights up over a
26
+ * list it is not filtering;
27
+ * - and on the template page's own Linked Monitors table — the same component,
28
+ * scoped by `monitorTemplateId` — a chip would OVERWRITE that scope rather
29
+ * than narrow it, because the facet bar merges everything into one query
30
+ * object, so the page would list another template's monitors under this
31
+ * template's heading.
32
+ *
33
+ * These render the real MonitorTable and read the column set and facet list it
34
+ * actually hands downstream, rather than reading its source.
35
+ */
36
+
37
+ jest.mock("react-i18next", () => {
38
+ return {
39
+ useTranslation: () => {
40
+ return {
41
+ t: (key: string): string => {
42
+ return key;
43
+ },
44
+ };
45
+ },
46
+ };
47
+ });
48
+
49
+ jest.mock("../../../UI/Utils/Permission", () => {
50
+ return {
51
+ __esModule: true,
52
+ default: {
53
+ getAllPermissions: () => {
54
+ return [];
55
+ },
56
+ getProjectPermissions: () => {
57
+ return [];
58
+ },
59
+ getGlobalPermissions: () => {
60
+ return [];
61
+ },
62
+ },
63
+ };
64
+ });
65
+
66
+ jest.mock("../../../UI/Utils/User", () => {
67
+ return {
68
+ __esModule: true,
69
+ default: {
70
+ isMasterAdmin: () => {
71
+ return false;
72
+ },
73
+ getUserId: () => {
74
+ return null;
75
+ },
76
+ },
77
+ };
78
+ });
79
+
80
+ type CapturedTableProps = {
81
+ columns?: Array<CapturedColumn> | undefined;
82
+ query?: Record<string, unknown> | undefined;
83
+ };
84
+
85
+ type CapturedColumn = {
86
+ title: string;
87
+ field?: Record<string, unknown> | undefined;
88
+ getElement?: ((item: Monitor) => ReactElement) | undefined;
89
+ getExportValue?: ((item: Monitor) => string) | undefined;
90
+ };
91
+
92
+ let capturedTableProps: CapturedTableProps | null = null;
93
+
94
+ jest.mock("../../../UI/Components/ModelTable/ModelTable", () => {
95
+ return {
96
+ __esModule: true,
97
+ default: (props: CapturedTableProps) => {
98
+ capturedTableProps = props;
99
+ return null;
100
+ },
101
+ };
102
+ });
103
+
104
+ type CapturedHookOptions = {
105
+ extraFacets?: Array<ResourceFacet> | undefined;
106
+ };
107
+
108
+ let capturedHookOptions: CapturedHookOptions | null = null;
109
+
110
+ /*
111
+ * The hook is replaced rather than run: the real one fetches owners, labels and
112
+ * every chip's options over the network on mount. Its named exports stay real,
113
+ * because MonitorTable builds its other chips out of them.
114
+ */
115
+ jest.mock(
116
+ "../../../../App/FeatureSet/Dashboard/src/Components/ResourceOwners/useResourceOwners",
117
+ () => {
118
+ const actual: Record<string, unknown> = jest.requireActual(
119
+ "../../../../App/FeatureSet/Dashboard/src/Components/ResourceOwners/useResourceOwners",
120
+ ) as Record<string, unknown>;
121
+
122
+ return {
123
+ ...actual,
124
+ __esModule: true,
125
+ default: (options: CapturedHookOptions) => {
126
+ capturedHookOptions = options;
127
+
128
+ return {
129
+ getOwnersForResource: () => {
130
+ return [];
131
+ },
132
+ isLoadingOwners: false,
133
+ onResourcesFetched: () => {
134
+ // no-op
135
+ },
136
+ filterBar: null,
137
+ mergeFiltersIntoQuery: (
138
+ base: Record<string, unknown> | undefined,
139
+ ) => {
140
+ return base || {};
141
+ },
142
+ facetSaveState: {},
143
+ restoreFacetState: () => {
144
+ // no-op
145
+ },
146
+ };
147
+ },
148
+ };
149
+ },
150
+ );
151
+
152
+ jest.mock(
153
+ "../../../../App/FeatureSet/Dashboard/src/Components/CustomFields/useCustomFieldFacets",
154
+ () => {
155
+ return {
156
+ __esModule: true,
157
+ default: () => {
158
+ return { facets: [], isLoading: false };
159
+ },
160
+ };
161
+ },
162
+ );
163
+
164
+ jest.mock("../../../UI/Components/BulkUpdate/BulkLabelActions", () => {
165
+ return {
166
+ __esModule: true,
167
+ default: () => {
168
+ return { bulkActions: [], modals: null };
169
+ },
170
+ };
171
+ });
172
+
173
+ jest.mock("../../../UI/Components/BulkUpdate/BulkOwnerActions", () => {
174
+ return {
175
+ __esModule: true,
176
+ default: () => {
177
+ return { bulkActions: [], modals: null };
178
+ },
179
+ };
180
+ });
181
+
182
+ jest.mock("../../../../App/FeatureSet/Dashboard/src/Utils/Probe", () => {
183
+ return {
184
+ __esModule: true,
185
+ default: {
186
+ getAllProbes: async () => {
187
+ return [];
188
+ },
189
+ },
190
+ };
191
+ });
192
+
193
+ import MonitorTable from "../../../../App/FeatureSet/Dashboard/src/Components/Monitor/MonitorTable";
194
+ import {
195
+ MONITOR_TEMPLATE_FACET_KEY,
196
+ MONITOR_TEMPLATE_FACET_QUERY_FIELD,
197
+ } from "../../../../App/FeatureSet/Dashboard/src/Components/Monitor/MonitorFacets";
198
+ import { ResourceFacet } from "../../../../App/FeatureSet/Dashboard/src/Components/ResourceOwners/ResourceFacet";
199
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
200
+ import MonitorTemplate from "../../../Models/DatabaseModels/MonitorTemplate";
201
+ import Includes from "../../../Types/BaseDatabase/Includes";
202
+ import IsNull from "../../../Types/BaseDatabase/IsNull";
203
+ import ObjectID from "../../../Types/ObjectID";
204
+ import Navigation from "../../../UI/Utils/Navigation";
205
+ import ProjectUtil from "../../../UI/Utils/Project";
206
+
207
+ const PROJECT_ID: ObjectID = ObjectID.generate();
208
+ const TEMPLATE_ID: ObjectID = ObjectID.generate();
209
+
210
+ type RenderTableFunction = (
211
+ query: Record<string, unknown>,
212
+ ) => Promise<CapturedTableProps>;
213
+
214
+ const renderTable: RenderTableFunction = async (
215
+ query: Record<string, unknown>,
216
+ ): Promise<CapturedTableProps> => {
217
+ render(
218
+ <MemoryRouter>
219
+ <MonitorTable query={query as never} />
220
+ </MemoryRouter>,
221
+ );
222
+
223
+ await waitFor(() => {
224
+ expect(capturedTableProps).not.toBeNull();
225
+ });
226
+
227
+ return capturedTableProps!;
228
+ };
229
+
230
+ type ColumnTitledFunction = (title: string) => CapturedColumn | undefined;
231
+
232
+ const columnTitled: ColumnTitledFunction = (
233
+ title: string,
234
+ ): CapturedColumn | undefined => {
235
+ return (capturedTableProps?.columns || []).find(
236
+ (column: CapturedColumn): boolean => {
237
+ return column.title === title;
238
+ },
239
+ );
240
+ };
241
+
242
+ type FacetKeyedFunction = (key: string) => ResourceFacet | undefined;
243
+
244
+ const facetKeyed: FacetKeyedFunction = (
245
+ key: string,
246
+ ): ResourceFacet | undefined => {
247
+ return (capturedHookOptions?.extraFacets || []).find(
248
+ (facet: ResourceFacet): boolean => {
249
+ return facet.key === key;
250
+ },
251
+ );
252
+ };
253
+
254
+ type MonitorWithTemplateFunction = (
255
+ templateName: string | undefined,
256
+ ) => Monitor;
257
+
258
+ const monitorWithTemplate: MonitorWithTemplateFunction = (
259
+ templateName: string | undefined,
260
+ ): Monitor => {
261
+ const monitor: Monitor = new Monitor();
262
+ monitor.name = "core-switch-01";
263
+
264
+ if (templateName) {
265
+ const template: MonitorTemplate = new MonitorTemplate();
266
+ template._id = TEMPLATE_ID.toString();
267
+ template.templateName = templateName;
268
+ monitor.monitorTemplate = template;
269
+ }
270
+
271
+ return monitor;
272
+ };
273
+
274
+ beforeEach(() => {
275
+ capturedTableProps = null;
276
+ capturedHookOptions = null;
277
+
278
+ jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(PROJECT_ID);
279
+
280
+ /*
281
+ * The table builds its row link off the current route. In the app the router
282
+ * pushes this in; under test nothing does.
283
+ */
284
+ Navigation.setLocation({
285
+ pathname: `/dashboard/${PROJECT_ID.toString()}/monitors`,
286
+ } as unknown as Parameters<typeof Navigation.setLocation>[0]);
287
+ });
288
+
289
+ afterEach(() => {
290
+ cleanup();
291
+ jest.restoreAllMocks();
292
+ });
293
+
294
+ describe("the Template column on the monitor list", () => {
295
+ test("is one of the table's columns", async () => {
296
+ await renderTable({ projectId: PROJECT_ID });
297
+
298
+ expect(columnTitled("Template")).toBeDefined();
299
+ });
300
+
301
+ /*
302
+ * Both keys, and through the relation. `templateName` is the label the cell
303
+ * prints; `_id` is what makes it a link to the template — which is the reason
304
+ * to look at the column at all, since the next thing a user does is go and
305
+ * read what the template now says.
306
+ */
307
+ test("asks for the template's name and id through the relation", async () => {
308
+ await renderTable({ projectId: PROJECT_ID });
309
+
310
+ expect(columnTitled("Template")!.field).toEqual({
311
+ monitorTemplate: {
312
+ _id: true,
313
+ templateName: true,
314
+ },
315
+ });
316
+ });
317
+
318
+ test("renders the template's name, linked to the template", async () => {
319
+ await renderTable({ projectId: PROJECT_ID });
320
+
321
+ render(
322
+ <MemoryRouter>
323
+ {columnTitled("Template")!.getElement!(
324
+ monitorWithTemplate("Production API Health"),
325
+ )}
326
+ </MemoryRouter>,
327
+ );
328
+
329
+ const link: HTMLElement = screen.getByText("Production API Health");
330
+
331
+ expect(link).toBeInTheDocument();
332
+ expect(link.closest("a")?.getAttribute("href")).toContain(
333
+ TEMPLATE_ID.toString(),
334
+ );
335
+ expect(link.closest("a")?.getAttribute("href")).toContain(
336
+ "settings/templates",
337
+ );
338
+ });
339
+
340
+ /*
341
+ * Most monitors are not created from a template, so the empty case is the
342
+ * common one and has to read as "no template" rather than as a value that
343
+ * failed to load.
344
+ */
345
+ test("renders a dash when the monitor came from no template", async () => {
346
+ await renderTable({ projectId: PROJECT_ID });
347
+
348
+ render(
349
+ <MemoryRouter>
350
+ {columnTitled("Template")!.getElement!(monitorWithTemplate(undefined))}
351
+ </MemoryRouter>,
352
+ );
353
+
354
+ expect(screen.getByText("—")).toBeInTheDocument();
355
+ expect(screen.queryByRole("link")).not.toBeInTheDocument();
356
+ });
357
+
358
+ /*
359
+ * "Export the list and diff it" is exactly what an admin does after a
360
+ * template change, and a cell rendered through getElement contributes nothing
361
+ * usable to the CSV on its own.
362
+ */
363
+ test("exports the template name, and an empty cell when there is none", async () => {
364
+ await renderTable({ projectId: PROJECT_ID });
365
+
366
+ const column: CapturedColumn = columnTitled("Template")!;
367
+
368
+ expect(column.getExportValue!(monitorWithTemplate("Edge Ping"))).toBe(
369
+ "Edge Ping",
370
+ );
371
+ expect(column.getExportValue!(monitorWithTemplate(undefined))).toBe("");
372
+ });
373
+ });
374
+
375
+ describe("the Template chip in the monitor list's filter bar", () => {
376
+ test("is one of the chips the bar is given", async () => {
377
+ await renderTable({ projectId: PROJECT_ID });
378
+
379
+ expect(facetKeyed(MONITOR_TEMPLATE_FACET_KEY)).toBeDefined();
380
+ expect(facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.label).toBe("Template");
381
+ });
382
+
383
+ /*
384
+ * The foreign key, not the relation. "is empty" is only answerable of the
385
+ * column — a monitor from no template has no template row to join against —
386
+ * and the same field is what the template page scopes its own table by.
387
+ */
388
+ test("filters the monitor's template foreign key", async () => {
389
+ await renderTable({ projectId: PROJECT_ID });
390
+
391
+ expect(facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.queryField).toBe(
392
+ MONITOR_TEMPLATE_FACET_QUERY_FIELD,
393
+ );
394
+ expect(MONITOR_TEMPLATE_FACET_QUERY_FIELD).toBe("monitorTemplateId");
395
+ });
396
+
397
+ test("turns a picked template into an id filter", async () => {
398
+ await renderTable({ projectId: PROJECT_ID });
399
+
400
+ const value: unknown = facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!
401
+ .toQueryValue!([TEMPLATE_ID.toString()], "is");
402
+
403
+ expect(value).toBeInstanceOf(Includes);
404
+ expect(((value as Includes).values as Array<ObjectID>)[0]!.toString()).toBe(
405
+ TEMPLATE_ID.toString(),
406
+ );
407
+ });
408
+
409
+ test("turns 'is empty' into the monitors that came from no template", async () => {
410
+ await renderTable({ projectId: PROJECT_ID });
411
+
412
+ expect(
413
+ facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.toQueryValue!([], "is_empty"),
414
+ ).toBeInstanceOf(IsNull);
415
+ });
416
+
417
+ test("offers the empty operators, which is how that is asked for", async () => {
418
+ await renderTable({ projectId: PROJECT_ID });
419
+
420
+ expect(facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.supportedOperators).toEqual([
421
+ "is",
422
+ "is_not",
423
+ "is_empty",
424
+ "is_not_empty",
425
+ ]);
426
+ });
427
+
428
+ /*
429
+ * A project can hold any number of templates, so the options have to be
430
+ * searched server-side, and a selection restored from a shared link has to be
431
+ * resolvable to a label even when it is not on the first page of results.
432
+ */
433
+ test("searches its options on the server and resolves restored ones", async () => {
434
+ await renderTable({ projectId: PROJECT_ID });
435
+
436
+ expect(typeof facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.loadOptions).toBe(
437
+ "function",
438
+ );
439
+ expect(typeof facetKeyed(MONITOR_TEMPLATE_FACET_KEY)!.resolveOptions).toBe(
440
+ "function",
441
+ );
442
+ });
443
+
444
+ /*
445
+ * BaseModelTable builds its request as `{...props.query, ...columnFilterQuery}`,
446
+ * so a column-filter popup over the chip's field would replace the chip's
447
+ * constraint outright, silently, while the chip carried on claiming to apply.
448
+ */
449
+ test("no column filter competes with it for the same field", async () => {
450
+ const props: CapturedTableProps & {
451
+ filters?: Array<{ field?: Record<string, unknown> }>;
452
+ } = (await renderTable({ projectId: PROJECT_ID })) as CapturedTableProps & {
453
+ filters?: Array<{ field?: Record<string, unknown> }>;
454
+ };
455
+
456
+ for (const filter of props.filters || []) {
457
+ expect(Object.keys(filter.field || {})).not.toContain(
458
+ MONITOR_TEMPLATE_FACET_QUERY_FIELD,
459
+ );
460
+ expect(Object.keys(filter.field || {})).not.toContain("monitorTemplate");
461
+ }
462
+ });
463
+ });
464
+
465
+ describe("the same table scoped to one template", () => {
466
+ /*
467
+ * The template page's Linked Monitors card. A chip here would overwrite the
468
+ * page's own scope rather than narrow it, and the column would repeat one
469
+ * value down every row.
470
+ */
471
+ test("shows no Template chip", async () => {
472
+ await renderTable({
473
+ projectId: PROJECT_ID,
474
+ monitorTemplateId: TEMPLATE_ID,
475
+ });
476
+
477
+ expect(facetKeyed(MONITOR_TEMPLATE_FACET_KEY)).toBeUndefined();
478
+ });
479
+
480
+ test("shows no Template column", async () => {
481
+ await renderTable({
482
+ projectId: PROJECT_ID,
483
+ monitorTemplateId: TEMPLATE_ID,
484
+ });
485
+
486
+ expect(columnTitled("Template")).toBeUndefined();
487
+ });
488
+
489
+ /*
490
+ * Guards the two above from passing because the table rendered nothing at
491
+ * all: the rest of its columns and chips have to still be there.
492
+ */
493
+ test("keeps every other column and chip", async () => {
494
+ await renderTable({
495
+ projectId: PROJECT_ID,
496
+ monitorTemplateId: TEMPLATE_ID,
497
+ });
498
+
499
+ expect(columnTitled("Name")).toBeDefined();
500
+ expect(columnTitled("Monitor Status")).toBeDefined();
501
+ expect(columnTitled("Labels")).toBeDefined();
502
+ expect(facetKeyed("currentMonitorStatus")).toBeDefined();
503
+ expect(facetKeyed("monitorType")).toBeDefined();
504
+ });
505
+ });