require 'action_cable' require 'active_support/testing/autorun' require 'puma' require 'mocha/setup' require 'rack/mock' require 'active_support/core_ext/hash/indifferent_access' # 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