aboutsummaryrefslogblamecommitdiffstats
path: root/test/channel_test.rb
blob: 3f7847a12da168046829d394c55b6747d4a158e2 (plain) (tree)
1
2

                     























































































































                                                                                                        
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