aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/render_test.rb
blob: ce778e1d7da0e665e82a87ada82a3339a96b474c (plain) (blame)
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
129
130
131
132
133
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
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

  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