Testing Multipart Upload with Sinatra

2009-01-21

Here’s how we create multipart uploads in our test suite for testing with Sinatra 0.3, similar to the post_it test helper method:

def upload_it(path, params, rack_opts, file)
  @request = Rack::MockRequest.new(Sinatra.build_application)
  opts = normalize_rack_environment(opts)
  input = FiveRuns::Multipart::FileUpload.new(file, params)
  opts[:input] ||= input.to_s
  opts['CONTENT_TYPE'] = input.content_type
  opts['CONTENT_LENGTH'] = opts[:input].length
  @response = @request.request('POST', path, opts)
end

You can use it as such:

filedata = Zlib::Deflate.deflate({'foo' => 'bar'}.to_json)
other_params = {"pid"=>"20256"}
upload_it "/apps/#{app.token}/processes.json", other_params, {}, StringIO.new(filedata)

Here’s the multipart helper: multipart.rb. I hope this saves someone a few hours of experimentation out there!