@oneuptime/common 12.0.13 → 12.0.14
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/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import IncomingEmailCriteria from "../../../../../Server/Utils/Monitor/Criteria/IncomingEmailCriteria";
|
|
2
|
+
import DataToProcess from "../../../../../Server/Utils/Monitor/DataToProcess";
|
|
3
|
+
import OneUptimeDate from "../../../../../Types/Date";
|
|
4
|
+
import {
|
|
5
|
+
CheckOn,
|
|
6
|
+
CriteriaFilter,
|
|
7
|
+
FilterType,
|
|
8
|
+
} from "../../../../../Types/Monitor/CriteriaFilter";
|
|
9
|
+
import IncomingEmailMonitorRequest from "../../../../../Types/Monitor/IncomingEmailMonitor/IncomingEmailMonitorRequest";
|
|
10
|
+
import MonitorCriteriaInstance from "../../../../../Types/Monitor/MonitorCriteriaInstance";
|
|
11
|
+
import ObjectID from "../../../../../Types/ObjectID";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* CheckOn.EmailBody is what the Incoming Email monitor's default criteria
|
|
15
|
+
* now run on: "body contains error" takes the monitor offline, "body does
|
|
16
|
+
* not contain error" brings it back online. These tests cover that pair,
|
|
17
|
+
* the case-insensitive matching the email evaluator does, and the
|
|
18
|
+
* onlyCheckForIncomingEmailReceivedAt guard — the flag the every-30-seconds
|
|
19
|
+
* cron sets, which must stop the cron from re-judging a stale email body.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const KEYWORD: string =
|
|
23
|
+
MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD;
|
|
24
|
+
|
|
25
|
+
function buildEmail(input: {
|
|
26
|
+
emailBody: string;
|
|
27
|
+
onlyCheckForIncomingEmailReceivedAt?: boolean | undefined;
|
|
28
|
+
minutesAgo?: number | undefined;
|
|
29
|
+
}): DataToProcess {
|
|
30
|
+
const checkedAt: Date = OneUptimeDate.getCurrentDate();
|
|
31
|
+
|
|
32
|
+
const email: IncomingEmailMonitorRequest = {
|
|
33
|
+
projectId: ObjectID.generate(),
|
|
34
|
+
monitorId: ObjectID.generate(),
|
|
35
|
+
emailFrom: "alerts@example.com",
|
|
36
|
+
emailTo: "monitor@inbound.oneuptime.com",
|
|
37
|
+
emailSubject: "Nightly job report",
|
|
38
|
+
emailBody: input.emailBody,
|
|
39
|
+
emailReceivedAt: OneUptimeDate.addRemoveMinutes(
|
|
40
|
+
checkedAt,
|
|
41
|
+
-(input.minutesAgo ?? 0),
|
|
42
|
+
),
|
|
43
|
+
checkedAt: checkedAt,
|
|
44
|
+
onlyCheckForIncomingEmailReceivedAt:
|
|
45
|
+
input.onlyCheckForIncomingEmailReceivedAt,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return email as DataToProcess;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function evaluate(
|
|
52
|
+
emailBody: string,
|
|
53
|
+
criteriaFilter: CriteriaFilter,
|
|
54
|
+
onlyCheckForIncomingEmailReceivedAt?: boolean,
|
|
55
|
+
): Promise<string | null> {
|
|
56
|
+
return IncomingEmailCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
57
|
+
dataToProcess: buildEmail({
|
|
58
|
+
emailBody,
|
|
59
|
+
onlyCheckForIncomingEmailReceivedAt,
|
|
60
|
+
}),
|
|
61
|
+
criteriaFilter,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const CONTAINS_ERROR: CriteriaFilter = {
|
|
66
|
+
checkOn: CheckOn.EmailBody,
|
|
67
|
+
filterType: FilterType.Contains,
|
|
68
|
+
value: KEYWORD,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const NOT_CONTAINS_ERROR: CriteriaFilter = {
|
|
72
|
+
checkOn: CheckOn.EmailBody,
|
|
73
|
+
filterType: FilterType.NotContains,
|
|
74
|
+
value: KEYWORD,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
describe("IncomingEmailCriteria - CheckOn.EmailBody", () => {
|
|
78
|
+
describe("Contains (the default offline criteria)", () => {
|
|
79
|
+
test("a body reporting an error matches", async () => {
|
|
80
|
+
const result: string | null = await evaluate(
|
|
81
|
+
"The nightly backup finished with an error.",
|
|
82
|
+
CONTAINS_ERROR,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
expect(result).toBeTruthy();
|
|
86
|
+
expect(result).toContain("Email body contains");
|
|
87
|
+
expect(result).toContain(KEYWORD);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("a healthy body does not match", async () => {
|
|
91
|
+
expect(
|
|
92
|
+
await evaluate("The nightly backup finished cleanly.", CONTAINS_ERROR),
|
|
93
|
+
).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("matching is case insensitive", async () => {
|
|
97
|
+
expect(await evaluate("ERROR: disk full", CONTAINS_ERROR)).toBeTruthy();
|
|
98
|
+
expect(await evaluate("Error: disk full", CONTAINS_ERROR)).toBeTruthy();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("an empty body does not match", async () => {
|
|
102
|
+
expect(await evaluate("", CONTAINS_ERROR)).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe("Not Contains (the default online criteria)", () => {
|
|
107
|
+
test("a healthy body matches", async () => {
|
|
108
|
+
const result: string | null = await evaluate(
|
|
109
|
+
"All checks passed.",
|
|
110
|
+
NOT_CONTAINS_ERROR,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
expect(result).toBeTruthy();
|
|
114
|
+
expect(result).toContain("Email body does not contain");
|
|
115
|
+
expect(result).toContain(KEYWORD);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("a body reporting an error does not match", async () => {
|
|
119
|
+
expect(
|
|
120
|
+
await evaluate("Job failed with error 500", NOT_CONTAINS_ERROR),
|
|
121
|
+
).toBeNull();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("a differently-cased error still blocks the online criteria", async () => {
|
|
125
|
+
expect(await evaluate("FATAL ERROR", NOT_CONTAINS_ERROR)).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("an empty body matches", async () => {
|
|
129
|
+
expect(await evaluate("", NOT_CONTAINS_ERROR)).toBeTruthy();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("Contains and Not Contains are mutually exclusive", () => {
|
|
134
|
+
const bodies: Array<string> = [
|
|
135
|
+
"error",
|
|
136
|
+
"ERROR",
|
|
137
|
+
"all good",
|
|
138
|
+
"",
|
|
139
|
+
"there was an Error in stage 2",
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
test.each(bodies)(
|
|
143
|
+
"exactly one of the two default filters matches body %p",
|
|
144
|
+
async (body: string) => {
|
|
145
|
+
const contains: boolean = Boolean(await evaluate(body, CONTAINS_ERROR));
|
|
146
|
+
const notContains: boolean = Boolean(
|
|
147
|
+
await evaluate(body, NOT_CONTAINS_ERROR),
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(contains).not.toBe(notContains);
|
|
151
|
+
},
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* CheckOnlineStatus runs every 30 seconds and replays the LAST email that
|
|
157
|
+
* arrived, with onlyCheckForIncomingEmailReceivedAt set. Body checks are
|
|
158
|
+
* skipped on that path, so the cron cannot re-open an incident from an old
|
|
159
|
+
* email — and, since the defaults no longer include an Email Received
|
|
160
|
+
* filter, a monitor on the defaults is only judged when mail actually lands.
|
|
161
|
+
*/
|
|
162
|
+
describe("onlyCheckForIncomingEmailReceivedAt guard", () => {
|
|
163
|
+
test("the body Contains filter is skipped on the cron path", async () => {
|
|
164
|
+
expect(
|
|
165
|
+
await evaluate("ERROR: disk full", CONTAINS_ERROR, true),
|
|
166
|
+
).toBeNull();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("the body Not Contains filter is skipped on the cron path", async () => {
|
|
170
|
+
expect(await evaluate("all good", NOT_CONTAINS_ERROR, true)).toBeNull();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("the same body is evaluated when the email actually arrives", async () => {
|
|
174
|
+
expect(
|
|
175
|
+
await evaluate("ERROR: disk full", CONTAINS_ERROR, false),
|
|
176
|
+
).toBeTruthy();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
describe("filters that cannot decide", () => {
|
|
181
|
+
test("a Contains filter with no value does not match", async () => {
|
|
182
|
+
expect(
|
|
183
|
+
await evaluate("error", {
|
|
184
|
+
checkOn: CheckOn.EmailBody,
|
|
185
|
+
filterType: FilterType.Contains,
|
|
186
|
+
value: undefined,
|
|
187
|
+
}),
|
|
188
|
+
).toBeNull();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test("a Not Contains filter with no value does not match", async () => {
|
|
192
|
+
expect(
|
|
193
|
+
await evaluate("all good", {
|
|
194
|
+
checkOn: CheckOn.EmailBody,
|
|
195
|
+
filterType: FilterType.NotContains,
|
|
196
|
+
value: undefined,
|
|
197
|
+
}),
|
|
198
|
+
).toBeNull();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* The arrival-clock check is no longer part of the defaults, but users can
|
|
204
|
+
* still add it by hand, so it must keep working alongside the body check.
|
|
205
|
+
*/
|
|
206
|
+
describe("CheckOn.EmailReceivedAt still works when added manually", () => {
|
|
207
|
+
test("Not Recieved In Minutes fires once the window has elapsed", async () => {
|
|
208
|
+
const result: string | null =
|
|
209
|
+
await IncomingEmailCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
210
|
+
dataToProcess: buildEmail({
|
|
211
|
+
emailBody: "all good",
|
|
212
|
+
minutesAgo: 45,
|
|
213
|
+
onlyCheckForIncomingEmailReceivedAt: true,
|
|
214
|
+
}),
|
|
215
|
+
criteriaFilter: {
|
|
216
|
+
checkOn: CheckOn.EmailReceivedAt,
|
|
217
|
+
filterType: FilterType.NotRecievedInMinutes,
|
|
218
|
+
value: 30,
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
expect(result).toBeTruthy();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test("Recieved In Minutes fires while the window is still open", async () => {
|
|
226
|
+
const result: string | null =
|
|
227
|
+
await IncomingEmailCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
228
|
+
dataToProcess: buildEmail({
|
|
229
|
+
emailBody: "all good",
|
|
230
|
+
minutesAgo: 5,
|
|
231
|
+
onlyCheckForIncomingEmailReceivedAt: true,
|
|
232
|
+
}),
|
|
233
|
+
criteriaFilter: {
|
|
234
|
+
checkOn: CheckOn.EmailReceivedAt,
|
|
235
|
+
filterType: FilterType.RecievedInMinutes,
|
|
236
|
+
value: 30,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
expect(result).toBeTruthy();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
});
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import IncomingRequestCriteria from "../../../../../Server/Utils/Monitor/Criteria/IncomingRequestCriteria";
|
|
2
|
+
import DataToProcess from "../../../../../Server/Utils/Monitor/DataToProcess";
|
|
3
|
+
import OneUptimeDate from "../../../../../Types/Date";
|
|
4
|
+
import { JSONObject } from "../../../../../Types/JSON";
|
|
5
|
+
import {
|
|
6
|
+
CheckOn,
|
|
7
|
+
CriteriaFilter,
|
|
8
|
+
FilterType,
|
|
9
|
+
} from "../../../../../Types/Monitor/CriteriaFilter";
|
|
10
|
+
import IncomingMonitorRequest from "../../../../../Types/Monitor/IncomingMonitor/IncomingMonitorRequest";
|
|
11
|
+
import MonitorCriteriaInstance from "../../../../../Types/Monitor/MonitorCriteriaInstance";
|
|
12
|
+
import ObjectID from "../../../../../Types/ObjectID";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* CheckOn.RequestBody is what the Incoming Request monitor's default
|
|
16
|
+
* criteria now run on: "body contains error" takes the monitor offline,
|
|
17
|
+
* "body does not contain error" brings it back online. These tests cover
|
|
18
|
+
* that pair against every body shape the ingest endpoint can hand over —
|
|
19
|
+
* JSON objects (stringified before matching), plain strings, and the
|
|
20
|
+
* bodiless heartbeat ping, which must read as "no error present" rather
|
|
21
|
+
* than as "unknown".
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const KEYWORD: string =
|
|
25
|
+
MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD;
|
|
26
|
+
|
|
27
|
+
function buildRequest(
|
|
28
|
+
requestBody: string | JSONObject | undefined,
|
|
29
|
+
): DataToProcess {
|
|
30
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
31
|
+
|
|
32
|
+
const request: IncomingMonitorRequest = {
|
|
33
|
+
projectId: ObjectID.generate(),
|
|
34
|
+
monitorId: ObjectID.generate(),
|
|
35
|
+
requestBody: requestBody,
|
|
36
|
+
requestHeaders: {},
|
|
37
|
+
incomingRequestReceivedAt: now,
|
|
38
|
+
checkedAt: now,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return request as DataToProcess;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function evaluate(
|
|
45
|
+
requestBody: string | JSONObject | undefined,
|
|
46
|
+
criteriaFilter: CriteriaFilter,
|
|
47
|
+
): Promise<string | null> {
|
|
48
|
+
return IncomingRequestCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
49
|
+
dataToProcess: buildRequest(requestBody),
|
|
50
|
+
criteriaFilter,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const CONTAINS_ERROR: CriteriaFilter = {
|
|
55
|
+
checkOn: CheckOn.RequestBody,
|
|
56
|
+
filterType: FilterType.Contains,
|
|
57
|
+
value: KEYWORD,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const NOT_CONTAINS_ERROR: CriteriaFilter = {
|
|
61
|
+
checkOn: CheckOn.RequestBody,
|
|
62
|
+
filterType: FilterType.NotContains,
|
|
63
|
+
value: KEYWORD,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
describe("IncomingRequestCriteria - CheckOn.RequestBody", () => {
|
|
67
|
+
describe("Contains (the default offline criteria)", () => {
|
|
68
|
+
test("a JSON body reporting an error matches", async () => {
|
|
69
|
+
const result: string | null = await evaluate(
|
|
70
|
+
{ status: "error", detail: "disk full" },
|
|
71
|
+
CONTAINS_ERROR,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
expect(result).toBeTruthy();
|
|
75
|
+
expect(result).toContain("Request body contains");
|
|
76
|
+
expect(result).toContain(KEYWORD);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("a healthy JSON body does not match", async () => {
|
|
80
|
+
expect(
|
|
81
|
+
await evaluate({ status: "ok", detail: "all good" }, CONTAINS_ERROR),
|
|
82
|
+
).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("a plain-string body reporting an error matches", async () => {
|
|
86
|
+
expect(
|
|
87
|
+
await evaluate("error: queue backed up", CONTAINS_ERROR),
|
|
88
|
+
).toBeTruthy();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("a body carrying the keyword inside a longer word still matches (substring semantics)", async () => {
|
|
92
|
+
expect(await evaluate({ code: "errored" }, CONTAINS_ERROR)).toBeTruthy();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("an empty object body does not match", async () => {
|
|
96
|
+
expect(await evaluate({}, CONTAINS_ERROR)).toBeNull();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("an empty string body does not match", async () => {
|
|
100
|
+
expect(await evaluate("", CONTAINS_ERROR)).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("a missing body does not match", async () => {
|
|
104
|
+
expect(await evaluate(undefined, CONTAINS_ERROR)).toBeNull();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("nested values are searched because the body is compared as JSON", async () => {
|
|
108
|
+
expect(
|
|
109
|
+
await evaluate(
|
|
110
|
+
{ alerts: [{ labels: { severity: "error" } }] },
|
|
111
|
+
CONTAINS_ERROR,
|
|
112
|
+
),
|
|
113
|
+
).toBeTruthy();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("matching is case sensitive", async () => {
|
|
117
|
+
expect(await evaluate({ status: "ERROR" }, CONTAINS_ERROR)).toBeNull();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe("Not Contains (the default online criteria)", () => {
|
|
122
|
+
test("a healthy JSON body matches", async () => {
|
|
123
|
+
const result: string | null = await evaluate(
|
|
124
|
+
{ status: "ok" },
|
|
125
|
+
NOT_CONTAINS_ERROR,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
expect(result).toBeTruthy();
|
|
129
|
+
expect(result).toContain("Request body does not contain");
|
|
130
|
+
expect(result).toContain(KEYWORD);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("a JSON body reporting an error does not match", async () => {
|
|
134
|
+
expect(
|
|
135
|
+
await evaluate({ status: "error" }, NOT_CONTAINS_ERROR),
|
|
136
|
+
).toBeNull();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
/*
|
|
140
|
+
* A bodiless heartbeat POST is the single most common Incoming Request
|
|
141
|
+
* payload. It has to satisfy the default online criteria, otherwise a
|
|
142
|
+
* brand-new monitor could never report itself healthy.
|
|
143
|
+
*/
|
|
144
|
+
test("an empty object body matches", async () => {
|
|
145
|
+
expect(await evaluate({}, NOT_CONTAINS_ERROR)).toBeTruthy();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("an empty string body matches", async () => {
|
|
149
|
+
expect(await evaluate("", NOT_CONTAINS_ERROR)).toBeTruthy();
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test("a missing body matches", async () => {
|
|
153
|
+
expect(await evaluate(undefined, NOT_CONTAINS_ERROR)).toBeTruthy();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("a plain-string body without the keyword matches", async () => {
|
|
157
|
+
expect(
|
|
158
|
+
await evaluate("all systems nominal", NOT_CONTAINS_ERROR),
|
|
159
|
+
).toBeTruthy();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
describe("Contains and Not Contains are mutually exclusive", () => {
|
|
164
|
+
const bodies: Array<string | JSONObject | undefined> = [
|
|
165
|
+
{ status: "error" },
|
|
166
|
+
{ status: "ok" },
|
|
167
|
+
"error",
|
|
168
|
+
"ok",
|
|
169
|
+
"",
|
|
170
|
+
{},
|
|
171
|
+
undefined,
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
test.each(bodies)(
|
|
175
|
+
"exactly one of the two default filters matches body %p",
|
|
176
|
+
async (body: string | JSONObject | undefined) => {
|
|
177
|
+
const contains: boolean = Boolean(await evaluate(body, CONTAINS_ERROR));
|
|
178
|
+
const notContains: boolean = Boolean(
|
|
179
|
+
await evaluate(body, NOT_CONTAINS_ERROR),
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(contains).not.toBe(notContains);
|
|
183
|
+
},
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
describe("filters that cannot decide", () => {
|
|
188
|
+
test("a Contains filter with no value does not match", async () => {
|
|
189
|
+
expect(
|
|
190
|
+
await evaluate(
|
|
191
|
+
{ status: "error" },
|
|
192
|
+
{
|
|
193
|
+
checkOn: CheckOn.RequestBody,
|
|
194
|
+
filterType: FilterType.Contains,
|
|
195
|
+
value: undefined,
|
|
196
|
+
},
|
|
197
|
+
),
|
|
198
|
+
).toBeNull();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test("a Not Contains filter with no value does not match", async () => {
|
|
202
|
+
expect(
|
|
203
|
+
await evaluate(
|
|
204
|
+
{ status: "ok" },
|
|
205
|
+
{
|
|
206
|
+
checkOn: CheckOn.RequestBody,
|
|
207
|
+
filterType: FilterType.NotContains,
|
|
208
|
+
value: undefined,
|
|
209
|
+
},
|
|
210
|
+
),
|
|
211
|
+
).toBeNull();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test("an unsupported filter type on the body does not match", async () => {
|
|
215
|
+
expect(
|
|
216
|
+
await evaluate(
|
|
217
|
+
{ status: "ok" },
|
|
218
|
+
{
|
|
219
|
+
checkOn: CheckOn.RequestBody,
|
|
220
|
+
filterType: FilterType.EqualTo,
|
|
221
|
+
value: KEYWORD,
|
|
222
|
+
},
|
|
223
|
+
),
|
|
224
|
+
).toBeNull();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* The heartbeat check is no longer part of the defaults, but users can
|
|
230
|
+
* still add it by hand, so it must keep working alongside the body check.
|
|
231
|
+
*/
|
|
232
|
+
describe("CheckOn.IncomingRequest still works when added manually", () => {
|
|
233
|
+
function buildAgedRequest(minutesAgo: number): DataToProcess {
|
|
234
|
+
const checkedAt: Date = OneUptimeDate.getCurrentDate();
|
|
235
|
+
|
|
236
|
+
const request: IncomingMonitorRequest = {
|
|
237
|
+
projectId: ObjectID.generate(),
|
|
238
|
+
monitorId: ObjectID.generate(),
|
|
239
|
+
requestBody: {},
|
|
240
|
+
incomingRequestReceivedAt: OneUptimeDate.addRemoveMinutes(
|
|
241
|
+
checkedAt,
|
|
242
|
+
-minutesAgo,
|
|
243
|
+
),
|
|
244
|
+
checkedAt: checkedAt,
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
return request as DataToProcess;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
test("Not Recieved In Minutes fires once the window has elapsed", async () => {
|
|
251
|
+
const result: string | null =
|
|
252
|
+
await IncomingRequestCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
253
|
+
dataToProcess: buildAgedRequest(45),
|
|
254
|
+
criteriaFilter: {
|
|
255
|
+
checkOn: CheckOn.IncomingRequest,
|
|
256
|
+
filterType: FilterType.NotRecievedInMinutes,
|
|
257
|
+
value: 30,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
expect(result).toBeTruthy();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("Recieved In Minutes fires while the window is still open", async () => {
|
|
265
|
+
const result: string | null =
|
|
266
|
+
await IncomingRequestCriteria.isMonitorInstanceCriteriaFilterMet({
|
|
267
|
+
dataToProcess: buildAgedRequest(5),
|
|
268
|
+
criteriaFilter: {
|
|
269
|
+
checkOn: CheckOn.IncomingRequest,
|
|
270
|
+
filterType: FilterType.RecievedInMinutes,
|
|
271
|
+
value: 30,
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
expect(result).toBeTruthy();
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
});
|