lib/webmachine/spec/adapter_lint.rb in webmachine-1.2.2 vs lib/webmachine/spec/adapter_lint.rb in webmachine-1.3.0

- old
+ new

@@ -2,124 +2,158 @@ require "net/http" shared_examples_for :adapter_lint do attr_accessor :client - before(:all) do - configuration = Webmachine::Configuration.default - dispatcher = Webmachine::Dispatcher.new - dispatcher.add_route ["test"], Test::Resource + let(:address) { "127.0.0.1" } + let(:port) { s = TCPServer.new(address, 0); p = s.addr[1]; s.close; p } - @adapter = described_class.new(configuration, dispatcher) - @client = Net::HTTP.new(configuration.ip, configuration.port) + let(:application) do + application = Webmachine::Application.new + application.dispatcher.add_route ["test"], Test::Resource - Thread.abort_on_exception = true - @server_thread = Thread.new { @adapter.run } + application.configure do |c| + c.ip = address + c.port = port + end + application + end + + let(:client) do + client = Net::HTTP.new(application.configuration.ip, port) # Wait until the server is responsive timeout(5) do begin client.start rescue Errno::ECONNREFUSED - sleep(0.1) + sleep(0.01) retry end end + client end - after(:all) do - @adapter.shutdown - @client.finish - @server_thread.join + before do + @adapter = described_class.new(application) + + Thread.abort_on_exception = true + @server_thread = Thread.new { @adapter.run } + sleep(0.01) end + after do + client.finish + @server_thread.kill + end + + it "provides the request URI" do + request = Net::HTTP::Get.new("/test") + request["Accept"] = "test/response.request_uri" + response = client.request(request) + expect(response.body).to eq("http://#{address}:#{port}/test") + end + + context do + let(:address) { "::1" } + + it "provides the IPv6 request URI" do + if RUBY_VERSION =~ /^2\.(0|1)\./ + skip "Net::HTTP regression in Ruby 2.(0|1)" + end + + request = Net::HTTP::Get.new("/test") + request["Accept"] = "test/response.request_uri" + response = client.request(request) + expect(response.body).to eq("http://[#{address}]:#{port}/test") + end + end + it "provides a string-like request body" do request = Net::HTTP::Put.new("/test") request.body = "Hello, World!" request["Content-Type"] = "test/request.stringbody" response = client.request(request) - response["Content-Length"].should eq("21") - response.body.should eq("String: Hello, World!") + expect(response["Content-Length"]).to eq("21") + expect(response.body).to eq("String: Hello, World!") end it "provides an enumerable request body" do request = Net::HTTP::Put.new("/test") request.body = "Hello, World!" request["Content-Type"] = "test/request.enumbody" response = client.request(request) - response["Content-Length"].should eq("19") - response.body.should eq("Enum: Hello, World!") + expect(response["Content-Length"]).to eq("19") + expect(response.body).to eq("Enum: Hello, World!") end it "handles missing pages" do request = Net::HTTP::Get.new("/missing") response = client.request(request) - response.code.should eq("404") - response["Content-Type"].should eq("text/html") + expect(response.code).to eq("404") + expect(response["Content-Type"]).to eq("text/html") end it "handles empty response bodies" do request = Net::HTTP::Post.new("/test") request.body = "" response = client.request(request) - response.code.should eq("204") - # FIXME: Mongrel/WEBrick fail this test. Is there a bug? - #response["Content-Type"].should be_nil - response["Content-Length"].should be_nil - response.body.should be_nil + expect(response.code).to eq("204") + expect(["0", nil]).to include(response["Content-Length"]) + expect(response.body).to be_nil end it "handles string response bodies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.stringbody" response = client.request(request) - response["Content-Length"].should eq("20") - response.body.should eq("String response body") + expect(response["Content-Length"]).to eq("20") + expect(response.body).to eq("String response body") end it "handles enumerable response bodies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.enumbody" response = client.request(request) - response["Transfer-Encoding"].should eq("chunked") - response.body.should eq("Enumerable response body") + expect(response["Transfer-Encoding"]).to eq("chunked") + expect(response.body).to eq("Enumerable response body") end it "handles proc response bodies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.procbody" response = client.request(request) - response["Transfer-Encoding"].should eq("chunked") - response.body.should eq("Proc response body") + expect(response["Transfer-Encoding"]).to eq("chunked") + expect(response.body).to eq("Proc response body") end it "handles fiber response bodies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.fiberbody" response = client.request(request) - response["Transfer-Encoding"].should eq("chunked") - response.body.should eq("Fiber response body") + expect(response["Transfer-Encoding"]).to eq("chunked") + expect(response.body).to eq("Fiber response body") end it "handles io response bodies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.iobody" response = client.request(request) - response["Content-Length"].should eq("16") - response.body.should eq("IO response body") + expect(response["Content-Length"]).to eq("17") + expect(response.body).to eq("IO response body\n") end it "handles request cookies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.cookies" request["Cookie"] = "echo=echocookie" response = client.request(request) - response.body.should eq("echocookie") + expect(response.body).to eq("echocookie") end it "handles response cookies" do request = Net::HTTP::Get.new("/test") request["Accept"] = "test/response.cookies" response = client.request(request) - response["Set-Cookie"].should eq("cookie=monster, rodeo=clown") + expect(response["Set-Cookie"]).to eq("cookie=monster, rodeo=clown") end end