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
|
require File.dirname(__FILE__) + '/../abstract_unit'
class TestController < ActionController::Base
attr_accessor :delegate_attr
def delegate_method() end
def rescue_action(e) raise end
end
module Fun
class GamesController < ActionController::Base
def render_hello_world
render_template "hello: <%= stratego %>"
end
def rescue_action(e) raise end
end
end
module LocalAbcHelper
def a() end
def b() end
def c() end
end
class HelperTest < Test::Unit::TestCase
def setup
# Increment symbol counter.
@symbol = (@@counter ||= 'A0').succ!.dup
# Generate new controller class.
controller_class_name = "Helper#{@symbol}Controller"
eval("class #{controller_class_name} < TestController; end")
@controller_class = self.class.const_get(controller_class_name)
# Generate new template class and assign to controller.
template_class_name = "Test#{@symbol}View"
eval("class #{template_class_name} < ActionView::Base; end")
@template_class = self.class.const_get(template_class_name)
@controller_class.template_class = @template_class
# Set default test helper.
self.test_helper = LocalAbcHelper
end
def teardown
# Reset template class.
#ActionController::Base.template_class = ActionView::Base
end
def test_deprecated_helper
assert_equal helper_methods, missing_methods
assert_nothing_raised { @controller_class.helper TestHelper }
assert_equal [], missing_methods
end
def test_declare_helper
require 'abc_helper'
self.test_helper = AbcHelper
assert_equal helper_methods, missing_methods
assert_nothing_raised { @controller_class.helper :abc }
assert_equal [], missing_methods
end
def test_declare_missing_helper
assert_equal helper_methods, missing_methods
assert_raise(MissingSourceFile) { @controller_class.helper :missing }
end
def test_declare_missing_file_from_helper
require 'broken_helper'
rescue LoadError => e
assert_nil /\bbroken_helper\b/.match(e.to_s)[1]
end
def test_helper_block
assert_nothing_raised {
@controller_class.helper { def block_helper_method; end }
}
assert template_methods.include?('block_helper_method')
end
def test_helper_block_include
assert_equal helper_methods, missing_methods
assert_nothing_raised {
@controller_class.helper { include TestHelper }
}
assert [], missing_methods
end
def test_helper_method
assert_nothing_raised { @controller_class.helper_method :delegate_method }
assert template_methods.include?('delegate_method')
end
def test_helper_attr
assert_nothing_raised { @controller_class.helper_attr :delegate_attr }
assert template_methods.include?('delegate_attr')
assert template_methods.include?('delegate_attr=')
end
def test_helper_for_nested_controller
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@request.action = "render_hello_world"
assert_equal "hello: Iz guuut!", Fun::GamesController.process(@request, @response).body
end
private
def helper_methods; TestHelper.instance_methods end
def template_methods; @template_class.instance_methods end
def missing_methods; helper_methods - template_methods end
def test_helper=(helper_module)
old_verbose, $VERBOSE = $VERBOSE, nil
self.class.const_set('TestHelper', helper_module)
$VERBOSE = old_verbose
end
end
|