aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/new_base/render_test.rb
blob: cea3f9b5fd782e820c240463c530cdfa979b2ab9 (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
require "abstract_unit"

module Render
  class BlankRenderController < ActionController::Base
    self.view_paths = [ActionView::FixtureResolver.new(
      "render/blank_render/index.html.erb"                  => "Hello world!",
      "render/blank_render/access_request.html.erb"         => "The request: <%= request.method.to_s.upcase %>",
      "render/blank_render/access_action_name.html.erb"     => "Action Name: <%= action_name %>",
      "render/blank_render/access_controller_name.html.erb" => "Controller Name: <%= controller_name %>",
      "render/blank_render/overridden_with_own_view_paths_appended.html.erb"  => "parent content",
      "render/blank_render/overridden_with_own_view_paths_prepended.html.erb" => "parent content",
      "render/blank_render/overridden.html.erb"             => "parent content",
      "render/child_render/overridden.html.erb"             => "child content"
    )]

    def index
      render
    end

    def access_request
      render action: "access_request"
    end

    def render_action_name
      render action: "access_action_name"
    end

    def overridden_with_own_view_paths_appended
    end

    def overridden_with_own_view_paths_prepended
    end

    def overridden
    end

    private

      def secretz
        render plain: "FAIL WHALE!"
      end
  end

  class DoubleRenderController < ActionController::Base
    def index
      render plain: "hello"
      render plain: "world"
    end
  end

  class ChildRenderController < BlankRenderController
    append_view_path ActionView::FixtureResolver.new("render/child_render/overridden_with_own_view_paths_appended.html.erb" => "child content")
    prepend_view_path ActionView::FixtureResolver.new("render/child_render/overridden_with_own_view_paths_prepended.html.erb" => "child content")
  end

  class RenderTest < Rack::TestCase
    test "render with blank" do
      with_routing do |set|
        set.draw do
          ActiveSupport::Deprecation.silence do
            get ":controller", action: "index"
          end
        end

        get "/render/blank_render"

        assert_body "Hello world!"
        assert_status 200
      end
    end

    test "rendering more than once raises an exception" do
      with_routing do |set|
        set.draw do
          ActiveSupport::Deprecation.silence do
            get ":controller", action: "index"
          end
        end

        assert_raises(AbstractController::DoubleRenderError) do
          get "/render/double_render", headers: { "action_dispatch.show_exceptions" => false }
        end
      end
    end
  end

  class TestOnlyRenderPublicActions < Rack::TestCase
    # Only public methods on actual controllers are callable actions
    test "raises an exception when a method of Object is called" do
      assert_raises(AbstractController::ActionNotFound) do
        get "/render/blank_render/clone", headers: { "action_dispatch.show_exceptions" => false }
      end
    end

    test "raises an exception when a private method is called" do
      assert_raises(AbstractController::ActionNotFound) do
        get "/render/blank_render/secretz", headers: { "action_dispatch.show_exceptions" => false }
      end
    end
  end

  class TestVariousObjectsAvailableInView < Rack::TestCase
    test "The request object is accessible in the view" do
      get "/render/blank_render/access_request"
      assert_body "The request: GET"
    end

    test "The action_name is accessible in the view" do
      get "/render/blank_render/render_action_name"
      assert_body "Action Name: render_action_name"
    end

    test "The controller_name is accessible in the view" do
      get "/render/blank_render/access_controller_name"
      assert_body "Controller Name: blank_render"
    end
  end

  class TestViewInheritance < Rack::TestCase
    test "Template from child controller gets picked over parent one" do
      get "/render/child_render/overridden"
      assert_body "child content"
    end

    test "Template from child controller with custom view_paths prepended gets picked over parent one" do
      get "/render/child_render/overridden_with_own_view_paths_prepended"
      assert_body "child content"
    end

    test "Template from child controller with custom view_paths appended gets picked over parent one" do
      get "/render/child_render/overridden_with_own_view_paths_appended"
      assert_body "child content"
    end

    test "Template from parent controller gets picked if missing in child controller" do
      get "/render/child_render/index"
      assert_body "Hello world!"
    end
  end
end