1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actioncable/test/test_helper.rb
Jeremy Daer b168eb5819 Cable message encoding
* Introduce a connection coder responsible for encoding Cable messages
  as WebSocket messages, defaulting to `ActiveSupport::JSON` and duck-
  typing to any object responding to `#encode` and `#decode`.
* Consolidate encoding responsibility to the connection. No longer
  explicitly JSON-encode from channels or other sources. Pass Cable
  messages as Hashes to `#transmit` and rely on it to encode.
* Introduce stream encoders responsible for decoding pubsub messages.
  Preserve the currently raw encoding, but make it easy to use JSON.
  Same duck type as the connection encoder.
* Revert recent data normalization/quoting (#23649) which treated
  `identifier` and `data` values as nested JSON objects rather than as
  opaque JSON-encoded strings. That dealt us an awkward hand where we'd
  decode JSON strings… or not, but always encode as JSON. Embedding
  JSON object values directly is preferably, no extra JSON encoding,
  but that should be a purposeful protocol version change rather than
  ambiguously, inadvertently supporting multiple message formats.
2016-03-31 07:08:16 -07:00

70 lines
1.4 KiB
Ruby

require 'action_cable'
require 'active_support/testing/autorun'
require 'puma'
require 'mocha/setup'
require 'rack/mock'
begin
require 'byebug'
rescue LoadError
end
# Require all the stubs and models
Dir[File.dirname(__FILE__) + '/stubs/*.rb'].each {|file| require file }
if ENV['FAYE'].present?
require 'faye/websocket'
class << Faye::WebSocket
remove_method :ensure_reactor_running
# We don't want Faye to start the EM reactor in tests because it makes testing much harder.
# We want to be able to start and stop EM loop in tests to make things simpler.
def ensure_reactor_running
# no-op
end
end
end
module EventMachineConcurrencyHelpers
def wait_for_async
EM.run_deferred_callbacks
end
def run_in_eventmachine
failure = nil
EM.run do
begin
yield
rescue => ex
failure = ex
ensure
wait_for_async
EM.stop if EM.reactor_running?
end
end
raise failure if failure
end
end
module ConcurrentRubyConcurrencyHelpers
def wait_for_async
e = Concurrent.global_io_executor
until e.completed_task_count == e.scheduled_task_count
sleep 0.1
end
end
def run_in_eventmachine
yield
wait_for_async
end
end
class ActionCable::TestCase < ActiveSupport::TestCase
if ENV['FAYE'].present?
include EventMachineConcurrencyHelpers
else
include ConcurrentRubyConcurrencyHelpers
end
end