require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
Merb.start :environment => 'test', :log_level => :fatal
Dir[File.join(File.dirname(__FILE__), "controllers/**/*.rb")].each do |f|
require f
end
describe Merb::Test::MultipartRequestHelper do
describe "#dispatch_multipart_to" do
before(:all) do
@controller_klass = Merb::Test::DispatchController
end
it "should dispatch to the given controller and action" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:index)
dispatch_multipart_to(@controller_klass, :index)
end
it "should dispatch to the given controller and action with params" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
controller = dispatch_multipart_to(@controller_klass, :show, :name => "Fred")
controller.params[:name].should == "Fred"
end
it "should handle a file object when used as a param" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:show)
file_name = File.join(File.dirname(__FILE__), "multipart_upload_text_file.txt")
File.open( file_name ) do |file|
controller = dispatch_multipart_to(@controller_klass, :show, :my_file => file)
file_params = controller.params[:my_file]
file_params[:content_type].should == "text/plain"
file_params[:size].should == File.size(file_name)
file_params[:tempfile].should be_a_kind_of(File)
file_params[:filename].should == "multipart_upload_text_file.txt"
end
end
end
describe "#multipart_post" do
before(:each) do
Merb::Router.prepare do |r|
r.resources :spec_helper_controller
end
end
it "should post to the create action" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:create)
multipart_post("/spec_helper_controller")
end
it "should post to the create action with params" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:create)
controller = multipart_post("/spec_helper_controller", :name => "Harry")
controller.params[:name].should == "Harry"
end
it "should upload a file to the action using multipart" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:create)
file_name = File.join(File.dirname(__FILE__), "multipart_upload_text_file.txt")
File.open( file_name ) do |file|
controller = multipart_post("/spec_helper_controller", :my_file => file)
file_params = controller.params[:my_file]
file_params[:content_type].should == "text/plain"
file_params[:size].should == File.size(file_name)
file_params[:tempfile].should be_a_kind_of(File)
file_params[:filename].should == "multipart_upload_text_file.txt"
end
end
end
describe "#multipart_put" do
before(:each) do
Merb::Router.prepare do |r|
r.resources :spec_helper_controller
end
end
it "should put to the update action multipart" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:update)
multipart_put("/spec_helper_controller/1")
end
it "should put to the update action with multipart params" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:update)
controller = multipart_put("/spec_helper_controller/my_id", :name => "Harry")
controller.params[:name].should == "Harry"
controller.params[:id].should == "my_id"
end
it "should upload a file to the action using multipart" do
Merb::Test::ControllerAssertionMock.should_receive(:called).with(:update)
file_name = File.join(File.dirname(__FILE__), "multipart_upload_text_file.txt")
File.open( file_name ) do |file|
controller = multipart_put("/spec_helper_controller/my_id", :my_file => file)
controller.params[:id].should == "my_id"
file_params = controller.params[:my_file]
file_params[:content_type].should == "text/plain"
file_params[:size].should == File.size(file_name)
file_params[:tempfile].should be_a_kind_of(File)
file_params[:filename].should == "multipart_upload_text_file.txt"
end
end
end
end
module Merb::Test::MultipartRequestHelper
describe Param, '#to_multipart' do
it "should represent the key and value correctly" do
param = Param.new('foo', 'bar')
param.to_multipart.should == %(Content-Disposition: form-data; name="foo"\r\n\r\nbar\r\n)
end
end
describe FileParam, '#to_multipart' do
it "should represent the key, filename and content correctly" do
param = FileParam.new('foo', '/bar.txt', 'baz')
param.to_multipart.should == %(Content-Disposition: form-data; name="foo"; filename="/bar.txt"\r\nContent-Type: text/plain\r\n\r\nbaz\r\n)
end
end
describe Post, '#push_params(params) param parsing' do
before(:each) do
@fake_return_param = mock('fake return_param')
end
it "should create Param from params when param doesn't respond to read" do
params = { 'normal' => 'normal_param' }
Param.should_receive(:new).with('normal', 'normal_param').and_return(@fake_return_param)
Post.new.push_params(params)
end
it "should create FileParam from params when param does response to read" do
file_param = mock('file param')
file_param.should_receive(:read).and_return('file contents')
file_param.should_receive(:path).and_return('file.txt')
params = { 'file' => file_param }
FileParam.should_receive(:new).with('file', 'file.txt', 'file contents').and_return(@fake_return_param)
Post.new.push_params(params)
end
end
describe Post, '#to_multipart' do
it "should create a multipart request from the params" do
file_param = mock('file param')
file_param.should_receive(:read).and_return('file contents')
file_param.should_receive(:path).and_return('file.txt')
params = { 'file' => file_param, 'normal' => 'normal_param' }
multipart = Post.new(params)
query, content_type = multipart.to_multipart
content_type.should == "multipart/form-data, boundary=----------0xKhTmLbOuNdArY"
query.should == "------------0xKhTmLbOuNdArY\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.txt\"\r\nContent-Type: text/plain\r\n\r\nfile contents\r\n------------0xKhTmLbOuNdArY\r\nContent-Disposition: form-data; name=\"normal\"\r\n\r\nnormal_param\r\n------------0xKhTmLbOuNdArY--"
end
end
end