Skip to content

Commit 486f7e8

Browse files
authored
Pulsetic Integration (#115)
1 parent 71f81e3 commit 486f7e8

File tree

7 files changed

+175
-1
lines changed

7 files changed

+175
-1
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ jobs:
1313
strategy:
1414
fail-fast: false
1515
matrix:
16-
ruby: ['2.7', '3.0']
16+
ruby: ['2.7', '3.0', '3.1']
1717
gemfile:
1818
- rails_7
1919
- rails_master
20+
exclude:
21+
- gemfile: rails_master
22+
ruby: 2.7
23+
- gemfile: rails_master
24+
ruby: 3.0
2025
env:
2126
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
2227
BUNDLE_PATH_RELATIVE_TO_CWD: true

.ruby-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.1.0
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
module PagerTree::Integrations
2+
class Pulsetic::V3 < Integration
3+
OPTIONS = []
4+
store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
5+
6+
after_initialize do
7+
end
8+
9+
def adapter_supports_incoming?
10+
true
11+
end
12+
13+
def adapter_supports_outgoing?
14+
false
15+
end
16+
17+
def adapter_incoming_can_defer?
18+
true
19+
end
20+
21+
def adapter_thirdparty_id
22+
id = adapter_incoming_request_params.dig("monitor", "id")
23+
typ = _alert_type == "certificate_expires_soon" ? "certificate" : "monitor"
24+
"#{id}_#{typ}"
25+
end
26+
27+
def adapter_action
28+
case _alert_type
29+
when "monitor_offline", "certificate_expires_soon"
30+
:create
31+
when "monitor_online"
32+
:resolve
33+
else
34+
:other
35+
end
36+
end
37+
38+
def adapter_process_create
39+
Alert.new(
40+
title: _title,
41+
thirdparty_id: adapter_thirdparty_id,
42+
additional_data: _additional_datums
43+
)
44+
end
45+
46+
private
47+
48+
def _title
49+
case _alert_type
50+
when "monitor_offline"
51+
"#{adapter_incoming_request_params.dig("monitor", "url")} OFFLINE"
52+
when "certificate_expires_soon"
53+
"#{adapter_incoming_request_params.dig("monitor", "url")} CERTIFICATE EXPIRES SOON"
54+
else
55+
"[PULSETIC] UNKNOWN ALERT TYPE"
56+
end
57+
end
58+
59+
def _alert_type
60+
adapter_incoming_request_params.dig("alert_type")
61+
end
62+
63+
def _additional_datums
64+
[
65+
AdditionalDatum.new(format: "link", label: "Monitor", value: "https://app.pulsetic.com/monitors/#{adapter_incoming_request_params.dig("monitor", "id")}/overview"),
66+
AdditionalDatum.new(format: "link", label: "URL", value: adapter_incoming_request_params.dig("monitor", "url"))
67+
]
68+
end
69+
end
70+
end

app/views/pager_tree/integrations/pulsetic/v3/_form_options.html.erb

Whitespace-only changes.

app/views/pager_tree/integrations/pulsetic/v3/_show_options.html.erb

Whitespace-only changes.

test/fixtures/pager_tree/integrations/integrations.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ prtg_v3:
135135
type: "PagerTree::Integrations::Prtg::V3"
136136
# options: no_options
137137

138+
pulsetic_v3:
139+
type: "PagerTree::Integrations::Pulsetic::V3"
140+
# options: no_options
141+
138142
sentry_v3:
139143
type: "PagerTree::Integrations::Sentry::V3"
140144
# options: no_options
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
require "test_helper"
2+
3+
module PagerTree::Integrations
4+
class Pulsetic::V3Test < ActiveSupport::TestCase
5+
include Integrateable
6+
7+
setup do
8+
@integration = pager_tree_integrations_integrations(:pulsetic_v3)
9+
10+
@create_request = {
11+
alert_type: "monitor_offline",
12+
monitor: {
13+
id: 123456,
14+
url: "https://statuscode.app/200"
15+
}
16+
}.with_indifferent_access
17+
18+
@resolve_request = @create_request.deep_dup
19+
@resolve_request[:alert_type] = "monitor_online"
20+
21+
@certificate_request = @create_request.deep_dup
22+
@certificate_request[:alert_type] = "certificate_expires_soon"
23+
@certificate_request[:days_left] = 5
24+
25+
@other_request = @create_request.deep_dup
26+
@other_request[:alert_type] = "baaad"
27+
end
28+
29+
test "sanity" do
30+
assert @integration.adapter_supports_incoming?
31+
assert @integration.adapter_incoming_can_defer?
32+
assert_not @integration.adapter_supports_outgoing?
33+
assert @integration.adapter_show_alerts?
34+
assert @integration.adapter_show_logs?
35+
assert_not @integration.adapter_show_outgoing_webhook_delivery?
36+
end
37+
38+
test "adapter_actions" do
39+
@integration.adapter_incoming_request_params = @create_request
40+
assert_equal :create, @integration.adapter_action
41+
42+
@integration.adapter_incoming_request_params = @resolve_request
43+
assert_equal :resolve, @integration.adapter_action
44+
45+
@integration.adapter_incoming_request_params = @certificate_request
46+
assert_equal :create, @integration.adapter_action
47+
48+
@integration.adapter_incoming_request_params = @other_request
49+
assert_equal :other, @integration.adapter_action
50+
end
51+
52+
test "adapter_thirdparty_id" do
53+
@integration.adapter_incoming_request_params = @create_request
54+
assert_equal "123456_monitor", @integration.adapter_thirdparty_id
55+
56+
@integration.adapter_incoming_request_params = @certificate_request
57+
assert_equal "123456_certificate", @integration.adapter_thirdparty_id
58+
end
59+
60+
test "adapter_process_create_monitor" do
61+
@integration.adapter_incoming_request_params = @create_request
62+
63+
true_alert = Alert.new(
64+
title: "https://statuscode.app/200 OFFLINE",
65+
urgency: nil,
66+
thirdparty_id: "123456_monitor",
67+
dedup_keys: [],
68+
additional_data: [
69+
AdditionalDatum.new(format: "link", label: "Monitor", value: "https://app.pulsetic.com/monitors/123456/overview"),
70+
AdditionalDatum.new(format: "link", label: "URL", value: "https://statuscode.app/200")
71+
]
72+
)
73+
74+
assert_equal true_alert.to_json, @integration.adapter_process_create.to_json
75+
end
76+
77+
test "adapter_process_create_certificate" do
78+
@integration.adapter_incoming_request_params = @certificate_request
79+
80+
true_alert = Alert.new(
81+
title: "https://statuscode.app/200 CERTIFICATE EXPIRES SOON",
82+
urgency: nil,
83+
thirdparty_id: "123456_certificate",
84+
dedup_keys: [],
85+
additional_data: [
86+
AdditionalDatum.new(format: "link", label: "Monitor", value: "https://app.pulsetic.com/monitors/123456/overview"),
87+
AdditionalDatum.new(format: "link", label: "URL", value: "https://statuscode.app/200")
88+
]
89+
)
90+
91+
assert_equal true_alert.to_json, @integration.adapter_process_create.to_json
92+
end
93+
end
94+
end

0 commit comments

Comments
 (0)