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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Capybara::Server do
it "should spool up a rack server" do
@app = proc { |env| [200, {}, ["Hello Server!"]]}
@server = Capybara::Server.new(@app).boot
@res = Net::HTTP.start(@server.host, @server.port) { |http| http.get('/') }
expect(@res.body).to include('Hello Server')
end
it "should do nothing when no server given" do
expect do
@server = Capybara::Server.new(nil).boot
end.not_to raise_error
end
it "should bind to the specified host" do
begin
app = proc { |env| [200, {}, ['Hello Server!']] }
Capybara.server_host = '127.0.0.1'
server = Capybara::Server.new(app).boot
res = Net::HTTP.get(URI("http://127.0.0.1:#{server.port}"))
expect(res).to eq('Hello Server!')
Capybara.server_host = '0.0.0.0'
server = Capybara::Server.new(app).boot
res = Net::HTTP.get(URI("http://127.0.0.1:#{server.port}"))
expect(res).to eq('Hello Server!')
ensure
Capybara.server_host = nil
end
end unless ENV['TRAVIS'] and (RUBY_ENGINE == 'jruby') #TODO travis with jruby in container mode has an issue with this test
it "should use specified port" do
Capybara.server_port = 22789
@app = proc { |env| [200, {}, ["Hello Server!"]]}
@server = Capybara::Server.new(@app).boot
@res = Net::HTTP.start(@server.host, 22789) { |http| http.get('/') }
expect(@res.body).to include('Hello Server')
Capybara.server_port = nil
end
it "should use given port" do
@app = proc { |env| [200, {}, ["Hello Server!"]]}
@server = Capybara::Server.new(@app, 22790).boot
@res = Net::HTTP.start(@server.host, 22790) { |http| http.get('/') }
expect(@res.body).to include('Hello Server')
Capybara.server_port = nil
end
it "should find an available port" do
@app1 = proc { |env| [200, {}, ["Hello Server!"]]}
@app2 = proc { |env| [200, {}, ["Hello Second Server!"]]}
@server1 = Capybara::Server.new(@app1).boot
@server2 = Capybara::Server.new(@app2).boot
@res1 = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
expect(@res1.body).to include('Hello Server')
@res2 = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
expect(@res2.body).to include('Hello Second Server')
end
context "When Capybara.reuse_server is true" do
before do
@old_reuse_server = Capybara.reuse_server
Capybara.reuse_server = true
end
after do
Capybara.reuse_server = @old_reuse_server
end
it "should use the existing server if it already running" do
@app = proc { |env| [200, {}, ["Hello Server!"]]}
@server1 = Capybara::Server.new(@app).boot
@server2 = Capybara::Server.new(@app).boot
res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
expect(res.body).to include('Hello Server')
res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
expect(res.body).to include('Hello Server')
expect(@server1.port).to eq(@server2.port)
end
it "detects and waits for all reused server sessions pending requests" do
done = false
app = proc do |env|
request = Rack::Request.new(env)
sleep request.params['wait_time'].to_f
done = true
[200, {}, ["Hello Server!"]]
end
server1 = Capybara::Server.new(app).boot
server2 = Capybara::Server.new(app).boot
start_request(server1, 0.5)
start_request(server2, 1.0)
expect {
server1.wait_for_pending_requests
}.to change{done}.from(false).to(true)
expect(server2.send(:pending_requests?)).to eq(false)
end
end
context "When Capybara.reuse_server is false" do
before do
@old_reuse_server = Capybara.reuse_server
Capybara.reuse_server = false
end
after do
Capybara.reuse_server = @old_reuse_server
end
it "should not reuse an already running server" do
@app = proc { |env| [200, {}, ["Hello Server!"]]}
@server1 = Capybara::Server.new(@app).boot
@server2 = Capybara::Server.new(@app).boot
res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
expect(res.body).to include('Hello Server')
res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
expect(res.body).to include('Hello Server')
expect(@server1.port).not_to eq(@server2.port)
end
it "detects and waits for only one sessions pending requests" do
done = false
app = proc do |env|
request = Rack::Request.new(env)
sleep request.params['wait_time'].to_f
done = true
[200, {}, ["Hello Server!"]]
end
server1 = Capybara::Server.new(app).boot
server2 = Capybara::Server.new(app).boot
start_request(server1, 0.5)
start_request(server2, 1.0)
expect {
server1.wait_for_pending_requests
}.to change{done}.from(false).to(true)
expect(server2.send(:pending_requests?)).to eq(true)
end
end
it "should raise server errors when the server errors before the timeout" do
begin
Capybara.server do
sleep 0.1
raise 'kaboom'
end
expect do
Capybara::Server.new(proc {|e|}).boot
end.to raise_error(RuntimeError, 'kaboom')
ensure
# TODO refactor out the defaults so it's reliant on unset state instead of
# a one-time call in capybara.rb
Capybara.server {|app, port| Capybara.run_default_server(app, port)}
end
end
it "is not #responsive? when Net::HTTP raises a SystemCallError" do
app = lambda { [200, {}, ['Hello, world']] }
server = Capybara::Server.new(app)
expect(Net::HTTP).to receive(:start).and_raise(SystemCallError.allocate)
expect(server.responsive?).to eq false
end
def start_request(server, wait_time)
# Start request, but don't wait for it to finish
socket = TCPSocket.new(server.host, server.port)
socket.write "GET /?wait_time=#{wait_time.to_s} HTTP/1.0\r\n\r\n"
socket.close
sleep 0.1
end
end
|