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
@@ -3,36 +3,36 @@
3
3
 
4
4
  open '/oo/testnode37.html?test=edit2'
5
5
  set_timeout 4000
6
- assert_element_not_present 'edit22_title'
6
+ assert_element_not_present 'edit21_title'
7
7
  verify_text "css=#edit21 li.title", @old_title
8
8
 
9
9
  # edit (does not click on 'v_status' checkbox)
10
10
  click 'link=edit'
11
- wait_for_element_present 'edit22_title'
12
- type 'edit22_title', @new_title
11
+ wait_for_element_present 'edit21_title'
12
+ type 'edit21_title', @new_title
13
13
 
14
14
  # submit
15
15
  click 'css=input[type=submit]'
16
- wait_for_element_not_present 'edit22_title'
16
+ wait_for_element_not_present 'edit21_title'
17
17
  verify_text "css=#edit21 li.title", @new_title
18
18
 
19
19
  # edit again (click on 'v_status' checkbox)
20
20
  click 'link=edit'
21
- wait_for_element_present 'edit22_title'
21
+ wait_for_element_present 'edit21_title'
22
22
 
23
23
  # cancel
24
24
  click 'css=img[alt="cancel"]'
25
- wait_for_element_not_present 'edit22_title'
25
+ wait_for_element_not_present 'edit21_title'
26
26
 
27
27
  # edit again
28
28
  click 'link=edit'
29
- wait_for_element_present 'edit22_title'
30
- type 'edit22_title', @old_title
29
+ wait_for_element_present 'edit21_title'
30
+ type 'edit21_title', @old_title
31
31
  click 'css=#edit2 input[type=checkbox]'
32
32
 
33
33
  # submit
34
34
  click 'css=input[type=submit]'
35
- wait_for_element_not_present 'edit22_title'
35
+ wait_for_element_not_present 'edit21_title'
36
36
  verify_text "css=#edit21 li.title", @old_title
37
37
 
38
38
  # ensure page is published
@@ -3,37 +3,37 @@
3
3
 
4
4
  open '/oo/testnode37.html?test=edit5'
5
5
  set_timeout 4000
6
- assert_element_not_present 'edit52_title'
6
+ assert_element_not_present 'edit51_title'
7
7
  verify_text "css=#edit51_32 .title", @old_title
8
8
 
9
9
  # edit
10
10
  click 'link=edit'
11
- wait_for_element_present 'edit52_title'
12
- type 'edit52_title', @new_title
11
+ wait_for_element_present 'edit51_title'
12
+ type 'edit51_title', @new_title
13
13
 
14
14
  # submit
15
15
  click 'css=input[type=submit]'
16
- wait_for_element_not_present 'edit52_title'
16
+ wait_for_element_not_present 'edit51_title'
17
17
  verify_text "css=#edit51_32 .title", @new_title
18
18
 
19
19
  # edit again
20
20
  click 'link=edit'
21
- wait_for_element_present 'edit52_title'
21
+ wait_for_element_present 'edit51_title'
22
22
 
23
23
  # cancel
24
24
  click 'css=img[alt="cancel"]'
25
- wait_for_element_not_present 'edit52_title'
25
+ wait_for_element_not_present 'edit51_title'
26
26
 
27
27
  # edit again
28
28
  click 'link=edit'
29
- wait_for_element_present 'edit52_title'
29
+ wait_for_element_present 'edit51_title'
30
30
  # Ensure we do proper ajax replacements
31
31
  assert_element_not_present 'css=#edit5 form form'
32
- type 'edit52_title', @old_title
32
+ type 'edit51_title', @old_title
33
33
 
34
34
  # submit
35
35
  click 'css=input[type=submit]'
36
- wait_for_element_not_present 'edit52_title'
36
+ wait_for_element_not_present 'edit51_title'
37
37
  verify_text "css=#edit51_32 .title", @old_title
38
38
 
39
39
  # ensure changes are recorded
@@ -3,7 +3,7 @@
3
3
 
4
4
  open '/oo/testnode37.html?test=edit6'
5
5
  set_timeout 4000
6
- assert_element_not_present 'edit63_title'
6
+ assert_element_not_present 'edit61_title'
7
7
  verify_text "css=#edit61_32 .title", @old_title
8
8
 
9
9
  # swap block should work before edit
@@ -14,33 +14,33 @@ verify_text "css=#edit62_32 span", 'bob'
14
14
 
15
15
  # edit
16
16
  click 'link=edit'
17
- wait_for_element_present 'edit63_title'
18
- type 'edit63_title', @new_title
17
+ wait_for_element_present 'edit61_title'
18
+ type 'edit61_title', @new_title
19
19
 
20
20
  # submit
21
21
  click 'css=input[type=submit]'
22
22
  wait_for_element_present 'swap_span'
23
23
  verify_text "css=#edit61_32 .title", @new_title
24
- verify_text "css=#edit62_32 span", 'bob'
24
+ verify_text "swap_span", 'bob'
25
25
 
26
26
  # edit again
27
27
  click 'link=edit'
28
- wait_for_element_present 'edit63_title'
28
+ wait_for_element_present 'edit61_title'
29
29
 
30
30
  # cancel
31
31
  click 'css=img[alt="cancel"]'
32
- wait_for_element_not_present 'edit63_title'
32
+ wait_for_element_not_present 'edit61_title'
33
33
 
34
34
  # edit again
35
35
  click 'link=edit'
36
- wait_for_element_present 'edit63_title'
36
+ wait_for_element_present 'edit61_title'
37
37
  # Ensure we do proper ajax replacements
38
38
  assert_element_not_present 'css=#edit6 form form'
39
- type 'edit63_title', @old_title
39
+ type 'edit61_title', @old_title
40
40
 
41
41
  # submit
42
42
  click 'css=input[type=submit]'
43
- wait_for_element_not_present 'edit63_title'
43
+ wait_for_element_not_present 'edit61_title'
44
44
  verify_text "css=#edit61_32 .title", @old_title
45
45
 
46
46
  # swap block should work after edit
@@ -0,0 +1,17 @@
1
+ open "/oo/testnode37.html?test=form4"
2
+ verify_text "form4_one", "un"
3
+ verify_text "form4_two", "deux"
4
+ type "form41_settings", "zwei"
5
+ # submit
6
+ click_and_wait 'css=input[type=submit]'
7
+
8
+ # Redirected to same page
9
+ assert_location "http://test.host:3000/oo/testnode37.html"
10
+ open "/oo/testnode37.html?test=form4"
11
+ verify_text "form4_one", "un"
12
+ verify_text "form4_two", "zwei"
13
+
14
+ # clear
15
+ type "form41_settings", "deux"
16
+ # submit
17
+ click_and_wait 'css=input[type=submit]'
@@ -1,6 +1,8 @@
1
1
  open "/oo/testnode37.html?test=toggle1"
2
2
  assert_element_not_present "css=ul.references > li"
3
3
 
4
+ wait_for_element_present 'css=#toggle12_19.toggle.off > input.cb'
5
+
4
6
  # Add relation
5
7
  # Cannot test click on non-link in Safari and Chrome...
6
8
  click 'css=#toggle12_19.toggle.off > input.cb'
@@ -0,0 +1,18 @@
1
+ open "/oo/testnode37.html?test=toggle2"
2
+ assert_element_not_present "css=ul.references > li"
3
+ verify_text "toggle2_count", 'toggle2_count=0'
4
+
5
+ wait_for_element_present 'css=#toggle22_19.toggle.off > input.cb'
6
+ # Add relation
7
+ # Cannot test click on non-link in Safari and Chrome...
8
+ click 'css=#toggle22_19.toggle.off > input.cb'
9
+ wait_for_element_present 'css=#toggle22_19.toggle.on'
10
+ verify_value "css=#toggle22_19 > input.cb", "on"
11
+ # Make sure the js reload has been triggered
12
+ wait_for_text_present "toggle2_count=1"
13
+
14
+ # Remove relation
15
+ click 'css=#toggle22_19.toggle.on > input.cb'
16
+ wait_for_element_present 'css=#toggle22_19.toggle.off'
17
+ verify_value "css=#toggle22_19 > input.cb", "off"
18
+ wait_for_text_present "toggle2_count=0"
@@ -11,6 +11,9 @@ Original_origin:
11
11
  Original_weight:
12
12
  ptype: integer
13
13
 
14
+ Original_settings:
15
+ ptype: hash
16
+
14
17
  Original_tz:
15
18
 
16
19
  Letter_paper:
@@ -388,6 +388,11 @@ test_en:
388
388
  comment: small presentation
389
389
  title: Kill the bugs
390
390
  summary: "<a href='?test=all'>View all ajax tests</a>."
391
+ settings:
392
+ json_class: "StringHash"
393
+ data:
394
+ one: un
395
+ two: deux
391
396
 
392
397
  strange_en_red:
393
398
  node: strange
@@ -481,6 +486,7 @@ wiki_project_changes_xml_en:
481
486
  node: wiki_Project_changes_xml_zafu
482
487
  user: tiger
483
488
  prop:
489
+ title: Project-changes-xml
484
490
  comment: layout for wiki
485
491
  summary: Layout for the wiki skin.
486
492
  text: |
@@ -504,6 +510,7 @@ wiki_page_changes_en:
504
510
  prop:
505
511
  comment: layout for wiki
506
512
  summary: Layout for the wiki skin.
513
+ title: Page-changes
507
514
  text: |
508
515
  <r:include template='layout.html'>
509
516
  <r:with part='body/content/main'>
@@ -28,7 +28,7 @@ class CachedPageTest < Zena::Unit::TestCase
28
28
  # test expire
29
29
  login(:tiger)
30
30
  node = secure!(Node) { nodes(:status) }
31
- assert node.update_attributes(:title=>'hey'), "Can save"
31
+ assert node.update_attributes(:title=>'hey', :v_status => Zena::Status::Pub), "Can save"
32
32
  assert !File.exists?(path), "Cache file removed"
33
33
  assert_equal [], cache.node_ids
34
34
  end
@@ -53,7 +53,7 @@ class CachedPageTest < Zena::Unit::TestCase
53
53
  # test expire
54
54
  login(:tiger)
55
55
  node = secure!(Node) { nodes(:bird_jpg) }
56
- assert node.update_attributes(:title=>'hey'), "Can save"
56
+ assert node.update_attributes(:title=>'hey', :v_status => Zena::Status::Pub), "Can save"
57
57
  assert !File.exists?(path), "Cache file removed"
58
58
  login(:anon)
59
59
  node = secure!(Node) { nodes(:bird_jpg) }
@@ -142,10 +142,10 @@ class CachedPageTest < Zena::Unit::TestCase
142
142
  preserving_files('/test.host/data') do
143
143
  login(:anon)
144
144
  template_ids = [nodes_id(:Node_index_zafu), nodes_id(:Project_zafu), nodes_id(:Node_zafu), nodes_id(:notes_zafu)]
145
- path = SITES_ROOT + visitor.site.zafu_path + "/default/Node_index.html/en/main.erb"
145
+ path = SITES_ROOT + visitor.site.zafu_path + "/default/Node-foobar/en/main.erb"
146
146
  assert !File.exists?(path), "No cached file yet"
147
147
  cache = secure!(CachedPage) { CachedPage.create(
148
- :path => (visitor.site.zafu_path + "/default/Node_index.html/en/main.erb"),
148
+ :path => (visitor.site.zafu_path + "/default/Node-foobar/en/main.erb"),
149
149
  :expire_after => nil,
150
150
  :expire_with_ids => template_ids,
151
151
  :content_data => "this is the cached content") }
@@ -156,7 +156,7 @@ class CachedPageTest < Zena::Unit::TestCase
156
156
  # test expire
157
157
  login(:tiger)
158
158
  node = secure!(Node) { nodes(:Node_zafu) }
159
- assert node.update_attributes(:title=>'hey'), "Can save"
159
+ assert node.update_attributes(:title=>'hey', :v_status => Zena::Status::Pub), "Can save"
160
160
  assert !File.exists?(path), "Cache file removed"
161
161
  assert_equal [], cache.node_ids
162
162
  end
@@ -170,18 +170,18 @@ class CachedPageTest < Zena::Unit::TestCase
170
170
  visitor.dev_skin_id = nodes_id(:default)
171
171
  assert visitor.dev_mode?
172
172
  template_ids = [nodes_id(:Node_index_zafu), nodes_id(:Project_zafu), nodes_id(:Node_zafu), nodes_id(:notes_zafu)]
173
- path = SITES_ROOT + visitor.site.zafu_path + "/default/Node_index.html/en/main.erb"
174
- dev_path = SITES_ROOT + visitor.site.zafu_path + "/default/Node_index.html/dev_en/main.erb"
173
+ path = SITES_ROOT + visitor.site.zafu_path + "/default/Node-foobar/en/_main.erb"
174
+ dev_path = SITES_ROOT + visitor.site.zafu_path + "/default/Node-foobar/dev_en/_main.erb"
175
175
 
176
176
  assert !File.exists?(path), "No cached file yet"
177
177
  cache = secure!(CachedPage) { CachedPage.create(
178
- :path => (visitor.site.zafu_path + "/default/Node_index.html/en/main.erb"),
178
+ :path => (visitor.site.zafu_path + "/default/Node-foobar/en/_main.erb"),
179
179
  :expire_after => nil,
180
180
  :expire_with_ids => template_ids,
181
181
  :content_data => "public cache") }
182
182
 
183
183
  cache = secure!(CachedPage) { CachedPage.create(
184
- :path => (visitor.site.zafu_path + "/default/Node_index.html/dev_en/main.erb"),
184
+ :path => (visitor.site.zafu_path + "/default/Node-foobar/dev_en/_main.erb"),
185
185
  :expire_after => nil,
186
186
  :expire_with_ids => template_ids,
187
187
  :content_data => "dev cache") }
@@ -190,14 +190,14 @@ class CachedPageTest < Zena::Unit::TestCase
190
190
 
191
191
  # test expire
192
192
  node = secure!(Node) { nodes(:Node_zafu) }
193
- assert node.update_attributes(:title=>'hey'), "Can save"
194
- assert File.exists?(path), "Public cache not removed"
195
- assert !File.exists?(dev_path), "Dev cache removed"
193
+ assert node.update_attributes(:title => 'hey', :v_status => Zena::Status::Pub), "Can save"
194
+ assert File.exists?(path), "Public cache not removed (#{path})"
195
+ assert !File.exists?(dev_path), "Dev cache removed (#{dev_path})"
196
196
 
197
197
  # expire all
198
198
  assert current_site.update_attributes(:expire_in_dev => true)
199
199
  node = secure!(Node) { nodes(:Node_zafu) }
200
- assert node.update_attributes(:title=>'hey boy'), "Can save"
200
+ assert node.update_attributes(:title=>'hey boy', :v_status => Zena::Status::Pub), "Can save"
201
201
  assert !File.exists?(path), "Public cache removed"
202
202
  end
203
203
  end
@@ -51,6 +51,32 @@ class ColumnTest < Zena::Unit::TestCase
51
51
  end
52
52
  end
53
53
 
54
+ context 'A hash column' do
55
+ setup do
56
+ login(:lion)
57
+ end
58
+
59
+ subject do
60
+ Column.create(:role_id => roles_id(:Task), :ptype => 'hash', :name => 'foo')
61
+ end
62
+
63
+ should 'type_cast json as StringHash' do
64
+ assert_equal StringHash['one'=>'two', 'five'=>'six'], subject.type_cast('{"one":"two","five":"six"}')
65
+ end
66
+
67
+ should 'type_cast hash as StringHash' do
68
+ assert_equal StringHash['one'=>'two', 'five'=>'six'], subject.type_cast(:one => :two, 'five' => 'six')
69
+ end
70
+
71
+ should 'type_cast nil as nil' do
72
+ assert_nil subject.type_cast(nil)
73
+ end
74
+
75
+ should 'type_cast empty as nil' do
76
+ assert_nil subject.type_cast('')
77
+ end
78
+ end
79
+
54
80
  context 'Creating a column' do
55
81
  subject do
56
82
  Column.create(:role_id => roles_id(:Task), :ptype => 'string', :name => 'foo')
@@ -1216,6 +1216,21 @@ done: \"I am done\""
1216
1216
  assert_equal nodes_id(:bird_jpg), node.find(:first, 'icon')[:id]
1217
1217
  end
1218
1218
 
1219
+ def test_copy_no_id
1220
+ login(:lion)
1221
+ node = secure!(Node) { nodes(:status) }
1222
+ attributes = {
1223
+ 'copy_id' => '',
1224
+ 'text' => 'Changed icon to "#{title}"',
1225
+ }
1226
+
1227
+ new_attributes = secure(Node) { Node.transform_attributes(attributes) }
1228
+ assert_equal Hash['copy_zip' => '', 'text' => 'Changed icon to ""',], new_attributes
1229
+
1230
+ assert node.update_attributes_with_transformation(attributes)
1231
+ assert_equal 'Changed icon to ""', node.text
1232
+ end
1233
+
1219
1234
  def test_export
1220
1235
  without_files('/test.host/tmp') do
1221
1236
  login(:tiger)
@@ -1399,7 +1414,7 @@ done: \"I am done\""
1399
1414
  end
1400
1415
 
1401
1416
  should 'parse pseudo ids' do
1402
- assert_transforms "Hi, this is just a simple \"test\":49 or \"\":43_life.rss. OK ?\n\n!24_pv!",
1417
+ assert_transforms "Hi, this is just a simple \"test\":43 or \"\":31_life.rss. OK ?\n\n!24_pv!",
1403
1418
  "Hi, this is just a simple \"test\"::w or \"\"::w++_life.rss. OK ?\n\n!:lake_pv!"
1404
1419
  end
1405
1420
 
@@ -19,7 +19,12 @@ class ProjectTest < Zena::Unit::TestCase
19
19
  node = secure!(Project) { Project.find(nodes_id(:cleanWater))}
20
20
  assert_equal nodes_id(:cleanWater), node.get_project_id
21
21
  node[:parent_id] = nodes_id(:zena)
22
- assert node.save, 'Can save node'
22
+ if !node.save
23
+ # Cannot cast string to string hash ?
24
+ assert false, "Can save node (#{err(node)})"
25
+ else
26
+ assert true
27
+ end
23
28
  node.reload
24
29
  assert_equal nodes_id(:cleanWater), node.get_project_id
25
30
  assert_equal nodes_id(:zena), node[:project_id]
@@ -207,7 +207,7 @@ class RelationTest < Zena::Unit::TestCase
207
207
  assert_equal({
208
208
  'rel_group' => 'doc.tags',
209
209
  'source_role' => 'tagged',
210
- 'target_kpath' => 'NPT',
210
+ 'target_name' => 'Tag',
211
211
  'target_icon' => "<img src='/images/tag_blue.png' alt='tag'/>",
212
212
  }, subject.export)
213
213
  end
@@ -125,7 +125,7 @@ class RoleTest < Zena::Unit::TestCase
125
125
  end
126
126
 
127
127
  should 'return all defined safe columns' do
128
- assert_equal %w{origin tz weight}, subject.defined_safe_columns.map(&:name)
128
+ assert_equal %w{origin settings tz weight}, subject.defined_safe_columns.map(&:name)
129
129
  end
130
130
  end # with a Role
131
131
 
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ class StringHashTest < Test::Unit::TestCase
5
+ context 'A StringHash' do
6
+ subject do
7
+ StringHash[:a => 1, 'b' => '2']
8
+ end
9
+
10
+ should 'transform all keys to string' do
11
+ assert_equal Hash['a' => '1', 'b' => '2'], subject
12
+ end
13
+
14
+ should 'convert to json' do
15
+ assert_match %r{\{"data":\{"b":"2","a":"1"|"a":"1","b":"2"\},"json_class":"StringHash"\}}, subject.to_json
16
+ end
17
+
18
+ should 'create from json' do
19
+ obj = JSON.parse(subject.to_json)
20
+ assert_equal StringHash, obj.class
21
+ assert_equal obj, subject
22
+ end
23
+
24
+ should 'merge' do
25
+ subject.merge!(:a => 4, 'c' => '3')
26
+ assert_equal StringHash, subject.class
27
+ assert_equal Hash['a' => '4', 'b' => '2', 'c' => '3'], subject
28
+ end
29
+ end # A string with accents
30
+ end
@@ -2,7 +2,9 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class VirtualClassTest < Zena::Unit::TestCase
5
-
5
+ POST_PROPERTIES = %w{assigned cached_role_ids date origin settings summary text title tz weight}
6
+ NOTE_PROPERTIES = %w{assigned cached_role_ids origin settings summary text title tz weight}
7
+
6
8
  def test_virtual_subclasse
7
9
  # add a sub class
8
10
  login(:lion)
@@ -185,6 +187,10 @@ class VirtualClassTest < Zena::Unit::TestCase
185
187
  assert !vclass.new_record?
186
188
  assert_not_equal Section.kpath, vclass.kpath
187
189
  assert_equal 'NPU', vclass.kpath
190
+ # New class without any free key
191
+ vclass = VirtualClass.create(:superclass => 'Page', :name => 'U', :create_group_id => groups_id(:public))
192
+ assert !vclass.new_record?
193
+ assert_equal 'NPA', vclass.kpath
188
194
  end
189
195
 
190
196
  context 'Updating a VirtualClass' do
@@ -204,6 +210,14 @@ class VirtualClassTest < Zena::Unit::TestCase
204
210
  assert_equal 'NPO', n.kpath
205
211
  end
206
212
 
213
+ should 'update kpaths in relations' do
214
+ # kpath NNP => NO
215
+ assert subject.update_attributes(:name => 'Frost')
216
+ assert_equal 'NNF', subject.kpath
217
+ rel = relations(:post_has_blogs)
218
+ assert_equal 'NNF', rel.source_kpath
219
+ end
220
+
207
221
  context 'with a related template' do
208
222
  setup do
209
223
  @template = secure(Template) { Template.create(:parent_id => nodes_id(:default), :title => 'Post-foobar.zafu') }
@@ -306,7 +320,7 @@ class VirtualClassTest < Zena::Unit::TestCase
306
320
  end
307
321
 
308
322
  should 'return a loaded virtual class' do
309
- assert_equal %w{assigned cached_role_ids date origin summary text title tz weight}, subject.column_names.sort
323
+ assert_equal POST_PROPERTIES, subject.column_names.sort
310
324
  end
311
325
 
312
326
  context 'related to a real class' do
@@ -320,7 +334,7 @@ class VirtualClassTest < Zena::Unit::TestCase
320
334
  end
321
335
 
322
336
  should 'return a loaded virtual class' do
323
- assert_equal %w{assigned cached_role_ids origin summary text title tz weight}, subject.column_names.sort
337
+ assert_equal NOTE_PROPERTIES, subject.column_names.sort
324
338
  end
325
339
  end # related to a real class
326
340
 
@@ -342,7 +356,7 @@ class VirtualClassTest < Zena::Unit::TestCase
342
356
  end
343
357
 
344
358
  should 'return a loaded virtual class' do
345
- assert_equal %w{assigned cached_role_ids date origin summary text title tz weight}, subject.column_names.sort
359
+ assert_equal POST_PROPERTIES, subject.column_names.sort
346
360
  end
347
361
  end # with an id
348
362
 
@@ -363,7 +377,7 @@ class VirtualClassTest < Zena::Unit::TestCase
363
377
  end
364
378
 
365
379
  should 'return a loaded virtual class' do
366
- assert_equal %w{assigned cached_role_ids date origin summary text title tz weight}, subject.column_names.sort
380
+ assert_equal POST_PROPERTIES, subject.column_names.sort
367
381
  end
368
382
 
369
383
  context 'related to a real class' do
@@ -377,7 +391,7 @@ class VirtualClassTest < Zena::Unit::TestCase
377
391
  end
378
392
 
379
393
  should 'return a loaded virtual class' do
380
- assert_equal %w{assigned cached_role_ids origin summary text title tz weight}, subject.column_names.sort
394
+ assert_equal NOTE_PROPERTIES, subject.column_names.sort
381
395
  end
382
396
  end # related to a real class
383
397
  end # with a name
@@ -484,7 +498,7 @@ class VirtualClassTest < Zena::Unit::TestCase
484
498
  should 'load new role from cache' do
485
499
  subject
486
500
  # no more linked to assigned
487
- assert_equal %w{assigned cached_role_ids date foo origin summary text title tz weight}, VirtualClass['Post'].column_names.sort
501
+ assert_equal %w{assigned cached_role_ids date foo origin settings summary text title tz weight}, VirtualClass['Post'].column_names.sort
488
502
  end
489
503
 
490
504
  end # Creating a Column
@@ -522,7 +536,7 @@ class VirtualClassTest < Zena::Unit::TestCase
522
536
  should 'load new role from cache' do
523
537
  subject
524
538
  # change name
525
- assert_equal %w{assigned cached_role_ids date origin summary text title toz weight}, VirtualClass['Post'].column_names.sort
539
+ assert_equal POST_PROPERTIES.map{|p| p == 'tz' ? 'toz' : p}, VirtualClass['Post'].column_names.sort
526
540
  end
527
541
 
528
542
  end # Updating a Column
@@ -560,7 +574,7 @@ class VirtualClassTest < Zena::Unit::TestCase
560
574
  should 'load new role from cache' do
561
575
  subject
562
576
  # no more linked to assigned
563
- assert_equal %w{assigned cached_role_ids date origin summary text title weight}, VirtualClass['Post'].column_names.sort
577
+ assert_equal %w{assigned cached_role_ids date origin settings summary text title weight}, VirtualClass['Post'].column_names.sort
564
578
  end
565
579
 
566
580
  end # Deleting a Column
@@ -629,7 +643,7 @@ class VirtualClassTest < Zena::Unit::TestCase
629
643
  end
630
644
 
631
645
  should 'return safe column types' do
632
- assert_equal %w{assigned origin summary text title tz weight}, subject.safe_column_types.keys.sort
646
+ assert_equal %w{assigned origin settings summary text title tz weight}, subject.safe_column_types.keys.sort
633
647
  end
634
648
 
635
649
  should 'return nil on unsafe method type' do
@@ -664,7 +678,7 @@ class VirtualClassTest < Zena::Unit::TestCase
664
678
  end
665
679
 
666
680
  should 'return safe columns' do
667
- assert_equal %w{summary text title assigned origin tz weight}, subject.safe_columns.map(&:name)
681
+ assert_equal %w{summary text title assigned origin settings tz weight}, subject.safe_columns.map(&:name)
668
682
  end
669
683
 
670
684
  should 'return defined safe columns' do
@@ -672,7 +686,7 @@ class VirtualClassTest < Zena::Unit::TestCase
672
686
  end
673
687
 
674
688
  should 'return safe column types' do
675
- assert_equal %w{assigned origin summary text title tz weight}, subject.safe_column_types.keys.sort
689
+ assert_equal %w{assigned origin settings summary text title tz weight}, subject.safe_column_types.keys.sort
676
690
  end
677
691
 
678
692
  should 'not include unsafe properties in safe column types' do
@@ -698,7 +712,7 @@ class VirtualClassTest < Zena::Unit::TestCase
698
712
  end
699
713
 
700
714
  should 'return safe columns' do
701
- assert_equal %w{summary text title assigned origin tz weight date}, subject.safe_columns.map(&:name)
715
+ assert_equal %w{summary text title assigned origin settings tz weight date}, subject.safe_columns.map(&:name)
702
716
  end
703
717
 
704
718
  should 'return defined safe columns' do
@@ -706,7 +720,7 @@ class VirtualClassTest < Zena::Unit::TestCase
706
720
  end
707
721
 
708
722
  should 'return safe column types' do
709
- assert_equal %w{assigned date origin summary text title tz weight}, subject.safe_column_types.keys.sort
723
+ assert_equal %w{assigned date origin settings summary text title tz weight}, subject.safe_column_types.keys.sort
710
724
  end
711
725
 
712
726
  should 'return type on safe method type' do
@@ -898,7 +912,7 @@ class VirtualClassTest < Zena::Unit::TestCase
898
912
 
899
913
  should 'export relations' do
900
914
  assert_equal({
901
- 'blogs' => {'target_kpath'=>'NPP', 'source_role'=>'added_note'}
915
+ 'blogs' => {'target_name'=>'Project', 'source_role'=>'added_note'}
902
916
  }, subject['relations'])
903
917
  end
904
918
 
@@ -979,7 +993,7 @@ class VirtualClassTest < Zena::Unit::TestCase
979
993
  'type' => 'VirtualClass',
980
994
  'relations' => {
981
995
  'babar' => {
982
- 'target_kpath' => 'NNB',
996
+ 'target_name' => 'Post',
983
997
  'target_unique' => true,
984
998
  'source_role' => 'fool',
985
999
  'rel_group' => 'foo.bar',
@@ -1003,7 +1017,7 @@ class VirtualClassTest < Zena::Unit::TestCase
1003
1017
  assert bar = VirtualClass['Bar']
1004
1018
  rel = Relation.first(
1005
1019
  :conditions => ['source_kpath = ? AND target_role = ?', 'NNF', 'babar'])
1006
- assert_equal 'NNB', rel.target_kpath
1020
+ assert_equal 'NNP', rel.target_kpath
1007
1021
  assert_equal 'fools', rel.source_role
1008
1022
  assert_equal 'babar', rel.target_role
1009
1023
  assert_equal 'foo.bar', rel.rel_group