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.
This commit is contained in:
Jo Liss 2012-01-04 16:33:41 +01:00
parent 4c86d3a5cb
commit 74d01a7b2b
5 changed files with 89 additions and 92 deletions

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,12 +1,12 @@
<p>
<a href="/host">Relative Host</a>
<a href="http://capybara2.elabs.se/host">Absolute Host</a>
<a href="<%= params[:absolute_host] %>/host">Absolute Host</a>
</p>
<form action="/host">
<p><input type="submit" value="Relative Host"/></p>
</form>
<form action="http://capybara2.elabs.se/host">
<form action="<%= params[:absolute_host] %>/host">
<p><input type="submit" value="Absolute Host"/></p>
</form>