From 33fdf33c899c731cbae885547264c3966f9a4b82 Mon Sep 17 00:00:00 2001 From: Luke Melia Date: Wed, 1 Oct 2008 20:22:23 -0400 Subject: [PATCH] Raise error when trying to interact with a disabled form element --- History.txt | 1 + lib/webrat/core/field.rb | 12 ++++++++++++ lib/webrat/core/scope.rb | 4 +++- lib/webrat/core/select_option.rb | 1 + spec/api/checks_spec.rb | 20 ++++++++++++++++++++ spec/api/chooses_spec.rb | 13 ++++++++++++- spec/api/clicks_button_spec.rb | 11 +++++++++++ spec/api/fills_in_spec.rb | 12 ++++++++++++ spec/api/selects_spec.rb | 12 ++++++++++++ 9 files changed, 84 insertions(+), 2 deletions(-) diff --git a/History.txt b/History.txt index 1f33ce6..2e82518 100644 --- a/History.txt +++ b/History.txt @@ -8,6 +8,7 @@ * Support relative links, including href="?foo=bar" (Patch from Kyle Hargraves) * Separated Rails-specific code from the Webrat core to make it easier to use Webrat with other environments * Alias visits as visit, clicks_link as click_link, etc. for better readability + * Raise error when trying to interact with a disabled form element (Luke Melia) * Minor enhancements diff --git a/lib/webrat/core/field.rb b/lib/webrat/core/field.rb index 21c878f..c9ea46b 100644 --- a/lib/webrat/core/field.rb +++ b/lib/webrat/core/field.rb @@ -45,7 +45,15 @@ module Webrat def matches_alt?(alt) @element["alt"] =~ /^\W*#{Regexp.escape(alt.to_s)}/i end + + def disabled? + !@element["disabled"].nil? && @element["disabled"] != 'false' + end + def raise_error_if_disabled + raise "Cannot interact with disabled form element (#{self})" if disabled? + end + def to_param value = @value.to_s.gsub('&', '%26') param_parser.parse_query_parameters("#{name}=#{value}") @@ -144,6 +152,7 @@ module Webrat end def click + raise_error_if_disabled set(@element["value"]) unless @element["name"].blank? @form.submit end @@ -182,10 +191,12 @@ module Webrat end def check + raise_error_if_disabled set(@element["value"] || "on") end def uncheck + raise_error_if_disabled set(nil) end @@ -212,6 +223,7 @@ module Webrat end def choose + raise_error_if_disabled other_options.each do |option| option.set(nil) end diff --git a/lib/webrat/core/scope.rb b/lib/webrat/core/scope.rb index 0a760c4..445c1e9 100644 --- a/lib/webrat/core/scope.rb +++ b/lib/webrat/core/scope.rb @@ -22,7 +22,9 @@ module Webrat # field can be either the value of a name attribute (i.e. user[email]) # or the text inside a element that points at the field. def fills_in(id_or_name_or_label, options = {}) - find_field(id_or_name_or_label, TextField, TextareaField, PasswordField).set(options[:with]) + field = find_field(id_or_name_or_label, TextField, TextareaField, PasswordField) + field.raise_error_if_disabled + field.set(options[:with]) end alias_method :fill_in, :fills_in diff --git a/lib/webrat/core/select_option.rb b/lib/webrat/core/select_option.rb index 587c52b..c46224f 100644 --- a/lib/webrat/core/select_option.rb +++ b/lib/webrat/core/select_option.rb @@ -15,6 +15,7 @@ module Webrat end def choose + @select.raise_error_if_disabled @select.set(value) end diff --git a/spec/api/checks_spec.rb b/spec/api/checks_spec.rb index 2599b4f..cd357f1 100644 --- a/spec/api/checks_spec.rb +++ b/spec/api/checks_spec.rb @@ -50,6 +50,16 @@ describe "checks" do @session.clicks_button end + it "should fail if the checkbox is disabled" do + @session.response_body = <<-EOS +
+ + +
+ EOS + lambda { @session.checks "remember_me" }.should raise_error + end + it "should result in a custom value being posted" do @session.response_body = <<-EOS
@@ -87,6 +97,16 @@ describe "unchecks" do lambda { @session.unchecks "remember_me" }.should raise_error end + it "should fail if the checkbox is disabled" do + @session.response_body = <<-EOS + + + +
+ EOS + lambda { @session.unchecks "remember_me" }.should raise_error + end + it "should uncheck rails style checkboxes" do @session.response_body = <<-EOS
diff --git a/spec/api/chooses_spec.rb b/spec/api/chooses_spec.rb index dccb290..a1a2203 100644 --- a/spec/api/chooses_spec.rb +++ b/spec/api/chooses_spec.rb @@ -53,7 +53,18 @@ describe "chooses" do @session.chooses "Female" @session.chooses "Male" @session.clicks_button - end + end + + it "should fail if the radio button is disabled" do + @session.response_body = <<-EOS + + + +
+ EOS + + lambda { @session.chooses "first_option" }.should raise_error + end it "should result in the value on being posted if not specified" do @session.response_body = <<-EOS diff --git a/spec/api/clicks_button_spec.rb b/spec/api/clicks_button_spec.rb index 3978e4b..c732526 100644 --- a/spec/api/clicks_button_spec.rb +++ b/spec/api/clicks_button_spec.rb @@ -22,6 +22,17 @@ describe "clicks_button" do lambda { @session.clicks_button }.should raise_error end + + + it "should fail if button is disabled" do + @session.response_body = <<-EOS +
+ +
+ EOS + + lambda { @session.clicks_button }.should raise_error + end it "should default to get method" do @session.response_body = <<-EOS diff --git a/spec/api/fills_in_spec.rb b/spec/api/fills_in_spec.rb index 8dbda73..b13b2cf 100644 --- a/spec/api/fills_in_spec.rb +++ b/spec/api/fills_in_spec.rb @@ -39,6 +39,18 @@ describe "fills_in" do lambda { @session.fills_in "Email", :with => "foo@example.com" }.should raise_error end + it "should fail if input is disabled" do + @session.response_body = <<-EOS +
+ + + +
+ EOS + + lambda { @session.fills_in "Email", :with => "foo@example.com" }.should raise_error + end + it "should allow overriding default form values" do @session.response_body = <<-EOS
diff --git a/spec/api/selects_spec.rb b/spec/api/selects_spec.rb index 21aeb4e..d33afce 100644 --- a/spec/api/selects_spec.rb +++ b/spec/api/selects_spec.rb @@ -35,6 +35,18 @@ describe "selects" do lambda { @session.selects "February", :from => "year" }.should raise_error end + + + it "should fail if the select is disabled" do + @session.response_body = <<-EOS + + + +
+ EOS + + lambda { @session.selects "January", :from => "month" }.should raise_error + end it "should send value from option" do @session.response_body = <<-EOS