zena 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
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