padrino-helpers 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/padrino-helpers.rb +4 -1
- data/lib/padrino-helpers/asset_tag_helpers.rb +17 -14
- data/lib/padrino-helpers/breadcrumb_helpers.rb +6 -6
- data/lib/padrino-helpers/form_builder/abstract_form_builder.rb +119 -163
- data/lib/padrino-helpers/form_builder/deprecated_builder_methods.rb +92 -0
- data/lib/padrino-helpers/form_helpers.rb +66 -347
- data/lib/padrino-helpers/form_helpers/errors.rb +138 -0
- data/lib/padrino-helpers/form_helpers/options.rb +97 -0
- data/lib/padrino-helpers/form_helpers/security.rb +70 -0
- data/lib/padrino-helpers/output_helpers.rb +1 -1
- data/lib/padrino-helpers/output_helpers/abstract_handler.rb +1 -1
- data/lib/padrino-helpers/render_helpers.rb +10 -9
- data/lib/padrino-helpers/tag_helpers.rb +2 -1
- data/lib/padrino/rendering.rb +378 -0
- data/lib/padrino/rendering/extensions/erubis.rb +74 -0
- data/lib/padrino/rendering/extensions/haml.rb +29 -0
- data/lib/padrino/rendering/extensions/slim.rb +21 -0
- data/padrino-helpers.gemspec +2 -1
- data/test/fixtures/apps/.components +6 -0
- data/test/fixtures/apps/.gitignore +7 -0
- data/test/fixtures/apps/render.rb +25 -0
- data/test/fixtures/apps/views/article/comment/show.slim +1 -0
- data/test/fixtures/apps/views/blog/post.erb +1 -0
- data/test/fixtures/apps/views/layouts/specific.erb +1 -0
- data/test/fixtures/apps/views/test/post.erb +1 -0
- data/test/fixtures/layouts/layout.erb +1 -0
- data/test/fixtures/markup_app/app.rb +0 -1
- data/test/fixtures/render_app/app.rb +25 -1
- data/test/fixtures/render_app/views/_unsafe.html.builder +2 -0
- data/test/fixtures/render_app/views/_unsafe_object.html.builder +2 -0
- data/test/fixtures/render_app/views/ruby_block_capture_erb.erb +1 -0
- data/test/fixtures/render_app/views/ruby_block_capture_haml.haml +1 -0
- data/test/fixtures/render_app/views/ruby_block_capture_slim.slim +1 -0
- data/test/helper.rb +65 -1
- data/test/test_asset_tag_helpers.rb +83 -79
- data/test/test_breadcrumb_helpers.rb +20 -20
- data/test/test_form_builder.rb +196 -196
- data/test/test_form_helpers.rb +163 -163
- data/test/test_format_helpers.rb +65 -65
- data/test/test_locale.rb +1 -1
- data/test/test_number_helpers.rb +10 -11
- data/test/test_output_helpers.rb +28 -28
- data/test/test_render_helpers.rb +89 -35
- data/test/test_rendering.rb +683 -0
- data/test/test_rendering_extensions.rb +14 -0
- data/test/test_tag_helpers.rb +23 -23
- metadata +57 -5
data/test/test_render_helpers.rb
CHANGED
@@ -6,70 +6,109 @@ describe "RenderHelpers" do
|
|
6
6
|
RenderDemo
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
should
|
9
|
+
describe 'for #partial method and object' do
|
10
|
+
before { visit '/partial/object' }
|
11
|
+
it 'should render partial html with object' do
|
12
12
|
assert_have_selector "h1", :content => "User name is John"
|
13
13
|
end
|
14
|
-
should
|
14
|
+
it 'should have no counter index for single item' do
|
15
15
|
assert_have_no_selector "p", :content => "My counter is 1", :count => 1
|
16
16
|
end
|
17
|
-
should
|
17
|
+
it 'should include extra locals information' do
|
18
18
|
assert_have_selector 'p', :content => "Extra is bar"
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
should
|
22
|
+
describe 'for #partial method and collection' do
|
23
|
+
before { visit '/partial/collection' }
|
24
|
+
it 'should render partial html with collection' do
|
25
25
|
assert_have_selector "h1", :content => "User name is John"
|
26
26
|
assert_have_selector "h1", :content => "User name is Billy"
|
27
27
|
end
|
28
|
-
should
|
28
|
+
it 'should include counter which contains item index' do
|
29
29
|
assert_have_selector "p", :content => "My counter is 1"
|
30
30
|
assert_have_selector "p", :content => "My counter is 2"
|
31
31
|
end
|
32
|
-
should
|
32
|
+
it 'should include extra locals information' do
|
33
33
|
assert_have_selector 'p', :content => "Extra is bar"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
should
|
37
|
+
describe 'for #partial with ext and collection' do
|
38
|
+
before { visit '/partial/collection.ext' }
|
39
|
+
it 'should not fail horribly with `invalid locals key` RuntimeError' do
|
40
40
|
assert_have_selector "h1", :content => "User name is John"
|
41
41
|
end
|
42
|
-
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'for #partial method and locals' do
|
45
|
+
before { visit '/partial/locals' }
|
46
|
+
it 'should render partial html with locals' do
|
47
|
+
assert_have_selector "h1", :content => "User name is John"
|
48
|
+
end
|
49
|
+
it 'should have no counter index for single item' do
|
43
50
|
assert_have_no_selector "p", :content => "My counter is 1", :count => 1
|
44
51
|
end
|
45
|
-
should
|
52
|
+
it 'should include extra locals information' do
|
46
53
|
assert_have_selector 'p', :content => "Extra is bar"
|
47
54
|
end
|
48
55
|
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
should
|
57
|
+
describe 'for #partial method taking a path starting with forward slash' do
|
58
|
+
before { visit '/partial/foward_slash' }
|
59
|
+
it 'should render partial without throwing an error' do
|
60
|
+
assert_have_selector "h1", :content => "User name is John"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'for #partial method with unsafe engine' do
|
65
|
+
it 'should render partial without escaping it' do
|
66
|
+
visit '/partial/unsafe'
|
67
|
+
assert_have_selector "h1", :content => "User name is John"
|
68
|
+
end
|
69
|
+
it 'should render partial object without escaping it' do
|
70
|
+
visit '/partial/unsafe_one'
|
71
|
+
assert_have_selector "h1", :content => "User name is Mary"
|
72
|
+
end
|
73
|
+
it 'should render partial collection without escaping it' do
|
74
|
+
visit '/partial/unsafe_many'
|
75
|
+
assert_have_selector "h1", :content => "User name is John"
|
76
|
+
assert_have_selector "h1", :content => "User name is Mary"
|
77
|
+
end
|
78
|
+
it 'should render unsafe partial without escaping it' do
|
79
|
+
visit '/partial/unsafe?block=%3Cevil%3E'
|
80
|
+
assert_have_selector "h1", :content => "User name is John"
|
81
|
+
assert_have_selector "evil"
|
82
|
+
end
|
83
|
+
it 'should render unsafe partial object without escaping it' do
|
84
|
+
visit '/partial/unsafe_one?block=%3Cevil%3E'
|
85
|
+
assert_have_selector "h1", :content => "User name is Mary"
|
86
|
+
assert_have_selector "evil"
|
87
|
+
end
|
88
|
+
it 'should render unsafe partial collection without escaping it' do
|
89
|
+
visit '/partial/unsafe_many?block=%3Cevil%3E'
|
53
90
|
assert_have_selector "h1", :content => "User name is John"
|
91
|
+
assert_have_selector "h1", :content => "User name is Mary"
|
92
|
+
assert_have_selector "evil"
|
54
93
|
end
|
55
94
|
end
|
56
95
|
|
57
|
-
|
58
|
-
should
|
96
|
+
describe 'render with block' do
|
97
|
+
it 'should render slim with block' do
|
59
98
|
visit '/render_block_slim'
|
60
99
|
assert_have_selector 'h1', :content => 'prefix'
|
61
100
|
assert_have_selector 'h3', :content => 'postfix'
|
62
101
|
assert_have_selector '.slim-block'
|
63
102
|
assert_have_selector 'div', :content => 'go block!'
|
64
103
|
end
|
65
|
-
should
|
104
|
+
it 'should render erb with block' do
|
66
105
|
visit '/render_block_erb'
|
67
106
|
assert_have_selector 'h1', :content => 'prefix'
|
68
107
|
assert_have_selector 'h3', :content => 'postfix'
|
69
108
|
assert_have_selector '.erb-block'
|
70
109
|
assert_have_selector 'div', :content => 'go block!'
|
71
110
|
end
|
72
|
-
should
|
111
|
+
it 'should render haml with block' do
|
73
112
|
visit '/render_block_haml'
|
74
113
|
assert_have_selector 'h1', :content => 'prefix'
|
75
114
|
assert_have_selector 'h3', :content => 'postfix'
|
@@ -78,8 +117,8 @@ describe "RenderHelpers" do
|
|
78
117
|
end
|
79
118
|
end
|
80
119
|
|
81
|
-
|
82
|
-
should
|
120
|
+
describe 'partial with block' do
|
121
|
+
it 'should show partial slim with block' do
|
83
122
|
visit '/partial_block_slim'
|
84
123
|
assert_have_selector 'h1', :content => 'prefix'
|
85
124
|
assert_have_selector 'h3', :content => 'postfix'
|
@@ -87,7 +126,7 @@ describe "RenderHelpers" do
|
|
87
126
|
assert_have_selector 'div', :content => 'go block!'
|
88
127
|
assert_have_selector 'div.deep', :content => 'Done'
|
89
128
|
end
|
90
|
-
should
|
129
|
+
it 'should show partial erb with block' do
|
91
130
|
visit '/partial_block_erb'
|
92
131
|
assert_have_selector 'h1', :content => 'prefix'
|
93
132
|
assert_have_selector 'h3', :content => 'postfix'
|
@@ -95,7 +134,7 @@ describe "RenderHelpers" do
|
|
95
134
|
assert_have_selector 'div', :content => 'go block!'
|
96
135
|
assert_have_selector 'div.deep', :content => 'Done'
|
97
136
|
end
|
98
|
-
should
|
137
|
+
it 'should show partial haml with block' do
|
99
138
|
visit '/partial_block_haml'
|
100
139
|
assert_have_selector 'h1', :content => 'prefix'
|
101
140
|
assert_have_selector 'h3', :content => 'postfix'
|
@@ -105,8 +144,8 @@ describe "RenderHelpers" do
|
|
105
144
|
end
|
106
145
|
end
|
107
146
|
|
108
|
-
|
109
|
-
should
|
147
|
+
describe 'for #current_engine method' do
|
148
|
+
it 'should detect correctly current engine for a padrino application' do
|
110
149
|
visit '/current_engine'
|
111
150
|
assert_have_selector 'p.start', :content => "haml"
|
112
151
|
assert_have_selector 'p.haml span', :content => "haml"
|
@@ -115,7 +154,7 @@ describe "RenderHelpers" do
|
|
115
154
|
assert_have_selector 'p.end', :content => "haml"
|
116
155
|
end
|
117
156
|
|
118
|
-
should
|
157
|
+
it 'should detect correctly current engine for explicit engine on partials' do
|
119
158
|
visit '/explicit_engine'
|
120
159
|
assert_have_selector 'p.start', :content => "haml"
|
121
160
|
assert_have_selector 'p.haml span', :content => "haml"
|
@@ -124,38 +163,53 @@ describe "RenderHelpers" do
|
|
124
163
|
assert_have_selector 'p.end', :content => "haml"
|
125
164
|
end
|
126
165
|
|
127
|
-
should
|
166
|
+
it 'should capture slim template once and only once' do
|
128
167
|
$number_of_captures = 0
|
129
168
|
visit '/double_capture_slim'
|
130
169
|
assert_equal 1,$number_of_captures
|
131
170
|
end
|
132
171
|
|
133
|
-
should
|
172
|
+
it 'should capture haml template once and only once' do
|
134
173
|
$number_of_captures = 0
|
135
174
|
visit '/double_capture_haml'
|
136
175
|
assert_equal 1,$number_of_captures
|
137
176
|
end
|
138
177
|
|
139
|
-
should
|
178
|
+
it 'should capture erb template once and only once' do
|
140
179
|
$number_of_captures = 0
|
141
180
|
visit '/double_capture_erb'
|
142
181
|
assert_equal 1,$number_of_captures
|
143
182
|
end
|
144
183
|
|
145
|
-
should
|
184
|
+
it 'should fail on wrong erb usage' do
|
146
185
|
assert_raises(SyntaxError) do
|
147
186
|
visit '/wrong_capture_erb'
|
148
187
|
end
|
149
188
|
end
|
150
189
|
|
151
|
-
should
|
190
|
+
it 'should ignore wrong haml usage' do
|
152
191
|
visit '/wrong_capture_haml'
|
153
192
|
assert_have_no_selector 'p', :content => 'this is wrong'
|
154
193
|
end
|
155
194
|
|
156
|
-
should
|
195
|
+
it 'should ignore wrong slim usage' do
|
157
196
|
visit '/wrong_capture_slim'
|
158
197
|
assert_have_no_selector 'p', :content => 'this is wrong'
|
159
198
|
end
|
199
|
+
|
200
|
+
it 'should support weird ruby blocks in erb' do
|
201
|
+
visit '/ruby_block_capture_erb'
|
202
|
+
assert_have_selector 'b', :content => 'c'
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should support weird ruby blocks in haml' do
|
206
|
+
visit '/ruby_block_capture_haml'
|
207
|
+
assert_have_selector 'b', :content => 'c'
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'should support weird ruby blocks in slim' do
|
211
|
+
visit '/ruby_block_capture_slim'
|
212
|
+
assert_have_selector 'b', :content => 'c'
|
213
|
+
end
|
160
214
|
end
|
161
215
|
end
|
@@ -0,0 +1,683 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/helper')
|
2
|
+
require 'slim'
|
3
|
+
|
4
|
+
describe "Rendering" do
|
5
|
+
def setup
|
6
|
+
Padrino::Rendering::DEFAULT_RENDERING_OPTIONS[:strict_format] = false
|
7
|
+
I18n.enforce_available_locales = true
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
I18n.locale = :en
|
12
|
+
remove_views
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'for application layout functionality' do
|
16
|
+
|
17
|
+
it 'should get no layout' do
|
18
|
+
mock_app do
|
19
|
+
get("/"){ "no layout" }
|
20
|
+
end
|
21
|
+
|
22
|
+
get "/"
|
23
|
+
assert_equal "no layout", body
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should be compatible with sinatra layout' do
|
27
|
+
mock_app do
|
28
|
+
layout do
|
29
|
+
"this is a <%= yield %>"
|
30
|
+
end
|
31
|
+
|
32
|
+
get("/"){ render :erb, "sinatra layout", :layout => true }
|
33
|
+
end
|
34
|
+
|
35
|
+
get "/"
|
36
|
+
assert_equal "this is a sinatra layout", body
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should use rails way layout' do
|
40
|
+
with_layout :application, "this is a <%= yield %>" do
|
41
|
+
mock_app do
|
42
|
+
get("/"){ render :erb, "rails way layout" }
|
43
|
+
end
|
44
|
+
|
45
|
+
get "/"
|
46
|
+
assert_equal "this is a rails way layout", body
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should use rails way for a custom layout' do
|
51
|
+
with_layout "layouts/custom", "this is a <%= yield %>" do
|
52
|
+
mock_app do
|
53
|
+
layout :custom
|
54
|
+
get("/"){ render :erb, "rails way custom layout" }
|
55
|
+
end
|
56
|
+
|
57
|
+
get "/"
|
58
|
+
assert_equal "this is a rails way custom layout", body
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should not use layout' do
|
63
|
+
with_layout :application, "this is an <%= yield %>" do
|
64
|
+
with_view :index, "index" do
|
65
|
+
mock_app do
|
66
|
+
get("/with/layout"){ render :index }
|
67
|
+
get("/without/layout"){ render :index, :layout => false }
|
68
|
+
end
|
69
|
+
get "/with/layout"
|
70
|
+
assert_equal "this is an index", body
|
71
|
+
get "/without/layout"
|
72
|
+
assert_equal "index", body
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should not use layout with js format' do
|
78
|
+
create_layout :application, "this is an <%= yield %>"
|
79
|
+
create_view :foo, "erb file"
|
80
|
+
create_view :foo, "js file", :format => :js
|
81
|
+
mock_app do
|
82
|
+
get('/layout_test', :provides => [:html, :js]){ render :foo }
|
83
|
+
end
|
84
|
+
get "/layout_test"
|
85
|
+
assert_equal "this is an erb file", body
|
86
|
+
get "/layout_test.js"
|
87
|
+
assert_equal "js file", body
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should use correct layout for each format' do
|
91
|
+
create_layout :application, "this is an <%= yield %>"
|
92
|
+
create_layout :application, "document start <%= yield %> end", :format => :xml
|
93
|
+
create_view :foo, "erb file"
|
94
|
+
create_view :foo, "xml file", :format => :xml
|
95
|
+
mock_app do
|
96
|
+
get('/layout_test', :provides => [:html, :xml]){ render :foo }
|
97
|
+
end
|
98
|
+
get "/layout_test"
|
99
|
+
assert_equal "this is an erb file", body
|
100
|
+
get "/layout_test.xml"
|
101
|
+
assert_equal "document start xml file end", body
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should by default use html file when no other is given' do
|
105
|
+
create_layout :baz, "html file", :format => :html
|
106
|
+
|
107
|
+
mock_app do
|
108
|
+
get('/content_type_test', :provides => [:html, :xml]) { render :baz }
|
109
|
+
end
|
110
|
+
|
111
|
+
get "/content_type_test"
|
112
|
+
assert_equal "html file", body
|
113
|
+
get "/content_type_test.html"
|
114
|
+
assert_equal "html file", body
|
115
|
+
get "/content_type_test.xml"
|
116
|
+
assert_equal "html file", body
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should not use html file when DEFAULT_RENDERING_OPTIONS[:strict_format] == true' do
|
120
|
+
create_layout :foo, "html file", :format => :html
|
121
|
+
|
122
|
+
mock_app do
|
123
|
+
get('/default_rendering_test', :provides => [:html, :xml]) { render :foo }
|
124
|
+
end
|
125
|
+
|
126
|
+
@save = Padrino::Rendering::DEFAULT_RENDERING_OPTIONS
|
127
|
+
Padrino::Rendering::DEFAULT_RENDERING_OPTIONS[:strict_format] = true
|
128
|
+
|
129
|
+
get "/default_rendering_test"
|
130
|
+
assert_equal "html file", body
|
131
|
+
assert_raises Padrino::Rendering::TemplateNotFound do
|
132
|
+
get "/default_rendering_test.xml"
|
133
|
+
end
|
134
|
+
|
135
|
+
Padrino::Rendering::DEFAULT_RENDERING_OPTIONS.merge!(@save)
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should use correct layout with each controller' do
|
139
|
+
create_layout :foo, "foo layout at <%= yield %>"
|
140
|
+
create_layout :bar, "bar layout at <%= yield %>"
|
141
|
+
create_layout :baz, "baz layout at <%= yield %>"
|
142
|
+
create_layout :application, "default layout at <%= yield %>"
|
143
|
+
mock_app do
|
144
|
+
get("/"){ render :erb, "application" }
|
145
|
+
controller :foo do
|
146
|
+
layout :foo
|
147
|
+
get("/"){ render :erb, "foo" }
|
148
|
+
end
|
149
|
+
controller :bar do
|
150
|
+
layout :bar
|
151
|
+
get("/"){ render :erb, "bar" }
|
152
|
+
end
|
153
|
+
controller :baz do
|
154
|
+
layout :baz
|
155
|
+
get("/"){ render :erb, "baz", :layout => true }
|
156
|
+
end
|
157
|
+
controller :none do
|
158
|
+
get("/") { render :erb, "none" }
|
159
|
+
get("/with_foo_layout") { render :erb, "none with layout", :layout => :foo }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
get "/foo"
|
163
|
+
assert_equal "foo layout at foo", body
|
164
|
+
get "/bar"
|
165
|
+
assert_equal "bar layout at bar", body
|
166
|
+
get "/baz"
|
167
|
+
assert_equal "baz layout at baz", body
|
168
|
+
get "/none"
|
169
|
+
assert_equal "default layout at none", body
|
170
|
+
get "/none/with_foo_layout"
|
171
|
+
assert_equal "foo layout at none with layout", body
|
172
|
+
get "/"
|
173
|
+
assert_equal "default layout at application", body
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should solve layout in layouts paths' do
|
178
|
+
create_layout :foo, "foo layout <%= yield %>"
|
179
|
+
create_layout :"layouts/bar", "bar layout <%= yield %>"
|
180
|
+
mock_app do
|
181
|
+
get("/") { render :erb, "none" }
|
182
|
+
get("/foo") { render :erb, "foo", :layout => :foo }
|
183
|
+
get("/bar") { render :erb, "bar", :layout => :bar }
|
184
|
+
end
|
185
|
+
get "/"
|
186
|
+
assert_equal "none", body
|
187
|
+
get "/foo"
|
188
|
+
assert_equal "foo layout foo", body
|
189
|
+
get "/bar"
|
190
|
+
assert_equal "bar layout bar", body
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should render correctly if layout was not found or not exist' do
|
194
|
+
create_layout :application, "application layout for <%= yield %>"
|
195
|
+
create_view :foo, "index", :format => :html
|
196
|
+
create_view :foo, "xml.rss", :format => :rss
|
197
|
+
mock_app do
|
198
|
+
get("/foo", :provides => [:html, :rss]) { render('foo') }
|
199
|
+
get("/baz", :provides => :js) { render(:erb, 'baz') }
|
200
|
+
get("/bar") { render :haml, "haml" }
|
201
|
+
end
|
202
|
+
get "/foo"
|
203
|
+
assert_equal "application layout for index", body
|
204
|
+
get "/foo.rss"
|
205
|
+
assert_equal "<rss/>", body.chomp
|
206
|
+
get "/baz.js"
|
207
|
+
assert_equal "baz", body
|
208
|
+
get "/bar"
|
209
|
+
assert_equal "haml", body.chomp
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'should allow to render template with layout option that using other template engine.' do
|
213
|
+
create_layout :"layouts/foo", "application layout for <%= yield %>", :format => :erb
|
214
|
+
create_view :slim, "| slim", :format => :slim
|
215
|
+
create_view :haml, "haml", :format => :haml
|
216
|
+
create_view :erb, "erb", :format => :erb
|
217
|
+
mock_app do
|
218
|
+
get("/slim") { render("slim.slim", :layout => "foo.erb") }
|
219
|
+
get("/haml") { render("haml.haml", :layout => "foo.erb") }
|
220
|
+
get("/erb") { render("erb.erb", :layout => "foo.erb") }
|
221
|
+
end
|
222
|
+
get "/slim"
|
223
|
+
assert_equal "application layout for slim", body.chomp
|
224
|
+
get "/haml"
|
225
|
+
assert_equal "application layout for haml", body.chomp
|
226
|
+
get "/erb"
|
227
|
+
assert_equal "application layout for erb", body.chomp
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should allow to use extension with layout method.' do
|
231
|
+
create_layout :"layouts/bar", "application layout for <%= yield %>", :format => :erb
|
232
|
+
create_view :slim, "| slim", :format => :slim
|
233
|
+
create_view :haml, "haml", :format => :haml
|
234
|
+
create_view :erb, "erb", :format => :erb
|
235
|
+
mock_app do
|
236
|
+
layout "bar.erb"
|
237
|
+
get("/slim") { render("slim.slim") }
|
238
|
+
get("/haml") { render("haml.haml") }
|
239
|
+
get("/erb") { render("erb.erb") }
|
240
|
+
end
|
241
|
+
get "/slim"
|
242
|
+
assert_equal "application layout for slim", body.chomp
|
243
|
+
get "/haml"
|
244
|
+
assert_equal "application layout for haml", body.chomp
|
245
|
+
get "/erb"
|
246
|
+
assert_equal "application layout for erb", body.chomp
|
247
|
+
end
|
248
|
+
|
249
|
+
describe 'for application render functionality' do
|
250
|
+
|
251
|
+
it 'should work properly with logging and missing layout' do
|
252
|
+
create_view :index, "<%= foo %>"
|
253
|
+
mock_app do
|
254
|
+
enable :logging
|
255
|
+
get("/") { render "index", { :layout => nil }, { :foo => "bar" } }
|
256
|
+
end
|
257
|
+
get "/"
|
258
|
+
assert_equal "bar", body
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'should work properly with logging and layout' do
|
262
|
+
create_layout :application, "layout <%= yield %>"
|
263
|
+
create_view :index, "<%= foo %>"
|
264
|
+
mock_app do
|
265
|
+
enable :logging
|
266
|
+
get("/") { render "index", { :layout => true }, { :foo => "bar" } }
|
267
|
+
end
|
268
|
+
get "/"
|
269
|
+
assert_equal "layout bar", body
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'should be compatible with sinatra render' do
|
273
|
+
mock_app do
|
274
|
+
get("/"){ render :erb, "<%= 1+2 %>" }
|
275
|
+
end
|
276
|
+
get "/"
|
277
|
+
assert_equal "3", body
|
278
|
+
end
|
279
|
+
|
280
|
+
it 'should support passing locals into render' do
|
281
|
+
create_layout :application, "layout <%= yield %>"
|
282
|
+
create_view :index, "<%= foo %>"
|
283
|
+
mock_app do
|
284
|
+
get("/") { render "index", { :layout => true }, { :foo => "bar" } }
|
285
|
+
end
|
286
|
+
get "/"
|
287
|
+
assert_equal "layout bar", body
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'should support passing locals into sinatra render' do
|
291
|
+
create_layout :application, "layout <%= yield %>"
|
292
|
+
create_view :index, "<%= foo %>"
|
293
|
+
mock_app do
|
294
|
+
get("/") { render :erb, :index, { :layout => true }, { :foo => "bar" } }
|
295
|
+
end
|
296
|
+
get "/"
|
297
|
+
assert_equal "layout bar", body
|
298
|
+
end
|
299
|
+
|
300
|
+
it 'should support passing locals into special nil engine render' do
|
301
|
+
create_layout :application, "layout <%= yield %>"
|
302
|
+
create_view :index, "<%= foo %>"
|
303
|
+
mock_app do
|
304
|
+
get("/") { render nil, :index, { :layout => true }, { :foo => "bar" } }
|
305
|
+
end
|
306
|
+
get "/"
|
307
|
+
assert_equal "layout bar", body
|
308
|
+
end
|
309
|
+
|
310
|
+
it 'should be compatible with sinatra views' do
|
311
|
+
with_view :index, "<%= 1+2 %>" do
|
312
|
+
mock_app do
|
313
|
+
get("/foo") { render :erb, :index }
|
314
|
+
get("/bar") { erb :index }
|
315
|
+
get("/dir") { "3" }
|
316
|
+
get("/inj") { erb "<%= 2+1 %>" }
|
317
|
+
get("/rnj") { render :erb, "<%= 2+1 %>" }
|
318
|
+
end
|
319
|
+
get "/foo"
|
320
|
+
assert_equal "3", body
|
321
|
+
get "/bar"
|
322
|
+
assert_equal "3", body
|
323
|
+
get "/dir"
|
324
|
+
assert_equal "3", body
|
325
|
+
get "/inj"
|
326
|
+
assert_equal "3", body
|
327
|
+
get "/rnj"
|
328
|
+
assert_equal "3", body
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'should resolve template engine' do
|
333
|
+
with_view :index, "<%= 1+2 %>" do
|
334
|
+
mock_app do
|
335
|
+
get("/foo") { render :index }
|
336
|
+
get("/bar") { render "/index" }
|
337
|
+
end
|
338
|
+
get "/foo"
|
339
|
+
assert_equal "3", body
|
340
|
+
get "/bar"
|
341
|
+
assert_equal "3", body
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
it 'should resolve template content type' do
|
346
|
+
create_view :foo, "Im Js", :format => :js
|
347
|
+
create_view :foo, "Im Erb"
|
348
|
+
mock_app do
|
349
|
+
get("/foo", :provides => :js) { render :foo }
|
350
|
+
get("/bar.js") { render :foo }
|
351
|
+
end
|
352
|
+
get "/foo.js"
|
353
|
+
assert_equal "Im Js", body
|
354
|
+
# TODO: implement this!
|
355
|
+
# get "/bar.js"
|
356
|
+
# assert_equal "Im Js", body
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'should resolve with explicit template format' do
|
360
|
+
create_view :foo, "Im Js", :format => :js
|
361
|
+
create_view :foo, "Im Haml", :format => :haml
|
362
|
+
create_view :foo, "Im Xml", :format => :xml
|
363
|
+
mock_app do
|
364
|
+
get("/foo_normal", :provides => :js) { render 'foo' }
|
365
|
+
get("/foo_haml", :provides => :js) { render 'foo.haml' }
|
366
|
+
get("/foo_xml", :provides => :js) { render 'foo.xml' }
|
367
|
+
end
|
368
|
+
get "/foo_normal.js"
|
369
|
+
assert_equal "Im Js", body
|
370
|
+
get "/foo_haml.js"
|
371
|
+
assert_equal "Im Haml\n", body
|
372
|
+
get "/foo_xml.js"
|
373
|
+
assert_equal "Im Xml", body
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'should resolve without explict template format' do
|
377
|
+
create_view :foo, "Im Html"
|
378
|
+
create_view :foo, "xml.rss", :format => :rss
|
379
|
+
mock_app do
|
380
|
+
get(:index, :map => "/", :provides => [:html, :rss]){ render 'foo' }
|
381
|
+
end
|
382
|
+
get "/", {}, { 'HTTP_ACCEPT' => 'text/html;q=0.9' }
|
383
|
+
assert_equal "Im Html", body
|
384
|
+
get ".rss"
|
385
|
+
assert_equal "<rss/>\n", body
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'should ignore files ending in tilde and not render them' do
|
389
|
+
create_view :foo, "Im Wrong", :format => 'haml~'
|
390
|
+
create_view :foo, "Im Haml", :format => :haml
|
391
|
+
create_view :bar, "Im Haml backup", :format => 'haml~'
|
392
|
+
mock_app do
|
393
|
+
get('/foo') { render 'foo' }
|
394
|
+
get('/bar') { render 'bar' }
|
395
|
+
end
|
396
|
+
get '/foo'
|
397
|
+
assert_equal "Im Haml\n", body
|
398
|
+
assert_raises(Padrino::Rendering::TemplateNotFound) { get '/bar' }
|
399
|
+
end
|
400
|
+
|
401
|
+
it 'should resolve template locale' do
|
402
|
+
create_view :foo, "Im English", :locale => :en
|
403
|
+
create_view :foo, "Im Italian", :locale => :it
|
404
|
+
mock_app do
|
405
|
+
get("/foo") { render :foo }
|
406
|
+
end
|
407
|
+
I18n.locale = :en
|
408
|
+
get "/foo"
|
409
|
+
assert_equal "Im English", body
|
410
|
+
I18n.locale = :it
|
411
|
+
get "/foo"
|
412
|
+
assert_equal "Im Italian", body
|
413
|
+
end
|
414
|
+
|
415
|
+
it 'should resolve template content_type and locale' do
|
416
|
+
create_view :foo, "Im Js", :format => :js
|
417
|
+
create_view :foo, "Im Erb"
|
418
|
+
create_view :foo, "Im English Erb", :locale => :en
|
419
|
+
create_view :foo, "Im Italian Erb", :locale => :it
|
420
|
+
create_view :foo, "Im English Js", :format => :js, :locale => :en
|
421
|
+
create_view :foo, "Im Italian Js", :format => :js, :locale => :it
|
422
|
+
mock_app do
|
423
|
+
get("/foo", :provides => [:html, :js]) { render :foo }
|
424
|
+
end
|
425
|
+
|
426
|
+
I18n.enforce_available_locales = false
|
427
|
+
I18n.locale = :none
|
428
|
+
get "/foo.js"
|
429
|
+
assert_equal "Im Js", body
|
430
|
+
get "/foo"
|
431
|
+
assert_equal "Im Erb", body
|
432
|
+
I18n.enforce_available_locales = true
|
433
|
+
|
434
|
+
I18n.locale = :en
|
435
|
+
get "/foo"
|
436
|
+
assert_equal "Im English Erb", body
|
437
|
+
I18n.locale = :it
|
438
|
+
get "/foo"
|
439
|
+
assert_equal "Im Italian Erb", body
|
440
|
+
I18n.locale = :en
|
441
|
+
get "/foo.js"
|
442
|
+
assert_equal "Im English Js", body
|
443
|
+
I18n.locale = :it
|
444
|
+
get "/foo.js"
|
445
|
+
assert_equal "Im Italian Js", body
|
446
|
+
I18n.locale = :en
|
447
|
+
get "/foo.pk"
|
448
|
+
assert_equal 404, status
|
449
|
+
end
|
450
|
+
|
451
|
+
it 'should resolve layouts from specific application' do
|
452
|
+
require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/render')
|
453
|
+
@app = RenderDemo2
|
454
|
+
get '/blog/override'
|
455
|
+
assert_equal 'otay', body
|
456
|
+
end
|
457
|
+
|
458
|
+
it 'should resolve templates and layouts located in absolute paths' do
|
459
|
+
mock_app do
|
460
|
+
get("/foo") { render 'apps/views/blog/post', :layout => 'layout', :views => File.dirname(__FILE__)+'/fixtures' }
|
461
|
+
end
|
462
|
+
get '/foo'
|
463
|
+
assert_match /okay absolute layout/, body
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'should resolve template content_type and locale with layout' do
|
467
|
+
create_layout :foo, "Hello <%= yield %> in a Js layout", :format => :js
|
468
|
+
create_layout :foo, "Hello <%= yield %> in a Js-En layout", :format => :js, :locale => :en
|
469
|
+
create_layout :foo, "Hello <%= yield %> in a Js-It layout", :format => :js, :locale => :it
|
470
|
+
create_layout :foo, "Hello <%= yield %> in a Erb-En layout", :locale => :en
|
471
|
+
create_layout :foo, "Hello <%= yield %> in a Erb-It layout", :locale => :it
|
472
|
+
create_layout :foo, "Hello <%= yield %> in a Erb layout"
|
473
|
+
create_view :bar, "Im Js", :format => :js
|
474
|
+
create_view :bar, "Im Erb"
|
475
|
+
create_view :bar, "Im English Erb", :locale => :en
|
476
|
+
create_view :bar, "Im Italian Erb", :locale => :it
|
477
|
+
create_view :bar, "Im English Js", :format => :js, :locale => :en
|
478
|
+
create_view :bar, "Im Italian Js", :format => :js, :locale => :it
|
479
|
+
create_view :bar, "Im a json", :format => :json
|
480
|
+
mock_app do
|
481
|
+
layout :foo
|
482
|
+
get("/bar", :provides => [:html, :js, :json]) { render :bar }
|
483
|
+
end
|
484
|
+
|
485
|
+
I18n.enforce_available_locales = false
|
486
|
+
I18n.locale = :none
|
487
|
+
get "/bar.js"
|
488
|
+
assert_equal "Hello Im Js in a Js layout", body
|
489
|
+
get "/bar"
|
490
|
+
assert_equal "Hello Im Erb in a Erb layout", body
|
491
|
+
I18n.enforce_available_locales = true
|
492
|
+
|
493
|
+
I18n.locale = :en
|
494
|
+
get "/bar"
|
495
|
+
assert_equal "Hello Im English Erb in a Erb-En layout", body
|
496
|
+
I18n.locale = :it
|
497
|
+
get "/bar"
|
498
|
+
assert_equal "Hello Im Italian Erb in a Erb-It layout", body
|
499
|
+
I18n.locale = :en
|
500
|
+
get "/bar.js"
|
501
|
+
assert_equal "Hello Im English Js in a Js-En layout", body
|
502
|
+
I18n.locale = :it
|
503
|
+
get "/bar.js"
|
504
|
+
assert_equal "Hello Im Italian Js in a Js-It layout", body
|
505
|
+
I18n.locale = :en
|
506
|
+
get "/bar.json"
|
507
|
+
assert_equal "Im a json", body
|
508
|
+
get "/bar.pk"
|
509
|
+
assert_equal 404, status
|
510
|
+
|
511
|
+
end
|
512
|
+
|
513
|
+
it 'should resolve template location relative to controller name' do
|
514
|
+
require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/render')
|
515
|
+
@app = RenderDemo2
|
516
|
+
get '/blog'
|
517
|
+
assert_equal 'okay', body
|
518
|
+
end
|
519
|
+
|
520
|
+
it 'should resolve nested template location relative to controller name' do
|
521
|
+
require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/render')
|
522
|
+
@app = RenderDemo2
|
523
|
+
get '/article/comment'
|
524
|
+
assert_equal 'okay comment', body
|
525
|
+
end
|
526
|
+
|
527
|
+
it 'should renders erb with blocks' do
|
528
|
+
mock_app do
|
529
|
+
def container
|
530
|
+
@_out_buf << "THIS."
|
531
|
+
yield
|
532
|
+
@_out_buf << "SPARTA!"
|
533
|
+
end
|
534
|
+
def is; "IS."; end
|
535
|
+
get '/' do
|
536
|
+
render :erb, '<% container do %> <%= is %> <% end %>'
|
537
|
+
end
|
538
|
+
end
|
539
|
+
get '/'
|
540
|
+
assert ok?
|
541
|
+
assert_equal 'THIS. IS. SPARTA!', body
|
542
|
+
end
|
543
|
+
|
544
|
+
it 'should render erb to a SafeBuffer' do
|
545
|
+
mock_app do
|
546
|
+
layout do
|
547
|
+
"this is a <%= yield %>"
|
548
|
+
end
|
549
|
+
get '/' do
|
550
|
+
render :erb, '<p><%= %q{<script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script>} %></p>', :layout => false
|
551
|
+
end
|
552
|
+
get '/with_layout' do
|
553
|
+
render :erb, '<span>span</span>', :layout => true
|
554
|
+
end
|
555
|
+
end
|
556
|
+
get '/'
|
557
|
+
assert ok?
|
558
|
+
assert_equal '<p><script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script></p>', body
|
559
|
+
|
560
|
+
get '/with_layout'
|
561
|
+
assert ok?
|
562
|
+
assert_equal 'this is a <span>span</span>', body
|
563
|
+
end
|
564
|
+
|
565
|
+
it 'should render haml to a SafeBuffer' do
|
566
|
+
mock_app do
|
567
|
+
layout do
|
568
|
+
"%p= yield"
|
569
|
+
end
|
570
|
+
get '/' do
|
571
|
+
render :haml, '%p= %s{<script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script>}', :layout => false
|
572
|
+
end
|
573
|
+
get '/with_layout' do
|
574
|
+
render :haml, "%div\n foo", :layout => true
|
575
|
+
end
|
576
|
+
end
|
577
|
+
get '/'
|
578
|
+
assert ok?
|
579
|
+
assert_equal '<p><script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script></p>', body.strip
|
580
|
+
|
581
|
+
get 'with_layout'
|
582
|
+
assert ok?
|
583
|
+
assert_equal '<p><div>foo</div></p>', body.gsub(/\s+/, "")
|
584
|
+
end
|
585
|
+
|
586
|
+
it 'should render slim to a SafeBuffer' do
|
587
|
+
mock_app do
|
588
|
+
layout do
|
589
|
+
"p= yield"
|
590
|
+
end
|
591
|
+
get '/' do
|
592
|
+
render :slim, 'p = %q{<script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script>}', :layout => false
|
593
|
+
end
|
594
|
+
get "/with_layout" do
|
595
|
+
render :slim, 'div foo', :layout => true
|
596
|
+
end
|
597
|
+
end
|
598
|
+
get '/'
|
599
|
+
assert ok?
|
600
|
+
assert_equal '<p><script lang="ronin">alert("https://github.com/ronin-ruby/ronin")</script></p>', body.strip
|
601
|
+
|
602
|
+
get '/with_layout'
|
603
|
+
assert ok?
|
604
|
+
assert_equal '<p><div>foo</div></p>', body.strip
|
605
|
+
end
|
606
|
+
|
607
|
+
it 'should render correct erb when use sinatra as middleware' do
|
608
|
+
class Bar < Sinatra::Base
|
609
|
+
get "/" do
|
610
|
+
render :erb, "<&'>"
|
611
|
+
end
|
612
|
+
end
|
613
|
+
mock_app do
|
614
|
+
use Bar
|
615
|
+
end
|
616
|
+
get "/"
|
617
|
+
assert_equal "<&'>", body
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
describe 'standalone Sinatra usage of Rendering' do
|
622
|
+
before do
|
623
|
+
Sinatra::Request.class_eval{ alias_method :monkey_controller, :controller; undef :controller }
|
624
|
+
end
|
625
|
+
after do
|
626
|
+
Sinatra::Request.class_eval{ alias_method :controller, :monkey_controller; undef :monkey_controller }
|
627
|
+
end
|
628
|
+
it 'should work with Sinatra::Base' do
|
629
|
+
class Application < Sinatra::Base
|
630
|
+
register Padrino::Rendering
|
631
|
+
get '/' do
|
632
|
+
render :post, :views => File.dirname(__FILE__)+'/fixtures/apps/views/blog'
|
633
|
+
end
|
634
|
+
end
|
635
|
+
@app = Application.new
|
636
|
+
get '/'
|
637
|
+
assert_equal 'okay', body
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
641
|
+
describe 'locating of template paths' do
|
642
|
+
it 'should locate controller templates' do
|
643
|
+
mock_app do
|
644
|
+
disable :reload_templates
|
645
|
+
set :views, File.dirname(__FILE__)+'/fixtures/apps/views'
|
646
|
+
controller :test do
|
647
|
+
get :index do
|
648
|
+
render 'test/post'
|
649
|
+
end
|
650
|
+
end
|
651
|
+
end
|
652
|
+
get '/test'
|
653
|
+
end
|
654
|
+
|
655
|
+
it 'should properly cache template path' do
|
656
|
+
mock_app do
|
657
|
+
disable :reload_templates
|
658
|
+
set :views, File.dirname(__FILE__)+'/fixtures/apps/views'
|
659
|
+
controller :blog do
|
660
|
+
get :index do
|
661
|
+
render :post
|
662
|
+
end
|
663
|
+
end
|
664
|
+
controller :test do
|
665
|
+
get :index do
|
666
|
+
render 'post'
|
667
|
+
end
|
668
|
+
end
|
669
|
+
end
|
670
|
+
get '/blog'
|
671
|
+
get '/test'
|
672
|
+
assert_equal 'test', body
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
676
|
+
describe 'rendering bug in some' do
|
677
|
+
it 'should raise error on registering things to Padrino::Application' do
|
678
|
+
assert_raises(RuntimeError) do
|
679
|
+
Padrino::Application.register Padrino::Rendering
|
680
|
+
end
|
681
|
+
end
|
682
|
+
end
|
683
|
+
end
|