diff --git a/lib/webrat/core/field.rb b/lib/webrat/core/field.rb index 471d0a4..cd732e4 100644 --- a/lib/webrat/core/field.rb +++ b/lib/webrat/core/field.rb @@ -43,7 +43,8 @@ module Webrat end def to_param - param_parser.parse_query_parameters("#{name}=#{@value}") + value = @value.to_s.gsub('&', '%26') + param_parser.parse_query_parameters("#{name}=#{value}") end def set(value) @@ -239,11 +240,19 @@ module Webrat class FileField < Field + attr_accessor :content_type + + def set(value, content_type = nil) + super(value) + @content_type = content_type + end + def to_param if @value.nil? super else - replace_param_value(super, @value, ActionController::TestUploadedFile.new(@value)) + file = content_type ? ActionController::TestUploadedFile.new(@value, content_type) : ActionController::TestUploadedFile.new(@value) + replace_param_value(super, @value, file) end end diff --git a/lib/webrat/core/page.rb b/lib/webrat/core/page.rb index f9f88bf..35261fd 100644 --- a/lib/webrat/core/page.rb +++ b/lib/webrat/core/page.rb @@ -101,13 +101,14 @@ module Webrat # Verifies that an input file field exists on the current page and sets # its value to the given +file+, so that the file will be uploaded - # along with the form. + # along with the form. An optional content_type may be given. # # Example: - # attaches_file "Photo", "/path/to/the/photo.jpg" - def attaches_file(id_or_name_or_label, path) + # attaches_file "Resume", "/path/to/the/resume.txt" + # attaches_file "Photo", "/path/to/the/image.png", "image/png" + def attaches_file(id_or_name_or_label, path, content_type = nil) field = find_field(id_or_name_or_label, FileField) - field.set(path) + field.set(path, content_type) end alias_method :attach_file, :attaches_file diff --git a/spec/api/attaches_file_spec.rb b/spec/api/attaches_file_spec.rb index f807f6e..a6792c3 100644 --- a/spec/api/attaches_file_spec.rb +++ b/spec/api/attaches_file_spec.rb @@ -56,4 +56,17 @@ describe "attaches_file" do @session.attaches_file "Spreadsheet", @filename @session.clicks_button end + + it "should allow the content type to be specified" do + @session.response_body = <<-EOS +
+ EOS + ActionController::TestUploadedFile.expects(:new).with(@filename, "image/png").returns(@uploaded_file) + @session.attaches_file "Picture", @filename, "image/png" + @session.clicks_button + end end diff --git a/spec/api/selects_spec.rb b/spec/api/selects_spec.rb index 68503ad..1ffdc16 100644 --- a/spec/api/selects_spec.rb +++ b/spec/api/selects_spec.rb @@ -48,6 +48,18 @@ describe "selects" do @session.clicks_button end + it "should send values with HTML encoded ampersands" do + @session.response_body = <<-EOS + + EOS + @session.expects(:post).with("/login", "encoded" => "A & B") + @session.selects "Encoded", :from => "encoded" + @session.clicks_button + end + it "should work with empty select lists" do @session.response_body = <<-EOS