106 lines
3.5 KiB
Ruby
106 lines
3.5 KiB
Ruby
require "test_helper"
|
|
|
|
module MySmsaPio
|
|
module Notifications
|
|
module Ntfy
|
|
class PublisherTest < ActiveSupport::TestCase
|
|
setup do
|
|
@admin = AdminUser.create!(
|
|
name: "Notifier", email: "notif@example.com",
|
|
password: "password123",
|
|
ntfy_topic: "mysmsa-test-topic",
|
|
ntfy_token: "tk_test_token",
|
|
ntfy_enabled: true,
|
|
ntfy_server_url: "https://ntfy.example.com"
|
|
)
|
|
end
|
|
|
|
test "publish sends POST to the correct ntfy URL with JSON body and auth header" do
|
|
stubbed = stub_request(:post, "https://ntfy.example.com/mysmsa-test-topic")
|
|
.with(
|
|
headers: {
|
|
"Authorization" => "Bearer tk_test_token",
|
|
"Content-Type" => "application/json"
|
|
},
|
|
body: hash_including(
|
|
"topic" => "mysmsa-test-topic",
|
|
"title" => "Gateway offline",
|
|
"message" => /gw-001 went offline/,
|
|
"priority" => 4,
|
|
"tags" => ->(tags) { tags.include?("rotating_light") }
|
|
)
|
|
)
|
|
.to_return(status: 200, body: "", headers: {})
|
|
|
|
result = Publisher.new(@admin).publish(
|
|
title: "Gateway offline",
|
|
message: "gw-001 went offline at #{Time.current}",
|
|
priority: 4,
|
|
tags: ["rotating_light"]
|
|
)
|
|
|
|
assert result
|
|
assert_requested stubbed
|
|
end
|
|
|
|
test "publish returns false on HTTP failure without raising" do
|
|
stub_request(:post, "https://ntfy.example.com/mysmsa-test-topic")
|
|
.to_return(status: 500, body: "error")
|
|
|
|
result = Publisher.new(@admin).publish(
|
|
title: "Test",
|
|
message: "body",
|
|
priority: 3,
|
|
tags: []
|
|
)
|
|
|
|
assert_not result
|
|
end
|
|
|
|
test "publish returns false if admin not ntfy_configured?" do
|
|
unconfigured = AdminUser.create!(
|
|
name: "No Ntfy", email: "none@example.com",
|
|
password: "password123"
|
|
)
|
|
|
|
result = Publisher.new(unconfigured).publish(
|
|
title: "X", message: "Y", priority: 3, tags: []
|
|
)
|
|
|
|
assert_not result
|
|
end
|
|
|
|
test "publish uses default server URL from ENV when ntfy_server_url is nil" do
|
|
ENV["NTFY_SERVER_URL"] = "https://default-ntfy.example.com"
|
|
admin = AdminUser.create!(
|
|
name: "Default", email: "default@example.com",
|
|
password: "password123",
|
|
ntfy_topic: "def-topic", ntfy_token: "tk_def",
|
|
ntfy_enabled: true
|
|
)
|
|
|
|
stub = stub_request(:post, "https://default-ntfy.example.com/def-topic")
|
|
.to_return(status: 200, body: "", headers: {})
|
|
|
|
Publisher.new(admin).publish(title: "T", message: "M", priority: 3, tags: [])
|
|
assert_requested stub
|
|
ensure
|
|
ENV.delete("NTFY_SERVER_URL")
|
|
end
|
|
|
|
test "publish includes click URL when provided" do
|
|
stub = stub_request(:post, "https://ntfy.example.com/mysmsa-test-topic")
|
|
.with(body: hash_including("click" => "https://app.example.com/admin/gateways"))
|
|
.to_return(status: 200, body: "", headers: {})
|
|
|
|
Publisher.new(@admin).publish(
|
|
title: "T", message: "M", priority: 3, tags: [],
|
|
click: "https://app.example.com/admin/gateways"
|
|
)
|
|
assert_requested stub
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|