diff --git a/app/channels/turbo/streams/broadcasts.rb b/app/channels/turbo/streams/broadcasts.rb index 8f216fc5..45df1306 100644 --- a/app/channels/turbo/streams/broadcasts.rb +++ b/app/channels/turbo/streams/broadcasts.rb @@ -75,8 +75,13 @@ def broadcast_refresh_later_to(*streamables, request_id: Turbo.current_request_i end def broadcast_action_later_to(*streamables, action:, target: nil, targets: nil, attributes: {}, **rendering) - Turbo::Streams::ActionBroadcastJob.perform_later \ - stream_name_from(streamables), action: action, target: target, targets: targets, attributes: attributes, **rendering + streamables.flatten! + streamables.compact_blank! + + if streamables.present? + Turbo::Streams::ActionBroadcastJob.perform_later \ + stream_name_from(streamables), action: action, target: target, targets: targets, attributes: attributes, **rendering + end end def broadcast_render_to(*streamables, **rendering) @@ -88,7 +93,12 @@ def broadcast_render_later_to(*streamables, **rendering) end def broadcast_stream_to(*streamables, content:) - ActionCable.server.broadcast stream_name_from(streamables), content + streamables.flatten! + streamables.compact_blank! + + if streamables.present? + ActionCable.server.broadcast stream_name_from(streamables), content + end end def refresh_debouncer_for(*streamables, request_id: nil) # :nodoc: diff --git a/test/streams/broadcastable_test.rb b/test/streams/broadcastable_test.rb index 5c086289..1cab0da8 100644 --- a/test/streams/broadcastable_test.rb +++ b/test/streams/broadcastable_test.rb @@ -1,11 +1,30 @@ require "test_helper" require "action_cable" +require "minitest/mock" class Turbo::BroadcastableTest < ActionCable::Channel::TestCase include ActiveJob::TestHelper, Turbo::Streams::ActionHelper setup { @message = Message.new(id: 1, content: "Hello!") } + test "broadcasting ignores blank streamables" do + ActionCable.server.stub :broadcast, proc { flunk "expected no broadcasts" } do + @message.broadcast_remove_to nil + @message.broadcast_remove_to [nil] + @message.broadcast_remove_to "" + @message.broadcast_remove_to [""] + end + end + + test "broadcasting later ignores blank streamables" do + assert_no_enqueued_jobs do + @message.broadcast_append_later_to nil + @message.broadcast_append_later_to [nil] + @message.broadcast_append_later_to "" + @message.broadcast_append_later_to [""] + end + end + test "broadcasting remove to stream now" do assert_broadcast_on "stream", turbo_stream_action_tag("remove", target: "message_1") do @message.broadcast_remove_to "stream"