lib/capybara/driver/mechanize.rb in capybara-mechanize-0.1.0 vs lib/capybara/driver/mechanize.rb in capybara-mechanize-0.2.0
- old
+ new
@@ -3,19 +3,43 @@
class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
def initialize(*args)
super
@agent = ::Mechanize.new
+ @agent.redirect_ok = false
end
def visit(url)
get url
end
+ def cleanup!
+ @agent.cookie_jar.clear!
+ super
+ end
+
+ def current_url
+ (response_proxy && response_proxy.current_url) || super
+ end
+
def response
response_proxy || super
end
+
+ # TODO see how this can be cleaned up
+ def follow_redirect!
+ unless response.redirect?
+ raise "Last response was not a redirect. Cannot follow_redirect!"
+ end
+
+ if response.respond_to?(:page)
+ location = response.page.response['Location']
+ else
+ location = response['Location']
+ end
+ get(location)
+ end
def get(url, params = {}, headers = {})
process_remote_request(:get, url) || super
end
@@ -36,10 +60,11 @@
private
def process_remote_request(method, url, *options)
if remote?(url)
+ url = File.join((Capybara.app_host || Capybara.default_host), url) if URI.parse(url).host.nil?
reset_cache
@agent.send *( [method, url] + options)
follow_redirects!
true
end
@@ -48,19 +73,33 @@
def response_proxy
ResponseProxy.new(@agent.current_page) if @agent.current_page
end
class ResponseProxy
+ extend Forwardable
+
+ def_delegator :page, :body
+
+ attr_reader :page
+
def initialize(page)
@page = page
end
- def redirect?
- %w(301 302).include?(@page.code)
+ def current_url
+ page.uri.to_s
end
- def method_missing(method, *args, &block)
- @page.send(method, *args, &block)
+ def headers
+ page.response
+ end
+
+ def status
+ page.code.to_i
+ end
+
+ def redirect?
+ [301, 302].include?(status)
end
end
end
\ No newline at end of file