require 'spec_helper' require "action_controller" class TestController < ::ActionController::Base include Restfulie::Server::ActionController::Base def create render :text => (params.keys - ['controller', 'action']).sort.join(", ") end end class NormalController < ::ActionController::Base def build render :text => (params.keys - ['controller', 'action']).sort.join(", ") end end class CSVRepresentation cattr_reader :media_type_name @@media_type_name = 'text/csv' cattr_reader :headers @@headers = { :get => { 'Accept' => media_type_name }, :post => { 'Content-Type' => media_type_name } } def self.to_hash(string) { :data => string }.with_indifferent_access end end # This test uses ActionController::IntegrationTest because we needed a specific implementation of the post test method, which accepts a payload passed as string, and not only a hash. class ParamsParserTest < ActionController::IntegrationTest def setup ActionController::Base.session_store = nil end def teardown ActionController::Base.session_store = ActionController::Session::CookieStore end def test_simple_getting with_test_route_set do get '/create', :sort => true assert_equal 'sort', @controller.response.body assert @controller.params.has_key?(:sort) assert_equal "true", @controller.params["sort"] end end def test_offer_proper_params_hash_when_doing_post_with_xml with_test_route_set do post '/create', 'Top Ten Songs feedhttp://local/songs_top_ten', :content_type => 'application/xml' assert_equal 'feed', @controller.response.body assert @controller.params.has_key?(:feed) assert_equal 'Top Ten Songs feed', @controller.params["feed"]['title'] end end def test_offer_proper_params_hash_when_doing_post_with_atom with_test_route_set do post '/create', 'Top Ten Songs feedhttp://local/songs_top_ten2010-12-13T18:30:02Z', :content_type => 'application/atom+xml' assert_equal 'feed', @controller.response.body assert @controller.params.has_key?(:feed) assert_equal 'Top Ten Songs feed', @controller.params["feed"]['title'] end end def test_raise_bad_request_when_doing_post_with_invalid_atom with_test_route_set do begin $stderr = StringIO.new log_io = StringIO.new ::ActionController::Base.logger = Logger.new(log_io) post '/create', 'Top Ten Songs feedhttp://local/songs_top_ten', :content_type => 'application/atom+xml' assert_response :bad_request assert_match /400 Bad Request/, log_io.string $stderr.rewind ensure $stderr = STDERR end end end def test_unsupported_media_type_when_doing_post_with_csv with_test_route_set do log_io = StringIO.new ::ActionController::Base.logger = Logger.new(log_io) post '/create', 'name,age\njohndoe,42', :content_type => 'text/csv' assert_response :unsupported_media_type assert_match /415 Unsupported Media Type/, log_io.string end end def test_posting_with_csv_after_registering_it_as_supported_type Restfulie::Server::ActionController::ParamsParser.register('text/csv',CSVRepresentation) with_test_route_set do post '/create', 'name,age\njohndoe,42', :content_type => 'text/csv' assert_equal 'data', @controller.response.body assert @controller.params.has_key?(:data) assert_equal 'name,age\njohndoe,42', @controller.params["data"] end Restfulie::Server::ActionController::ParamsParser.unregister('text/csv') end def test_normal_controller_should_behave_just_as_any_rails_controller with_test_route_set do post '/build', 'foo=1', :content_type => 'application/x-www-form-urlencoded' assert_equal 'foo', @controller.response.body assert @controller.params.has_key?(:foo) assert_equal "1", @controller.params["foo"] end end private def with_test_route_set with_routing do |set| set.draw do |map| map.with_options :controller => "test" do |c| c.connect "/create", :action => "create" end map.with_options :controller => "normal" do |c| c.connect "/build", :action => "build" end end yield end end end