From f55514125cae291791365effc856d237008f7cd2 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Tue, 17 Mar 2009 18:04:22 -0700 Subject: Working toward getting a basic AbstractController framework --- actionpack/test/new_base/base_test.rb | 337 ++++++++++------------------------ 1 file changed, 98 insertions(+), 239 deletions(-) (limited to 'actionpack/test/new_base') diff --git a/actionpack/test/new_base/base_test.rb b/actionpack/test/new_base/base_test.rb index 7ac5eac3c5..9609c11753 100644 --- a/actionpack/test/new_base/base_test.rb +++ b/actionpack/test/new_base/base_test.rb @@ -23,38 +23,6 @@ require 'rubygems' require 'rack/test' module ActionController - module TestProcess - def process(action, parameters = nil, session = nil, flash = nil, http_method = 'GET') - # Sanity check for required instance variables so we can give an - # understandable error message. - %w(@controller @request @response).each do |iv_name| - if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil? - raise "#{iv_name} is nil: make sure you set it in your test's setup method." - end - end - - @request.recycle! - @response.recycle! - - @html_document = nil - @request.env['REQUEST_METHOD'] = http_method - - @request.action = action.to_s - - parameters ||= {} - @request.assign_parameters(@controller.class.controller_path, action.to_s, parameters) - - @request.session = ActionController::TestSession.new(session) unless session.nil? - @request.session["flash"] = ActionController::Flash::FlashHash.new.update(flash) if flash - build_request_uri(action, parameters) - - # Base.class_eval { include ProcessWithTest } unless Base < ProcessWithTest - @controller.request = @request - @controller.response = @response - @controller.process(action) - end - end - class Base2 < AbstractBase include AbstractController::Callbacks include AbstractController::Renderer @@ -64,254 +32,145 @@ module ActionController include ActionController::HideActions include ActionController::UrlFor + include ActionController::Renderer CORE_METHODS = self.public_instance_methods end end -# Provide some controller to run the tests on. -module Submodule - class ContainedEmptyController < ActionController::Base2 +# Temporary base class +class Rack::TestCase < ActiveSupport::TestCase + + include Rack::Test::Methods + + setup do + ActionController::Base.session_options[:key] = "abc" + ActionController::Base.session_options[:secret] = ("*" * 30) + ActionController::Routing.use_controllers! %w(happy_path/simple_dispatch) end - class ContainedNonEmptyController < ActionController::Base2 - def public_action - render :nothing => true - end - - hide_action :hidden_action - def hidden_action - raise "Noooo!" - end - - def another_hidden_action + + def self.get(url) + setup do |test| + test.get url end - hide_action :another_hidden_action - end - class SubclassedController < ContainedNonEmptyController - hide_action :public_action # Hiding it here should not affect the superclass. - end -end -class EmptyController < ActionController::Base2 -end -class NonEmptyController < ActionController::Base2 - def public_action - end + end - hide_action :hidden_action - def hidden_action + def app + @app ||= ActionController::Dispatcher.new end -end - -class MethodMissingController < ActionController::Base - hide_action :shouldnt_be_called - def shouldnt_be_called - raise "NO WAY!" + def assert_body(body) + assert_equal [body], last_response.body end -protected - - def method_missing(selector) - render :text => selector.to_s + def assert_status(code) + assert_equal code, last_response.status end -end - -class DefaultUrlOptionsController < ActionController::Base2 - def default_url_options_action - end - - def default_url_options(options = nil) - { :host => 'www.override.com', :action => 'new', :bacon => 'chunky' } + def assert_content_type(type) + assert_equal type, last_response.headers["Content-Type"] end -end - -class ControllerClassTests < Test::Unit::TestCase - def test_controller_path - assert_equal 'empty', EmptyController.controller_path - assert_equal EmptyController.controller_path, EmptyController.new.controller_path - assert_equal 'submodule/contained_empty', Submodule::ContainedEmptyController.controller_path - assert_equal Submodule::ContainedEmptyController.controller_path, Submodule::ContainedEmptyController.new.controller_path + + def assert_header(name, value) + assert_equal value, last_response.headers[name] end - def test_controller_name - assert_equal 'empty', EmptyController.controller_name - assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name - end + end -class ControllerInstanceTests < Test::Unit::TestCase - def setup - @empty = EmptyController.new - @contained = Submodule::ContainedEmptyController.new - @empty_controllers = [@empty, @contained, Submodule::SubclassedController.new] - - @non_empty_controllers = [NonEmptyController.new, - Submodule::ContainedNonEmptyController.new] - end - def test_action_methods - @empty_controllers.each do |c| - hide_mocha_methods_from_controller(c) - assert_equal Set.new, c.__send__(:action_methods), "#{c.controller_path} should be empty!" +# Tests the controller dispatching happy path +module HappyPath + class SimpleDispatchController < ActionController::Base2 + def index + render :text => "success" end - @non_empty_controllers.each do |c| - hide_mocha_methods_from_controller(c) - assert_equal Set.new(%w(public_action)), c.__send__(:action_methods), "#{c.controller_path} should not be empty!" - end - end - protected - # Mocha adds some public instance methods to Object that would be - # considered actions, so explicitly hide_action them. - def hide_mocha_methods_from_controller(controller) - mocha_methods = [ - :expects, :mocha, :mocha_inspect, :reset_mocha, :stubba_object, - :stubba_method, :stubs, :verify, :__metaclass__, :__is_a__, :to_matcher, - ] - controller.class.__send__(:hide_action, *mocha_methods) + def modify_response_body + self.response_body = "success" end -end - - -class PerformActionTest < ActiveSupport::TestCase - class MockLogger - attr_reader :logged - - def initialize - @logged = [] + + def modify_response_body_twice + ret = (self.response_body = "success") + self.response_body = "#{ret}!" end - - def method_missing(method, *args) - @logged << args.first + + def modify_response_headers + end end - - def use_controller(controller_class) - @controller = controller_class.new - - # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get - # a more accurate simulation of what happens in "real life". - @controller.logger = Logger.new(nil) - - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - - @request.host = "www.nxtangle.com" - - rescue_action_in_public! - end - - attr_accessor :app - include Rack::Test::Methods - def with_routing - real_routes = ActionController::Routing::Routes - ActionController::Routing.module_eval { remove_const :Routes } - - temporary_routes = ActionController::Routing::RouteSet.new - ActionController::Routing.module_eval { const_set :Routes, temporary_routes } - - yield temporary_routes - ensure - if ActionController::Routing.const_defined? :Routes - ActionController::Routing.module_eval { remove_const :Routes } - end - ActionController::Routing.const_set(:Routes, real_routes) if real_routes - end - - def test_get_on_priv_should_show_selector - ActionController::Base.session_options[:key] = "abc" - ActionController::Base.session_options[:secret] = ("*" * 30) - - with_routing do |set| - set.draw do |map| + class SimpleRouteCase < Rack::TestCase + setup do + ActionController::Routing::Routes.draw do |map| map.connect ':controller/:action' end - - @app = ActionController::Dispatcher.new - - resp = get "/method_missing/shouldnt_be_called" - assert_equal 'shouldnt_be_called', resp.body end - - # use_controller MethodMissingController - # get :shouldnt_be_called - # assert_response :success - # assert_equal 'shouldnt_be_called', @response.body end - def test_method_missing_is_not_an_action_name - use_controller MethodMissingController - assert ! @controller.__send__(:action_methods).include?('method_missing') + class TestSimpleDispatch < SimpleRouteCase + + get "/happy_path/simple_dispatch/index" + + test "sets the body" do + assert_body "success" + end + + test "sets the status code" do + assert_status 200 + end - get :method_missing - assert_response :success - assert_equal 'method_missing', @response.body + test "sets the content type" do + assert_content_type Mime::HTML + end + + test "sets the content length" do + assert_header "Content-Length", 7 + end + end - def test_get_on_hidden_should_fail - use_controller NonEmptyController - get :hidden_action - assert_response 404 + # :api: plugin + class TestDirectResponseMod < SimpleRouteCase + get "/happy_path/simple_dispatch/modify_response_body" + + test "sets the body" do + assert_body "success" + end - get :another_hidden_action - assert_response 404 - end - - def test_namespaced_action_should_log_module_name - use_controller Submodule::ContainedNonEmptyController - @controller.logger = MockLogger.new - get :public_action - assert_match /Processing\sSubmodule::ContainedNonEmptyController#public_action/, @controller.logger.logged[1] - end -end - -class DefaultUrlOptionsTest < ActionController::TestCase - tests DefaultUrlOptionsController - - def setup - @request.host = 'www.example.com' - rescue_action_in_public! + test "setting the body manually sets the content length" do + assert_header "Content-Length", 7 + end end - - def test_default_url_options_are_used_if_set - ActionController::Routing::Routes.draw do |map| - map.default_url_options 'default_url_options', :controller => 'default_url_options' - map.connect ':controller/:action/:id' + + # :api: plugin + class TestDirectResponseModTwice < SimpleRouteCase + get "/happy_path/simple_dispatch/modify_response_body_twice" + + test "self.response_body= returns the body being set" do + assert_body "success!" + end + + test "updating the response body updates the content length" do + assert_header "Content-Length", 8 end - - get :default_url_options_action # Make a dummy request so that the controller is initialized properly. - - assert_equal 'http://www.override.com/default_url_options/new?bacon=chunky', @controller.url_for(:controller => 'default_url_options') - assert_equal 'http://www.override.com/default_url_options?bacon=chunky', @controller.send(:default_url_options_url) - ensure - ActionController::Routing::Routes.load! end end -class EmptyUrlOptionsTest < ActionController::TestCase - tests NonEmptyController - - def setup - @request.host = 'www.example.com' - rescue_action_in_public! - end - def test_ensure_url_for_works_as_expected_when_called_with_no_options_if_default_url_options_is_not_set - get :public_action - assert_equal "http://www.example.com/non_empty/public_action", @controller.url_for - end +class EmptyController < ActionController::Base2 ; end +module Submodule + class ContainedEmptyController < ActionController::Base2 ; end end -class EnsureNamedRoutesWorksTicket22BugTest < Test::Unit::TestCase - def test_named_routes_still_work - ActionController::Routing::Routes.draw do |map| - map.resources :things - end - EmptyController.send :include, ActionController::UrlWriter - - assert_equal '/things', EmptyController.new.send(:things_path) - ensure - ActionController::Routing::Routes.load! +class ControllerClassTests < Test::Unit::TestCase + def test_controller_path + assert_equal 'empty', EmptyController.controller_path + assert_equal EmptyController.controller_path, EmptyController.new.controller_path + assert_equal 'submodule/contained_empty', Submodule::ContainedEmptyController.controller_path + assert_equal Submodule::ContainedEmptyController.controller_path, Submodule::ContainedEmptyController.new.controller_path end -end + def test_controller_name + assert_equal 'empty', EmptyController.controller_name + assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name + end +end \ No newline at end of file -- cgit v1.2.3