render_test.rb 4.6 KB
Newer Older
D
Initial  
David Heinemeier Hansson 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
require File.dirname(__FILE__) + '/../abstract_unit'

Customer = Struct.new("Customer", :name)

class RenderTest < Test::Unit::TestCase
  class TestController < ActionController::Base
    layout :determine_layout

    def hello_world
    end

    def render_hello_world
      render "test/hello_world"
    end

    def render_hello_world_from_variable
      @person = "david"
      render_text "hello #{@person}"
    end

    def render_action_hello_world
      render_action "hello_world"
    end
    
    def render_text_hello_world
      render_text "hello world"
    end

    def render_custom_code
      render_text "hello world", "404 Moved"
    end
    
    def render_xml_hello
      @name = "David"
      render "test/hello"
    end

    def greeting
      # let's just rely on the template
    end

    def layout_test
      render_action "hello_world"
    end
    
    def builder_layout_test
      render_action "hello"
    end

    def partials_list
      @customers = [ Customer.new("david"), Customer.new("mary") ]
      render_action "list"
    end

    def modgreet
    end

    def rescue_action(e) raise end
      
    private
      def determine_layout
        case action_name 
          when "layout_test":         "layouts/standard"
          when "builder_layout_test": "layouts/builder"
        end
      end
  end

  TestController.template_root = File.dirname(__FILE__) + "/../fixtures/"
  
  class TestLayoutController < ActionController::Base
    layout "layouts/standard"
    
    def hello_world
    end
    
    def hello_world_outside_layout
    end

    def rescue_action(e)
      raise unless ActionController::MissingTemplate === e
    end
  end

  def setup
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new

    @request.host = "www.nextangle.com"
  end

  def test_simple_show
    @request.action = "hello_world"
    response = process_request
    assert_equal "200 OK", response.headers["Status"]
    assert_equal "test/hello_world", response.template.first_render
  end

  def test_do_with_render
    @request.action = "render_hello_world"
    assert_equal "test/hello_world", process_request.template.first_render
  end

  def test_do_with_render_from_variable
    @request.action = "render_hello_world_from_variable"
    assert_equal "hello david", process_request.body
  end

  def test_do_with_render_action
    @request.action = "render_action_hello_world"
    assert_equal "test/hello_world", process_request.template.first_render
  end

  def test_do_with_render_text
    @request.action = "render_text_hello_world"
    assert_equal "hello world", process_request.body
  end

  def test_do_with_render_custom_code
    @request.action = "render_custom_code"
    assert_equal "404 Moved", process_request.headers["Status"]
  end

  def test_attempt_to_access_object_method
    @request.action = "clone"
    assert_raises(ActionController::UnknownAction, "No action responded to [clone]") { process_request }
  end

129 130 131 132 133
  def test_private_methods
    @request.action = "determine_layout"
    assert_raises(ActionController::UnknownAction, "No action responded to [determine_layout]") { process_request }
  end

D
Initial  
David Heinemeier Hansson 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
  def test_access_to_request_in_view
    ActionController::Base.view_controller_internals = false

    @request.action = "hello_world"
    response = process_request
    assert_nil response.template.assigns["request"]

    ActionController::Base.view_controller_internals = true

    @request.action = "hello_world"
    response = process_request
    assert_kind_of ActionController::AbstractRequest, response.template.assigns["request"]
  end
  
  def test_render_xml
    @request.action = "render_xml_hello"
    assert_equal "<html>\n  <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", process_request.body
  end

  def test_render_xml_with_default
    @request.action = "greeting"
    assert_equal "<p>This is grand!</p>\n", process_request.body
  end

  def test_layout_rendering
    @request.action = "layout_test"
    assert_equal "<html>Hello world!</html>", process_request.body
  end

  def test_render_xml_with_layouts
    @request.action = "builder_layout_test"
    assert_equal "<wrapper>\n<html>\n  <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", process_request.body
  end

  def test_partials_list
    @request.action = "partials_list"
    assert_equal "Hello: davidHello: mary", process_request.body
  end

  def test_module_rendering
    @request.action = "modgreet"
    @request.parameters["module"] = "scope"
    assert_equal "<p>Beautiful modules!</p>", process_request.body
  end

  private
    def process_request
      TestController.process(@request, @response)
    end
end