Skip to content

Commit

Permalink
Merge branch 'master' of github.com:jeroenvandijk/capybara-mechanize
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Hao committed Oct 16, 2014
2 parents b9d78f3 + 05deac9 commit 3ac30dc
Show file tree
Hide file tree
Showing 14 changed files with 112 additions and 53 deletions.
1 change: 0 additions & 1 deletion .travis.yml
Expand Up @@ -6,7 +6,6 @@ before_install:
rvm:
- 1.9.3
- 2.0.0
- rbx-19mode
- jruby-19mode
- ruby-head
matrix:
Expand Down
4 changes: 2 additions & 2 deletions Gemfile
Expand Up @@ -2,8 +2,8 @@ source 'http://rubygems.org'

gemspec

gem 'capybara', '2.1.0'
gem 'rspec', '~> 2.12.0'
gem 'rspec', '~> 2.99.0'
gem 'launchy', '>= 2.0.4'
gem 'sinatra', '~> 1.3.3'
gem 'rake', '~> 10.0.3'
gem 'rdoc'
Expand Down
6 changes: 3 additions & 3 deletions capybara-mechanize.gemspec
Expand Up @@ -16,8 +16,8 @@ Gem::Specification.new do |s|
s.rdoc_options = ["--charset=UTF-8"]
s.require_paths = ["lib"]
s.rubygems_version = %q{1.3.7}
s.add_runtime_dependency(%q<mechanize>, ["~> 2.7"])
s.add_runtime_dependency(%q<capybara>, ["~> 2.1.0"])

s.add_runtime_dependency(%q<mechanize>, ["~> 2.7.0"])
s.add_runtime_dependency(%q<capybara>, ["~> 2.4.4"])
end

18 changes: 14 additions & 4 deletions lib/capybara/mechanize/browser.rb
Expand Up @@ -19,6 +19,7 @@ def initialize(driver)
def reset_host!
@last_remote_uri = nil
@last_request_remote = nil
@errored_remote_response = nil
super
end

Expand Down Expand Up @@ -71,7 +72,7 @@ def find(format, selector)
end.map { |node| Capybara::Mechanize::Node.new(self, node) }
end

attr_reader :agent
attr_reader :agent, :errored_remote_response

private

Expand Down Expand Up @@ -116,8 +117,13 @@ def process_remote_request(method, url, attributes, headers)
else
@agent.send(method, url, attributes, headers)
end
rescue => e
raise "Received the following error for a #{method.to_s.upcase} request to #{url}: '#{e.message}'"
@errored_remote_response = nil
rescue Mechanize::ResponseCodeError => e
@errored_remote_response = e.page

if Capybara.raise_server_errors
raise "Received the following error for a #{method.to_s.upcase} request to #{url}: '#{e.message}'"
end
end
@last_request_remote = true
end
Expand All @@ -129,7 +135,11 @@ def submit_mechanize_form(url, form, headers)
end

def remote_response
ResponseProxy.new(@agent.current_page) if @agent.current_page
if errored_remote_response
ResponseProxy.new(errored_remote_response)
elsif @agent.current_page
ResponseProxy.new(@agent.current_page)
end
end

def default_user_agent
Expand Down
3 changes: 2 additions & 1 deletion lib/capybara/mechanize/node.rb
Expand Up @@ -4,7 +4,8 @@ def click
super
elsif (tag_name == 'input' and %w(submit image).include?(type)) or
((tag_name == 'button') and type.nil? or type == "submit")
Capybara::Mechanize::Form.new(driver, form).submit(self)
associated_form = form
Capybara::Mechanize::Form.new(driver, form).submit(self) if associated_form
end
end
end
2 changes: 1 addition & 1 deletion lib/capybara/mechanize/version.rb
@@ -1,5 +1,5 @@
module Capybara
module Mechanize
VERSION = '1.1.0'
VERSION = '1.4.0'
end
end
2 changes: 1 addition & 1 deletion lib/capybara/spec/extended_test_app.rb
@@ -1,6 +1,6 @@
require 'capybara/spec/test_app'

class ExtendedTestApp < TestApp#< Sinatra::Base
class ExtendedTestApp < TestApp
set :environment, :production # so we don't get debug info that makes our test pass!
disable :protection

Expand Down
67 changes: 48 additions & 19 deletions spec/driver/mechanize_driver_spec.rb
Expand Up @@ -99,7 +99,6 @@
end

context "with an app_host" do

before do
Capybara.app_host = 'http://www.remote.com'
end
Expand All @@ -118,9 +117,22 @@
Capybara.default_host = 'www.local.com'
end

it "should allow local hosts to be set" do
Capybara::Mechanize.local_hosts = ['subdomain.local.com']
driver.should_not be_remote('http://subdomain.local.com')
after do
Capybara.default_host = CAPYBARA_DEFAULT_HOST
end

context "local hosts" do
before do
Capybara::Mechanize.local_hosts = ['subdomain.local.com']
end

after do
Capybara::Mechanize.local_hosts = nil
end

it "should allow local hosts to be set" do
driver.should_not be_remote('http://subdomain.local.com')
end
end

it "should treat urls with the same host names as local" do
Expand All @@ -132,7 +144,7 @@
end

it "should treat relative paths as remote if the previous request was remote" do
driver.visit(REMOTE_TEST_URL)
driver.visit(remote_test_url)
driver.should be_remote('/some_relative_link')
end

Expand All @@ -155,7 +167,7 @@
end

it "should consider relative paths to be remote when the previous request was remote" do
driver.visit("#{REMOTE_TEST_URL}/host")
driver.visit("#{remote_test_url}/host")
driver.get('/host')

should_be_a_remote_get
Expand All @@ -165,7 +177,7 @@
it "should always switch to the right context" do
driver.visit('http://www.local.com/host')
driver.get('/host')
driver.get("#{REMOTE_TEST_URL}/host")
driver.get("#{remote_test_url}/host")
driver.get('/host')
driver.get('http://www.local.com/host')

Expand All @@ -174,28 +186,41 @@
end

it "should follow redirects from local to remote" do
driver.visit("http://www.local.com/redirect_to/#{REMOTE_TEST_URL}/host")
driver.visit("http://www.local.com/redirect_to/#{remote_test_url}/host")
should_be_a_remote_get
end

it "should follow redirects from remote to local" do
driver.visit("#{REMOTE_TEST_URL}/redirect_to/http://www.local.com/host")
driver.visit("#{remote_test_url}/redirect_to/http://www.local.com/host")
should_be_a_local_get
end

after do
Capybara.default_host = nil
it "passes the status code of remote calls back to be validated" do
quietly do
driver.visit(remote_test_url)
driver.get('/asdfafadfsdfs')
driver.response.status.should be >= 400
end
end

it "should raise a useful error for sites that return a 404, because it is probably a misconfiguration" do
expect {
driver.visit("http://iamreallysurethatthisdoesntexist.com/canttouchthis")
}.to raise_error(%r{Received the following error for a GET request to http://iamreallysurethatthisdoesntexist.com/canttouchthis:})
context "when errors are set to true" do
it "raises an useful error because it is probably a misconfiguration" do
quietly do
original = Capybara.raise_server_errors

expect {
driver.visit(remote_test_url)
Capybara.raise_server_errors = true
driver.get('/asdfafadfsdfs')
}.to raise_error(%r{Received the following error for a GET request to /asdfafadfsdfs:})
Capybara.raise_server_errors = original
end
end
end
end

it "should include the right host when remote" do
driver.visit("#{REMOTE_TEST_URL}/host")
driver.visit("#{remote_test_url}/host")
should_be_a_remote_get
end

Expand All @@ -204,8 +229,12 @@
Capybara.default_host = 'http://www.local.com'
end

after do
Capybara.default_host = CAPYBARA_DEFAULT_HOST
end

it 'should reset remote host' do
driver.visit("#{REMOTE_TEST_URL}/host")
driver.visit("#{remote_test_url}/host")
should_be_a_remote_get
driver.reset!
driver.visit("/host")
Expand All @@ -214,11 +243,11 @@
end

def should_be_a_remote_get
driver.current_url.should include(REMOTE_TEST_URL)
driver.current_url.should include(remote_test_url)
end

def should_be_a_local_get
driver.current_url.should include("www.local.com")
end
#

end
12 changes: 6 additions & 6 deletions spec/driver/remote_mechanize_driver_spec.rb
Expand Up @@ -2,7 +2,7 @@

describe Capybara::Mechanize::Driver, 'remote' do
before do
Capybara.app_host = REMOTE_TEST_URL
Capybara.app_host = remote_test_url
end

after do
Expand All @@ -13,32 +13,32 @@

context "in remote mode" do
it "should pass arguments through to a get request" do
driver.visit("#{REMOTE_TEST_URL}/form/get", {:form => "success"})
driver.visit("#{remote_test_url}/form/get", {:form => "success"})
driver.html.should include('success')
end

it "should pass arguments through to a post request" do
driver.post("#{REMOTE_TEST_URL}/form", {:form => "success"})
driver.post("#{remote_test_url}/form", {:form => "success"})
driver.html.should include('success')
end

describe "redirect" do
it "should handle redirects with http-params" do
driver.visit "#{REMOTE_TEST_URL}/redirect_with_http_param"
driver.visit "#{remote_test_url}/redirect_with_http_param"
driver.html.should include('correct redirect')
end
end

context "for a post request" do
it 'transforms nested map in post data' do
driver.post("#{REMOTE_TEST_URL}/form", {:form => {:key => 'value'}})
driver.post("#{remote_test_url}/form", {:form => {:key => 'value'}})
driver.html.should include(':key=>"value"')
end
end

context 'process remote request' do
it 'transforms nested map in post data' do
driver.submit(:post, "#{REMOTE_TEST_URL}/form", {:form => {:key => 'value'}})
driver.submit(:post, "#{remote_test_url}/form", {:form => {:key => 'value'}})
driver.html.should include(':key=>"value"')
end
end
Expand Down
26 changes: 16 additions & 10 deletions spec/session/mechanize_spec.rb
Expand Up @@ -4,13 +4,15 @@ module TestSessions
Mechanize = Capybara::Session.new(:mechanize, TestApp)
end

Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :skip => [
Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :capybara_skip => [
:js,
:screenshot,
:frames,
:windows,
:server,
:hover
:hover,
:modals,
:about_scheme
]

describe Capybara::Session do
Expand All @@ -21,6 +23,10 @@ module TestSessions
Capybara.default_host = 'http://www.local.com'
end

after do
Capybara.default_host = CAPYBARA_DEFAULT_HOST
end

describe '#driver' do
it "should be a mechanize driver" do
session.driver.should be_an_instance_of(Capybara::Mechanize::Driver)
Expand Down Expand Up @@ -71,31 +77,31 @@ module TestSessions
end

it "should use the last remote url when following relative links" do
session.visit("#{REMOTE_TEST_URL}/relative_link_to_host")
session.visit("#{remote_test_url}/relative_link_to_host")
session.click_link "host"
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/host, method get")
session.body.should include("Current host is #{remote_test_url}/request_info/host, method get")
end

it "should use the last remote url when submitting a form with a relative action" do
session.visit("#{REMOTE_TEST_URL}/form_with_relative_action_to_host")
session.visit("#{remote_test_url}/form_with_relative_action_to_host")
session.click_button "submit"
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/host, method post")
session.body.should include("Current host is #{remote_test_url}/request_info/host, method post")
end

it "should use the last url when submitting a form with no action" do
session.visit("#{REMOTE_TEST_URL}/request_info/form_with_no_action")
session.visit("#{remote_test_url}/request_info/form_with_no_action")
session.click_button "submit"
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/form_with_no_action, method post")
session.body.should include("Current host is #{remote_test_url}/request_info/form_with_no_action, method post")
end

it "should send correct user agent" do
session.visit("#{REMOTE_TEST_URL}/request_info/user_agent")
session.visit("#{remote_test_url}/request_info/user_agent")
session.body.should include("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.853.0 Safari/535.2")
end

context 'form referer when switching from local to remote' do
it 'sends the referer' do
session.visit "/form_posts_to/#{REMOTE_TEST_URL}/get_referer"
session.visit "/form_posts_to/#{remote_test_url}/get_referer"
session.click_button 'submit'
session.body.should include 'Got referer'
end
Expand Down
8 changes: 5 additions & 3 deletions spec/session/remote_mechanize_spec.rb
Expand Up @@ -6,21 +6,23 @@ module TestSessions

shared_context "remote tests" do
before do
Capybara.app_host = REMOTE_TEST_URL
Capybara.app_host = remote_test_url
end

after do
Capybara.app_host = nil
end
end

session_describe = Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :skip => [
session_describe = Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :capybara_skip => [
:js,
:screenshot,
:frames,
:windows,
:server,
:hover
:hover,
:modals,
:about_scheme
]

session_describe.include_context("remote tests")
Expand Down

0 comments on commit 3ac30dc

Please sign in to comment.