render_test.rb 4.6 KB
Newer Older
D
Initial  
David Heinemeier Hansson 已提交
1 2 3 4
require File.dirname(__FILE__) + '/../abstract_unit'

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

5 6
module Fun
  class GamesController < ActionController::Base
D
Initial  
David Heinemeier Hansson 已提交
7 8
    def hello_world
    end
9 10
  end
end
D
Initial  
David Heinemeier Hansson 已提交
11 12


13 14
class TestController < ActionController::Base
  layout :determine_layout
D
Initial  
David Heinemeier Hansson 已提交
15

16 17
  def hello_world
  end
D
Initial  
David Heinemeier Hansson 已提交
18

19 20 21
  def render_hello_world
    render "test/hello_world"
  end
D
Initial  
David Heinemeier Hansson 已提交
22

23 24 25 26
  def render_hello_world_from_variable
    @person = "david"
    render_text "hello #{@person}"
  end
D
Initial  
David Heinemeier Hansson 已提交
27

28 29 30 31 32 33 34
  def render_action_hello_world
    render_action "hello_world"
  end
  
  def render_text_hello_world
    render_text "hello world"
  end
D
Initial  
David Heinemeier Hansson 已提交
35

36 37 38 39 40 41 42 43
  def render_custom_code
    render_text "hello world", "404 Moved"
  end
  
  def render_xml_hello
    @name = "David"
    render "test/hello"
  end
44

45 46
  def greeting
    # let's just rely on the template
47 48
  end

49 50 51
  def layout_test
    render_action "hello_world"
  end
52
  
53 54 55 56 57 58 59 60 61 62
  def builder_layout_test
    render_action "hello"
  end

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

  def rescue_action(e) raise end
63
    
64 65 66 67 68 69
  private
    def determine_layout
      case action_name 
        when "layout_test":         "layouts/standard"
        when "builder_layout_test": "layouts/builder"
      end
D
Initial  
David Heinemeier Hansson 已提交
70
    end
71
end
72

73 74 75 76 77 78
TestController.template_root = File.dirname(__FILE__) + "/../fixtures/"

class TestLayoutController < ActionController::Base
  layout "layouts/standard"
  
  def hello_world
79
  end
80 81 82 83 84 85 86 87
  
  def hello_world_outside_layout
  end

  def rescue_action(e)
    raise unless ActionController::MissingTemplate === e
  end
end
D
Initial  
David Heinemeier Hansson 已提交
88

89
class RenderTest < Test::Unit::TestCase
D
Initial  
David Heinemeier Hansson 已提交
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 129 130 131 132 133
  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

134 135 136 137 138
  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 已提交
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
  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

178 179 180
  def test_nested_rendering
    @request.action = "hello_world"
    assert_equal "Living in a nested world", Fun::GamesController.process(@request, @response).body
D
Initial  
David Heinemeier Hansson 已提交
181 182 183 184 185 186 187
  end

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