mab 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/COPYING +19 -0
  2. data/Gemfile +10 -0
  3. data/Gemfile.lock +12 -0
  4. data/README.md +224 -0
  5. data/Rakefile +8 -0
  6. data/bench.rb +37 -0
  7. data/lib/mab/mixin.rb +58 -42
  8. data/lib/mab/version.rb +1 -1
  9. data/mab-0.0.1.gem +0 -0
  10. data/mab.gemspec +20 -0
  11. data/markaby/CHANGELOG.rdoc +106 -0
  12. data/markaby/Markaby.gemspec +109 -0
  13. data/markaby/README.rdoc +317 -0
  14. data/markaby/Rakefile +78 -0
  15. data/markaby/VERSION +1 -0
  16. data/markaby/garlic.rb +29 -0
  17. data/markaby/init.rb +6 -0
  18. data/markaby/lib/markaby.rb +30 -0
  19. data/markaby/lib/markaby/builder.rb +314 -0
  20. data/markaby/lib/markaby/builder_tags.rb +64 -0
  21. data/markaby/lib/markaby/cssproxy.rb +55 -0
  22. data/markaby/lib/markaby/kernel_method.rb +7 -0
  23. data/markaby/lib/markaby/rails.rb +75 -0
  24. data/markaby/lib/markaby/rails/current.rb +85 -0
  25. data/markaby/lib/markaby/rails/deprecated.rb +124 -0
  26. data/markaby/lib/markaby/rails/rails_builder.rb +91 -0
  27. data/markaby/lib/markaby/sinatra.rb +18 -0
  28. data/markaby/lib/markaby/tags.rb +200 -0
  29. data/markaby/lib/markaby/tilt.rb +8 -0
  30. data/markaby/spec/markaby/builder_spec.rb +118 -0
  31. data/markaby/spec/markaby/css_proxy_test.rb +47 -0
  32. data/markaby/spec/markaby/fragment_test.rb +10 -0
  33. data/markaby/spec/markaby/markaby_other_static.mab +1 -0
  34. data/markaby/spec/markaby/markaby_spec.rb +184 -0
  35. data/markaby/spec/markaby/markaby_test.rb +251 -0
  36. data/markaby/spec/markaby/rails/spec_helper.rb +29 -0
  37. data/markaby/spec/markaby/rails/views/layouts/layout.mab +11 -0
  38. data/markaby/spec/markaby/rails/views/markaby/_a_partial.mab +3 -0
  39. data/markaby/spec/markaby/rails/views/markaby/_form_for_with_body_in_erb.erb +1 -0
  40. data/markaby/spec/markaby/rails/views/markaby/_partial_child_with_locals.mab +1 -0
  41. data/markaby/spec/markaby/rails/views/markaby/access_to_helpers.mab +1 -0
  42. data/markaby/spec/markaby/rails/views/markaby/broken.mab +7 -0
  43. data/markaby/spec/markaby/rails/views/markaby/commented_out_template.mab +1 -0
  44. data/markaby/spec/markaby/rails/views/markaby/correct_template_values.mab +5 -0
  45. data/markaby/spec/markaby/rails/views/markaby/double_output.mab +8 -0
  46. data/markaby/spec/markaby/rails/views/markaby/form_for.mab +2 -0
  47. data/markaby/spec/markaby/rails/views/markaby/form_for_with_fields.mab +3 -0
  48. data/markaby/spec/markaby/rails/views/markaby/form_for_with_multiple_fields.mab +4 -0
  49. data/markaby/spec/markaby/rails/views/markaby/no_values_passed.mab +3 -0
  50. data/markaby/spec/markaby/rails/views/markaby/partial_parent.mab +1 -0
  51. data/markaby/spec/markaby/rails/views/markaby/partial_parent_with_locals.mab +7 -0
  52. data/markaby/spec/markaby/rails/views/markaby/render_erb_without_explicit_render_call.erb +1 -0
  53. data/markaby/spec/markaby/rails/views/markaby/render_explicit_but_empty_markaby_layout.mab +0 -0
  54. data/markaby/spec/markaby/rails/views/markaby/render_mab_without_explicit_render_call.mab +3 -0
  55. data/markaby/spec/markaby/rails/views/markaby/render_with_ivar.mab +3 -0
  56. data/markaby/spec/markaby/rails/views/markaby/renders_erb.rhtml +1 -0
  57. data/markaby/spec/markaby/rails/views/markaby/renders_form_for_with_erb_body.mab +3 -0
  58. data/markaby/spec/markaby/rails/views/markaby/routes.mab +1 -0
  59. data/markaby/spec/markaby/rails/views/markaby/yielding.mab +3 -0
  60. data/markaby/spec/markaby/rails/views/markaby/yielding_content_for_with_block_helper.mab +5 -0
  61. data/markaby/spec/markaby/rails/views/markaby/yielding_two.mab +7 -0
  62. data/markaby/spec/markaby/rails/views/markaby/yielding_with_content_for.mab +3 -0
  63. data/markaby/spec/markaby/rails_test.rb +380 -0
  64. data/markaby/spec/markaby/rails_version_spec.rb +37 -0
  65. data/markaby/spec/markaby/sinatra/app.rb +49 -0
  66. data/markaby/spec/markaby/sinatra/sinatra_spec.rb +67 -0
  67. data/markaby/spec/markaby/sinatra/views/helpers.mab +1 -0
  68. data/markaby/spec/markaby/sinatra/views/layout.mab +7 -0
  69. data/markaby/spec/markaby/sinatra/views/markaby_template.mab +0 -0
  70. data/markaby/spec/markaby/sinatra/views/scope_instance_variables.mab +3 -0
  71. data/markaby/spec/markaby/sinatra/views/simple_html.mab +4 -0
  72. data/markaby/spec/markaby/sinatra/views/variables.mab +3 -0
  73. data/markaby/spec/markaby/tilt/erb.erb +1 -0
  74. data/markaby/spec/markaby/tilt/locals.mab +1 -0
  75. data/markaby/spec/markaby/tilt/markaby.mab +1 -0
  76. data/markaby/spec/markaby/tilt/markaby_other_static.mab +1 -0
  77. data/markaby/spec/markaby/tilt/render_twice.mab +1 -0
  78. data/markaby/spec/markaby/tilt/scope.mab +1 -0
  79. data/markaby/spec/markaby/tilt/yielding.mab +2 -0
  80. data/markaby/spec/markaby/tilt_spec.rb +75 -0
  81. data/markaby/spec/spec.opts +2 -0
  82. data/markaby/spec/spec_helper.rb +44 -0
  83. data/test/helper.rb +4 -0
  84. data/test/test_mab_builder.rb +56 -0
  85. data/test/test_mab_indentation.rb +66 -0
  86. data/test/test_mab_kernel_method.rb +10 -0
  87. data/test/test_mab_mixin.rb +246 -0
  88. metadata +92 -6
@@ -0,0 +1,251 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ class MarkabyTest < Test::Unit::TestCase
4
+ def teardown
5
+ Markaby::Builder.restore_defaults!
6
+ end
7
+
8
+ def test_simple
9
+ assert_equal "<hr/>", mab { hr }
10
+ assert_equal "<hr/><br/>", mab { hr; br }
11
+ assert_equal "<p>foo</p>", mab { p 'foo' }
12
+ assert_equal "<p>foo</p>", mab { p { 'foo' } }
13
+ end
14
+
15
+ def test_classes_and_ids
16
+ assert_equal %{<div class="one"></div>}, mab { div.one '' }
17
+ assert_equal %{<div class="one two"></div>}, mab { div.one.two '' }
18
+ assert_equal %{<div id="three"></div>}, mab { div.three! '' }
19
+ assert_equal %{<hr class="hidden"/>}, mab { hr.hidden }
20
+
21
+ out = mab { input.foo :id => 'bar' }
22
+ out.should match("<input.*class=\"foo\".*/>")
23
+ out.should match("<input.*name=\"bar\".*/>")
24
+ end
25
+
26
+ def test_escaping
27
+ assert_equal "<h1>Apples &amp; Oranges</h1>", mab { h1 'Apples & Oranges' }
28
+ assert_equal "<h1>Apples & Oranges</h1>", mab { h1 { 'Apples & Oranges' } }
29
+ assert_equal "<h1 class=\"fruits&amp;floots\">Apples</h1>", mab { h1 'Apples', :class => 'fruits&floots' }
30
+ end
31
+
32
+ def test_capture
33
+ builder = Markaby::Builder.new
34
+ assert builder.to_s.empty?
35
+ assert_equal "<h1>TEST</h1>", builder.capture { h1 'TEST' }
36
+ assert builder.to_s.empty?
37
+ assert mab { capture { h1 'hello world' }; nil }.empty?
38
+ assert_equal mab { div { h1 'TEST' } }, mab { div { capture { h1 'TEST' } } }
39
+ end
40
+
41
+ def test_ivars
42
+ html = "<div><h1>Steve</h1><div><h2>Gerald</h2></div><h3>Gerald</h3></div>"
43
+ assert_equal html, mab { div { @name = 'Steve'; h1 @name; div { @name = 'Gerald'; h2 @name }; h3 @name } }
44
+ assert_equal html, mab { div { @name = 'Steve'; h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
45
+ assert_equal html, mab(:name => 'Steve') { div { h1 @name; self << capture { div { @name = 'Gerald'; h2 @name } }; h3 @name } }
46
+ end
47
+
48
+ def test_ivars_without_at_symbol
49
+ assert_equal "<h1>Hello World</h1>", mab { @message = 'Hello World'; h1 message }
50
+ end
51
+
52
+ def spec_helpers
53
+ Markaby::Builder.ignored_helpers.clear
54
+ assert_equal %{squirrels}, mab({}, MarkabyTestHelpers) { pluralize('squirrel') }
55
+ assert_equal %{<a href="">edit</a>}, mab({}, MarkabyTestHelpers) { link_to('edit') }
56
+ assert mab({}, MarkabyTestHelpers) { @output_helpers = false; link_to('edit'); nil }.empty?
57
+ Markaby::Builder.ignore_helpers :pluralize
58
+ assert_exception(NoMethodError, "undefined method `pluralize'", {}, MarkabyTestHelpers) { pluralize('squirrel') }
59
+ end
60
+
61
+ def test_uses_helper_instance_variable
62
+ helper = Module.new do
63
+ @some_ivar = :ivar_value
64
+ end
65
+
66
+ builder = Markaby::Builder.new({}, helper)
67
+ assert_equal :ivar_value, builder.some_ivar
68
+ end
69
+ end
70
+
71
+ describe Markaby do
72
+ it "can assign helpers after instantiation" do
73
+ helper = mock 'helper', :foo => :bar
74
+
75
+ builder = Markaby::Builder.new
76
+ builder.helper = helper
77
+ builder.foo.should == :bar
78
+ end
79
+
80
+ it "should be able to set a local" do
81
+ builder = Markaby::Builder.new
82
+ builder.locals = { :foo => "bar" }
83
+ builder.foo.should == "bar"
84
+ end
85
+
86
+ it "should be able to set a different local value" do
87
+ builder = Markaby::Builder.new
88
+ builder.locals = { :foo => "baz" }
89
+ builder.foo.should == "baz"
90
+ end
91
+
92
+ it "should assign the correct key" do
93
+ builder = Markaby::Builder.new
94
+ builder.locals = { :key => :value }
95
+ builder.key.should == :value
96
+ end
97
+
98
+ it "should be able to assign multiple locals" do
99
+ builder = Markaby::Builder.new
100
+
101
+ builder.locals = { :one => "two", :three => "four" }
102
+
103
+ builder.one.should == "two"
104
+ builder.three.should == "four"
105
+ end
106
+
107
+ def test_builder_bang_methods
108
+ assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", mab { instruct! }
109
+ end
110
+
111
+ it "should be able to produce the correct html from a fragment" do
112
+ str = ""
113
+ str += "<div>"
114
+ str += "<h1>Monkeys</h1>"
115
+ str += "<h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2>"
116
+ str += "<h3>Donkeys</h3>"
117
+ str += "<h4>Parakeet <b><i>Innocent IV</i></b> in Classic Chartreuse</h4>"
118
+ str += "</div>"
119
+
120
+ generated = mab {
121
+ div {
122
+ h1 "Monkeys"
123
+ h2 {
124
+ "Giraffes #{small('Miniature')} and #{strong 'Large'}"
125
+ }
126
+ h3 "Donkeys"
127
+ h4 { "Parakeet #{b { i 'Innocent IV' }} in Classic Chartreuse" }
128
+ }
129
+ }
130
+
131
+ generated.should == str
132
+ end
133
+
134
+ def test_fragments
135
+ assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <strong>Miniature</strong></h2><h3>Donkeys</h3></div>},
136
+ mab { div { h1 "Monkeys"; h2 { "Giraffes #{strong 'Miniature' }" }; h3 "Donkeys" } }
137
+
138
+ assert_equal %{<div><h1>Monkeys</h1><h2>Giraffes <small>Miniature</small> and <strong>Large</strong></h2><h3>Donkeys</h3><h4>Parakeet <strong>Large</strong> as well...</h4></div>},
139
+ mab { div { @a = small 'Miniature'; @b = strong 'Large'; h1 "Monkeys"; h2 { "Giraffes #{@a} and #{@b}" }; h3 "Donkeys"; h4 { "Parakeet #{@b} as well..." } } }
140
+ end
141
+
142
+ def test_invalid_xhtml
143
+ assert_exception(NoMethodError, "undefined method `dav'") { dav {} }
144
+ assert_exception(Markaby::InvalidXhtmlError, "no attribute `styl' on div elements") { div(:styl => 'ok') {} }
145
+ assert_exception(Markaby::InvalidXhtmlError, "no attribute `class' on tbody elements") { tbody.okay {} }
146
+ end
147
+
148
+ def test_full_doc_transitional
149
+ doc = mab { xhtml_transitional { head { title 'OKay' } } }
150
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
151
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">})
152
+ assert doc.include?(%{<title>OKay</title>})
153
+ end
154
+
155
+ def test_full_doc_strict
156
+ doc = mab { xhtml_strict { head { title 'OKay' } } }
157
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
158
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
159
+ assert doc.include?(%{<title>OKay</title>})
160
+ end
161
+
162
+ def test_full_doc_frameset
163
+ doc = mab { xhtml_frameset { head { title 'OKay' } } }
164
+ assert doc =~ /^<\?xml version="1.0" encoding="UTF-8"\?>/
165
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">})
166
+ assert doc.include?(%{<title>OKay</title>})
167
+ end
168
+
169
+ def test_root_attributes_can_be_changed
170
+ doc = mab { xhtml_strict(:lang => 'fr') { head { title { 'Salut!' } } } }
171
+ assert doc.include?(%{"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">})
172
+ assert doc.include?(%{<title>Salut!</title>})
173
+ assert doc.include?(%{ lang="fr"})
174
+ end
175
+
176
+ def version_file
177
+ File.expand_path(File.dirname(__FILE__) + "/../../VERSION")
178
+ end
179
+
180
+ def test_markaby_should_have_correct_version
181
+ assert_equal Markaby::VERSION, File.read(version_file).strip
182
+ end
183
+
184
+ def test_duplicate_usage_of_same_id
185
+ assert_raises Markaby::InvalidXhtmlError do
186
+ mab do
187
+ p.one!
188
+ p.one!
189
+ end
190
+ end
191
+ end
192
+
193
+ # auto validation
194
+
195
+ def test_tagging_with_invalid_tag_should_raise_error
196
+ assert_raises Markaby::InvalidXhtmlError do
197
+ mab do
198
+ tag! :an_invalid_tag
199
+ end
200
+ end
201
+ end
202
+
203
+ def test_self_closing_html_tag_with_block_throws_errors
204
+ assert_raises Markaby::InvalidXhtmlError do
205
+ mab do
206
+ html_tag :img do
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ def test_local_assigning
213
+ builder = Markaby::Builder.new(:variable => :a_value)
214
+
215
+ assert_equal :a_value, builder.variable
216
+ end
217
+
218
+ def test_local_assignment_with_strings
219
+ builder = Markaby::Builder.new("variable" => :a_value)
220
+ assert_equal :a_value, builder.variable
221
+ end
222
+
223
+ def test_local_assignment_prefers_symbols_to_strings
224
+ builder = Markaby::Builder.new("variable" => "string_value", :variable => :symbol_value)
225
+ assert_equal :symbol_value, builder.variable
226
+ end
227
+
228
+ def test_method_missing_should_call_tag_if_no_tagset_present
229
+ Markaby::Builder.set(:tagset, nil)
230
+
231
+ builder = Markaby::Builder.new
232
+ builder.something.should == "<something/>"
233
+ end
234
+
235
+ it "should copy instance variables from a helper object" do
236
+ klass = Class.new do
237
+ def initialize
238
+ @hello = "hello there"
239
+ end
240
+ end
241
+
242
+ builder = Markaby::Builder.new({}, klass.new)
243
+ builder.capture { @hello }.should == "hello there"
244
+ end
245
+
246
+ describe Markaby::InvalidXhtmlError do
247
+ it "should inherit from StandardError" do
248
+ Markaby::InvalidXhtmlError.superclass.should == StandardError
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,29 @@
1
+ require 'test/unit'
2
+
3
+ unless defined?(RUNNING_RAILS)
4
+ MARKABY_ROOT = File.join(File.dirname(__FILE__), "..", "..", "..")
5
+ rails_root = File.join(MARKABY_ROOT, "..", "..", "..")
6
+ RAILS_BOOT_FILE = File.join(rails_root, "config", "boot.rb")
7
+
8
+ RUNNING_RAILS = File.exists?(RAILS_BOOT_FILE) ? true : false
9
+ end
10
+
11
+ if RUNNING_RAILS
12
+ ENV["RAILS_ENV"] ||= "test"
13
+ require RAILS_BOOT_FILE
14
+ Rails::Initializer.run
15
+ require 'action_controller/test_process'
16
+
17
+ $:.unshift MARKABY_ROOT
18
+ require 'init'
19
+
20
+ ActionController::Routing::Routes.draw do |map|
21
+ map.new_user "/users/new", :controller => "users", :action => "new"
22
+
23
+ # default routes
24
+ map.connect ':controller/:action/:id.:format'
25
+ map.connect ':controller/:action/:id'
26
+ end
27
+ else
28
+ warn "Skipping rails specific tests"
29
+ end
@@ -0,0 +1,11 @@
1
+ div :id => "main" do
2
+ yield
3
+ end
4
+
5
+ str = yield(:foo)
6
+
7
+ unless str.blank?
8
+ div :id => "foo" do
9
+ str
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ ul do
2
+ li "smtlaissezfaire"
3
+ end
@@ -0,0 +1,7 @@
1
+ div {
2
+ ul {
3
+ li 'one'
4
+ li 'two'
5
+ li supercalifragilisticexpialidocious
6
+ }
7
+ }
@@ -0,0 +1 @@
1
+ # <!-- raise an ruby error -->
@@ -0,0 +1,5 @@
1
+ ul do
2
+ li "smt"
3
+ li "joho"
4
+ li "spox"
5
+ end
@@ -0,0 +1,8 @@
1
+ content_for :foo do
2
+ form_for :foo do |f|
3
+ p :class => "foo" do
4
+ f.text_field :foo
5
+ f.submit "foo"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+ form_for :obj do
2
+ end
@@ -0,0 +1,3 @@
1
+ form_for :foo do |f|
2
+ f.text_field :foo
3
+ end
@@ -0,0 +1,4 @@
1
+ form_for :foo do |f|
2
+ f.text_field :foo
3
+ f.text_field :baz
4
+ end
@@ -0,0 +1 @@
1
+ render :partial => "a_partial"
@@ -0,0 +1,7 @@
1
+ ul do
2
+ authors = ["smtlaissezfaire"]
3
+
4
+ authors.each do |author|
5
+ render :partial => "partial_child_with_locals", :locals => {:author => author}
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ form_for :foo do |f|
2
+ render :partial => "form_for_with_body_in_erb", :locals => { :f => f }
3
+ end
@@ -0,0 +1 @@
1
+ link_to("Foo", new_user_path)
@@ -0,0 +1,3 @@
1
+ p :class => "hey" do
2
+ "hi there"
3
+ end
@@ -0,0 +1,5 @@
1
+ content_for :foo do
2
+ form_for :foo do |f|
3
+ f.text_field :foo
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ p :class => "hi" do
2
+ "hi there"
3
+ end
4
+
5
+ p :class => "hi" do
6
+ "hi again"
7
+ end
@@ -0,0 +1,3 @@
1
+ content_for :foo do
2
+ p "in foo content_for"
3
+ end
@@ -0,0 +1,380 @@
1
+ require File.expand_path('../rails/spec_helper', __FILE__)
2
+
3
+ if RUNNING_RAILS
4
+ class NonSpecificTestController < ActionController::Base
5
+ VIEW_PATH = File.expand_path(File.join(File.dirname(__FILE__), 'rails', 'views'))
6
+
7
+ around_filter :catch_exceptions
8
+
9
+ attr_reader :last_exception
10
+
11
+ def catch_exceptions
12
+ yield
13
+ rescue Exception => @last_exception
14
+ raise @last_exception
15
+ end
16
+ end
17
+
18
+ if Markaby::Rails.deprecated_rails_version?
19
+ class ActionController::TestCase < Test::Unit::TestCase; end
20
+
21
+ class TestController < NonSpecificTestController
22
+ self.template_root = VIEW_PATH
23
+ end
24
+ else
25
+ class TestController < NonSpecificTestController
26
+ append_view_path(VIEW_PATH)
27
+ end
28
+ end
29
+
30
+ class MarkabyController < TestController
31
+ def renders_nothing
32
+ render :text => ""
33
+ end
34
+
35
+ def renders_erb_with_explicit_template
36
+ render :template => "markaby/renders_erb"
37
+ end
38
+
39
+ def render_inline_content
40
+ mab_content = mab do
41
+ ul do
42
+ li "Scott"
43
+ end
44
+ end
45
+
46
+ render :inline => mab_content
47
+ end
48
+
49
+ def render_explicit_but_empty_markaby_layout
50
+ render :template => "markaby/render_explicit_but_empty_markaby_layout.mab"
51
+ end
52
+
53
+ def no_values_passed
54
+ render :template => "markaby/no_values_passed"
55
+ end
56
+
57
+ def correct_template_values
58
+ render :template => "markaby/correct_template_values"
59
+ end
60
+
61
+ def render_erb_without_explicit_render_call
62
+ end
63
+
64
+ def render_mab_without_explicit_render_call
65
+ end
66
+
67
+ def render_with_ivar
68
+ @user = "smtlaissezfaire"
69
+ render :template => "markaby/render_with_ivar"
70
+ end
71
+
72
+ def access_to_helpers
73
+ render :template => "markaby/access_to_helpers"
74
+ end
75
+
76
+ def renders_partial
77
+ render :template => "markaby/partial_parent"
78
+ end
79
+
80
+ def renders_partial_with_locals
81
+ render :template => "markaby/partial_parent_with_locals"
82
+ end
83
+
84
+ def render_which_raises_error
85
+ render :template => "markaby/broken"
86
+ end
87
+
88
+ def renders_form_for
89
+ @obj = Object.new
90
+ render :template => "markaby/form_for"
91
+ end
92
+
93
+ def render_form_for_with_fields
94
+ @obj = Object.new
95
+ def @obj.foo
96
+ "bar"
97
+ end
98
+
99
+ render :template => "markaby/form_for_with_fields"
100
+ end
101
+
102
+ def render_form_for_with_multiple_fields
103
+ @obj = Object.new
104
+
105
+ def @obj.foo
106
+ "bar"
107
+ end
108
+
109
+ def @obj.baz
110
+ "quxx"
111
+ end
112
+
113
+ render :template => "markaby/form_for_with_multiple_fields"
114
+ end
115
+
116
+ def routes
117
+ end
118
+
119
+ def commented_out_template
120
+ end
121
+
122
+ def render_with_yielding
123
+ render :layout => "layout.mab",
124
+ :template => "markaby/yielding"
125
+ end
126
+
127
+ def render_with_yielding_where_template_has_two_elements
128
+ render :layout => "layout.mab",
129
+ :template => "markaby/yielding_two"
130
+ end
131
+
132
+ def render_with_yielding_content_for_block
133
+ render :layout => "layout.mab",
134
+ :template => "markaby/yielding_with_content_for"
135
+ end
136
+
137
+ def render_content_for_with_block_helper
138
+ @obj = Object.new
139
+ def @obj.foo
140
+ "bar"
141
+ end
142
+
143
+ render :layout => "layout.mab",
144
+ :template => "markaby/yielding_content_for_with_block_helper"
145
+ end
146
+
147
+ def renders_content_for_with_form_for_without_double_render
148
+ @obj = Object.new
149
+ def @obj.foo
150
+ "bar"
151
+ end
152
+
153
+ render :layout => "layout.mab",
154
+ :template => "markaby/double_output"
155
+ end
156
+
157
+ def renders_form_for_with_erb_body
158
+ @obj = Object.new
159
+
160
+ def @obj.foo
161
+ "bar"
162
+ end
163
+ end
164
+ end
165
+
166
+ class MarkabyOnRailsTest < ActionController::TestCase
167
+ def setup
168
+ Markaby::Builder.restore_defaults!
169
+
170
+ @request = ActionController::TestRequest.new
171
+ @response = ActionController::TestResponse.new
172
+ @controller = MarkabyController.new
173
+ end
174
+
175
+ def test_renders_nothing
176
+ get :renders_nothing
177
+ assert_response :success
178
+ end
179
+
180
+ def test_renders_erb_with_explicit_template
181
+ get :renders_erb_with_explicit_template
182
+ assert_response :success
183
+ # TODO: - fix this test environment issue so that assert_template works
184
+ # correctly in these tests
185
+ # assert_template "renders_erb.erb"
186
+ end
187
+
188
+ def test_renders_explicit_but_empty_markaby_layout
189
+ get :render_explicit_but_empty_markaby_layout
190
+ assert_response :success
191
+
192
+ assert_equal "", @response.body
193
+ # TODO:
194
+ # assert_template "markaby/render_explicit_but_empty_markaby_layout"
195
+ end
196
+
197
+ def test_renders_inline_markaby_content
198
+ get :render_inline_content
199
+ assert_response :success
200
+ assert_equal "<ul><li>Scott</li></ul>", @response.body
201
+ end
202
+
203
+ def test_renders_mab_template_with_no_values_passed
204
+ get :no_values_passed
205
+ assert_response :success
206
+ assert_equal "<ul><li>Scott</li></ul>", @response.body
207
+ end
208
+
209
+ def test_renders_mab_template_with_correct_values
210
+ get :correct_template_values
211
+ assert_response :success
212
+
213
+ assert_equal "<ul><li>smt</li><li>joho</li><li>spox</li></ul>", @response.body
214
+ end
215
+
216
+ def test_renders_without_explicit_render_call
217
+ get :render_mab_without_explicit_render_call
218
+ assert_response :success
219
+
220
+ assert_equal @response.body, "<ul><li>smtlaissezfaire</li></ul>"
221
+ end
222
+
223
+ def test_renders_with_ivar
224
+ get :render_with_ivar
225
+ assert_response :success
226
+
227
+ assert_equal "<ul><li>smtlaissezfaire</li></ul>", @response.body
228
+ end
229
+
230
+ def test_access_to_helpers
231
+ get :access_to_helpers
232
+ assert_response :success
233
+
234
+ assert_equal '<a href="/foo">bar</a>', @response.body
235
+ end
236
+
237
+ def test_renders_partial_from_template
238
+ get :renders_partial
239
+ assert_response :success
240
+
241
+ assert_equal "<ul><li>smtlaissezfaire</li></ul>", @response.body
242
+ end
243
+
244
+ def test_renders_partial_with_locals
245
+ get :renders_partial_with_locals
246
+ assert_response :success
247
+
248
+ assert_equal "<ul><li>smtlaissezfaire</li></ul>", @response.body
249
+ end
250
+
251
+ def test_raises_error_when_template_raises_error
252
+ get :render_which_raises_error
253
+
254
+ assert_response :error
255
+
256
+ assert_equal ActionView::TemplateError, @controller.last_exception.class
257
+ assert %r(undefined local variable or method `supercalifragilisticexpialidocious' for #<Markaby::.*Builder.*) =~
258
+ @controller.last_exception.message.to_s
259
+ end
260
+
261
+ def test_routes_work
262
+ get :routes
263
+ assert_response :success
264
+
265
+ expected_output = '<a href="/users/new">Foo</a>'
266
+ assert_equal expected_output, @response.body
267
+ end
268
+
269
+ def test_commented_out_template_cant_raise_errors
270
+ get :commented_out_template
271
+ assert_response :success
272
+
273
+ expected_output = ""
274
+ assert_equal expected_output, @response.body
275
+ end
276
+
277
+ if Rails::VERSION::MAJOR >= 2
278
+ def test_renders_form_for_properly
279
+ get :renders_form_for
280
+
281
+ assert_response :success
282
+
283
+ assert %r(<form.*></form>) =~ @response.body
284
+ end
285
+
286
+ def test_renders_form_for_with_fields_for
287
+ get :render_form_for_with_fields
288
+
289
+ assert_response :success
290
+
291
+ assert_equal '<form action="/markaby/render_form_for_with_fields" method="post"><input id="foo_foo" name="foo[foo]" size="30" type="text" /></form>',
292
+ @response.body
293
+ end
294
+
295
+ def test_renders_form_for_with_multiple_fields
296
+ get :render_form_for_with_multiple_fields
297
+
298
+ assert_response :success
299
+
300
+ expected_output = '<form action="/markaby/render_form_for_with_multiple_fields" method="post">'
301
+ expected_output << '<input id="foo_foo" name="foo[foo]" size="30" type="text" />'
302
+ expected_output << '<input id="foo_baz" name="foo[baz]" size="30" type="text" />'
303
+ expected_output << '</form>'
304
+
305
+ assert_equal expected_output,
306
+ @response.body
307
+ end
308
+
309
+ def test_rendering_with_yield_works
310
+ get :render_with_yielding
311
+ assert_response :success
312
+
313
+ expected_output = '<div id="main"><p class="hey">hi there</p></div>'
314
+ assert_equal expected_output, @response.body
315
+ end
316
+
317
+ def test_render_with_yielding_where_template_has_two_elements
318
+ get :render_with_yielding_where_template_has_two_elements
319
+ assert_response :success
320
+
321
+ expected_output = '<div id="main"><p class="hi">hi there</p><p class="hi">hi again</p></div>'
322
+ assert_equal expected_output, @response.body
323
+ end
324
+
325
+ def test_render_with_yielding_content_for_block
326
+ get :render_with_yielding_content_for_block
327
+ assert_response :success
328
+
329
+ expected_output = '<div id="main"></div><div id="foo"><p>in foo content_for</p></div>'
330
+ assert_equal expected_output, @response.body
331
+ end
332
+
333
+ def test_render_content_for_with_block_helper
334
+ get :render_content_for_with_block_helper
335
+ assert_response :success
336
+
337
+ expected_output = '<div id="main"></div><div id="foo">'
338
+ expected_output << '<form action="/markaby/render_content_for_with_block_helper" method="post">'
339
+ expected_output << '<input id="foo_foo" name="foo[foo]" size="30" type="text" />'
340
+ expected_output << '</form>'
341
+ expected_output << '</div>'
342
+
343
+ assert_equal expected_output, @response.body
344
+ end
345
+
346
+ def test_renders_content_for_with_form_for_without_double_render
347
+ get :renders_content_for_with_form_for_without_double_render
348
+ assert_response :success
349
+
350
+ expected_output = '<div id="main"></div><div id="foo">'
351
+ expected_output << '<form action="/markaby/renders_content_for_with_form_for_without_double_render" method="post">'
352
+ expected_output << '<p class="foo">'
353
+ expected_output << '<input id="foo_foo" name="foo[foo]" size="30" type="text" />'
354
+ expected_output << '<input id="foo_submit" name="commit" type="submit" value="foo" />'
355
+ expected_output << '</p>'
356
+ expected_output << '</form>'
357
+ expected_output << '</div>'
358
+
359
+ assert_equal expected_output, @response.body
360
+ end
361
+
362
+ def test_renders_form_for_with_erb_render_in_body
363
+ get :renders_form_for_with_erb_body
364
+ assert_response :success
365
+
366
+ str = '<form action="/markaby/renders_form_for_with_erb_body" method="post">'
367
+ str << '<input id="foo_foo" name="foo[foo]" size="30" type="text" />'
368
+ str << '</form>'
369
+
370
+ assert_equal str, @response.body
371
+ end
372
+ end
373
+ end
374
+
375
+ describe "rails version" do
376
+ it "should support the current rails version" do
377
+ Markaby::Rails::SUPPORTED_RAILS_VERSIONS.should include(::Rails::VERSION::STRING)
378
+ end
379
+ end
380
+ end