1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
# frozen_string_literal: true
require "test_helper"
require "stubs/test_server"
require "active_support/core_ext/object/json"
class ActionCable::Connection::BaseTest < ActionCable::TestCase
class Connection < ActionCable::Connection::Base
attr_reader :websocket, :subscriptions, :message_buffer, :connected
def connect
@connected = true
end
def disconnect
@connected = false
end
def send_async(method, *args)
send method, *args
end
end
setup do
@server = TestServer.new
@server.config.allowed_request_origins = %w( http://rubyonrails.com )
end
test "making a connection with invalid headers" do
run_in_eventmachine do
connection = ActionCable::Connection::Base.new(@server, Rack::MockRequest.env_for("/test"))
response = connection.process
assert_equal 404, response[0]
end
end
test "websocket connection" do
run_in_eventmachine do
connection = open_connection
connection.process
assert_predicate connection.websocket, :possible?
wait_for_async
assert_predicate connection.websocket, :alive?
end
end
test "rack response" do
run_in_eventmachine do
connection = open_connection
response = connection.process
assert_equal [ -1, {}, [] ], response
end
end
test "on connection open" do
run_in_eventmachine do
connection = open_connection
connection.websocket.expects(:transmit).with({ type: "welcome" }.to_json)
connection.message_buffer.expects(:process!)
connection.process
wait_for_async
assert_equal [ connection ], @server.connections
assert connection.connected
end
end
test "on connection close" do
run_in_eventmachine do
connection = open_connection
connection.process
# Setup the connection
connection.server.stubs(:timer).returns(true)
connection.send :handle_open
assert connection.connected
connection.subscriptions.expects(:unsubscribe_from_all)
connection.send :handle_close
assert ! connection.connected
assert_equal [], @server.connections
end
end
test "connection statistics" do
run_in_eventmachine do
connection = open_connection
connection.process
statistics = connection.statistics
assert_predicate statistics[:identifier], :blank?
assert_kind_of Time, statistics[:started_at]
assert_equal [], statistics[:subscriptions]
end
end
test "explicitly closing a connection" do
run_in_eventmachine do
connection = open_connection
connection.process
connection.websocket.expects(:close)
connection.close
end
end
test "rejecting a connection causes a 404" do
run_in_eventmachine do
class CallMeMaybe
def call(*)
raise "Do not call me!"
end
end
env = Rack::MockRequest.env_for(
"/test",
"HTTP_CONNECTION" => "upgrade", "HTTP_UPGRADE" => "websocket",
"HTTP_HOST" => "localhost", "HTTP_ORIGIN" => "http://rubyonrails.org", "rack.hijack" => CallMeMaybe.new
)
connection = ActionCable::Connection::Base.new(@server, env)
response = connection.process
assert_equal 404, response[0]
end
end
private
def open_connection
env = Rack::MockRequest.env_for "/test", "HTTP_CONNECTION" => "upgrade", "HTTP_UPGRADE" => "websocket",
"HTTP_HOST" => "localhost", "HTTP_ORIGIN" => "http://rubyonrails.com"
Connection.new(@server, env)
end
end
|