From e77495bc04cacfb1e7684bd938a7c6d32545130f Mon Sep 17 00:00:00 2001 From: Josh Knowles Date: Mon, 29 Dec 2008 22:45:55 -0500 Subject: [PATCH] Refactor redirect handling as Merb response doesn't support the redirect? method. All integration specs now passing again. --- lib/webrat/core/session.rb | 6 ++- spec/fakes/test_session.rb | 8 +-- spec/private/core/session_spec.rb | 18 ++++++- spec/public/click_area_spec.rb | 13 ++--- spec/public/click_button_spec.rb | 61 ++++++++++----------- spec/public/click_link_spec.rb | 89 ++++++++++++++++--------------- spec/public/visit_spec.rb | 3 +- 7 files changed, 108 insertions(+), 90 deletions(-) diff --git a/lib/webrat/core/session.rb b/lib/webrat/core/session.rb index 5cefee9..3cff73c 100644 --- a/lib/webrat/core/session.rb +++ b/lib/webrat/core/session.rb @@ -110,7 +110,7 @@ For example: @http_method = http_method @data = data - request_page(response.location, :get, data) if response.redirect? + request_page(response.location, :get, data) if redirect? return response end @@ -118,6 +118,10 @@ For example: def success_code? #:nodoc: (200..499).include?(response_code) end + + def redirect? #:nodoc: + response_code / 100 == 3 + end def exception_caught? #:nodoc: response_body =~ /Exception caught/ diff --git a/spec/fakes/test_session.rb b/spec/fakes/test_session.rb index 7533fe0..1f25fdf 100644 --- a/spec/fakes/test_session.rb +++ b/spec/fakes/test_session.rb @@ -12,7 +12,7 @@ module Webrat #:nodoc: end def response - @response ||= TestResponse.new + @response ||= Object.new end def response_code @@ -31,10 +31,4 @@ module Webrat #:nodoc: def delete(url, data, headers = nil) end end - - class TestResponse #:nodoc: - def redirect? - false - end - end end \ No newline at end of file diff --git a/spec/private/core/session_spec.rb b/spec/private/core/session_spec.rb index 31d0fb6..96cf281 100644 --- a/spec/private/core/session_spec.rb +++ b/spec/private/core/session_spec.rb @@ -114,7 +114,7 @@ describe Webrat::Session do end it "should follow redirects" do - webrat_session.response.should_receive(:redirect?).twice.and_return(true, false) + webrat_session.should_receive(:redirect?).twice.and_return(true, false) webrat_session.response.should_receive(:location).once.and_return("/newurl") webrat_session.request_page("/oldurl", :get, {}) @@ -122,4 +122,20 @@ describe Webrat::Session do webrat_session.current_url.should == "/newurl" end end + + describe "#redirect?" do + before(:each) do + webrat_session = Webrat::Session.new + end + + it "should return true if the last response was a redirect" do + webrat_session.stub!(:response_code => 301) + webrat_session.redirect?.should be_true + end + + it "should return false if the last response wasn't a redirect" do + webrat_session.stub!(:response_code => 200) + webrat_session.redirect?.should be_false + end + end end \ No newline at end of file diff --git a/spec/public/click_area_spec.rb b/spec/public/click_area_spec.rb index 65bfbbe..e039323 100644 --- a/spec/public/click_area_spec.rb +++ b/spec/public/click_area_spec.rb @@ -24,7 +24,7 @@ describe "click_area" do webrat_session.response_code = 501 lambda { click_area "Berlin" }.should raise_error(Webrat::PageLoadError) end - + [200, 300, 400, 499].each do |status| it "should consider the #{status} status code as success" do with_html <<-HTML @@ -34,11 +34,12 @@ describe "click_area" do HTML + webrat_session.stub!(:redirect? => false) webrat_session.response_code = status lambda { click_area "Berlin" }.should_not raise_error end end - + it "should fail if the area doesn't exist" do with_html <<-HTML @@ -47,12 +48,12 @@ describe "click_area" do HTML - + lambda { click_area "Missing area" }.should raise_error(Webrat::NotFoundError) end - + it "should not be case sensitive" do with_html <<-HTML @@ -64,7 +65,7 @@ describe "click_area" do webrat_session.should_receive(:get).with("/page", {}) click_area "berlin" end - + it "should follow relative links" do webrat_session.stub!(:current_url => "/page") @@ -78,7 +79,7 @@ describe "click_area" do webrat_session.should_receive(:get).with("/page/sub", {}) click_area "Berlin" end - + it "should follow fully qualified local links" do with_html <<-HTML diff --git a/spec/public/click_button_spec.rb b/spec/public/click_button_spec.rb index e639b66..ed21488 100644 --- a/spec/public/click_button_spec.rb +++ b/spec/public/click_button_spec.rb @@ -7,10 +7,10 @@ describe "click_button" do
HTML - + lambda { click_button }.should raise_error(Webrat::NotFoundError) end - + it "should fail if input is not a submit button" do with_html <<-HTML @@ -23,7 +23,7 @@ describe "click_button" do lambda { click_button }.should raise_error(Webrat::NotFoundError) end - + it "should fail if button is disabled" do with_html <<-HTML @@ -35,7 +35,7 @@ describe "click_button" do lambda { click_button }.should raise_error(Webrat::DisabledFieldError) end - + it "should default to get method" do with_html <<-HTML @@ -47,7 +47,7 @@ describe "click_button" do webrat_session.should_receive(:get) click_button end - + it "should assert valid response" do with_html <<-HTML @@ -59,7 +59,7 @@ describe "click_button" do webrat_session.response_code = 501 lambda { click_button }.should raise_error(Webrat::PageLoadError) end - + [200, 300, 400, 499].each do |status| it "should consider the #{status} status code as success" do with_html <<-HTML @@ -69,11 +69,12 @@ describe "click_button" do HTML + webrat_session.stub!(:redirect? => false) webrat_session.response_code = status lambda { click_button }.should_not raise_error end end - + it "should submit the first form by default" do with_html <<-HTML @@ -88,7 +89,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/form1", {}) click_button end - + it "should not explode on file fields" do with_html <<-HTML @@ -100,7 +101,7 @@ describe "click_button" do HTML click_button end - + it "should submit the form with the specified button" do with_html <<-HTML @@ -115,7 +116,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/form2", {}) click_button "Form2" end - + it "should use action from form" do with_html <<-HTML @@ -127,7 +128,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", {}) click_button end - + it "should use method from form" do with_html <<-HTML @@ -139,7 +140,7 @@ describe "click_button" do webrat_session.should_receive(:post) click_button end - + it "should send button as param if it has a name" do with_html <<-HTML @@ -152,7 +153,7 @@ describe "click_button" do webrat_session.should_receive(:post).with("/login", "login" => "Login") click_button("Login") end - + it "should not send button as param if it has no name" do with_html <<-HTML @@ -177,8 +178,8 @@ describe "click_button" do HTML webrat_session.should_receive(:get).with("/login", "user" => {"password" => "mypass"}) click_button - end - + end + it "should send default hidden field values" do with_html <<-HTML @@ -191,7 +192,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "user" => {"email" => "test@example.com"}) click_button end - + it "should send default text field values" do with_html <<-HTML @@ -204,7 +205,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "user" => {"email" => "test@example.com"}) click_button end - + it "should not send disabled field values" do with_html <<-HTML @@ -221,7 +222,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", {}) click_button end - + it "should send default checked fields" do with_html <<-HTML @@ -234,7 +235,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "user" => {"tos" => "1"}) click_button end - + it "should send default radio options" do with_html <<-HTML @@ -250,7 +251,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "user" => {"gender" => "F"}) click_button end - + it "should send correct data for rails style unchecked fields" do with_html <<-HTML @@ -264,7 +265,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "user" => {"tos" => "0"}) click_button end - + it "should send correct data for rails style checked fields" do with_html <<-HTML @@ -302,7 +303,7 @@ describe "click_button" do "response" => { "choices" => [{"selected" => "one"}, {"selected" => "two"}, {"selected" => "two"}]}) click_button end - + it "should not send default unchecked fields" do with_html <<-HTML @@ -315,7 +316,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", {}) click_button end - + it "should send default textarea values" do with_html <<-HTML @@ -328,7 +329,7 @@ describe "click_button" do webrat_session.should_receive(:post).with("/posts", "post" => {"body" => "Post body here!"}) click_button end - + it "should properly handle HTML entities in textarea default values" do spec = lambda do with_html <<-HTML @@ -342,14 +343,14 @@ describe "click_button" do webrat_session.should_receive(:post).with("/posts", "post" => {"body" => "Peanut butter & jelly"}) click_button end - + if Webrat.on_java? spec.call else pending("needs bug fix", &spec) end end - + it "should send default selected option value from select" do with_html <<-HTML @@ -381,7 +382,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "month" => "February") click_button end - + it "should send first select option value when no option selected" do with_html <<-HTML @@ -397,7 +398,7 @@ describe "click_button" do webrat_session.should_receive(:get).with("/login", "month" => "1") click_button end - + it "should handle nested properties" do with_html <<-HTML @@ -449,7 +450,7 @@ describe "click_button" do webrat_session.should_receive(:get) click_button end - + it "should find buttons by their IDs" do with_html <<-HTML @@ -461,7 +462,7 @@ describe "click_button" do webrat_session.should_receive(:get) click_button "my_button" end - + it "should find image buttons by their alt text" do with_html <<-HTML diff --git a/spec/public/click_link_spec.rb b/spec/public/click_link_spec.rb index ac6f1dc..a00549c 100644 --- a/spec/public/click_link_spec.rb +++ b/spec/public/click_link_spec.rb @@ -10,7 +10,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "Save & go back" end - + it "should use get by default" do with_html <<-HTML @@ -30,7 +30,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "Link text", :method => :get end - + it "should click link on substring" do with_html <<-HTML @@ -40,7 +40,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "ink tex", :method => :get end - + it "should click delete links" do with_html <<-HTML @@ -50,8 +50,8 @@ describe "click_link" do webrat_session.should_receive(:delete).with("/page", {}) click_link "Link text", :method => :delete end - - + + it "should click post links" do with_html <<-HTML @@ -61,7 +61,7 @@ describe "click_link" do webrat_session.should_receive(:post).with("/page", {}) click_link "Link text", :method => :post end - + it "should click put links" do with_html <<-HTML @@ -71,7 +71,7 @@ describe "click_link" do webrat_session.should_receive(:put).with("/page", {}) click_link "Link text", :method => :put end - + it "should click links by regexp" do with_html <<-HTML @@ -81,8 +81,8 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link /link [a-z]/i end - - it "should click links by id" do + + it "should click links by id" do with_html <<-HTML Link text @@ -91,8 +91,8 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "link_text_link" end - - it "should click links by id regexp" do + + it "should click links by id regexp" do with_html <<-HTML Link text @@ -101,7 +101,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link /_text_/ end - + it "should click rails javascript links with authenticity tokens" do with_html <<-HTML @@ -122,7 +122,7 @@ describe "click_link" do webrat_session.should_receive(:post).with("/posts", "authenticity_token" => "aa79cb354597a60a3786e7e291ed4f74d77d3a62") click_link "Posts" end - + it "should click rails javascript delete links" do with_html <<-HTML @@ -143,7 +143,7 @@ describe "click_link" do webrat_session.should_receive(:delete).with("/posts/1", {}) click_link "Delete" end - + it "should click rails javascript post links" do with_html <<-HTML @@ -159,7 +159,7 @@ describe "click_link" do webrat_session.should_receive(:post).with("/posts", {}) click_link "Posts" end - + it "should click rails javascript post links without javascript" do with_html <<-HTML @@ -175,7 +175,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/posts", {}) click_link "Posts", :javascript => false end - + it "should click rails javascript put links" do with_html <<-HTML @@ -196,7 +196,7 @@ describe "click_link" do webrat_session.should_receive(:put).with("/posts", {}) click_link "Put" end - + it "should fail if the javascript link doesn't have a value for the _method input" do with_html <<-HTML @@ -213,12 +213,12 @@ describe "click_link" do return false;">Link HTML - + lambda { click_link "Link" }.should raise_error(Webrat::WebratError) end - + it "should assert valid response" do with_html <<-HTML @@ -228,7 +228,7 @@ describe "click_link" do webrat_session.response_code = 501 lambda { click_link "Link text" }.should raise_error(Webrat::PageLoadError) end - + [200, 300, 400, 499].each do |status| it "should consider the #{status} status code as success" do with_html <<-HTML @@ -236,23 +236,24 @@ describe "click_link" do Link text HTML + webrat_session.stub!(:redirect? => false) webrat_session.response_code = status lambda { click_link "Link text" }.should_not raise_error end end - + it "should fail is the link doesn't exist" do with_html <<-HTML Link text HTML - + lambda { click_link "Missing link" }.should raise_error(Webrat::NotFoundError) end - + it "should not be case sensitive" do with_html <<-HTML @@ -262,7 +263,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "LINK TEXT" end - + it "should match link substrings" do with_html <<-HTML @@ -272,7 +273,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "Link text" end - + it "should work with elements in the link" do with_html <<-HTML @@ -282,7 +283,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page", {}) click_link "Link text" end - + it "should match the first matching link" do with_html <<-HTML @@ -293,7 +294,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page1", {}) click_link "Link text" end - + it "should choose the shortest link text match" do with_html <<-HTML @@ -301,22 +302,22 @@ describe "click_link" do Link HTML - + webrat_session.should_receive(:get).with("/page2", {}) click_link "Link" end - + it "should treat non-breaking spaces as spaces" do with_html <<-HTML This is a link HTML - + webrat_session.should_receive(:get).with("/page1", {}) click_link "This is a link" end - + it "should not match on non-text contents" do pending "needs fix" do with_html <<-HTML @@ -325,12 +326,12 @@ describe "click_link" do Location HTML - + webrat_session.should_receive(:get).with("/page2", {}) click_link "Location" end end - + it "should click link within a selector" do with_html <<-HTML @@ -340,7 +341,7 @@ describe "click_link" do HTML - + webrat_session.should_receive(:get).with("/page2", {}) click_link_within "#container", "Link" end @@ -366,7 +367,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page/sub", {}) click_link "Jump to sub page" end - + it "should follow fully qualified local links" do webrat_session.stub!(:current_url => "/page") with_html <<-HTML @@ -377,7 +378,7 @@ describe "click_link" do webrat_session.should_receive(:get).with("http://subdomain.example.com/page/sub", {}) click_link "Jump to sub page" end - + it "should follow fully qualified local links to example.com" do with_html <<-HTML @@ -398,28 +399,28 @@ describe "click_link" do webrat_session.should_receive(:get).with("/page?foo=bar", {}) click_link "Jump to foo bar" end - + it "should matches_text? on regexp" do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) link.should_receive(:text).and_return(@link_text_with_nbsp) link.matches_text?(/link/i).should == 0 end - + it "should matches_text? on link_text" do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) link.should_receive(:text).and_return(@link_text_with_nbsp) link.matches_text?("Link Text").should == 0 end - + it "should matches_text? on substring" do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) link.should_receive(:text).and_return(@link_text_with_nbsp) link.matches_text?("nk Te").should_not be_nil end - + it "should not matches_text? on link_text case insensitive" do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) @@ -428,15 +429,15 @@ describe "click_link" do link.should_receive(:title).and_return(nil) link.matches_text?("link_text").should == false end - + it "should match text not include  " do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) link.should_receive(:text).and_return('LinkText') link.matches_text?("LinkText").should == 0 end - - it "should not matches_text? on wrong text" do + + it "should not matches_text? on wrong text" do pending "need to update these" link = Webrat::Link.new(webrat_session, nil) nbsp = [0xA0].pack("U") @@ -464,5 +465,5 @@ describe "click_link" do link.should_receive(:inner_html).and_return('') link.matches_text?('logo.png').should == 10 end - + end diff --git a/spec/public/visit_spec.rb b/spec/public/visit_spec.rb index ce37384..cecd460 100644 --- a/spec/public/visit_spec.rb +++ b/spec/public/visit_spec.rb @@ -21,6 +21,7 @@ describe "visit" do [200, 300, 400, 499].each do |status| it "should consider the #{status} status code as success" do + webrat_session.stub!(:redirect? => false) webrat_session.response_code = status lambda { visit("/") }.should_not raise_error end @@ -31,7 +32,7 @@ describe "visit" do end it "should follow redirects" do - webrat_session.response.should_receive(:redirect?).twice.and_return(true, false) + webrat_session.should_receive(:redirect?).twice.and_return(true, false) webrat_session.response.should_receive(:location).once.and_return("/newurl") visit("/oldurl")