From 74d01a7b2bd2a9b95bf0832b5c44a18609c38b9f Mon Sep 17 00:00:00 2001 From: Jo Liss Date: Wed, 4 Jan 2012 16:33:41 +0100 Subject: [PATCH] Eliminate dependency on Heroku apps to make specs less brittle Fold all current_host specs into common current{_url,_host,_path} specs, since current_host simply calls current_url. Since current_host omits the port, differentiating between different servers on localhost is impossible without the help of current_url. Two examples are pending now, since Rack::Test ignores ports when changing hosts. --- lib/capybara/spec/session.rb | 17 ++-- .../spec/session/current_host_spec.rb | 68 -------------- lib/capybara/spec/session/current_url_spec.rb | 88 +++++++++++++++++-- lib/capybara/spec/test_app.rb | 4 +- lib/capybara/spec/views/host_links.erb | 4 +- 5 files changed, 89 insertions(+), 92 deletions(-) delete mode 100644 lib/capybara/spec/session/current_host_spec.rb diff --git a/lib/capybara/spec/session.rb b/lib/capybara/spec/session.rb index 8f75455d..7b14d020 100644 --- a/lib/capybara/spec/session.rb +++ b/lib/capybara/spec/session.rb @@ -56,19 +56,15 @@ shared_examples_for "session" do @session.body.should_not include('test_cookie') end - it "resets current host" do - @session.visit('http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' + it "resets current url, host, path" do + @session.visit '/foo' + @session.current_url.should_not be_empty + @session.current_host.should_not be_empty + @session.current_path.should == '/foo' @session.reset_session! + [nil, '', 'about:blank'].should include @session.current_url @session.current_host.should be_nil - end - - it "resets current path" do - @session.visit('/with_html') - @session.current_path.should == '/with_html' - - @session.reset_session! @session.current_path.should be_nil end @@ -112,7 +108,6 @@ shared_examples_for "session" do it_should_behave_like "unselect" it_should_behave_like "within" it_should_behave_like "current_url" - it_should_behave_like "current_host" it "should encode complex field names, like array[][value]" do @session.visit('/form') diff --git a/lib/capybara/spec/session/current_host_spec.rb b/lib/capybara/spec/session/current_host_spec.rb deleted file mode 100644 index f872cd4d..00000000 --- a/lib/capybara/spec/session/current_host_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -shared_examples_for "current_host" do - after do - Capybara.app_host = nil - end - - describe '#current_host' do - it "is affected by visiting a page directly" do - @session.visit('http://capybara-testapp.heroku.com/host') - @session.body.should include('Current host is http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' - end - - it "returns to the app host when visiting a relative url" do - Capybara.app_host = "http://capybara1.elabs.se" - @session.visit('http://capybara-testapp.heroku.com/host') - @session.body.should include('Current host is http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' - @session.visit('/host') - @session.body.should include('Current host is http://capybara1.elabs.se') - @session.current_host.should == 'http://capybara1.elabs.se' - end - - it "is affected by setting Capybara.app_host" do - Capybara.app_host = "http://capybara-testapp.heroku.com" - @session.visit('/host') - @session.body.should include('Current host is http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' - Capybara.app_host = "http://capybara1.elabs.se" - @session.visit('/host') - @session.body.should include('Current host is http://capybara1.elabs.se') - @session.current_host.should == 'http://capybara1.elabs.se' - end - - it "is unaffected by following a relative link" do - @session.visit('http://capybara-testapp.heroku.com/host_links') - @session.click_link('Relative Host') - @session.body.should include('Current host is http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' - end - - it "is affected by following an absolute link" do - @session.visit('http://capybara-testapp.heroku.com/host_links') - @session.click_link('Absolute Host') - @session.body.should include('Current host is http://capybara2.elabs.se') - @session.current_host.should == 'http://capybara2.elabs.se' - end - - it "is unaffected by posting through a relative form" do - @session.visit('http://capybara-testapp.heroku.com/host_links') - @session.click_button('Relative Host') - @session.body.should include('Current host is http://capybara-testapp.heroku.com') - @session.current_host.should == 'http://capybara-testapp.heroku.com' - end - - it "is affected by posting through an absolute form" do - @session.visit('http://capybara-testapp.heroku.com/host_links') - @session.click_button('Absolute Host') - @session.body.should include('Current host is http://capybara2.elabs.se') - @session.current_host.should == 'http://capybara2.elabs.se' - end - - it "is affected by following a redirect" do - @session.visit('http://capybara-testapp.heroku.com/redirect_secure') - @session.body.should include('Current host is https://capybara-testapp.heroku.com') - @session.current_host.should == 'https://capybara-testapp.heroku.com' - end - end -end diff --git a/lib/capybara/spec/session/current_url_spec.rb b/lib/capybara/spec/session/current_url_spec.rb index f4ce7983..9b1606b7 100644 --- a/lib/capybara/spec/session/current_url_spec.rb +++ b/lib/capybara/spec/session/current_url_spec.rb @@ -1,15 +1,85 @@ shared_examples_for "current_url" do - describe '#current_url' do - it "should return the current url" do - @session.visit('/form') - @session.current_url.should =~ %r(http://[^/]+/form) - end + before :all do + @servers = 2.times.map { Capybara::Server.new(TestApp.clone).boot } + # sanity check + @servers[0].port.should_not == @servers[1].port + @servers.map { |s| s.port }.should_not include 80 end - describe '#current_path' do - it 'should show the correct location' do - @session.visit('/foo') - @session.current_path.should == '/foo' + def bases + @servers.map { |s| "http://#{s.host}:#{s.port}" } + end + + describe '#current_url, #current_path, #current_host' do + def should_be_on server_index, path="/host", scheme="http" + # Check that we are on /host on the given server + s = @servers[server_index] + @session.current_url.should == "#{scheme}://#{s.host}:#{s.port}#{path}" + @session.current_host.should == "#{scheme}://#{s.host}" # no port + @session.current_path.should == path + if path == '/host' + # Server should agree with us + @session.body.should include("Current host is #{scheme}://#{s.host}:#{s.port}") + end + end + + def visit_host_links + @session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}") + end + + it "is affected by visiting a page directly" do + @session.visit("#{bases[0]}/host") + should_be_on 0 + end + + it "returns to the app host when visiting a relative url" do + Capybara.app_host = bases[1] + @session.visit("#{bases[0]}/host") + should_be_on 0 + @session.visit('/host') + should_be_on 1 + Capybara.app_host = nil + end + + it "is affected by setting Capybara.app_host" do + Capybara.app_host = bases[0] + @session.visit("/host") + should_be_on 0 + Capybara.app_host = bases[1] + @session.visit("/host") + should_be_on 1 + Capybara.app_host = nil + end + + it "is unaffected by following a relative link" do + pending 'reverts to port 80' + visit_host_links + @session.click_link("Relative Host") + should_be_on 0 + end + + it "is affected by following an absolute link" do + visit_host_links + @session.click_link("Absolute Host") + should_be_on 1 + end + + it "is unaffected by posting through a relative form" do + pending 'reverts to port 80' + visit_host_links + @session.click_button("Relative Host") + should_be_on 0 + end + + it "is affected by posting through an absolute form" do + visit_host_links + @session.click_button("Absolute Host") + should_be_on 1 + end + + it "is affected by following a redirect" do + @session.visit("#{bases[0]}/redirect") + should_be_on 0, "/landed" end end end diff --git a/lib/capybara/spec/test_app.rb b/lib/capybara/spec/test_app.rb index 3240f280..93a3fc2e 100644 --- a/lib/capybara/spec/test_app.rb +++ b/lib/capybara/spec/test_app.rb @@ -23,7 +23,7 @@ class TestApp < Sinatra::Base end get '/host' do - "Current host is #{request.scheme}://#{request.host}" + "Current host is #{request.scheme}://#{request.host}:#{request.port}" end get '/redirect/:times/times' do @@ -72,7 +72,7 @@ class TestApp < Sinatra::Base end get '/redirect_secure' do - redirect "https://#{request.host}/host" + redirect "https://#{request.host}:#{request.port}/host" end get '/slow_response' do diff --git a/lib/capybara/spec/views/host_links.erb b/lib/capybara/spec/views/host_links.erb index b57a865f..2051cdd3 100644 --- a/lib/capybara/spec/views/host_links.erb +++ b/lib/capybara/spec/views/host_links.erb @@ -1,12 +1,12 @@

Relative Host - Absolute Host + Absolute Host

-
+