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