lib/capybara/rack_test_json/driver.rb in capybara-json-0.1.0 vs lib/capybara/rack_test_json/driver.rb in capybara-json-0.1.1
- old
+ new
@@ -3,21 +3,53 @@
class Capybara::RackTestJson::Driver < to_inherit
def body
MultiJson.decode(source) || {}
end
+ %w[ get delete ].each do |method|
+ class_eval %{
+ def #{method}(path, params = {}, env = {})
+ super(path, params, env_for_rack(env))
+ end
+
+ def #{method}!(path, params = {}, env = {})
+ handle_error { #{method}(path, params, env) }
+ end
+ }
+ end
+
%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}",
'rack.input' => StringIO.new(json)
- }.merge(env)
+ }.merge(env_for_rack(env))
super(path, {}, request_env)
end
+
+ def #{method}!(path, json, env = {})
+ handle_error { #{method}(path, json, env) }
+ end
}
+ 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"
+ rack_env[env_key] = value
+
+ rack_env
+ end
+ end
+
+ def handle_error(&block)
+ yield
+ raise(Capybara::Json::Error, response) if status_code >= 400
end
end