diff --git a/app/models/pager_tree/integrations/uptime_observer/v3.rb b/app/models/pager_tree/integrations/uptime_observer/v3.rb new file mode 100644 index 0000000..aca11a5 --- /dev/null +++ b/app/models/pager_tree/integrations/uptime_observer/v3.rb @@ -0,0 +1,63 @@ +module PagerTree::Integrations + class UptimeObserver::V3 < Integration + OPTIONS = [] + store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option" + + after_initialize do + end + + def adapter_supports_incoming? + true + end + + def adapter_supports_outgoing? + false + end + + def adapter_incoming_can_defer? + true + end + + def adapter_thirdparty_id + adapter_incoming_request_params.dig("incident_id") + end + + def adapter_action + case adapter_incoming_request_params.dig("incident_status") + when "Active" + :create + when "Resolved" + :resolve + else + :other + end + end + + def adapter_process_create + Alert.new( + title: _title, + description: _description, + thirdparty_id: adapter_thirdparty_id, + dedup_keys: [adapter_thirdparty_id], + additional_data: _additional_datums + ) + end + + private + + def _title + adapter_incoming_request_params.dig("title") + end + + def _description + adapter_incoming_request_params.dig("description") + end + + def _additional_datums + [ + AdditionalDatum.new(format: "link", label: "Incident URL", value: adapter_incoming_request_params.dig("incident_url")), + AdditionalDatum.new(format: "link", label: "Monitor URL", value: adapter_incoming_request_params.dig("monitor_url")) + ] + end + end +end diff --git a/app/views/pager_tree/integrations/uptime_observer/v3/_form_options.html.erb b/app/views/pager_tree/integrations/uptime_observer/v3/_form_options.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/pager_tree/integrations/uptime_observer/v3/_show_options.html.erb b/app/views/pager_tree/integrations/uptime_observer/v3/_show_options.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/pager_tree/integrations/integrations.yml b/test/fixtures/pager_tree/integrations/integrations.yml index c5473e2..a8112c5 100644 --- a/test/fixtures/pager_tree/integrations/integrations.yml +++ b/test/fixtures/pager_tree/integrations/integrations.yml @@ -205,6 +205,10 @@ uptime_kuma_v3: type: "PagerTree::Integrations::UptimeKuma::V3" # options: no_options +uptime_observer_v3: + type: "PagerTree::Integrations::UptimeObserver::V3" + # options: no_options + uptime_robot_v3: type: "PagerTree::Integrations::UptimeRobot::V3" # options: no_options diff --git a/test/models/pager_tree/integrations/uptime_observer/v3_test.rb b/test/models/pager_tree/integrations/uptime_observer/v3_test.rb new file mode 100644 index 0000000..f378c81 --- /dev/null +++ b/test/models/pager_tree/integrations/uptime_observer/v3_test.rb @@ -0,0 +1,71 @@ +require "test_helper" + +module PagerTree::Integrations + class UptimeObserver::V3Test < ActiveSupport::TestCase + include Integrateable + + setup do + @integration = pager_tree_integrations_integrations(:uptime_observer_v3) + + @create_request = { + incident_url: "https://app.uptimeobserver.com/monitoring/incidents/123456", + incident_id: 123456, + title: "Incident Title", + description: "Monitor 1 failed. Reason Socket Timeout", + incident_status: "Active", + monitor_id: 54321, + monitor_name: "Monitor 1", + monitor_url: "https://app.uptimeobserver.com/monitoring/monitor/123456" + }.with_indifferent_access + + @resolve_request = @create_request.deep_dup + @resolve_request[:incident_status] = "Resolved" + + @other_request = @create_request.deep_dup + @other_request[:incident_status] = "unknown" + end + + test "sanity" do + assert @integration.adapter_supports_incoming? + assert @integration.adapter_incoming_can_defer? + assert_not @integration.adapter_supports_outgoing? + assert @integration.adapter_show_alerts? + assert @integration.adapter_show_logs? + assert_not @integration.adapter_show_outgoing_webhook_delivery? + end + + test "adapter_actions" do + @integration.adapter_incoming_request_params = @create_request + assert_equal :create, @integration.adapter_action + + @integration.adapter_incoming_request_params = @resolve_request + assert_equal :resolve, @integration.adapter_action + + @integration.adapter_incoming_request_params = @other_request + assert_equal :other, @integration.adapter_action + end + + test "adapter_thirdparty_id" do + @integration.adapter_incoming_request_params = @create_request + assert_equal @create_request.dig(:incident_id), @integration.adapter_thirdparty_id + end + + test "adapter_process_create" do + @integration.adapter_incoming_request_params = @create_request + + true_alert = Alert.new( + title: @create_request.dig(:title), + description: @create_request.dig(:description), + urgency: nil, + thirdparty_id: @create_request.dig(:incident_id), + dedup_keys: [@create_request.dig(:incident_id)], + additional_data: [ + AdditionalDatum.new(format: "link", label: "Incident URL", value: @create_request.dig(:incident_url)), + AdditionalDatum.new(format: "link", label: "Monitor URL", value: @create_request.dig(:monitor_url)) + ] + ) + + assert_equal true_alert.to_json, @integration.adapter_process_create.to_json + end + end +end