zena 1.2.1 → 1.2.2

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.
Files changed (202) hide show
  1. data/History.txt +38 -1
  2. data/app/controllers/documents_controller.rb +7 -5
  3. data/app/controllers/nodes_controller.rb +47 -6
  4. data/app/controllers/user_sessions_controller.rb +12 -3
  5. data/app/controllers/virtual_classes_controller.rb +8 -2
  6. data/app/models/acl.rb +5 -2
  7. data/app/models/cached_page.rb +5 -5
  8. data/app/models/column.rb +27 -4
  9. data/app/models/group.rb +1 -1
  10. data/app/models/node.rb +106 -24
  11. data/app/models/note.rb +2 -1
  12. data/app/models/relation.rb +9 -4
  13. data/app/models/relation_proxy.rb +2 -2
  14. data/app/models/role.rb +12 -5
  15. data/app/models/site.rb +10 -9
  16. data/app/models/skin.rb +8 -0
  17. data/app/models/string_hash.rb +65 -0
  18. data/app/models/text_document.rb +1 -1
  19. data/app/models/user.rb +2 -0
  20. data/app/models/virtual_class.rb +43 -10
  21. data/app/views/comments/create.rjs +1 -32
  22. data/app/views/comments/edit.rjs +1 -1
  23. data/app/views/comments/update.rjs +1 -1
  24. data/app/views/documents/show.rhtml +1 -1
  25. data/app/views/groups/_form.rhtml +7 -0
  26. data/app/views/groups/_li.rhtml +1 -1
  27. data/app/views/nodes/500.html +2 -1
  28. data/app/views/nodes/destroy.rjs +2 -0
  29. data/app/views/sites/jobs.erb +2 -3
  30. data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
  31. data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
  32. data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
  33. data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
  34. data/app/views/versions/custom_tab.rhtml +1 -1
  35. data/app/views/versions/edit.rhtml +1 -1
  36. data/bricks/acls/lib/bricks/acls.rb +3 -3
  37. data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
  38. data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
  39. data/bricks/fs_skin/zena/init.rb +1 -0
  40. data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
  41. data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
  42. data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
  43. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
  44. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
  45. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
  46. data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
  47. data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
  48. data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
  49. data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
  50. data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
  51. data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
  52. data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
  53. data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
  54. data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
  55. data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
  56. data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
  57. data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
  58. data/bricks/fs_skin/zena/tasks.rb +26 -0
  59. data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
  60. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
  61. data/bricks/grid/lib/bricks/grid.rb +4 -3
  62. data/bricks/tags/lib/bricks/tags.rb +1 -7
  63. data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
  64. data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
  65. data/config/bricks.yml +3 -3
  66. data/config/gems.yml +2 -3
  67. data/lib/tasks/zena.rake +7 -3
  68. data/lib/zafu.rb +7 -0
  69. data/lib/zafu/all.rb +21 -0
  70. data/lib/zafu/compiler.rb +7 -0
  71. data/lib/zafu/controller_methods.rb +58 -0
  72. data/lib/zafu/handler.rb +57 -0
  73. data/lib/zafu/info.rb +4 -0
  74. data/lib/zafu/markup.rb +309 -0
  75. data/lib/zafu/mock_helper.rb +42 -0
  76. data/lib/zafu/node_context.rb +203 -0
  77. data/lib/zafu/ordered_hash.rb +53 -0
  78. data/lib/zafu/parser.rb +676 -0
  79. data/lib/zafu/parsing_rules.rb +382 -0
  80. data/lib/zafu/process/ajax.rb +530 -0
  81. data/lib/zafu/process/conditional.rb +92 -0
  82. data/lib/zafu/process/context.rb +186 -0
  83. data/lib/zafu/process/forms.rb +143 -0
  84. data/lib/zafu/process/html.rb +186 -0
  85. data/lib/zafu/process/ruby_less_processing.rb +321 -0
  86. data/lib/zafu/security.rb +15 -0
  87. data/lib/zafu/template.rb +25 -0
  88. data/lib/zafu/test_helper.rb +19 -0
  89. data/lib/zafu/view_methods.rb +6 -0
  90. data/lib/zena.rb +1 -1
  91. data/lib/zena/acts/enrollable.rb +1 -1
  92. data/lib/zena/app.rb +4 -17
  93. data/lib/zena/console.rb +18 -1
  94. data/lib/zena/core_ext/file_utils.rb +13 -1
  95. data/lib/zena/core_ext/fixnum.rb +4 -0
  96. data/lib/zena/core_ext/float.rb +7 -0
  97. data/lib/zena/deploy.rb +4 -2
  98. data/lib/zena/deploy/app_init.rhtml +2 -1
  99. data/lib/zena/deploy/database.rhtml +1 -1
  100. data/lib/zena/info.rb +1 -1
  101. data/lib/zena/parser/zazen_rules.rb +4 -4
  102. data/lib/zena/routes.rb +1 -1
  103. data/lib/zena/test_controller.rb +1 -1
  104. data/lib/zena/use.rb +14 -1
  105. data/lib/zena/use/action.rb +4 -2
  106. data/lib/zena/use/ajax.rb +86 -38
  107. data/lib/zena/use/authlogic.rb +16 -1
  108. data/lib/zena/use/calendar.rb +37 -17
  109. data/lib/zena/use/conditional.rb +2 -2
  110. data/lib/zena/use/context.rb +30 -9
  111. data/lib/zena/use/dates.rb +39 -3
  112. data/lib/zena/use/display.rb +6 -19
  113. data/lib/zena/use/forms.rb +100 -79
  114. data/lib/zena/use/i18n.rb +40 -16
  115. data/lib/zena/use/query_builder.rb +0 -6
  116. data/lib/zena/use/query_node.rb +17 -4
  117. data/lib/zena/use/relations.rb +1 -3
  118. data/lib/zena/use/rendering.rb +10 -8
  119. data/lib/zena/use/scope_index.rb +5 -1
  120. data/lib/zena/use/search.rb +2 -1
  121. data/lib/zena/use/urls.rb +82 -77
  122. data/lib/zena/use/workflow.rb +12 -4
  123. data/lib/zena/use/zafu_safe_definitions.rb +37 -9
  124. data/lib/zena/use/zafu_templates.rb +49 -20
  125. data/lib/zena/use/zazen.rb +6 -2
  126. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  127. data/locale/it/zena.mo +0 -0
  128. data/locale/it/zena.po +1982 -0
  129. data/public/images/arrow_back.png +0 -0
  130. data/public/images/remove_tag.png +0 -0
  131. data/public/javascripts/grid.js +800 -199
  132. data/public/javascripts/window.js +1 -1
  133. data/public/javascripts/zena.js +130 -21
  134. data/public/stylesheets/grid.css +11 -2
  135. data/public/stylesheets/zena.css +2 -1
  136. data/test/custom_queries/complex.host.yml +5 -0
  137. data/test/fixtures/files/TestNode.zafu +36 -0
  138. data/test/functional/nodes_controller_test.rb +18 -1
  139. data/test/integration/zafu_compiler/action.yml +2 -2
  140. data/test/integration/zafu_compiler/ajax.yml +44 -26
  141. data/test/integration/zafu_compiler/asset.yml +12 -2
  142. data/test/integration/zafu_compiler/basic.yml +0 -16
  143. data/test/integration/zafu_compiler/calendar.yml +6 -6
  144. data/test/integration/zafu_compiler/complex_ok.yml +23 -1
  145. data/test/integration/zafu_compiler/conditional.yml +5 -5
  146. data/test/integration/zafu_compiler/context.yml +6 -5
  147. data/test/integration/zafu_compiler/dates.yml +23 -2
  148. data/test/integration/zafu_compiler/display.yml +46 -2
  149. data/test/integration/zafu_compiler/errors.yml +2 -2
  150. data/test/integration/zafu_compiler/eval.yml +35 -7
  151. data/test/integration/zafu_compiler/forms.yml +47 -13
  152. data/test/integration/zafu_compiler/i18n.yml +2 -2
  153. data/test/integration/zafu_compiler/meta.yml +35 -1
  154. data/test/integration/zafu_compiler/query.yml +23 -4
  155. data/test/integration/zafu_compiler/relations.yml +10 -6
  156. data/test/integration/zafu_compiler/roles.yml +4 -4
  157. data/test/integration/zafu_compiler/rubyless.yml +11 -1
  158. data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
  159. data/test/integration/zafu_compiler/security.yml +10 -6
  160. data/test/integration/zafu_compiler/urls.yml +23 -6
  161. data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
  162. data/test/integration/zafu_compiler/zazen.yml +14 -0
  163. data/test/selenium/Add/add3.rsel +8 -8
  164. data/test/selenium/Destroy/0setup.rsel +12 -0
  165. data/test/selenium/Destroy/destroy1.rsel +16 -0
  166. data/test/selenium/Edit/edit2.rsel +9 -9
  167. data/test/selenium/Edit/edit5.rsel +9 -9
  168. data/test/selenium/Edit/edit6.rsel +9 -9
  169. data/test/selenium/Form/form4.rsel +17 -0
  170. data/test/selenium/Toggle/toggle1.rsel +2 -0
  171. data/test/selenium/Toggle/toggle2.rsel +18 -0
  172. data/test/sites/zena/columns.yml +3 -0
  173. data/test/sites/zena/versions.yml +7 -0
  174. data/test/unit/cached_page_test.rb +13 -13
  175. data/test/unit/column_test.rb +26 -0
  176. data/test/unit/node_test.rb +16 -1
  177. data/test/unit/project_test.rb +6 -1
  178. data/test/unit/relation_test.rb +1 -1
  179. data/test/unit/role_test.rb +1 -1
  180. data/test/unit/string_hash_test.rb +30 -0
  181. data/test/unit/virtual_class_test.rb +31 -17
  182. data/test/unit/zafu_markup_test.rb +414 -0
  183. data/test/unit/zafu_node_context_test.rb +375 -0
  184. data/test/unit/zafu_ordered_hash_test.rb +69 -0
  185. data/test/unit/zena/acts/enrollable_test.rb +1 -1
  186. data/test/unit/zena/parser/zafu_asset.yml +0 -10
  187. data/test/unit/zena/parser/zazen.yml +1 -1
  188. data/test/unit/zena/parser_test.rb +1 -72
  189. data/test/unit/zena/use/dates_test.rb +1 -1
  190. data/test/unit/zena/use/rendering_test.rb +24 -7
  191. data/test/unit/zena/use/scope_index_test.rb +17 -0
  192. data/test/unit/zena/use/zazen_test.rb +2 -1
  193. data/zena.gemspec +71 -37
  194. metadata +104 -83
  195. data/app/views/nodes/destroy.erb +0 -0
  196. data/bricks/static/lib/bricks/static.rb +0 -151
  197. data/bricks/static/zena/init.rb +0 -1
  198. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
  199. data/bricks/static/zena/test/unit/static_test.rb +0 -33
  200. data/lib/zena/parser/zafu_rules.rb +0 -244
  201. data/lib/zena/parser/zafu_tags.rb +0 -198
  202. data/lib/zena/parser/zena_rules.rb +0 -23
@@ -0,0 +1,414 @@
1
+ require 'test_helper'
2
+
3
+ class MarkupTest < Test::Unit::TestCase
4
+ include RubyLess
5
+ safe_method :day => {:class => String, :method => %q{Time.now.strftime('%A')}}
6
+ Markup = Zafu::Markup
7
+
8
+ context 'Parsing parameters' do
9
+ should 'retrieve values escaped with single quotes' do
10
+ h = {:class => 'worker', :style => 'tired'}
11
+ assert_equal h, Markup.parse_params("class='worker' style='tired'")
12
+ end
13
+
14
+ should 'retrieve values escaped with double quotes' do
15
+ h = {:class => 'worker', :style => 'tired'}
16
+ assert_equal h, Markup.parse_params('class="worker" style="tired"')
17
+ end
18
+
19
+ should 'retrieve values escaped with mixed quotes' do
20
+ h = {:class => 'worker', :style => 'tired'}
21
+ assert_equal h, Markup.parse_params('class=\'worker\' style="tired"')
22
+ end
23
+
24
+ should 'properly handle escaped single quotes' do
25
+ h = {:class => "that's nice", :style => 'tired'}
26
+ assert_equal h, Markup.parse_params("class='that\\\'s nice' style='tired'")
27
+ end
28
+
29
+ should 'properly handle escaped double quotes' do
30
+ h = {:class => '30"', :style => 'tired'}
31
+ assert_equal h, Markup.parse_params('class="30\\"" style="tired"')
32
+ end
33
+ end
34
+
35
+ context 'Setting parameters' do
36
+ setup do
37
+ @markup = Markup.new('p')
38
+ end
39
+
40
+ should 'parse params if the parameters are provided as a string' do
41
+ @markup.params = "class='shiny' id='slogan'"
42
+ h = {:class => 'shiny', :id => 'slogan'}
43
+ assert_equal h, @markup.params
44
+ end
45
+
46
+ should 'set params if the parameters are provided as a hash' do
47
+ @markup.params = {:class => 'shiny', :style => 'good'}
48
+ h = {:class => 'shiny', :style => 'good'}
49
+ assert_equal h, @markup.params
50
+ end
51
+
52
+ should 'respond to has_param' do
53
+ @markup.params = {:class => 'one', :x => 'y'}
54
+ @markup.dyn_params = {:y => 'z'}
55
+ assert @markup.has_param?(:x)
56
+ assert @markup.has_param?(:y)
57
+ assert !@markup.has_param?(:z)
58
+ end
59
+ end
60
+
61
+ context 'Stealing html params' do
62
+ subject do
63
+ Markup.new('p')
64
+ end
65
+
66
+ should 'transfer common html params' do
67
+ base = {:class => 'blue', :name => 'sprout', :id => 'front_cover', :style => 'padding:5px;', :attr => 'title'}
68
+ subject.steal_html_params_from(base)
69
+ new_base = {:name => 'sprout', :attr => 'title'}
70
+ markup_params = {:class => 'blue', :id => 'front_cover', :style => 'padding:5px;'}
71
+ assert_equal new_base, base
72
+ assert_equal markup_params, subject.params
73
+ end
74
+
75
+ context 'on a link' do
76
+ subject do
77
+ Markup.new('link')
78
+ end
79
+
80
+ should 'transfer common html params' do
81
+ base = {:rel => 'rel', :type => 'type', :class => 'blue', :name => 'sprout', :id => 'front_cover', :style => 'padding:5px;', :attr => 'title'}
82
+ subject.steal_html_params_from(base)
83
+ new_base = {:name => 'sprout', :attr => 'title'}
84
+ markup_params = {:type=>"type", :rel=>"rel", :id => 'front_cover', :class => 'blue', :style => 'padding:5px;'}
85
+ assert_equal new_base, base
86
+ assert_equal markup_params, subject.params
87
+ end
88
+ end
89
+ end
90
+
91
+ context 'Defining the dom id' do
92
+ setup do
93
+ @markup = Markup.new('p')
94
+ @markup.params[:id] = 'foobar'
95
+ @markup.dyn_params[:id] = 'foobar'
96
+ @markup.set_id('<%= @node.zip %>')
97
+ end
98
+
99
+ should 'remove any predifined id' do
100
+ assert_nil @markup.params[:id]
101
+ end
102
+
103
+ should 'write id in the dynamic params' do
104
+ assert_equal '<%= @node.zip %>', @markup.dyn_params[:id]
105
+ end
106
+ end
107
+
108
+ context 'Setting a dynamic param' do
109
+ setup do
110
+ @markup = Markup.new('p')
111
+ @markup.params[:foo] = 'one'
112
+ @markup.set_dyn_params(:foo => '<%= @node.two %>')
113
+ end
114
+
115
+ should 'clear a static param with same key' do
116
+ assert_nil @markup.params[:foo]
117
+ assert_equal '<%= @node.two %>', @markup.dyn_params[:foo]
118
+ end
119
+ end
120
+
121
+ context 'Setting a static param' do
122
+ setup do
123
+ @markup = Markup.new('p')
124
+ @markup.dyn_params[:foo] = '<%= @node.two %>'
125
+ @markup.set_params(:foo => 'one')
126
+ end
127
+
128
+ should 'clear a dynamic param with same key' do
129
+ assert_nil @markup.dyn_params[:foo]
130
+ assert_equal 'one', @markup.params[:foo]
131
+ end
132
+ end
133
+
134
+
135
+ context 'Appending a static param' do
136
+ context 'on a static param' do
137
+ setup do
138
+ @markup = Markup.new('p')
139
+ @markup.set_params(:class => 'simple')
140
+ end
141
+
142
+ should 'append param in the static params' do
143
+ @markup.append_param(:class, 'mind')
144
+ assert_equal 'simple mind', @markup.params[:class]
145
+ end
146
+ end
147
+
148
+ context 'on a dynamic param' do
149
+ setup do
150
+ @markup = Markup.new('p')
151
+ @markup.set_dyn_params(:class => '<%= @foo %>')
152
+ end
153
+
154
+ should 'append param in the dynamic params' do
155
+ @markup.append_param(:class, 'bar')
156
+ assert_equal '<%= @foo %> bar', @markup.dyn_params[:class]
157
+ end
158
+ end
159
+
160
+ context 'on an empty param' do
161
+ setup do
162
+ @markup = Markup.new('p')
163
+ end
164
+
165
+ should 'set param in the static params' do
166
+ @markup.append_param(:class, 'bar')
167
+ assert_equal 'bar', @markup.params[:class]
168
+ end
169
+ end
170
+ end
171
+
172
+ context 'Prepending a static param' do
173
+ context 'on a static param' do
174
+ setup do
175
+ @markup = Markup.new('p')
176
+ @markup.set_params(:class => 'simple')
177
+ end
178
+
179
+ should 'prepend param in the static params' do
180
+ @markup.prepend_param(:class, 'super')
181
+ assert_equal 'super simple', @markup.params[:class]
182
+ end
183
+ end
184
+
185
+ context 'on a dynamic param' do
186
+ setup do
187
+ @markup = Markup.new('p')
188
+ @markup.set_dyn_params(:class => '<%= @fu %>')
189
+ end
190
+
191
+ should 'prepend param in the dynamic params' do
192
+ @markup.prepend_param(:class, 'to')
193
+ assert_equal 'to <%= @fu %>', @markup.dyn_params[:class]
194
+ end
195
+ end
196
+
197
+ context 'on an empty param' do
198
+ setup do
199
+ @markup = Markup.new('p')
200
+ end
201
+
202
+ should 'set param in the static params' do
203
+ @markup.prepend_param(:class, 'bar')
204
+ assert_equal 'bar', @markup.params[:class]
205
+ end
206
+ end
207
+ end
208
+
209
+ context 'Appending a dynamic param' do
210
+ context 'on a static param' do
211
+ setup do
212
+ @markup = Markup.new('p')
213
+ @markup.set_params(:class => 'simple')
214
+ end
215
+
216
+ should 'copy the static param in the dynamic params' do
217
+ @markup.append_dyn_param(:class, '<%= @mind %>')
218
+ assert_equal 'simple <%= @mind %>', @markup.dyn_params[:class]
219
+ end
220
+ end
221
+
222
+ context 'on a dynamic param' do
223
+ setup do
224
+ @markup = Markup.new('p')
225
+ @markup.set_dyn_params(:class => '<%= @foo %>')
226
+ end
227
+
228
+ should 'append param in the dynamic params' do
229
+ @markup.append_dyn_param(:class, '<%= @bar %>')
230
+ assert_equal '<%= @foo %> <%= @bar %>', @markup.dyn_params[:class]
231
+ end
232
+
233
+ should 'append param without spacer if conditional' do
234
+ @markup.append_dyn_param(:class, '<%= @bar %>', true)
235
+ assert_equal '<%= @foo %><%= @bar %>', @markup.dyn_params[:class]
236
+ end
237
+ end
238
+
239
+ context 'on an empty param' do
240
+ setup do
241
+ @markup = Markup.new('p')
242
+ end
243
+
244
+ should 'set param in the dynamic params' do
245
+ @markup.append_dyn_param(:class, '<%= @bar %>')
246
+ assert_equal '<%= @bar %>', @markup.dyn_params[:class]
247
+ end
248
+ end
249
+ end
250
+
251
+ context 'Prepending a dynamic param' do
252
+ context 'on a static param' do
253
+ setup do
254
+ @markup = Markup.new('p')
255
+ @markup.set_params(:class => 'fu')
256
+ end
257
+
258
+ should 'copy the static param in the dynamic params' do
259
+ @markup.prepend_dyn_param(:class, '<%= @to %>')
260
+ assert_equal '<%= @to %> fu', @markup.dyn_params[:class]
261
+ end
262
+ end
263
+
264
+ context 'on a dynamic param' do
265
+ setup do
266
+ @markup = Markup.new('p')
267
+ @markup.set_dyn_params(:class => '<%= @fu %>')
268
+ end
269
+
270
+ should 'prepend param in the dynamic params' do
271
+ @markup.prepend_dyn_param(:class, '<%= @to %>')
272
+ assert_equal '<%= @to %> <%= @fu %>', @markup.dyn_params[:class]
273
+ end
274
+
275
+ should 'prepend param without spacer if conditional' do
276
+ @markup.prepend_dyn_param(:class, '<%= @to %>', true)
277
+ assert_equal '<%= @to %><%= @fu %>', @markup.dyn_params[:class]
278
+ end
279
+ end
280
+
281
+ context 'on an empty param' do
282
+ setup do
283
+ @markup = Markup.new('p')
284
+ end
285
+
286
+ should 'set param in the dynamic params' do
287
+ @markup.prepend_dyn_param(:class, '<%= @bar %>')
288
+ assert_equal '<%= @bar %>', @markup.dyn_params[:class]
289
+ end
290
+ end
291
+ end
292
+
293
+ context 'To string' do
294
+ subject do
295
+ Markup.new('img', :src => '/foo/bar.png')
296
+ end
297
+
298
+ should 'render' do
299
+ assert_equal "<img src='/foo/bar.png'/>", subject.to_s
300
+ end
301
+ end
302
+
303
+ context 'Wrapping some text' do
304
+ setup do
305
+ @text = 'Alice: It would be so nice if something made sense for a change.'
306
+ @markup = Markup.new('p')
307
+ @markup.params[:class] = 'quote'
308
+ @markup.params[:style] = 'padding:3px; border:1px solid red;'
309
+ end
310
+
311
+ should 'add the markup tag around the text' do
312
+ assert_equal "<p class='quote' style='padding:3px; border:1px solid red;'>#{@text}</p>", @markup.wrap(@text)
313
+ end
314
+
315
+ should 'add the appended params inside the tag' do
316
+ @markup.append_attribute("<%= anything %>")
317
+ assert_equal "<p class='quote' style='padding:3px; border:1px solid red;'<%= anything %>>#{@text}</p>", @markup.wrap(@text)
318
+ end
319
+
320
+ should 'not wrap twice if called twice' do
321
+ assert_equal "<p class='quote' style='padding:3px; border:1px solid red;'>#{@text}</p>", @markup.wrap(@markup.wrap(@text))
322
+ end
323
+
324
+ should 'display static params before dynamic and keep them ordered' do
325
+ @markup.set_dyn_params(:foo => '<%= @bar %>')
326
+ @markup.set_params(:baz => 'buzz')
327
+ assert_equal "<p class='quote' style='padding:3px; border:1px solid red;' baz='buzz' foo='<%= @bar %>'>foo</p>", @markup.wrap('foo')
328
+ end
329
+
330
+ should 'insert pre_wrap content' do
331
+ @markup.pre_wrap[:foo] = 'FOO'
332
+ assert_equal %q{<p class='quote' style='padding:3px; border:1px solid red;'>FOOcontent</p>}, @markup.wrap('content')
333
+ end
334
+ end
335
+
336
+ context 'Compiling params' do
337
+ setup do
338
+ @markup = Markup.new('p')
339
+ @markup.params = %q{class='one #{day}' id='foobar' name='#{day}'}
340
+ end
341
+
342
+ context 'with compile_params' do
343
+ setup do
344
+ @markup.compile_params(self)
345
+ end
346
+
347
+ should 'translate dynamic params into ERB by using RubyLess' do
348
+ assert_equal %q{<%= "one #{Time.now.strftime('%A')}" %>}, @markup.dyn_params[:class]
349
+ end
350
+
351
+ should 'translate without string on single dynamic content' do
352
+ assert_equal %q{<%= Time.now.strftime('%A') %>}, @markup.dyn_params[:name]
353
+ end
354
+ end
355
+ end
356
+
357
+ context 'Duplicating a markup' do
358
+ context 'and changing params' do
359
+ setup do
360
+ @markup = Markup.new('p')
361
+ @markup.params[:class] = 'one'
362
+ @duplicate = @markup.dup
363
+ end
364
+
365
+ should 'not propagate params changes to original' do
366
+ @duplicate.params[:class] = 'two'
367
+ assert_equal "<p class='one'>one</p>", @markup.wrap('one')
368
+ end
369
+
370
+ should 'not propagate params changes to duplicate' do
371
+ @markup.params[:class] = 'two'
372
+ assert_equal "<p class='one'>one</p>", @duplicate.wrap('one')
373
+ end
374
+
375
+ should 'not propagate appended params to duplicate' do
376
+ @markup.append_param(:class, 'drop')
377
+ assert_equal "<p class='one'>one</p>", @duplicate.wrap('one')
378
+ end
379
+
380
+ should 'not propagate dyn_params changes to original' do
381
+ @markup.append_dyn_param(:class, 'two')
382
+ assert_equal "<p class='one'>one</p>", @duplicate.wrap('one')
383
+ end
384
+
385
+ should 'not propagate dyn_params changes to duplicate' do
386
+ @duplicate.append_dyn_param(:class, 'two')
387
+ assert_equal "<p class='one'>one</p>", @markup.wrap('one')
388
+ end
389
+
390
+ should 'not propagate pre_wrap changes to duplicate' do
391
+ @markup.pre_wrap[:drop] = 'no bombs'
392
+ @duplicate = @markup.dup
393
+ @duplicate.pre_wrap[:drop] = 'ego'
394
+ assert_equal "<p class='one'>no bombs</p>", @markup.wrap('')
395
+ end
396
+ end
397
+
398
+ context 'and wrapping' do
399
+ setup do
400
+ @markup = Markup.new('p')
401
+ @duplicate = @markup.dup
402
+ end
403
+
404
+ should 'not propagate done to duplicate' do
405
+ @markup.wrap('')
406
+ assert_equal '<p>one</p>', @duplicate.wrap('one')
407
+ end
408
+ end
409
+ end # Duplicating a markup
410
+ end
411
+
412
+
413
+
414
+
@@ -0,0 +1,375 @@
1
+ require 'test_helper'
2
+
3
+ module NCFoo
4
+ end
5
+
6
+ class NCPage < ActiveRecord::Base
7
+ include RubyLess
8
+ safe_context :root => Page
9
+ end
10
+
11
+ class SubPage < NCPage
12
+ include NCFoo
13
+ end
14
+
15
+ class SubSubPage < SubPage
16
+ end
17
+
18
+ class NCComment
19
+ end
20
+
21
+ class NodeContextTest < Test::Unit::TestCase
22
+
23
+ NodeContext = Zafu::NodeContext
24
+
25
+ context 'In a blank context' do
26
+ subject do
27
+ NodeContext.new('@node', NCPage)
28
+ end
29
+
30
+ should 'return the current name' do
31
+ assert_equal '@node', subject.name
32
+ end
33
+
34
+ should 'return the current class' do
35
+ assert_equal NCPage, subject.klass
36
+ end
37
+
38
+ should 'return true on will_be with the same class' do
39
+ assert subject.will_be?(NCPage)
40
+ end
41
+
42
+ should 'return false on will_be with a sub class' do
43
+ assert !subject.will_be?(SubPage)
44
+ end
45
+
46
+ should 'return false on will_be with a different class' do
47
+ assert !subject.will_be?(String)
48
+ end
49
+
50
+ should 'return self on a get for the same class' do
51
+ assert_equal subject.object_id, subject.get(NCPage).object_id
52
+ end
53
+
54
+ should 'return nil on a get for another class' do
55
+ assert_nil subject.get(NCComment)
56
+ end
57
+
58
+ context 'calling as_main' do
59
+ should 'build the name from the class' do
60
+ assert_equal '@nc_page', subject.as_main.name
61
+ end
62
+
63
+ should 'return same class' do
64
+ assert_equal subject.klass, subject.as_main.klass
65
+ end
66
+ end
67
+
68
+ context 'calling form_name' do
69
+ should 'return underscore name of base class' do
70
+ assert_equal 'nc_page', subject.form_name
71
+ end
72
+ end
73
+
74
+ context 'with a sub-class' do
75
+ subject do
76
+ NodeContext.new('@node', SubPage)
77
+ end
78
+
79
+ should 'return true on will_be with the same class' do
80
+ assert subject.will_be?(SubPage)
81
+ end
82
+
83
+ should 'return true on will_be with a super class' do
84
+ assert subject.will_be?(NCPage)
85
+ end
86
+
87
+ should 'return false on will_be with a different class' do
88
+ assert !subject.will_be?(String)
89
+ end
90
+
91
+ context 'calling form_name' do
92
+ should 'return underscore name of base class' do
93
+ assert_equal 'nc_page', subject.form_name
94
+ end
95
+ end
96
+
97
+ context 'calling as_main' do
98
+ should 'build the name from the class' do
99
+ assert_equal '@sub_page', subject.as_main.name
100
+ end
101
+
102
+ should 'return same class' do
103
+ assert_equal subject.klass, subject.as_main.klass
104
+ end
105
+
106
+ should 'return current class when using after_class argument' do
107
+ subject = NodeContext.new('@node', SubSubPage)
108
+ assert_equal SubSubPage, subject.as_main(NCPage).klass
109
+ end
110
+
111
+ should 'rebuild name from ancestor when using after_class argument' do
112
+ subject = NodeContext.new('@node', SubSubPage)
113
+ assert_equal '@sub_page', subject.as_main(NCPage).name
114
+ end
115
+
116
+ context 'in a list context' do
117
+ subject do
118
+ NodeContext.new('list', [SubSubPage])
119
+ end
120
+
121
+ should 'return current class when using after_class argument' do
122
+ assert_equal SubSubPage, subject.as_main(NCPage).klass
123
+ end
124
+
125
+ should 'rebuild name from ancestor when using after_class argument' do
126
+ assert_equal '@sub_page', subject.as_main(NCPage).name
127
+ end
128
+ end # in a list context
129
+
130
+ end
131
+
132
+ should 'return subclass on class_name' do
133
+ assert_equal 'SubPage', subject.class_name
134
+ end
135
+ end # with a sub-class
136
+
137
+ context 'with an anonymous sub-class' do
138
+ subject do
139
+ NodeContext.new('@node', Class.new(NCPage))
140
+ end
141
+
142
+ should 'return class on class_name' do
143
+ assert_equal 'NCPage', subject.class_name
144
+ end
145
+ end # with an anonymous sub-class
146
+ end
147
+
148
+ context 'In a sub-context' do
149
+ setup do
150
+ @parent = NodeContext.new('@node', NCPage)
151
+ end
152
+
153
+ subject do
154
+ @parent.move_to('comment1', NCComment)
155
+ end
156
+
157
+ should 'return the current name' do
158
+ assert_equal 'comment1', subject.name
159
+ end
160
+
161
+ should 'return the current class' do
162
+ assert_equal NCComment, subject.klass
163
+ end
164
+
165
+ should 'return self on a get for the same class' do
166
+ assert_equal subject.object_id, subject.get(NCComment).object_id
167
+ end
168
+
169
+ should 'return the parent on a get for the class of the parent' do
170
+ assert_equal @parent.object_id, subject.get(NCPage).object_id
171
+ end
172
+ end
173
+
174
+ context 'In a deeply nested context' do
175
+ setup do
176
+ @grandgrandma = NodeContext.new('@comment', NCComment)
177
+ @grandma = @grandgrandma.move_to('page', NCPage)
178
+ @mother = @grandma.move_to('comment1', NCComment)
179
+ end
180
+
181
+ subject do
182
+ @mother.move_to('var1', String)
183
+ end
184
+
185
+ should 'return the current name' do
186
+ assert_equal 'var1', subject.name
187
+ end
188
+
189
+ should 'return the current class' do
190
+ assert_equal String, subject.klass
191
+ end
192
+
193
+ should 'return the first ancestor matching class on get' do
194
+ assert_equal @mother.object_id, subject.get(NCComment).object_id
195
+ end
196
+
197
+ should 'return nil if no ancestor matches class on get' do
198
+ assert_nil subject.get(Fixnum)
199
+ end
200
+
201
+ should 'return the parent on up' do
202
+ assert_equal @mother, subject.up
203
+ end
204
+ end
205
+
206
+ context 'In a sub-classes context' do
207
+ subject do
208
+ NodeContext.new('super', SubPage)
209
+ end
210
+
211
+ should 'find the required class in ancestors' do
212
+ assert_equal subject.object_id, subject.get(NCPage).object_id
213
+ end
214
+ end
215
+
216
+ context 'In a list context' do
217
+ setup do
218
+ @grandma = NodeContext.new('@nc_page', SubPage)
219
+ @mother = @grandma.move_to('@comment', NCComment)
220
+ end
221
+
222
+ subject do
223
+ @mother.move_to('list', [NCPage])
224
+ end
225
+
226
+ should 'find the context and resolve without using first' do
227
+ assert context = subject.get(NCPage)
228
+ assert_equal '@nc_page', context.name
229
+ assert_equal SubPage, context.klass
230
+ end
231
+
232
+ should 'return parent on up with class' do
233
+ assert_equal @grandma, subject.up(NCPage)
234
+ end
235
+
236
+ should 'return true on will_be with the same class' do
237
+ assert subject.will_be?(NCPage)
238
+ end
239
+
240
+ should 'return class on master_class' do
241
+ assert_equal NCPage, subject.master_class(ActiveRecord::Base)
242
+ end
243
+ end
244
+
245
+ context 'In a deeply nested list context' do
246
+ setup do
247
+ @grandma = NodeContext.new('@nc_page', SubPage)
248
+ @mother = @grandma.move_to('@comment', NCComment)
249
+ end
250
+
251
+ subject do
252
+ @mother.move_to('list', [[[NCPage]]])
253
+ end
254
+
255
+ should 'find the context without using first' do
256
+ assert context = subject.get(NCPage)
257
+ assert_equal '@nc_page', context.name
258
+ assert_equal SubPage, context.klass
259
+ end
260
+
261
+ should 'return parent on up with class' do
262
+ assert_equal @grandma, subject.up(NCPage)
263
+ end
264
+
265
+ should 'return true on will_be with the same class' do
266
+ assert subject.will_be?(NCPage)
267
+ end
268
+
269
+ should 'return class on master_class' do
270
+ assert_equal NCPage, subject.master_class(ActiveRecord::Base)
271
+ end
272
+ end
273
+
274
+ context 'Generating a dom id' do
275
+ context 'in a blank context' do
276
+ subject do
277
+ n = NodeContext.new('@foo', NCPage)
278
+ n.dom_prefix = 'list1'
279
+ n
280
+ end
281
+
282
+ should 'return the node name in DOM id' do
283
+ assert_equal '<%= %Q{list1_#{@foo.zip}} %>', subject.dom_id
284
+ end
285
+
286
+ should 'not use zip on list false' do
287
+ assert_equal 'list1', subject.dom_id(:list => false)
288
+ end
289
+
290
+ should 'scope without erb on erb false' do
291
+ assert_equal 'list1_#{@foo.zip}', subject.dom_id(:erb => false)
292
+ end
293
+ end
294
+
295
+ context 'in a hierarchy of contexts' do
296
+ setup do
297
+ @a = NodeContext.new('@node', NCPage)
298
+ @a.dom_prefix = 'a'
299
+ @b = NodeContext.new('var1', [NCPage], @a)
300
+ @b.dom_prefix = 'b'
301
+ @c = NodeContext.new('var2', NCPage, @b)
302
+ end
303
+
304
+ subject do
305
+ NodeContext.new('var3', NCPage, @c)
306
+ end
307
+
308
+ context 'with parents as dom_scopes' do
309
+ setup do
310
+ @b.propagate_dom_scope!
311
+ @c.propagate_dom_scope!
312
+ end
313
+
314
+ should 'use dom_scopes' do
315
+ assert_equal '<%= %Q{b_#{var1.zip}_#{var2.zip}_#{var3.zip}} %>', subject.dom_id
316
+ end
317
+
318
+ should 'use dom_scopes and dom_prefix not in list' do
319
+ subject.dom_prefix = 'd'
320
+ assert_equal '<%= %Q{b_#{var1.zip}_#{var2.zip}_d} %>', subject.dom_id(:list => false)
321
+ end
322
+
323
+ context 'with a saved dom_id' do
324
+ setup do
325
+ @c.saved_dom_id = '#{ndom_id(@foo)}'
326
+ end
327
+
328
+ should 'use saved id in scope' do
329
+ assert_equal '<%= %Q{#{ndom_id(@foo)}_#{var3.zip}} %>', subject.dom_id
330
+ end
331
+ end
332
+ end
333
+
334
+ context 'with a saved dom_id' do
335
+ setup do
336
+ @c.saved_dom_id = '#{ndom_id(@foo)}'
337
+ end
338
+
339
+ should 'not use saved id in scope' do
340
+ # We did not ask for dom_scope to propagate.
341
+ assert_equal '<%= %Q{b_#{var3.zip}} %>', subject.dom_id
342
+ end
343
+ end
344
+
345
+ context 'with ancestors and self as dom_scopes' do
346
+ setup do
347
+ @a.propagate_dom_scope!
348
+ subject.propagate_dom_scope!
349
+ end
350
+
351
+ should 'not use self twice' do
352
+ assert_equal '<%= %Q{a_#{@node.zip}_#{var3.zip}} %>', subject.dom_id
353
+ end
354
+ end
355
+
356
+ context 'with a parent defining a dom_prefix' do
357
+ setup do
358
+ @b.dom_prefix = 'cart'
359
+ end
360
+
361
+ should 'use dom_prefix' do
362
+ subject.dom_prefix = nil
363
+ assert_equal '<%= %Q{cart_#{var3.zip}} %>', subject.dom_id
364
+ end
365
+ end
366
+
367
+ end
368
+ end
369
+ end
370
+
371
+
372
+
373
+
374
+
375
+