Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8978

Show
Ignore:
Timestamp:
03/03/08 06:42:24 (3 months ago)
Author:
nzkoz
Message:

Allow file uploads in Integration Tests. Closes #11091 [RubyRedRick]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/CHANGELOG

    r8976 r8978  
    11*SVN* 
     2 
     3* Allow file uploads in Integration Tests.  Closes #11091 [RubyRedRick] 
    24 
    35* Refactor partial rendering into a PartialTemplate class. [Pratik] 
  • trunk/actionpack/lib/action_controller/integration.rb

    r8483 r8978  
    5656      attr_accessor :request_count 
    5757 
     58      class MultiPartNeededException < Exception 
     59      end 
     60 
    5861      # Create and initialize a new +Session+ instance. 
    5962      def initialize 
     
    295298          parse_result 
    296299          return status 
     300        rescue MultiPartNeededException 
     301          boundary = "----------XnJLe9ZIbbGUYtzPQJ16u1" 
     302          status = process(method, path, multipart_body(parameters, boundary), (headers || {}).merge({"CONTENT_TYPE" => "multipart/form-data; boundary=#{boundary}"})) 
     303          return status 
    297304        end 
    298305 
     
    343350        # be a string, +nil+, or a Hash. 
    344351        def requestify(parameters, prefix=nil) 
    345           if Hash === parameters 
     352          if TestUploadedFile === parameters 
     353            raise MultiPartNeededException 
     354          elsif Hash === parameters 
    346355            return nil if parameters.empty? 
    347356            parameters.map { |k,v| requestify(v, name_with_prefix(prefix, k)) }.join("&") 
     
    353362            "#{CGI.escape(prefix)}=#{CGI.escape(parameters.to_s)}" 
    354363          end 
     364        end 
     365 
     366        def multipart_requestify(params, first=true) 
     367          returning Hash.new do |p| 
     368            params.each do |key, value| 
     369              k = first ? CGI.escape(key.to_s) : "[#{CGI.escape(key.to_s)}]" 
     370              if Hash === value 
     371                multipart_requestify(value, false).each do |subkey, subvalue| 
     372                  p[k + subkey] = subvalue 
     373                end 
     374              else 
     375                p[k] = value 
     376              end 
     377            end 
     378          end 
     379        end 
     380 
     381        def multipart_body(params, boundary) 
     382          multipart_requestify(params).map do |key, value| 
     383            if value.respond_to?(:original_filename) 
     384              File.open(value.path) do |f| 
     385                <<-EOF 
     386--#{boundary}\r 
     387Content-Disposition: form-data; name="#{key}"; filename="#{CGI.escape(value.original_filename)}"\r 
     388Content-Type: #{value.content_type}\r 
     389Content-Length: #{File.stat(value.path).size}\r 
     390\r 
     391#{f.read}\r 
     392EOF 
     393              end 
     394            else 
     395<<-EOF 
     396--#{boundary}\r 
     397Content-Disposition: form-data; name="#{key}"\r 
     398\r 
     399#{value}\r 
     400EOF 
     401            end 
     402          end.join("")+"--#{boundary}--\r" 
    355403        end 
    356404    end