Permalink
Browse files

Merge pull request #150 from thunderboltlabs/master

Fix #to_rack to handle non-array response bodies.
  • Loading branch information...
2 parents beb8c65 + 146acef commit d0c58e98f5601c086956f1526721613cca1da178 @bblimke committed Jan 22, 2012
Showing with 29 additions and 2 deletions.
  1. +7 −1 lib/webmock/rack_response.rb
  2. +14 −1 spec/support/my_rack_app.rb
  3. +8 −0 spec/unit/rack_response_spec.rb
@@ -10,12 +10,18 @@ def evaluate(request)
status, headers, response = @app.call(env)
Response.new(
- :body => response.join,
+ :body => body_from_rack_response(response),
:headers => headers,
:status => status
)
end
+ def body_from_rack_response(response)
+ body = ""
+ response.each { |line| body << line }
+ return body
+ end
+
def build_rack_env(request)
uri = request.uri
headers = request.headers || {}
@@ -1,18 +1,31 @@
require 'rack'
class MyRackApp
+ class NonArrayResponse
+ # The rack response body need not implement #join,
+ # but it must implement #each. It need not be an Array.
+ # ActionDispatch::Response, for example, exercises that fact.
+ # See: http://rack.rubyforge.org/doc/SPEC.html
+
+ def each(*args, &blk)
+ ["This is not in an array!"].each(*args, &blk)
+ end
+ end
+
def self.call(env)
case env.values_at('REQUEST_METHOD', 'PATH_INFO')
when ['GET', '/']
[200, {}, ["This is my root!"]]
when ['GET', '/greet']
name = env['QUERY_STRING'][/name=([^&]*)/, 1] || "World"
[200, {}, ["Hello, #{name}"]]
+ when ['GET', '/non_array_response']
+ [200, {}, NonArrayResponse.new]
when ['POST', '/greet']
name = env["rack.input"].read[/name=([^&]*)/, 1] || "World"
[200, {}, ["Good to meet you, #{name}!"]]
else
[404, {}, ['']]
end
end
-end
+end
@@ -13,6 +13,14 @@
response.body.should include('This is my root!')
end
+ it "should behave correctly when the rack response is not a simple array of strings" do
+ request = WebMock::RequestSignature.new(:get, 'www.example.com/non_array_response')
+ response = @rack_response.evaluate(request)
+
+ response.status.first.should == 200
+ response.body.should include('This is not in an array!')
+ end
+
it "should send along params" do
request = WebMock::RequestSignature.new(:get, 'www.example.com/greet?name=Johnny')

0 comments on commit d0c58e9

Please sign in to comment.