53 lines
1.5 KiB
Ruby
53 lines
1.5 KiB
Ruby
module Matchers
|
|
class BroadcastToUser
|
|
class TestBroadcaster
|
|
attr_reader :broadcasts
|
|
|
|
def initialize
|
|
@broadcasts = []
|
|
end
|
|
|
|
def broadcast(object)
|
|
self.broadcasts << object
|
|
end
|
|
end
|
|
|
|
def initialize(user_id)
|
|
@user_id = user_id
|
|
@user_id = @user_id.id if @user_id.is_a?(User)
|
|
end
|
|
|
|
def matches?(block)
|
|
old_broadcaster = Mozo.broadcaster
|
|
test_broadcaster = TestBroadcaster.new
|
|
Mozo.broadcaster = test_broadcaster
|
|
block.call
|
|
Mozo.broadcaster = old_broadcaster
|
|
|
|
relevant_broadcasts = test_broadcaster.broadcasts.select{|b| b[:channel] =~ /^\/user\/#{@user_id}/ && b[:data][:event] == @message}
|
|
@failure_message = "User #{@user_id} did not receive any broadcasts" and return false if relevant_broadcasts.empty?
|
|
@failure_debug_content = "was #{relevant_broadcasts.map{|b| b[:data][:data].inspect}.join(" and ")}"
|
|
relevant_broadcasts.any? { |b| @target_object === b[:data][:data].deep_symbolize_keys }
|
|
end
|
|
|
|
def message(msg)
|
|
@message = msg
|
|
self
|
|
end
|
|
|
|
def with(target_object)
|
|
@target_object = target_object
|
|
self
|
|
end
|
|
|
|
def failure_message
|
|
@failure_message || "user #{@user_id} did not receive broadcast #{@message} with #{@target_object.inspect} #{@failure_debug_content}"
|
|
end
|
|
def supports_block_expectations?; true; end
|
|
end
|
|
|
|
def broadcast_to_user(*args, &block)
|
|
BroadcastToUser.new(*args, &block)
|
|
end
|
|
end
|