lib/capybara/rack_test_json/driver.rb in capybara-json-0.1.2 vs lib/capybara/rack_test_json/driver.rb in capybara-json-0.2.0
- old
+ new
@@ -1,44 +1,79 @@
-to_inherit = Capybara.const_defined?("RackTest") ? Capybara::RackTest::Driver : Capybara::Driver::RackTest
+class Capybara::RackTestJson::Driver < Capybara::Json::Driver::Base
+ def initialize(app)
+ @app = app
+ end
-class Capybara::RackTestJson::Driver < to_inherit
- def body
- MultiJson.decode(source) || {}
+ def client
+ @client ||= Capybara::RackTestJson::Client.new(@app)
end
+ def last_request
+ client.last_request
+ end
+
+ def last_response
+ client.last_response
+ end
+
%w[ get delete ].each do |method|
class_eval %{
def #{method}(path, params = {}, env = {})
- super(path, params, env_for_rack(env))
+ client.#{method}(path, params, env_for_rack(env))
end
def #{method}!(path, params = {}, env = {})
handle_error { #{method}(path, params, env) }
end
}
end
+ alias visit get
%w[ post put ].each do |method|
class_eval %{
def #{method}(path, json, env = {})
json = MultiJson.encode(json) unless json.is_a?(String)
request_env = {
'CONTENT_LENGTH' => json.size,
- 'CONTENT_TYPE' => "application/json; charset=\#{json.encoding.to_s.downcase}",
+ 'CONTENT_TYPE' => "application/json; charset=\#{json.encoding.to_s.downcase}",
'rack.input' => StringIO.new(json)
}.merge(env_for_rack(env))
-
- super(path, {}, request_env)
+
+ client.#{method}(path, {}, request_env)
end
def #{method}!(path, json, env = {})
handle_error { #{method}(path, json, env) }
end
}
end
+ def current_url
+ last_request.url
+ end
+
+ def source
+ last_response.body
+ end
+
+ def body
+ MultiJson.decode(source) || {}
+ end
+
+ def response_headers
+ last_response.headers
+ end
+
+ def status_code
+ last_response.status
+ end
+
+ def reset!
+ @client = nil
+ end
+
protected
def env_for_rack(env)
env.inject({}) do |rack_env, (key, value)|
env_key = key.upcase.gsub('-', '_')
env_key = "HTTP_" + env_key unless env_key == "CONTENT_TYPE"
@@ -48,8 +83,8 @@
end
end
def handle_error(&block)
yield
- raise(Capybara::Json::Error, response) if status_code >= 400
+ raise(Capybara::Json::Error, last_response) if status_code >= 400
end
end