blob: 3f7847a12da168046829d394c55b6747d4a158e2 (
plain) (
tree)
|
|
require 'test_helper'
class ChannelTest < ActiveSupport::TestCase
Room = Struct.new(:id)
User = Struct.new(:name)
class TestConnection
attr_reader :identifiers, :logger, :current_user, :transmissions
def initialize(user)
@identifiers = [ :current_user ]
@current_user = user
@logger = Logger.new(StringIO.new)
@transmissions = []
end
def transmit(data)
@transmissions << data
end
def last_transmission
@transmissions.last
end
end
class ChatChannel < ActionCable::Channel::Base
attr_reader :room, :last_action
on_subscribe :toggle_subscribed
on_unsubscribe :toggle_subscribed
def subscribed
@room = Room.new params[:id]
@actions = []
end
def unsubscribed
@room = nil
end
def toggle_subscribed
@subscribed = !@subscribed
end
def leave
@last_action = [ :leave ]
end
def speak(data)
@last_action = [ :speak, data ]
end
def subscribed?
@subscribed
end
def get_latest
transmit data: 'latest'
end
private
def rm_rf
@last_action = [ :rm_rf ]
end
end
setup do
@user = User.new "lifo"
@connection = TestConnection.new(@user)
@channel = ChatChannel.new @connection, "{id: 1}", { id: 1 }
end
test "should subscribe to a channel on initialize" do
assert_equal 1, @channel.room.id
end
test "on subscribe callbacks" do
assert @channel.subscribed
end
test "channel params" do
assert_equal({ id: 1 }, @channel.params)
end
test "unsubscribing from a channel" do
assert @channel.room
assert @channel.subscribed?
@channel.unsubscribe_from_channel
assert ! @channel.room
assert ! @channel.subscribed?
end
test "connection identifiers" do
assert_equal @user.name, @channel.current_user.name
end
test "callable action without any argument" do
@channel.perform_action 'action' => :leave
assert_equal [ :leave ], @channel.last_action
end
test "callable action with arguments" do
data = { 'action' => :speak, 'content' => "Hello World" }
@channel.perform_action data
assert_equal [ :speak, data ], @channel.last_action
end
test "try calling a private method" do
@channel.perform_action 'action' => :rm_rf
assert_nil @channel.last_action
end
test "transmitting data" do
@channel.perform_action 'action' => :get_latest
expected = ActiveSupport::JSON.encode "identifier" => "{id: 1}", "message" => { "data" => "latest" }
assert_equal expected, @connection.last_transmission
end
end
|