123456789_123456789_123456789_123456789_123456789_

Module: ActionCable::Channel::TestCase::Behavior

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Defined in: actioncable/lib/action_cable/channel/test_case.rb

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

  • #subscription readonly

    Use testserver (not test_server) to silence "Test is missing assertions: test_server" warnings.

  • #testserver readonly

    Use testserver (not test_server) to silence "Test is missing assertions: test_server" warnings.

::ActionCable::TestHelper - Included

Instance Method Summary

::ActionCable::TestHelper - Included

#assert_broadcast_on

Asserts that the specified message has been sent to the stream.

#assert_broadcasts

Asserts that the number of broadcasted messages to the stream matches the given number.

#assert_no_broadcasts

Asserts that no messages have been sent to the stream.

#capture_broadcasts

Returns the messages that are broadcasted in the block.

#new_broadcasts_from, #after_teardown, #before_setup, #pubsub_adapter

DSL Calls

included

[ GitHub ]


144
145
146
147
148
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 144

included do
  class_attribute :_channel_class

  ActiveSupport.run_load_hooks(:action_cable_channel_test_case, self)
end

Instance Attribute Details

#subscription (readonly)

Use testserver (not test_server) to silence "Test is missing assertions: test_server" warnings

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 199

attr_reader :subscription, :testserver

#testserver (readonly)

Use testserver (not test_server) to silence "Test is missing assertions: test_server" warnings

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 199

attr_reader :subscription, :testserver

Instance Method Details

#advance_time(seconds)

Advances all registered periodic timers by the given number of seconds, firing their blocks for each elapsed interval:

def test_timer
subscribe
advance_time 5.seconds
assert_equal 1, subscription.tick_count
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 236

def advance_time(seconds)
  testserver.advance_time(seconds)
end

#assert_broadcast_on(stream_or_object, *args)

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 265

def assert_broadcast_on(stream_or_object, *args)
  super(broadcasting_for(stream_or_object), *args)
end

#assert_broadcasts(stream_or_object, *args)

Enhance TestHelper assertions to handle non-String broadcastings

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 261

def assert_broadcasts(stream_or_object, *args)
  super(broadcasting_for(stream_or_object), *args)
end

#assert_has_no_stream(stream)

Asserts that the specified stream has not been started.

def test_assert_no_started_stream
  subscribe
  assert_has_no_stream 'messages'
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 312

def assert_has_no_stream(stream)
  check_subscribed!
  stream = String(stream)
  assert subscription.stream_names.exclude?(stream), "Stream #{stream} has been started"
end

#assert_has_no_stream_for(object)

Asserts that the specified stream for a model has not started.

def test_assert_no_started_stream_for
  subscribe id: 41
  assert_has_no_stream_for User.find(42)
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 325

def assert_has_no_stream_for(object)
  assert_has_no_stream(broadcasting_for(object))
end

#assert_has_stream(stream)

Asserts that the specified stream has been started.

def test_assert_started_stream
  subscribe
  assert_has_stream 'messages'
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 288

def assert_has_stream(stream)
  check_subscribed!
  stream = String(stream)
  assert subscription.stream_names.include?(stream), "Stream #{stream} has not been started"
end

#assert_has_stream_for(object)

Asserts that the specified stream for a model has started.

def test_assert_started_stream_for
  subscribe id: 42
  assert_has_stream_for User.find(42)
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 301

def assert_has_stream_for(object)
  assert_has_stream(broadcasting_for(object))
end

#assert_no_streams

Asserts that no streams have been started.

def test_assert_no_started_stream
  subscribe
  assert_no_streams
end
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 276

def assert_no_streams
  check_subscribed!
  assert subscription.stream_names.empty?, "No streams started was expected, but #{subscription.stream_names.count} found"
end

#broadcasting_for(stream_or_object) (private)

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 334

def broadcasting_for(stream_or_object)
  return stream_or_object if stream_or_object.is_a?(String) || stream_or_object.is_a?(Symbol)

  self.class.channel_class.broadcasting_for(stream_or_object)
end

#check_subscribed! (private)

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 330

def check_subscribed!
  raise "Must be subscribed!" if subscription.nil? || subscription.rejected?
end

#perform(action, data = {})

Perform action on a channel.

NOTE: Must be subscribed.

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 249

def perform(action, data = {})
  check_subscribed!
  subscription.perform_action(data.stringify_keys.merge("action" => action.to_s))
end

#stub_connection(server: ActionCable.server, **identifiers)

Set up test connection with the specified identifiers:

class ApplicationCable < ActionCable::Connection::Base
  identified_by :user, :token
end

stub_connection(user: users[:john], token: 'my-secret-token')
[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 208

def stub_connection(server: ActionCable.server, **identifiers)
  @socket = Connection::TestSocket.new(Connection::TestSocket.build_request(ActionCable.server.config.mount_path || "/cable"))
  @testserver = Connection::TestServer.new(server)
  @connection = self.class.connection_class.new(testserver, socket).tap do |conn|
    identifiers.each do |identifier, val|
      conn.public_send("#{identifier}=", val)
    end
  end
end

#subscribe(params = {})

Subscribe to the channel under test. Optionally pass subscription parameters as a ::Hash.

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 220

def subscribe(params = {})
  @connection ||= stub_connection
  @subscription = self.class.channel_class.new(connection, CHANNEL_IDENTIFIER, params.with_indifferent_access)
  @subscription.singleton_class.include(ChannelExt)
  @subscription.subscribe_to_channel
  @subscription
end

#transmissions

Returns messages transmitted into channel

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 255

def transmissions
  # Return only directly sent message (via #transmit)
  socket.transmissions.filter_map { |data| data["message"] }
end

#unsubscribe

Unsubscribe the subscription under test.

[ GitHub ]

  
# File 'actioncable/lib/action_cable/channel/test_case.rb', line 241

def unsubscribe
  check_subscribed!
  subscription.unsubscribe_from_channel
end