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 ]


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

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 197

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 197

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 234

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 263

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 259

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!
  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 323

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 286

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 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 274

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 332

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 328

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 247

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 206

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 218

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 253

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 239

def unsubscribe
  check_subscribed!
  subscription.unsubscribe_from_channel
end