require "test_helper"
class BroadcasterTest < ActionView::TestCase
include CableReady::StreamIdentifier
setup do
@post = posts(:one)
@post.stubs(:cubicle_element_ids).returns(%w[foo bar])
@post.stubs(:present_users_for_element_id_and_scope).with("foo", "").returns([users(:one)])
@post.stubs(:present_users_for_element_id_and_scope).with("bar", "").returns([users(:two)])
@post_2 = posts(:two)
@post_2.stubs(:cubicle_element_ids).returns(%w[baz])
@post_2.stubs(:present_users_for_element_id_and_scope).with("baz", :edit).returns([users(:one)])
@post_2.stubs(:present_users_for_element_id_and_scope).with("baz", :show).returns([])
block_source_foo = Cubism::BlockSource.new(location: "test:1", variable_name: "users", source: "
<%= users.map(&:username).to_sentence %>
", view_context: self)
block_source_bar = Cubism::BlockSource.new(location: "test:1", variable_name: "present_users", source: "<%= present_users.map(&:username).to_sentence %>
", view_context: self)
Cubism.stubs(:block_store).returns({
"foo" => Cubism::BlockContainer.new(block_location: "test:1", block_source: block_source_foo, user_gid: users(:one).to_gid.to_s, resource_gid: posts(:one).to_gid.to_s),
"bar" => Cubism::BlockContainer.new(block_location: "test:1", block_source: block_source_bar, user_gid: users(:two).to_gid.to_s, resource_gid: posts(:one).to_gid.to_s),
"baz" => Cubism::BlockContainer.new(block_location: "test:1", block_source: block_source_foo, user_gid: users(:one).to_gid.to_s, resource_gid: posts(:two).to_gid.to_s, scope: :edit)
})
end
test "it broadcasts to all registered element ids with default scopes" do
with_mocked_cable_ready({"foo" => {"" => users(:one)}, "bar" => {"" => users(:two)}}, @post) do |cable_ready_mock|
@broadcaster = Cubism::Broadcaster.new(resource: @post)
@broadcaster.expects(:cable_ready).returns(cable_ready_mock).times(3)
@broadcaster.broadcast
end
end
test "it broadcasts to all registered element ids and respects scopes" do
with_mocked_cable_ready({"baz" => {"edit" => users(:one)}}, @post_2) do |cable_ready_mock|
@broadcaster = Cubism::Broadcaster.new(resource: @post_2)
@broadcaster.expects(:cable_ready).returns(cable_ready_mock).twice
@broadcaster.broadcast
end
end
end
def with_mocked_cable_ready(elements_with_users_and_scopes, resource)
cable_ready_mock = mock
cable_ready_mock.expects(:broadcast).once
elements_with_users_and_scopes.each do |element_id, scoped_users|
cable_ready_channel = mock
scoped_users.each do |scope, user|
cable_ready_channel
.expects(:inner_html)
.with({
selector: "cubicle-element#cubicle-#{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
html: "#{user.username}
"
})
end
cable_ready_mock.expects(:[]).with(element_id).returns(cable_ready_channel)
end
yield cable_ready_mock
end