require File.join(File.dirname(__FILE__), "spec_helper") describe Merb::Controller, " displaying objects based on mime type" do before do Merb::Router.prepare do |r| r.default_routes end end it "should default the mime-type to HTML (and raise since there's no to_html)" do running { dispatch_to(Merb::Test::Fixtures::Controllers::DisplayHtmlDefault, :index) }.should raise_error(Merb::ControllerExceptions::NotAcceptable) end it "should set headers['Location'] to string provided by :location" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithStringLocation, :index, {}, :http_accept => "application/json").headers['Location'].should =~ /some_resources/ end it "should set the status to a code provided by :status" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithStatus, :index, {}, :http_accept => "application/json").status.should == 500 end it "should use a template if specified" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :index).body.should match(/Custom: Template/) end it "overrides layout settings with render :layout => false" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :no_layout).body.should_not match(/Custom: Template/) end it "should accept an absolute template path argument - with the mimetype extension" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :absolute_with_mime).body.should == "Custom: HTML: Default" end it "should accept an absolute template path argument - without the mimetype extension" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :absolute_without_mime).body.should == "Custom: HTML: Default" end it "should accept a relative template path argument - with the mimetype extension" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :relative_with_mime).body.should == "Custom: HTML: Default" end it "should accept a relative template path argument - without the mimetype extension" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplate, :relative_without_mime).body.should == "Custom: HTML: Default" end it "should accept a layout argument when calling to_*" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithLayout, :index, {}, :http_accept => "application/json").body.should == "{custom_arg: { 'include': '', 'exclude': '' }}" end it "should accept a layout argument with a template" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplateArgument, :index).body.should == "Custom Arg: Template" end it "should accept a template path argument" do dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithTemplateArgument, :index_by_arg).body.should == "Template" end it "should use other mime-types if they are provided on the class level" do controller = dispatch_to(Merb::Test::Fixtures::Controllers::DisplayClassProvides, :index, {}, :http_accept => "application/xml") controller.body.should == "" end it "should fail if none of the acceptable mime-types are available" do calling { dispatch_to(Merb::Test::Fixtures::Controllers::DisplayClassProvides, :index, {}, :http_accept => "application/json") }. should raise_error(Merb::ControllerExceptions::NotAcceptable) end it "should use mime-types that are provided at the local level" do controller = dispatch_to(Merb::Test::Fixtures::Controllers::DisplayLocalProvides, :index, {}, :http_accept => "application/xml") controller.body.should == "" end it "passes all options to serialization method like :to_json" do controller = dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithSerializationOptions, :index, {}, :http_accept => "application/json") controller.body.should == "{ 'include': 'beer, jazz', 'exclude': 'idiots' }" end it "passes single argument to serialization method like :to_json" do controller = dispatch_to(Merb::Test::Fixtures::Controllers::DisplayWithSerializationOptions, :index_that_passes_empty_hash, {}, :http_accept => "application/json") controller.body.should == "{ 'include': '', 'exclude': '' }" end end