Merge pull request #2626 from basecamp/push-event-payload-body-update

Push event payload body updates
This commit is contained in:
Stanko Krtalić
2026-02-27 19:56:50 +01:00
committed by GitHub
2 changed files with 242 additions and 1 deletions
+38 -1
View File
@@ -22,8 +22,32 @@ class Notification::EventPayload < Notification::DefaultPayload
card.closure ? "Moved to Done by #{event.creator.name}" : "Closed by #{event.creator.name}"
when "card_reopened"
"Reopened by #{event.creator.name}"
when "card_triaged"
if column_name.present?
"Moved to #{column_name} by #{event.creator.name}"
else
"Moved by #{event.creator.name}"
end
when "card_sent_back_to_triage"
"Moved back to Maybe? by #{event.creator.name}"
when "card_board_changed", "card_collection_changed"
if new_location_name.present?
"Moved to #{new_location_name} by #{event.creator.name}"
else
"Moved by #{event.creator.name}"
end
when "card_title_changed"
if new_title.present?
"Renamed to #{new_title} by #{event.creator.name}"
else
"Renamed by #{event.creator.name}"
end
when "card_postponed"
"Moved to Not Now by #{event.creator.name}"
when "card_auto_postponed"
"Moved to Not Now due to inactivity"
else
event.creator.name
"Updated by #{event.creator.name}"
end
end
@@ -57,6 +81,19 @@ class Notification::EventPayload < Notification::DefaultPayload
card.title.presence || "Card #{card.number}"
end
def column_name
event.particulars.dig("particulars", "column")
end
def new_location_name
event.particulars.dig("particulars", "new_board") ||
event.particulars.dig("particulars", "new_collection")
end
def new_title
event.particulars.dig("particulars", "new_title")
end
def card_url_with_comment_anchor(comment)
Rails.application.routes.url_helpers.card_url(
comment.card,
@@ -65,6 +65,210 @@ class Notification::PushTarget::WebTest < ActiveSupport::TestCase
Notification::PushTarget::Web.new(@notification).process
end
test "payload for triage includes column name" do
event = events(:logo_published)
event.update!(action: "card_triaged", particulars: { "particulars" => { "column" => "In Progress" } })
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved to In Progress by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for triage falls back when column name is missing" do
event = events(:logo_published)
event.update!(action: "card_triaged", particulars: {})
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for triage falls back when column name is blank" do
event = events(:logo_published)
event.update!(action: "card_triaged", particulars: { "particulars" => { "column" => "" } })
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for sent back to triage includes Maybe?" do
event = events(:logo_published)
event.update!(action: "card_sent_back_to_triage")
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved back to Maybe? by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for board change includes new board name" do
event = events(:logo_published)
event.update!(
action: "card_board_changed",
particulars: { "particulars" => { "old_board" => "Old Board", "new_board" => "New Board" } }
)
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved to New Board by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for board change falls back when board name is missing" do
event = events(:logo_published)
event.update!(action: "card_board_changed", particulars: {})
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for board change falls back when board name is blank" do
event = events(:logo_published)
event.update!(
action: "card_board_changed",
particulars: { "particulars" => { "new_board" => "" } }
)
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for collection change includes new collection name" do
event = events(:logo_published)
event.update!(
action: "card_collection_changed",
particulars: { "particulars" => { "new_collection" => "New Collection" } }
)
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved to New Collection by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for collection change falls back when collection name is missing" do
event = events(:logo_published)
event.update!(action: "card_collection_changed", particulars: {})
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for collection change falls back when collection name is blank" do
event = events(:logo_published)
event.update!(action: "card_collection_changed", particulars: { "particulars" => { "new_collection" => "" } })
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for title change includes new title" do
event = events(:logo_published)
event.update!(
action: "card_title_changed",
particulars: { "particulars" => { "old_title" => "Old Title", "new_title" => "New Title" } }
)
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Renamed to New Title by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for title change falls back when title is missing" do
event = events(:logo_published)
event.update!(action: "card_title_changed", particulars: {})
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Renamed by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for title change falls back when title is blank" do
event = events(:logo_published)
event.update!(action: "card_title_changed", particulars: { "particulars" => { "new_title" => "" } })
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Renamed by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for postponed includes Not Now" do
event = events(:logo_published)
event.update!(action: "card_postponed")
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved to Not Now by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for auto postponed includes inactivity message" do
event = events(:logo_published)
event.update!(action: "card_auto_postponed")
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Moved to Not Now due to inactivity"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for unhandled action uses updated fallback message" do
event = events(:logo_published)
event.update!(action: "card_unassigned")
@notification.update!(source: event)
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:body] == "Updated by #{event.creator.name}"
end
Notification::PushTarget::Web.new(@notification).process
end
test "payload for mention includes mentioner name" do
@web_push_pool.expects(:queue).once.with do |payload, _|
payload[:title].include?("mentioned you")