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 ]


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

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 198

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 198

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 235

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 264

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 260

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 310

def assert_has_no_stream(stream)
  check_subscribed!
  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 322

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 287

def assert_has_stream(stream)
  check_subscribed!
  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 299

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 275

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 331

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

  self.class.channel_class.broadcasting_for(stream_or_object)
end

#check_subscribed! (private)

[ GitHub ]

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

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 248

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 207

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 219

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 254

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 240

def unsubscribe
  check_subscribed!
  subscription.unsubscribe_from_channel
end