zena 0.16.9 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (572) hide show
  1. data/.gitignore +16 -3
  2. data/CREDITS +8 -4
  3. data/History.txt +12 -15
  4. data/app/controllers/application_controller.rb +1 -0
  5. data/app/controllers/columns_controller.rb +130 -0
  6. data/app/controllers/documents_controller.rb +16 -4
  7. data/app/controllers/groups_controller.rb +1 -5
  8. data/app/controllers/iformats_controller.rb +1 -5
  9. data/app/controllers/nodes_controller.rb +116 -41
  10. data/app/controllers/preferences_controller.rb +2 -0
  11. data/app/controllers/relations_controller.rb +1 -5
  12. data/app/controllers/sites_controller.rb +1 -5
  13. data/app/controllers/user_sessions_controller.rb +8 -3
  14. data/app/controllers/users_controller.rb +23 -11
  15. data/app/controllers/versions_controller.rb +29 -46
  16. data/app/controllers/virtual_classes_controller.rb +20 -12
  17. data/app/helpers/documents_helper.rb +5 -1
  18. data/app/models/attachment.rb +41 -0
  19. data/app/models/base_contact.rb +79 -0
  20. data/app/models/cache.rb +2 -2
  21. data/app/models/cached_page.rb +5 -4
  22. data/app/models/column.rb +90 -0
  23. data/app/models/comment.rb +3 -1
  24. data/app/models/contact_content.rb +5 -5
  25. data/app/models/contact_version.rb +2 -2
  26. data/app/models/data_entry.rb +9 -8
  27. data/app/models/discussion.rb +4 -0
  28. data/app/models/document.rb +170 -42
  29. data/app/models/document_content.rb +5 -9
  30. data/app/models/group.rb +4 -3
  31. data/app/models/idx_nodes_ml_string.rb +5 -0
  32. data/app/models/idx_nodes_string.rb +5 -0
  33. data/app/models/idx_template.rb +35 -0
  34. data/app/models/iformat.rb +4 -4
  35. data/app/models/image.rb +193 -26
  36. data/app/models/link.rb +1 -1
  37. data/app/models/node.rb +358 -338
  38. data/app/models/note.rb +2 -4
  39. data/app/models/page.rb +10 -8
  40. data/app/models/reference.rb +1 -1
  41. data/app/models/relation.rb +40 -1
  42. data/app/models/relation_proxy.rb +37 -40
  43. data/app/models/role.rb +19 -0
  44. data/app/models/site.rb +54 -24
  45. data/app/models/skin.rb +1 -16
  46. data/app/models/template.rb +92 -62
  47. data/app/models/template_content.rb +12 -6
  48. data/app/models/text_document.rb +69 -36
  49. data/app/models/text_document_content.rb +3 -3
  50. data/app/models/user.rb +34 -13
  51. data/app/models/version.rb +47 -291
  52. data/app/models/virtual_class.rb +26 -29
  53. data/app/views/columns/_add.html.erb +6 -0
  54. data/app/views/columns/_form.html.erb +36 -0
  55. data/app/views/columns/_li.html.erb +11 -0
  56. data/app/views/columns/create.rjs +8 -0
  57. data/app/views/columns/destroy.rjs +6 -0
  58. data/app/views/columns/edit.html.erb +5 -0
  59. data/app/views/columns/index.html.erb +15 -0
  60. data/app/views/columns/new.html.erb +2 -0
  61. data/app/views/columns/show.rjs +1 -0
  62. data/app/views/columns/update.rjs +5 -0
  63. data/app/views/comments/_li.rhtml +1 -1
  64. data/app/views/comments/create.rjs +1 -1
  65. data/app/views/comments/index.rhtml +1 -1
  66. data/app/views/comments/publish.rjs +1 -1
  67. data/app/views/comments/remove.rjs +1 -1
  68. data/app/views/data_entries/_li.html.erb +1 -1
  69. data/app/views/discussions/create.rjs +1 -1
  70. data/app/views/documents/_crop.rhtml +4 -4
  71. data/app/views/documents/crop_form.rjs +1 -1
  72. data/app/views/documents/new.rhtml +1 -1
  73. data/app/views/documents/show.rhtml +4 -4
  74. data/app/views/groups/_form.rhtml +1 -1
  75. data/app/views/groups/index.rhtml +1 -1
  76. data/app/views/iformats/_form.rhtml +1 -1
  77. data/app/views/iformats/create.rjs +1 -1
  78. data/app/views/iformats/index.rhtml +1 -1
  79. data/app/views/links/create.rjs +1 -1
  80. data/app/views/links/destroy.rjs +1 -1
  81. data/app/views/links/show.rjs +1 -1
  82. data/app/views/nodes/_dates.rhtml +2 -2
  83. data/app/views/nodes/_gallery.rhtml +2 -2
  84. data/app/views/nodes/_list_nodes.rhtml +2 -2
  85. data/app/views/nodes/_parent.rhtml +1 -1
  86. data/app/views/nodes/_position.rhtml +2 -2
  87. data/app/views/nodes/_results.rhtml +1 -1
  88. data/app/views/nodes/create.rjs +1 -4
  89. data/app/views/nodes/destroy.erb +0 -0
  90. data/app/views/nodes/import.rhtml +1 -1
  91. data/app/views/nodes/save_text.rjs +3 -3
  92. data/app/views/nodes/table_update.rjs +1 -2
  93. data/app/views/nodes/update.rjs +1 -1
  94. data/app/views/relations/_form.erb +15 -15
  95. data/app/views/relations/_li.erb +5 -11
  96. data/app/views/relations/create.rjs +1 -1
  97. data/app/views/relations/index.erb +1 -1
  98. data/app/views/sites/_form.erb +3 -3
  99. data/app/views/sites/_li.erb +1 -1
  100. data/app/views/sites/index.erb +1 -1
  101. data/app/views/templates/document_create_tabs/_file.rhtml +3 -3
  102. data/app/views/templates/document_create_tabs/_template.rhtml +9 -9
  103. data/app/views/templates/document_create_tabs/{_text_doc.rhtml → _text_document.rhtml} +4 -4
  104. data/app/views/templates/edit_tabs/{_contact.rhtml → _basecontact.rhtml} +2 -2
  105. data/app/views/templates/edit_tabs/_document.rhtml +3 -3
  106. data/app/views/templates/edit_tabs/_help.rhtml +2 -2
  107. data/app/views/templates/edit_tabs/_image.rhtml +4 -4
  108. data/app/views/templates/edit_tabs/_template.rhtml +6 -6
  109. data/app/views/templates/edit_tabs/_text.rhtml +1 -1
  110. data/app/views/templates/edit_tabs/_textdocument.rhtml +4 -4
  111. data/app/views/templates/edit_tabs/_title.rhtml +9 -14
  112. data/app/views/users/_form.rhtml +1 -1
  113. data/app/views/users/change_info.rjs +1 -1
  114. data/app/views/users/change_password.rjs +1 -1
  115. data/app/views/users/index.rhtml +1 -1
  116. data/app/views/users/preferences.html.erb +10 -4
  117. data/app/views/users/update.rjs +1 -1
  118. data/app/views/versions/_list.rhtml +1 -1
  119. data/app/views/versions/_tr.rhtml +1 -1
  120. data/app/views/versions/backup.rjs +1 -1
  121. data/app/views/versions/destroy.rjs +6 -2
  122. data/app/views/versions/diff.rjs +1 -1
  123. data/app/views/versions/edit.rhtml +14 -6
  124. data/app/views/versions/preview.rjs +1 -1
  125. data/app/views/versions/show.rjs +1 -1
  126. data/app/views/virtual_classes/_add.erb +1 -1
  127. data/app/views/virtual_classes/_form.erb +15 -10
  128. data/app/views/virtual_classes/_li.erb +13 -7
  129. data/app/views/virtual_classes/create.rjs +2 -2
  130. data/app/views/virtual_classes/edit.html.erb +7 -0
  131. data/app/views/virtual_classes/index.erb +2 -2
  132. data/app/views/zafu/default/Node-+adminLayout.zafu +47 -0
  133. data/app/views/zafu/default/Node-+index.zafu +1 -0
  134. data/app/views/{templates/defaults/+login.zafu → zafu/default/Node-+login.zafu} +9 -7
  135. data/app/views/zafu/default/Node-+notFound.zafu +14 -0
  136. data/app/views/zafu/default/Node-+popupLayout.zafu +24 -0
  137. data/app/views/zafu/default/Node-+search.zafu +23 -0
  138. data/app/views/zafu/default/Node.zafu +95 -0
  139. data/bin/zena +0 -2
  140. data/bricks/captcha/lib/bricks/captcha.rb +62 -0
  141. data/bricks/captcha/zena/init.rb +11 -0
  142. data/bricks/data2pdf/.document +5 -0
  143. data/bricks/data2pdf/README +19 -0
  144. data/bricks/data2pdf/Rakefile +36 -0
  145. data/bricks/data2pdf/VERSION +1 -0
  146. data/bricks/data2pdf/lib/data2pdf.rb +60 -0
  147. data/bricks/data2pdf/lib/engines/prince.rb +39 -0
  148. data/bricks/data2pdf/lib/engines/xhtml2pdf.rb +41 -0
  149. data/bricks/data2pdf/lib/install.rb +111 -0
  150. data/bricks/data2pdf/test/engines/test_prince.rb +14 -0
  151. data/bricks/data2pdf/test/engines/test_xhtml2pdf.rb +14 -0
  152. data/bricks/data2pdf/test/fixtures/application.css +241 -0
  153. data/bricks/data2pdf/test/fixtures/contact.html +153 -0
  154. data/bricks/data2pdf/test/fixtures/pisa-default.css +207 -0
  155. data/bricks/data2pdf/test/fixtures/sheet1.css +207 -0
  156. data/bricks/data2pdf/test/fixtures/sheet2.css +207 -0
  157. data/bricks/data2pdf/test/fixtures/simple-html.html +337 -0
  158. data/bricks/data2pdf/test/fixtures/simple-text.txt +1 -0
  159. data/bricks/data2pdf/test/helper.rb +23 -0
  160. data/bricks/data2pdf/test/shoulda_macros/shoulda_data2pdf.rb +91 -0
  161. data/bricks/data2pdf/test/unit/test_rendering.rb +37 -0
  162. data/bricks/math/{patch/application_helper.rb → lib/bricks/math.rb} +0 -4
  163. data/bricks/math/zena/init.rb +4 -0
  164. data/bricks/sphinx/README +2 -2
  165. data/bricks/sphinx/lib/use_sphinx.rb +7 -11
  166. data/bricks/sphinx/{misc → zena}/deploy.rb +0 -0
  167. data/bricks/sphinx/{patch/node.rb → zena/init.rb} +1 -3
  168. data/bricks/sphinx/{migrate → zena/migrate}/20091102171258_add_delta_for_sphinx.rb +0 -0
  169. data/bricks/sphinx/{misc → zena}/sphinx.yml +0 -0
  170. data/bricks/sphinx/{misc → zena}/tasks.rb +0 -0
  171. data/bricks/tags/lib/{has_tags.rb → bricks/tags.rb} +12 -24
  172. data/bricks/tags/zena/init.rb +21 -0
  173. data/bricks/tags/{test → zena/test}/sites/zena/links.yml +0 -0
  174. data/bricks/tags/{test → zena/test}/unit/tags_test.rb +1 -1
  175. data/bricks/tags/zena/test/zafu/tags.yml +41 -0
  176. data/bricks/worker/README +2 -2
  177. data/bricks/worker/{misc → zena}/deploy.rb +0 -0
  178. data/bricks/worker/{misc → zena}/init.rb +2 -1
  179. data/bricks/worker/{migrate → zena/migrate}/20091104191643_create_delayed_jobs_table.rb +0 -0
  180. data/bricks/worker/{misc → zena}/tasks.rb +0 -0
  181. data/bricks/worker/{misc → zena}/worker +0 -0
  182. data/config/bricks.yml +2 -0
  183. data/config/deploy.rb +2 -7
  184. data/config/environment.rb +3 -5
  185. data/config/gems.yml +9 -4
  186. data/db/20100628074512_zena0x_to1x.rb +223 -0
  187. data/db/init/base/help.en.zml +3 -3
  188. data/db/init/base/help.fr.zml +3 -3
  189. data/db/init/base/skins.zml +2 -2
  190. data/db/init/base/skins/default.zml +4 -4
  191. data/db/init/base/skins/default/Node-+adminLayout.zafu +8 -7
  192. data/db/init/base/skins/default/Node-+login.zafu +9 -7
  193. data/db/init/base/skins/default/Node-+search.zafu +4 -1
  194. data/db/init/base/skins/default/Node-tree.zafu +3 -3
  195. data/db/init/base/skins/default/Node.zafu +20 -20
  196. data/db/init/base/skins/default/Project.zafu +1 -1
  197. data/db/init/base/skins/default/notes.zafu +5 -5
  198. data/db/init/base/skins/default/style.css +17 -12
  199. data/db/migrate/001_create_base.rb +1 -1
  200. data/db/migrate/008_user_status.rb +1 -1
  201. data/db/migrate/020_create_participation.rb +3 -3
  202. data/db/migrate/024_correct_vclass_kpath.rb +5 -3
  203. data/db/migrate/025_move_tag_into_vclass.rb +7 -5
  204. data/db/migrate/030_redit_auto_publish_site_settings.rb +2 -2
  205. data/db/migrate/032_caches_context_as_hash.rb +4 -2
  206. data/db/migrate/046_fix_zazen_image_tag.rb +2 -2
  207. data/db/migrate/047_change_default_link_id_to_zero.rb +4 -2
  208. data/db/migrate/20090825201159_insert_zero_link.rb +1 -1
  209. data/db/migrate/20090924141459_zafu_fix_sept09.rb +2 -2
  210. data/db/migrate/20100125062254_add_dynamo_to_version.rb +9 -0
  211. data/db/migrate/20100201133242_remove_default_status_on_version.rb +9 -0
  212. data/db/migrate/20100208194210_create_attachments.rb +17 -0
  213. data/db/migrate/20100210112319_change_dynamo_to_property.rb +9 -0
  214. data/db/migrate/20100320145726_transform_template_contents_into_index.rb +13 -0
  215. data/db/migrate/20100328125634_change_skin_name_to_id.rb +31 -0
  216. data/db/migrate/20100417061257_add_properties_to_sites.rb +9 -0
  217. data/db/migrate/20100419163149_rename_name_to_node_name.rb +9 -0
  218. data/db/migrate/20100422091606_change_v_class_table_into_roles.rb +27 -0
  219. data/db/migrate/20100422094048_node_habtm_roles.rb +13 -0
  220. data/db/migrate/20100422115935_create_columns.rb +15 -0
  221. data/db/migrate/20100513181529_add_site_id_to_columns.rb +9 -0
  222. data/db/migrate/20100519091711_add_index_definition_to_columns.rb +9 -0
  223. data/db/migrate/20100519091940_create_idx_nodes_string.rb +14 -0
  224. data/db/migrate/20100519232432_create_idx_nodes_ml_string.rb +15 -0
  225. data/db/migrate/20100525113858_add_porperties_to_users.rb +9 -0
  226. data/db/migrate/20100526090140_renamed_contact_model_to_base_contact.rb +13 -0
  227. data/db/migrate/20100527130937_change_column_index_to_string.rb +9 -0
  228. data/db/migrate/20100531135128_add_fulltext_builder_fields.rb +28 -0
  229. data/doc/zafu_changes.yml +2 -2
  230. data/lib/bricks/loader.rb +48 -26
  231. data/lib/exif_data.rb +21 -1
  232. data/lib/gettext_strings.rb +8 -1
  233. data/lib/tasks/zena.rake +55 -20
  234. data/lib/version_off.rb +323 -0
  235. data/lib/zazen_parser.rb +9 -0
  236. data/lib/zena.rb +13 -14
  237. data/lib/zena/acts/enrollable.rb +232 -0
  238. data/lib/zena/acts/secure.rb +86 -506
  239. data/lib/zena/acts/secure_node.rb +483 -0
  240. data/lib/zena/acts/serializable.rb +149 -0
  241. data/lib/zena/app.rb +36 -23
  242. data/lib/zena/code_syntax.rb +26 -2
  243. data/lib/zena/controller/test_case.rb +23 -2
  244. data/lib/zena/core_ext/file_utils.rb +3 -3
  245. data/lib/zena/core_ext/string.rb +2 -2
  246. data/lib/zena/db.rb +180 -24
  247. data/lib/zena/deploy.rb +140 -183
  248. data/lib/zena/deploy/awstats.conf.rhtml +4 -4
  249. data/lib/zena/deploy/httpd.rhtml +1 -2
  250. data/lib/zena/deploy/stats.vhost.rhtml +7 -7
  251. data/lib/zena/deploy/vhost.rhtml +1 -1
  252. data/lib/zena/deploy/vhost_www.rhtml +4 -4
  253. data/lib/zena/foxy_parser.rb +345 -295
  254. data/lib/zena/info.rb +1 -2
  255. data/lib/zena/integration/test_case.rb +70 -0
  256. data/lib/zena/loader/yaml_loader.rb +80 -0
  257. data/lib/zena/migrator.rb +2 -2
  258. data/lib/zena/parser.rb +19 -17
  259. data/lib/zena/parser/zafu_rules.rb +7 -0
  260. data/lib/zena/parser/zafu_tags.rb +2 -2
  261. data/lib/zena/parser/zazen_rules.rb +9 -29
  262. data/lib/zena/parser/zena_rules.rb +2 -2
  263. data/lib/zena/refactor/act_as_content.rb +6 -0
  264. data/lib/zena/routes.rb +9 -3
  265. data/lib/zena/site_worker.rb +48 -0
  266. data/lib/zena/test_controller.rb +49 -12
  267. data/lib/zena/use.rb +47 -0
  268. data/lib/zena/use/action.rb +230 -0
  269. data/lib/zena/use/ajax.rb +287 -13
  270. data/lib/zena/use/authlogic.rb +28 -12
  271. data/lib/zena/use/calendar.rb +2 -2
  272. data/lib/zena/use/conditional.rb +41 -0
  273. data/lib/zena/use/context.rb +187 -0
  274. data/lib/zena/use/dates.rb +87 -30
  275. data/lib/zena/use/display.rb +598 -0
  276. data/lib/zena/use/dyn_attributes.rb +4 -4
  277. data/lib/zena/use/error_rendering.rb +3 -1
  278. data/lib/zena/use/fixtures.rb +56 -22
  279. data/lib/zena/use/forms.rb +584 -0
  280. data/lib/zena/use/fulltext.rb +90 -0
  281. data/lib/zena/use/grid.rb +12 -7
  282. data/lib/zena/use/html_tags.rb +8 -459
  283. data/lib/zena/use/i18n.rb +172 -109
  284. data/lib/zena/use/image_builder.rb +1 -2
  285. data/lib/zena/use/ml_index.rb +56 -0
  286. data/lib/zena/use/nested_attributes_alias.rb +2 -2
  287. data/lib/zena/use/node_name.rb +94 -0
  288. data/lib/zena/use/query_builder.rb +355 -0
  289. data/lib/zena/use/query_comment.rb +63 -73
  290. data/lib/zena/use/query_node.rb +404 -317
  291. data/lib/zena/use/recursion.rb +71 -0
  292. data/lib/zena/use/refactor.rb +27 -40
  293. data/lib/zena/use/relations.rb +9 -3
  294. data/lib/zena/use/rendering.rb +143 -116
  295. data/lib/zena/use/search.rb +79 -21
  296. data/lib/zena/use/test_helper.rb +17 -9
  297. data/lib/zena/use/upload.rb +1 -1
  298. data/lib/zena/use/urls.rb +534 -28
  299. data/lib/zena/use/version_hash.rb +154 -0
  300. data/lib/zena/use/workflow.rb +635 -0
  301. data/lib/zena/use/zafu_attributes.rb +205 -0
  302. data/lib/zena/use/zafu_eval.rb +21 -0
  303. data/lib/zena/use/zafu_safe_definitions.rb +36 -0
  304. data/lib/zena/use/zafu_templates.rb +459 -0
  305. data/lib/zena/use/zazen.rb +53 -23
  306. data/lib/zena/view/test_case.rb +56 -7
  307. data/lib/zena/webdav_adapter.rb +8 -8
  308. data/lib/zena/zafu_compiler.rb +25 -0
  309. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  310. data/locale/de/zena.mo +0 -0
  311. data/locale/de/zena.po +920 -781
  312. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  313. data/locale/en/zena.mo +0 -0
  314. data/locale/en/zena.po +530 -405
  315. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  316. data/locale/fr/zena.mo +0 -0
  317. data/locale/fr/zena.po +588 -432
  318. data/locale/zena.pot +391 -353
  319. data/old_zafu/action.rb +129 -0
  320. data/{lib/zafu → old_zafu}/ajax.rb +0 -24
  321. data/{lib/zafu → old_zafu}/attributes.rb +2 -2
  322. data/{lib/zafu → old_zafu}/calendar.rb +1 -1
  323. data/{lib/zafu → old_zafu}/context.rb +4 -8
  324. data/{lib/zafu → old_zafu}/core/html.rb +1 -1
  325. data/old_zafu/core/move_to_parser.rb +74 -0
  326. data/old_zafu/dates.rb +20 -0
  327. data/{lib/zafu → old_zafu}/display.rb +33 -146
  328. data/{lib/zafu → old_zafu}/eval.rb +0 -0
  329. data/{lib/zafu → old_zafu}/experimental.rb +1 -1
  330. data/{lib/zafu → old_zafu}/i18n.rb +1 -1
  331. data/{lib/zafu → old_zafu}/meta.rb +0 -0
  332. data/old_zafu/query_node.rb +278 -0
  333. data/{lib/zafu → old_zafu}/refactor.rb +2 -12
  334. data/old_zafu/support/context.rb +146 -0
  335. data/{lib/zafu → old_zafu}/support/dom.rb +1 -43
  336. data/{lib/zafu → old_zafu}/support/erb.rb +0 -0
  337. data/{lib/zafu → old_zafu}/support/flow.rb +1 -13
  338. data/old_zafu/support/forms.rb +7 -0
  339. data/old_zafu/support/links.rb +75 -0
  340. data/{lib → old_zafu}/zafu_parser.rb +2 -2
  341. data/public/images/attach_window.png +0 -0
  342. data/public/images/dettach_window.png +0 -0
  343. data/public/images/ext/{contact.png → basecontact.png} +0 -0
  344. data/public/images/toggle_off.png +0 -0
  345. data/public/images/toggle_on.png +0 -0
  346. data/public/images/window/bottom_left.png +0 -0
  347. data/public/images/window/bottom_mid.png +0 -0
  348. data/public/images/window/bottom_right.png +0 -0
  349. data/public/images/window/center_left.png +0 -0
  350. data/public/images/window/center_right.png +0 -0
  351. data/public/images/window/close.png +0 -0
  352. data/public/images/window/maximize.png +0 -0
  353. data/public/images/window/minimize.png +0 -0
  354. data/public/images/window/overlay.png +0 -0
  355. data/public/images/window/sizer.png +0 -0
  356. data/public/images/window/top_left.png +0 -0
  357. data/public/images/window/top_mid.png +0 -0
  358. data/public/images/window/top_right.png +0 -0
  359. data/public/javascripts/builder.js +1 -3
  360. data/public/javascripts/controls.js +3 -5
  361. data/public/javascripts/dragdrop.js +5 -8
  362. data/public/javascripts/effects.js +6 -15
  363. data/public/javascripts/prototype.js +1574 -1020
  364. data/public/javascripts/scriptaculous.js +13 -7
  365. data/public/javascripts/slider.js +5 -7
  366. data/public/javascripts/sound.js +6 -4
  367. data/public/javascripts/unittest.js +69 -71
  368. data/public/javascripts/window.js +1843 -0
  369. data/public/javascripts/zena.js +216 -16
  370. data/public/stylesheets/admin.css +18 -13
  371. data/public/stylesheets/default.css +18 -17
  372. data/public/stylesheets/popup.css +4 -4
  373. data/public/stylesheets/window.css +155 -0
  374. data/public/stylesheets/zena.css +9 -8
  375. data/test/custom_queries/complex.host.yml +8 -8
  376. data/test/fixtures/files/Node-test.zafu +11 -11
  377. data/test/fixtures/files/import.tgz +0 -0
  378. data/test/fixtures/files/simple.zml.gz +0 -0
  379. data/test/fixtures/import/photos.en.zml +3 -3
  380. data/test/fixtures/import/photos/bird.jpg.en.zml +1 -1
  381. data/test/fixtures/import/photos/bird.jpg.fr.zml +1 -1
  382. data/test/fixtures/import/simple.zml +2 -2
  383. data/test/functional/application_controller_test.rb +2 -41
  384. data/test/functional/columns_controller_test.rb +140 -0
  385. data/test/functional/data_entries_controller_test.rb +1 -1
  386. data/test/functional/documents_controller_test.rb +88 -5
  387. data/test/functional/nodes_controller_commit_test.rb +71 -0
  388. data/test/functional/nodes_controller_test.rb +393 -93
  389. data/test/functional/note_controller_test.rb +5 -5
  390. data/test/functional/relations_controller_test.rb +1 -1
  391. data/test/functional/users_controller_test.rb +72 -14
  392. data/test/functional/versions_controller_test.rb +9 -8
  393. data/test/functional/virtual_classes_controller_test.rb +142 -65
  394. data/test/integration/multiple_hosts_test.rb +28 -20
  395. data/test/integration/navigation_test.rb +121 -83
  396. data/test/integration/query_node/basic.yml +128 -0
  397. data/test/integration/query_node/comments.yml +23 -0
  398. data/test/integration/query_node/complex.yml +111 -0
  399. data/test/integration/query_node/dates.yml +22 -0
  400. data/test/integration/query_node/errors.yml +12 -0
  401. data/test/integration/query_node/filters.yml +123 -0
  402. data/test/integration/query_node/properties.yml +41 -0
  403. data/test/integration/query_node/relations.yml +75 -0
  404. data/test/integration/query_node_test.rb +189 -0
  405. data/test/integration/xml_api_test.rb +166 -0
  406. data/test/integration/zafu_compiler/action.yml +67 -0
  407. data/test/integration/zafu_compiler/ajax.yml +263 -0
  408. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/apphelper.yml +0 -0
  409. data/test/integration/zafu_compiler/asset.yml +13 -0
  410. data/test/integration/zafu_compiler/basic.yml +518 -0
  411. data/test/integration/zafu_compiler/calendar.yml +35 -0
  412. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/complex.yml +16 -16
  413. data/test/integration/zafu_compiler/conditional.yml +173 -0
  414. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/data.yml +3 -3
  415. data/test/integration/zafu_compiler/dates.yml +58 -0
  416. data/test/integration/zafu_compiler/display.yml +273 -0
  417. data/test/integration/zafu_compiler/errors.yml +79 -0
  418. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/eval.yml +6 -2
  419. data/test/integration/zafu_compiler/forms.yml +130 -0
  420. data/test/integration/zafu_compiler/i18n.yml +107 -0
  421. data/test/integration/zafu_compiler/later.yml +31 -0
  422. data/test/integration/zafu_compiler/off/off.yml +15 -0
  423. data/test/integration/zafu_compiler/recursion.yml +28 -0
  424. data/test/integration/zafu_compiler/relations.yml +487 -0
  425. data/test/integration/zafu_compiler/roles.yml +28 -0
  426. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/rubyless.yml +10 -9
  427. data/test/integration/zafu_compiler/safe_definitions.yml +65 -0
  428. data/test/integration/zafu_compiler/search.yml +13 -0
  429. data/test/integration/zafu_compiler/security.yml +30 -0
  430. data/test/integration/zafu_compiler/site.yml +14 -0
  431. data/test/integration/zafu_compiler/urls.yml +189 -0
  432. data/test/integration/zafu_compiler/user.yml +32 -0
  433. data/test/integration/zafu_compiler/version.yml +47 -0
  434. data/test/integration/zafu_compiler/workflow.yml +36 -0
  435. data/test/integration/zafu_compiler/zafu_attributes.yml +169 -0
  436. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/zazen.yml +7 -3
  437. data/test/{unit/zena/zena_tags_test.rb → integration/zafu_compiler_test.rb} +137 -57
  438. data/test/sites/complex/nodes.yml +48 -47
  439. data/test/sites/complex/{virtual_classes.yml → roles.yml} +2 -1
  440. data/test/sites/ocean/nodes.yml +7 -7
  441. data/test/sites/ocean/versions.yml +30 -21
  442. data/test/sites/zena/columns.yml +12 -0
  443. data/test/sites/zena/nodes.yml +33 -32
  444. data/test/sites/zena/{virtual_classes.yml → roles.yml} +11 -1
  445. data/test/sites/zena/sites.yml +4 -1
  446. data/test/sites/zena/users.yml +5 -4
  447. data/test/sites/zena/versions.yml +398 -279
  448. data/test/test_helper.rb +2 -1
  449. data/test/test_zena.rb +3 -8
  450. data/test/unit/after_commit_test.rb +103 -0
  451. data/test/unit/attachment_test.rb +266 -0
  452. data/test/unit/base_contact_test.rb +242 -0
  453. data/test/unit/cached_page_test.rb +6 -6
  454. data/test/unit/column_test.rb +77 -0
  455. data/test/unit/comment_test.rb +1 -1
  456. data/test/unit/data_entry_test.rb +8 -2
  457. data/test/unit/document_test.rb +393 -211
  458. data/test/unit/exif_data_test.rb +1 -1
  459. data/test/unit/iformat_test.rb +9 -9
  460. data/test/unit/image_test.rb +358 -284
  461. data/test/unit/multi_version_test.rb +4 -0
  462. data/test/unit/multiversion_test.rb +2 -1013
  463. data/test/unit/node_name_test.rb +137 -0
  464. data/test/unit/node_test.rb +374 -461
  465. data/test/unit/note_test.rb +23 -23
  466. data/test/unit/page_test.rb +23 -23
  467. data/test/unit/project_test.rb +2 -2
  468. data/test/unit/relation_proxy_test.rb +25 -6
  469. data/test/unit/relation_test.rb +156 -24
  470. data/test/unit/role_test.rb +122 -0
  471. data/test/unit/section_test.rb +2 -2
  472. data/test/unit/site_test.rb +48 -12
  473. data/test/unit/skin_test.rb +0 -13
  474. data/test/unit/template_test.rb +361 -314
  475. data/test/unit/text_document_test.rb +105 -33
  476. data/test/unit/transparent_version_test.rb +4 -0
  477. data/test/unit/user_test.rb +10 -10
  478. data/test/unit/version_test.rb +209 -301
  479. data/test/unit/virtual_class_test.rb +21 -29
  480. data/test/unit/workflow_test.rb +1075 -0
  481. data/test/unit/zena/acts/enrollable_test.rb +211 -0
  482. data/test/unit/{secure_test.rb → zena/acts/secure_test.rb} +190 -105
  483. data/test/unit/zena/acts/serializable_test.rb +85 -0
  484. data/test/unit/zena/db_test.rb +27 -14
  485. data/test/unit/zena/parser/zazen.yml +1 -1
  486. data/test/unit/zena/use/action_test.rb +109 -0
  487. data/test/unit/zena/use/calendar_test.rb +8 -8
  488. data/test/unit/zena/use/dates_test.rb +10 -0
  489. data/test/unit/zena/use/dates_view_methods_test.rb +8 -12
  490. data/test/unit/zena/use/fulltext_test.rb +82 -0
  491. data/test/unit/zena/use/html_tags_test.rb +225 -201
  492. data/test/unit/zena/use/i18n_test.rb +56 -26
  493. data/test/unit/zena/use/ml_index_test.rb +129 -0
  494. data/test/unit/zena/use/nested_attributes_alias_view_test.rb +10 -10
  495. data/test/unit/zena/use/query_node_test.rb +104 -0
  496. data/test/unit/zena/use/refactor_test.rb +4 -15
  497. data/test/unit/zena/use/rendering_test.rb +23 -16
  498. data/test/unit/zena/use/upload_test.rb +2 -2
  499. data/test/unit/zena/use/urls_test.rb +2 -0
  500. data/test/unit/zena/use/version_hash_test.rb +126 -0
  501. data/test/unit/zena/use/zafu_template_test.rb +135 -0
  502. data/test/unit/zena/use/zazen_test.rb +85 -61
  503. data/vendor/plugins/gettext_i18n_rails/README.markdown +26 -22
  504. data/vendor/plugins/gettext_i18n_rails/Rakefile +31 -5
  505. data/vendor/plugins/gettext_i18n_rails/VERSION +1 -0
  506. data/vendor/plugins/gettext_i18n_rails/gettext_i18n_rails.gemspec +64 -0
  507. data/vendor/plugins/gettext_i18n_rails/init.rb +7 -3
  508. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails.rb +5 -6
  509. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/active_record.rb +6 -2
  510. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/backend.rb +1 -1
  511. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/model_attributes_finder.rb +2 -2
  512. data/vendor/plugins/gettext_i18n_rails/{tasks → lib/tasks}/gettext_rails_i18n.rake +10 -9
  513. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/action_controller_spec.rb +7 -3
  514. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/active_record_spec.rb +7 -5
  515. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/backend_spec.rb +7 -7
  516. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails_spec.rb +4 -0
  517. data/vendor/plugins/gettext_i18n_rails/spec/spec_helper.rb +11 -9
  518. data/vendor/plugins/mysql_timezone_utc/init.rb +1 -0
  519. data/vendor/plugins/mysql_timezone_utc/lib/mysql_timezone_utc.rb +14 -0
  520. data/vendor/plugins/postgresql_timezone_utc/init.rb +1 -0
  521. data/vendor/plugins/postgresql_timezone_utc/lib/postgresql_timezone_utc.rb +14 -0
  522. data/zena.gemspec +281 -123
  523. metadata +354 -160
  524. data/app/models/contact.rb +0 -32
  525. data/app/models/document_version.rb +0 -13
  526. data/app/models/image_version.rb +0 -21
  527. data/app/models/text_document_version.rb +0 -29
  528. data/app/views/templates/defaults/+adminLayout.zafu +0 -69
  529. data/bricks/captcha/patch/application_controller.rb +0 -10
  530. data/bricks/captcha/patch/application_helper.rb +0 -32
  531. data/bricks/captcha/patch/site.rb +0 -2
  532. data/bricks/captcha/zafu/captcha.rb +0 -29
  533. data/bricks/tags/patch/node.rb +0 -15
  534. data/bricks/tags/test/zafu/tags.yml +0 -40
  535. data/db/schema.rb +0 -295
  536. data/lib/zafu/action.rb +0 -285
  537. data/lib/zafu/core/move_to_parser.rb +0 -167
  538. data/lib/zafu/dates.rb +0 -58
  539. data/lib/zafu/support/context.rb +0 -265
  540. data/lib/zafu/support/forms.rb +0 -461
  541. data/lib/zafu/support/links.rb +0 -306
  542. data/lib/zena/acts/multiversion.rb +0 -755
  543. data/lib/zena/fix/mysql_connection.rb +0 -17
  544. data/lib/zena/use/query_node_finders.rb +0 -91
  545. data/lib/zena/use/zafu.rb +0 -514
  546. data/test/helpers/query_node/basic.yml +0 -149
  547. data/test/helpers/query_node/comments.yml +0 -18
  548. data/test/helpers/query_node/complex.yml +0 -98
  549. data/test/helpers/query_node/filters.yml +0 -110
  550. data/test/helpers/query_node/relations.yml +0 -43
  551. data/test/helpers/query_node_test.rb +0 -116
  552. data/test/sites/ocean/contact_contents.yml +0 -19
  553. data/test/sites/ocean/template_contents.yml +0 -8
  554. data/test/sites/zena/contact_contents.yml +0 -55
  555. data/test/sites/zena/document_contents.yml +0 -76
  556. data/test/sites/zena/dyn_attributes.yml +0 -43
  557. data/test/sites/zena/template_contents.yml +0 -103
  558. data/test/unit/contact_content_test.rb +0 -33
  559. data/test/unit/contact_test.rb +0 -39
  560. data/test/unit/contact_version_test.rb +0 -48
  561. data/test/unit/document_content_test.rb +0 -110
  562. data/test/unit/document_version_test.rb +0 -11
  563. data/test/unit/dyn_attributes_test.rb +0 -229
  564. data/test/unit/image_content_test.rb +0 -154
  565. data/test/unit/image_version_test.rb +0 -18
  566. data/test/unit/template_content_test.rb +0 -9
  567. data/test/unit/text_document_version_test.rb +0 -37
  568. data/test/unit/zena/use/zafu_test.rb +0 -41
  569. data/test/unit/zena/zena_tags/ajax.yml +0 -233
  570. data/test/unit/zena/zena_tags/basic.yml +0 -1306
  571. data/test/unit/zena/zena_tags/errors.yml +0 -71
  572. data/test/unit/zena/zena_tags/relations.yml +0 -405
@@ -0,0 +1,137 @@
1
+ require 'test_helper'
2
+
3
+ class NodeNameTest < Zena::Unit::TestCase
4
+
5
+ context 'A visitor with write access' do
6
+ setup do
7
+ login(:tiger)
8
+ end
9
+
10
+ context 'on a node' do
11
+ subject do
12
+ secure!(Node) { nodes(:people) }
13
+ end
14
+
15
+ should 'sync node_name with title on publish' do
16
+ assert subject.update_attributes(:title => 'nice people')
17
+ assert subject.publish
18
+ assert_equal 'nicePeople', subject.node_name
19
+ end
20
+
21
+ should 'sync node_name with title if name changed' do
22
+ assert subject.update_attributes(:title => 'nice people', :node_name => 'foobar')
23
+ assert_equal 'foobar', subject.node_name
24
+ assert subject.publish
25
+ assert_equal 'nicePeople', subject.node_name
26
+ end
27
+
28
+ should 'not sync node_name with title on redaction' do
29
+ assert subject.update_attributes(:title => 'nice people')
30
+ assert_equal 'people', subject.node_name
31
+ end
32
+
33
+ context 'with another node with same node_name' do
34
+ setup do
35
+ page = secure!(Page) { Page.create(
36
+ :parent_id => subject.parent_id,
37
+ :title => 'nice people') # ==> nicePeople
38
+ }
39
+ end
40
+
41
+ should 'not sync node_name with title on redaction' do
42
+ assert subject.update_attributes(:title => 'nice people')
43
+ assert_equal 'people', subject.node_name
44
+ end
45
+
46
+ should 'set an error on node_name with title on publish' do
47
+ assert subject.update_attributes(:title => 'nice people')
48
+ assert !subject.publish
49
+ assert_equal subject.errors[:node_name], 'has already been taken'
50
+ end
51
+ end # with another node with same node_name
52
+ end # on a node
53
+ end # A visitor with write access
54
+
55
+ # TODO: move these tests above
56
+
57
+ def test_get_fullpath_rebuild
58
+ login(:lion)
59
+ node = secure!(Node) { nodes(:lake) }
60
+ assert_equal 'projects/cleanWater/lakeAddress', node.fullpath
61
+ assert node.update_attributes(:parent_id => nodes_id(:collections))
62
+ assert_equal 'collections/lakeAddress', node.fullpath
63
+ end
64
+
65
+ def test_fullpath_updated_on_parent_rename
66
+ login(:tiger)
67
+ node = secure!(Node) { nodes(:tiger) }
68
+ assert_equal 'people/tiger', node.fullpath
69
+ node = secure!(Node) { nodes(:tiger) }
70
+ assert_equal 'people/tiger', node[:fullpath] # make sure fullpath is cached
71
+
72
+ node = secure!(Node) { nodes(:people) }
73
+ assert node.update_attributes(:title => 'nice people')
74
+ assert node.publish
75
+ assert_equal 'nicePeople', node.node_name # sync node_name
76
+ node = secure!(Node) { nodes(:tiger) }
77
+ assert_equal 'nicePeople/tiger', node[:fullpath]
78
+ end
79
+
80
+ def test_rootpath
81
+ login(:ant)
82
+ node = secure!(Node) { nodes(:status) }
83
+ assert_equal 'zena/projects/cleanWater/status', node.rootpath
84
+ node = secure!(Node) { nodes(:zena) }
85
+ assert_equal 'zena', node.rootpath
86
+ end
87
+
88
+ def test_basepath
89
+ login(:tiger)
90
+ node = secure!(Node) { nodes(:status) }
91
+ assert_equal 'projects/cleanWater', node.basepath
92
+ node = secure!(Node) { nodes(:projects) }
93
+ assert_equal '', node.basepath
94
+ node = secure!(Node) { nodes(:proposition) }
95
+ assert_equal '', node.basepath
96
+ end
97
+
98
+ def test_sync_node_name_before_publish_if_single_version
99
+ login(:ant)
100
+ node = secure!(Node) { Node.create(:title => 'Eve', :parent_id => nodes_id(:people)) }
101
+ assert_equal Zena::Status[:red], node.v_status
102
+ assert_equal 'Eve', node.node_name
103
+ node.update_attributes(:title => 'Lilith')
104
+ assert_equal Zena::Status[:red], node.v_status
105
+ assert_equal 'Lilith', node.node_name
106
+ end
107
+
108
+ def test_sync_node_name_on_title_change_auto_pub_no_sync
109
+ Site.connection.execute "UPDATE sites set auto_publish = #{Zena::Db::TRUE}, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
110
+ Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:status)},#{nodes_id(:people)})"
111
+ login(:tiger)
112
+
113
+ node = secure!(Node) { nodes(:status) }
114
+ assert node.update_attributes(:title => 'simply different')
115
+ assert_equal 'simplyDifferent', node.node_name
116
+ visitor.lang = 'fr'
117
+ # not ref lang
118
+ node = secure!(Node) { nodes(:people) }
119
+ assert node.update_attributes(:title => 'des gens sympathiques')
120
+ assert_equal 'fr', node.v_lang
121
+ assert_equal 'desGensSympathiques', node.node_name
122
+ end
123
+
124
+ def test_sync_node_name_on_title_change_auto_pub
125
+ test_site('zena')
126
+ Site.connection.execute "UPDATE sites set auto_publish = #{Zena::Db::TRUE}, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
127
+ Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:people)})"
128
+ login(:tiger)
129
+ node = secure!(Node) { nodes(:people) }
130
+ # was in sync, correct lang
131
+ assert_equal node.node_name, node.title
132
+ assert node.update_attributes(:title => 'nice people')
133
+ node = secure!(Node) { nodes(:people) }
134
+ assert_equal 'nice people', node.title
135
+ assert_equal 'nicePeople', node.node_name
136
+ end
137
+ end
@@ -1,15 +1,117 @@
1
+ # encoding: utf-8
1
2
  require 'test_helper'
2
3
 
3
4
  class NodeTest < Zena::Unit::TestCase
4
5
 
5
6
  NEW_DEFAULT = {
6
- :name => 'hello',
7
- :rgroup_id => Zena::FoxyParser::id('zena', 'public'),
8
- :wgroup_id => Zena::FoxyParser::id('zena', 'workers'),
9
- :dgroup_id => Zena::FoxyParser::id('zena', 'managers'),
10
- :parent_id => Zena::FoxyParser::id('zena', 'cleanWater'),
7
+ :node_name => 'hello',
8
+ :rgroup_id => Zena::FoxyParser::id('zena', 'public'),
9
+ :wgroup_id => Zena::FoxyParser::id('zena', 'workers'),
10
+ :dgroup_id => Zena::FoxyParser::id('zena', 'managers'),
11
+ :parent_id => Zena::FoxyParser::id('zena', 'cleanWater'),
11
12
  }.freeze
12
13
 
14
+ context 'On a node' do
15
+ subject do
16
+ secure!(Node) { nodes(:cleanWater) }
17
+ end
18
+
19
+ context 'with a sub-node' do
20
+ should 'return true on ancestor?' do
21
+ assert subject.ancestor?(secure!(Node) { nodes(:status) })
22
+ end
23
+ end # with a sub-node
24
+
25
+ context 'with a node that is not a sub-node' do
26
+ should 'return false on ancestor?' do
27
+ assert !subject.ancestor?(secure!(Node) { nodes(:people) })
28
+ end
29
+ end # with a node that is not a sub-node
30
+
31
+ should 'return true on ancestor? on self' do
32
+ assert subject.ancestor?(subject)
33
+ end
34
+ end # On a node
35
+
36
+ context 'A logged in user' do
37
+ setup do
38
+ login(:lion)
39
+ end
40
+
41
+ context 'on a node with write access' do
42
+ subject do
43
+ secure!(Node) { nodes(:lion) }
44
+ end
45
+
46
+ context 'adding a comment with m_title' do
47
+ subject do
48
+ node = secure!(Node) { nodes(:lion) }
49
+ node.update_attributes(:m_title => 'Amartya Sen', :m_text => 'Equality of What')
50
+ node
51
+ end
52
+
53
+ should 'create a Comment' do
54
+ assert_difference('Comment.count', 1) do
55
+ subject
56
+ end
57
+ end
58
+
59
+ should 'set comment title from m_title' do
60
+ assert_equal 'Amartya Sen', subject.comments.first.title
61
+ end
62
+
63
+ should 'set author from visitor' do
64
+ assert_equal users_id(:lion), subject.comments.first.user_id
65
+ end
66
+ end # adding a comment with m_title
67
+
68
+ context 'setting an indexed field' do
69
+ subject do
70
+ node = secure!(Node) { nodes(:art) }
71
+ node.update_attributes(:origin => 'Dada')
72
+ node
73
+ end
74
+
75
+ should 'create index entries' do
76
+ assert_difference('IdxNodesString.count', 1) do
77
+ subject
78
+ end
79
+ end
80
+
81
+ should 'write field value in index' do
82
+ subject
83
+ index = IdxNodesString.find(:first, :conditions => {:key => 'origin', :node_id => subject.id})
84
+ assert_equal 'origin', index.key
85
+ assert_equal 'Dada', index.value
86
+ end
87
+
88
+ should 'keep index entries up to date' do
89
+ subject
90
+
91
+ assert_difference('IdxNodesString.count', 0) do
92
+ subject.update_attributes(:origin => 'Surrealism')
93
+ end
94
+
95
+ index = IdxNodesString.find(:first, :conditions => {:key => 'origin', :node_id => subject.id})
96
+ assert_equal 'origin', index.key
97
+ assert_equal 'Surrealism', index.value
98
+ end
99
+
100
+ should 'find indexed nodes with exact search' do
101
+ subject # create index entry
102
+ assert node = Node.search_records(:origin => 'Dada').first
103
+ assert_equal nodes_id(:art), node.id
104
+ end
105
+
106
+ should 'find indexed nodes with hash search' do
107
+ subject # create index entry
108
+ assert node = Node.search_records(:origin => 'Dada').first
109
+ assert_equal nodes_id(:art), node.id
110
+ end
111
+ end # setting an indexed field
112
+ end # on a node with write access
113
+ end # A logged in user
114
+
13
115
  def test_rebuild_fullpath
14
116
  Node.connection.execute "UPDATE nodes SET fullpath = NULL, basepath = NULL WHERE id = #{nodes_id(:wiki)}"
15
117
  login(:ant)
@@ -36,109 +138,23 @@ class NodeTest < Zena::Unit::TestCase
36
138
 
37
139
  def test_match_query
38
140
  query = Node.match_query('smala')
39
- assert_equal "nodes.name LIKE 'smala%'", query[:conditions]
141
+ assert_equal "nodes.node_name LIKE 'smala%'", query[:conditions]
40
142
  query = Node.match_query('.', :node => nodes(:wiki))
41
143
  assert_equal ["parent_id = ?", nodes_id(:wiki)], query[:conditions]
42
144
  end
43
145
 
44
- def transform_attributes_zazen_shortcut_v_text
45
- login(:lion)
46
- [
47
- ["Hi, this is just a simple \"test\"::w or \"\"::w+_life.rss. OK ?\n\n!:lake+_pv!",
48
- "Hi, this is just a simple \"test\":25 or \"\":29_life.rss. OK ?\n\n!24_pv!"],
49
-
50
- ["Hi ![30,:lake+]! ![]!",
51
- "Hi ![30,24]! ![]!"],
52
-
53
- ["Hi !{:bird,:lake+}! !{}!",
54
- "Hi !{30,24}! !{}!"],
55
-
56
- ["Hi !30!::clean !:bird!::clean !:bird/nice bird!:21 !30_pv/hello ladies!:21",
57
- "Hi !30!:21 !30!:21 !30/nice bird!:21 !30_pv/hello ladies!:21"],
58
-
59
- ["Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!",
60
- "Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!"],
61
- ].each do |src,res|
62
- assert_equal res, secure(Node) { Node.transform_attributes( 'v_text' => src )['v_text'] }
63
- end
64
- end
65
-
66
- def test_transform_attributes
67
- login(:tiger)
68
- visitor[:time_zone] = "Europe/Zurich"
69
- [
70
- [{'parent_id' => 'lake+'},
71
- {'parent_id' => nodes_id(:lake_jpg)}],
72
-
73
- [{'d_super_id' => 'lake', 'd_other_id' => '11'},
74
- {'d_super_id' => nodes_zip(:lake), 'd_other_id' => 11}],
75
-
76
- [{'tag_ids' => "33,news"},
77
- {'tag_ids' => [nodes_id(:art), nodes_id(:news)]}],
78
-
79
- [{'parent_id' => '999', 'tag_ids' => "999,34,art"},
80
- {'parent_id' => '999', 'tag_ids' => [nodes_id(:news),nodes_id(:art)]}],
81
-
82
- [{'link' => {'hot' => {'other_id' => '22', 'date' => '2009-7-15 16:58' }}},
83
- {'link' => {'hot' => {'other_id' => nodes_id(:status), 'date' => Time.gm(2009,7,15,16,58)}}}], # this should be 14:58 when #255 is fixed (tz support).
84
- ].each do |src,res|
85
- assert_equal res, secure(Node) { Node.transform_attributes( src ) }
86
- end
87
- end
88
-
89
- def test_get_fullpath_rebuild
90
- login(:lion)
91
- node = secure!(Node) { nodes(:lake) }
92
- assert_equal 'projects/cleanWater/lakeAddress', node.fullpath
93
- assert node.update_attributes(:parent_id => nodes_id(:collections))
94
- assert_equal 'collections/lakeAddress', node.fullpath
95
- end
96
-
97
- def test_fullpath_updated_on_parent_rename
98
- login(:tiger)
99
- node = secure!(Node) { nodes(:tiger) }
100
- assert_equal 'people/tiger', node.fullpath
101
- node = secure!(Node) { nodes(:tiger) }
102
- assert_equal 'people/tiger', node[:fullpath] # make sure fullpath is cached
103
-
104
- node = secure!(Node) { nodes(:people) }
105
- assert node.update_attributes(:v_title => 'nice people')
106
- assert node.publish
107
- assert_equal 'nicePeople', node.name # sync name
108
- node = secure!(Node) { nodes(:tiger) }
109
- assert_equal 'nicePeople/tiger', node[:fullpath]
110
- end
111
-
112
- def test_rootpath
113
- login(:ant)
114
- node = secure!(Node) { nodes(:status) }
115
- assert_equal 'zena/projects/cleanWater/status', node.rootpath
116
- node = secure!(Node) { nodes(:zena) }
117
- assert_equal 'zena', node.rootpath
118
- end
119
-
120
- def test_basepath
121
- login(:tiger)
122
- node = secure!(Node) { nodes(:status) }
123
- assert_equal 'projects/cleanWater', node.basepath
124
- node = secure!(Node) { nodes(:projects) }
125
- assert_equal '', node.basepath
126
- node = secure!(Node) { nodes(:proposition) }
127
- assert_equal '', node.basepath
128
- end
129
-
130
146
  def test_ancestors
131
147
  Node.connection.execute "UPDATE nodes SET parent_id = #{nodes_id(:proposition)} WHERE id = #{nodes_id(:bird_jpg)}"
132
148
  login(:tiger)
133
149
  node = secure!(Node) { nodes(:status) }
134
- assert_equal ['zena', 'projects', 'cleanWater'], node.ancestors.map { |a| a[:name] }
150
+ assert_equal ['zena', 'projects', 'cleanWater'], node.ancestors.map { |a| a[:node_name] }
135
151
  node = secure!(Node) { nodes(:zena) }
136
152
  assert_equal [], node.ancestors
137
153
  node = secure!(Node) { nodes(:bird_jpg) }
138
154
  prop = secure!(Node) { nodes(:proposition)}
139
155
  assert_kind_of Node, prop
140
156
  assert prop.can_read?
141
- assert_equal ['zena', 'projects', 'secret', 'proposition'], node.ancestors.map { |a| a[:name] }
157
+ assert_equal ['zena', 'projects', 'secret', 'proposition'], node.ancestors.map { |a| a[:node_name] }
142
158
  end
143
159
 
144
160
  def test_ancestors_infinit_loop
@@ -152,12 +168,12 @@ class NodeTest < Zena::Unit::TestCase
152
168
  login(:tiger)
153
169
  node = secure!(Node) { nodes(:proposition) }
154
170
  assert_kind_of Node, node
155
- assert_equal ['zena', 'projects', 'secret'], node.ancestors.map { |a| a[:name] } # ant can view 'proposition' but not the project proposition is in
171
+ assert_equal ['zena', 'projects', 'secret'], node.ancestors.map { |a| a[:node_name] } # ant can view 'proposition' but not the project proposition is in
156
172
  end
157
173
 
158
174
  def test_create_simplest
159
175
  login(:ant)
160
- test_page = secure!(Node) { Node.create(:name=>"yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
176
+ test_page = secure!(Node) { Node.create(:node_name => 'yoba', :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
161
177
  assert ! test_page.new_record? , "Not a new record"
162
178
  assert_equal nodes_id(:cleanWater), test_page.parent[:id]
163
179
  assert_equal 'projects/cleanWater/yoba', test_page.fullpath
@@ -166,15 +182,6 @@ class NodeTest < Zena::Unit::TestCase
166
182
  assert_equal 'projects/cleanWater', parent.fullpath
167
183
  end
168
184
 
169
- def test_cannot_update_v_status
170
- login(:ant)
171
- test_page = secure!(Node) { nodes(:status) }
172
- assert_equal 2, test_page.version.number
173
- assert test_page.update_attributes( :v_status => Zena::Status[:pub], :v_title => "New funky title")
174
- assert_equal 3, test_page.version.number
175
- assert_equal Zena::Status[:red], test_page.version.status
176
- end
177
-
178
185
  def test_new_bad_parent
179
186
  login(:tiger)
180
187
  attrs = NEW_DEFAULT.dup
@@ -208,16 +215,16 @@ class NodeTest < Zena::Unit::TestCase
208
215
  assert node.save , "Save succeeds"
209
216
  end
210
217
 
211
- def test_page_new_without_name
218
+ def test_page_new_without_node_name
212
219
  login(:tiger)
213
- node = secure!(Node) { Node.new(:parent_id=>nodes_id(:cleanWater)) }
220
+ node = secure!(Node) { Node.new(:parent_id => nodes_id(:cleanWater)) }
214
221
  assert ! node.save, 'Save fails'
215
- assert_equal 'can\'t be blank', node.errors[:name]
222
+ assert_equal 'can\'t be blank', node.errors[:node_name]
216
223
  end
217
224
 
218
225
  def test_new_set_section_id
219
226
  login(:tiger)
220
- node = secure!(Page) { Page.create(:parent_id=>nodes_id(:people), :name=>'SuperPage')}
227
+ node = secure!(Page) { Page.create(:parent_id => nodes_id(:people), :node_name => 'SuperPage')}
221
228
  assert ! node.new_record?, 'Not a new record'
222
229
  assert_equal nodes_id(:people), node[:section_id]
223
230
  end
@@ -256,17 +263,17 @@ class NodeTest < Zena::Unit::TestCase
256
263
  assert node.save , "Save succeeds"
257
264
  end
258
265
 
259
- def test_page_update_without_name
266
+ def test_page_update_without_node_name
260
267
  login(:tiger)
261
268
  node = secure!(Node) { nodes(:status) }
262
- node[:name] = nil
269
+ node[:node_name] = nil
263
270
  assert node.save, 'Save succeeds'
264
- assert_equal 'statusTitle', node[:name]
271
+ assert_equal 'statusTitle', node[:node_name]
265
272
  node = secure!(Node) { nodes(:status) }
266
- node[:name] = nil
267
- node.version.title = ""
273
+ node[:node_name] = nil
274
+ node.title = ""
268
275
  assert !node.save, 'Save fails'
269
- assert_equal 'can\'t be blank', node.errors[:name]
276
+ assert_equal 'can\'t be blank', node.errors[:node_name]
270
277
  end
271
278
 
272
279
  def test_update_set_section_id
@@ -280,23 +287,6 @@ class NodeTest < Zena::Unit::TestCase
280
287
  assert_equal nodes_id(:zena), node[:section_id]
281
288
  end
282
289
 
283
- def test_before_destroy
284
- login(:tiger)
285
- node = secure!(Node) { nodes(:projects) }
286
- assert !node.destroy, "Cannot destroy"
287
- assert_equal 'cannot be removed (contains subpages or data)', node.errors[:base]
288
- node = secure!(Node) { nodes(:bananas) }
289
- assert node.destroy, "Can destroy"
290
- end
291
-
292
- def test_cannot_destroy_has_private
293
- login(:tiger)
294
- node = secure!(Node) { nodes(:lion) }
295
- assert_nil node.find(:all, 'pages'), "No subpages"
296
- assert !node.destroy, "Cannot destroy"
297
- assert_equal 'cannot be removed (contains subpages or data)', node.errors[:base]
298
- end
299
-
300
290
  def test_parent
301
291
  login(:anon)
302
292
  assert_equal nodes_id(:projects), secure!(Node) { nodes(:wiki) }.parent[:id]
@@ -339,13 +329,13 @@ class NodeTest < Zena::Unit::TestCase
339
329
  def test_new_child
340
330
  login(:ant)
341
331
  node = secure!(Node) { nodes(:cleanWater) }
342
- child = node.new_child( :name => 'status', :class => Page )
332
+ child = node.new_child(:node_name => 'status', :class => Page )
343
333
  assert !child.save, "Save fails"
344
- assert child.errors[:name].any?
334
+ assert child.errors[:node_name].any?
345
335
 
346
- child = node.new_child( :name => 'new_name', :class => Page )
336
+ child = node.new_child(:node_name => 'new_name', :class => Page )
347
337
  assert child.save , "Save succeeds"
348
- assert_equal Zena::Status[:red], child.version.status
338
+ assert_equal Zena::Status[:red], child.v_status
349
339
  assert_equal child[:user_id], users_id(:ant)
350
340
  assert_equal node[:dgroup_id], child[:dgroup_id]
351
341
  assert_equal node[:rgroup_id], child[:rgroup_id]
@@ -374,36 +364,22 @@ class NodeTest < Zena::Unit::TestCase
374
364
  assert_equal 'Solenopsis Invicta', node.author.fullname
375
365
  end
376
366
 
377
- def test_ext
378
- node = nodes(:status)
379
- node[:name] = 'bob. and bob.jpg'
380
- assert_equal 'jpg', node.ext
381
- node[:name] = 'no ext'
382
- assert_equal '', node.ext
383
- node[:name] = ''
384
- assert_equal '', node.ext
385
- node[:name] = nil
386
- assert_equal '', node.ext
387
- end
388
-
389
- def test_set_name_with_title
367
+ def test_set_node_name_with_title
390
368
  login(:tiger)
391
- node = secure!(Node) { Node.create(NEW_DEFAULT.stringify_keys.merge('name' => '', 'v_title' => 'small bed')) }
369
+ node = secure!(Node) { Node.create(NEW_DEFAULT.stringify_keys.merge('node_name' => '', 'title' => 'small bed')) }
392
370
  assert_kind_of Node, node
393
371
  assert !node.new_record?
394
- assert_equal 'smallBed', node.name
372
+ assert_equal 'smallBed', node.node_name
395
373
  end
396
374
 
397
- def test_set_name
375
+ def test_set_node_name
398
376
  node = nodes(:wiki)
399
- node.name = " J'aime l'aïl en août ! "
400
- assert_equal 'JAimeLAilEnAout', node.name
401
- assert_equal 'JAimeLAilEnAout', node[:name]
402
- node.name = "LIEUX"
403
- assert_equal 'LIEUX', node.name
377
+ node.node_name = " J'aime l'aïl en août ! "
378
+ assert_equal 'JAimeLAilEnAout', node.node_name
379
+ node.node_name = "LIEUX"
380
+ assert_equal 'LIEUX', node.node_name
404
381
  end
405
382
 
406
-
407
383
  def test_change_project_to_page
408
384
  login(:tiger)
409
385
  node = secure!(Node) { nodes(:cleanWater) }
@@ -439,7 +415,7 @@ class NodeTest < Zena::Unit::TestCase
439
415
  end
440
416
 
441
417
  should 'be allowed to change attributes' do
442
- assert @node.update_attributes(:name => 'vodou', :event_at => Time.now)
418
+ assert @node.update_attributes(:node_name => 'vodou', :event_at => Time.now)
443
419
  end
444
420
 
445
421
  should 'not be allowed to set parent' do
@@ -452,79 +428,82 @@ class NodeTest < Zena::Unit::TestCase
452
428
  context 'A visitor with drive access' do
453
429
  setup do
454
430
  login(:tiger)
455
- @node = secure!(Node) { nodes(:wiki) }
456
431
  end
457
432
 
458
433
  context 'on a published node with documents' do
459
434
 
435
+ subject do
436
+ secure!(Node) { nodes(:wiki) }
437
+ end
438
+
460
439
  should 'see a published node with published documents' do
461
- assert_equal Zena::Status[:pub], @node.version.status
440
+ assert_equal Zena::Status[:pub], subject.v_status
462
441
  assert_equal Zena::Status[:pub], versions(:bird_jpg_en).status
463
442
  assert_equal Zena::Status[:pub], versions(:flower_jpg_en).status
464
443
  end
465
444
 
466
445
  should 'unpublish documents when unpublishing node' do
467
- assert @node.unpublish
446
+ assert subject.unpublish
468
447
  assert_equal Zena::Status[:rem], versions(:bird_jpg_en).status
469
448
  assert_equal Zena::Status[:rem], versions(:flower_jpg_en).status
470
449
  end
471
450
  end
472
451
 
473
452
  context 'on a removed node with removed documents' do
474
- setup do
475
- @node.unpublish
476
- @node = secure!(Node) { nodes(:wiki) }
477
- end
478
-
479
- should 'see a removed node with removed documents' do
480
- assert_equal Zena::Status[:rem], @node.version.status
481
- assert_equal Zena::Status[:rem], versions(:bird_jpg_en).status
482
- assert_equal Zena::Status[:rem], versions(:flower_jpg_en).status
453
+ subject do
454
+ node = secure!(Node) { nodes(:wiki) }
455
+ node.unpublish
456
+ node.reload
457
+ node
483
458
  end
484
459
 
485
460
  should 'publish documents when publishing node' do
486
- assert @node.publish
461
+ assert subject.publish
487
462
  assert_equal Zena::Status[:pub], versions(:bird_jpg_en).status
488
463
  assert_equal Zena::Status[:pub], versions(:flower_jpg_en).status
489
464
  end
490
465
  end
491
466
 
492
467
  context 'on a redaction node with documents in redaction status' do
493
- setup do
494
- @node.unpublish
495
- @node.redit
496
- @node = secure!(Node) { nodes(:wiki) }
468
+ subject do
469
+ node = secure!(Node) { nodes(:wiki) }
470
+ node.unpublish
471
+ node.redit
472
+ node.reload
473
+ node
497
474
  end
498
475
 
499
476
  should 'see redactions' do
500
- assert_equal Zena::Status[:red], @node.version.status
477
+ assert_equal Zena::Status[:red], subject.v_status
501
478
  assert_equal Zena::Status[:red], versions(:bird_jpg_en).status
502
479
  assert_equal Zena::Status[:red], versions(:flower_jpg_en).status
503
480
  end
504
481
 
505
482
  should 'propose documents when proposing node' do
506
- assert @node.propose
483
+ assert subject.propose
507
484
  assert_equal Zena::Status[:prop_with], versions(:bird_jpg_en).status
508
485
  assert_equal Zena::Status[:prop_with], versions(:flower_jpg_en).status
509
486
  end
510
487
  end
511
488
 
512
489
  context 'on a proposition with proposed documents' do
513
- setup do
514
- @node.unpublish
515
- @node.redit
516
- @node.propose
517
- @node = secure!(Node) { nodes(:wiki) }
490
+ subject do
491
+ node = secure!(Node) { nodes(:wiki) }
492
+ node.unpublish
493
+ node.redit
494
+ node.propose
495
+ node.reload
496
+ node
518
497
  end
519
498
 
520
499
  should 'see propositions' do
521
- assert_equal Zena::Status[:prop], @node.version.status
500
+ assert_equal Zena::Status[:prop], subject.v_status
522
501
  assert_equal Zena::Status[:prop_with], versions(:bird_jpg_en).status
523
502
  assert_equal Zena::Status[:prop_with], versions(:flower_jpg_en).status
524
503
  end
525
504
 
526
505
  should 'refuse documents when refusing node' do
527
- assert @node.refuse
506
+ assert subject.refuse
528
507
  assert_equal Zena::Status[:red], versions(:bird_jpg_en).status
529
508
  assert_equal Zena::Status[:red], versions(:flower_jpg_en).status
530
509
  end
@@ -614,13 +593,13 @@ class NodeTest < Zena::Unit::TestCase
614
593
  assert @node.save
615
594
  tags = @node.find(:all, 'set_tags')
616
595
  assert_equal 2, tags.size
617
- assert_equal 'art', tags[0].name
618
- assert_equal 'news', tags[1].name
596
+ assert_equal 'art', tags[0].node_name
597
+ assert_equal 'news', tags[1].node_name
619
598
  @node.rel['set_tag'].other_ids = [nodes_id(:art)]
620
599
  @node.save
621
600
  tags = @node.find(:all, 'set_tags')
622
601
  assert_equal 1, tags.size
623
- assert_equal 'art', tags[0].name
602
+ assert_equal 'art', tags[0].node_name
624
603
  end
625
604
 
626
605
  def test_tag_update
@@ -647,7 +626,7 @@ class NodeTest < Zena::Unit::TestCase
647
626
  # do something on a project
648
627
  node = secure!(Node) { nodes(:wiki) }
649
628
  assert_equal 'NPP', node.class.kpath
650
- assert node.update_attributes(:v_title=>'new title'), "Can change attributes"
629
+ assert node.update_attributes(:title=>'new title'), "Can change attributes"
651
630
  # sweep only kpath NPP
652
631
  i = 3
653
632
  assert_equal "content 3", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
@@ -656,7 +635,7 @@ class NodeTest < Zena::Unit::TestCase
656
635
  # do something on a note
657
636
  node = secure!(Node) { nodes(:proposition) }
658
637
  assert_equal 'NNP', node.vclass.kpath
659
- assert node.update_attributes(:name => 'popo' ), "Can change attributes"
638
+ assert node.update_attributes(:node_name => 'popo' ), "Can change attributes"
660
639
  # sweep only kpath NN
661
640
  i = 4
662
641
  assert_equal "content 3", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
@@ -674,7 +653,7 @@ class NodeTest < Zena::Unit::TestCase
674
653
  def test_discussion_lang
675
654
  login(:tiger)
676
655
  node = secure!(Node) { nodes(:status) }
677
- assert_equal Zena::Status[:pub], node.version.status
656
+ assert_equal Zena::Status[:pub], node.v_status
678
657
  discussion = node.discussion
679
658
  assert_kind_of Discussion, discussion
680
659
  assert_equal discussions_id(:outside_discussion_on_status_en), discussion[:id]
@@ -697,7 +676,7 @@ class NodeTest < Zena::Unit::TestCase
697
676
  login(:ant)
698
677
  node = secure!(Node) { nodes(:status) }
699
678
  assert_nil node.discussion
700
- node.update_attributes( :v_title=>'test' )
679
+ node.update_attributes( :title=>'test' )
701
680
  discussion = node.discussion
702
681
  assert_kind_of Discussion, discussion
703
682
  assert discussion.inside?
@@ -706,20 +685,20 @@ class NodeTest < Zena::Unit::TestCase
706
685
  def test_inside_discussion
707
686
  login(:tiger)
708
687
  node = secure!(Node) { nodes(:status) }
709
- node.update_attributes( :v_title=>'new status' )
710
- assert_equal Zena::Status[:red], node.version.status
688
+ node.update_attributes( :title=>'new status' )
689
+ assert_equal Zena::Status[:red], node.v_status
711
690
  discussion = node.discussion
712
691
  assert_equal discussions_id(:inside_discussion_on_status), discussion[:id]
713
692
  end
714
693
 
715
694
  def test_auto_create_discussion
716
695
  login(:tiger)
717
- post = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a new post', :class => 'Post', :parent_id => nodes_zip(:cleanWater)) }
718
- letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
696
+ post = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :title => 'a new post', :class => 'Post', :parent_id => nodes_zip(:cleanWater)) }
697
+ letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
719
698
  assert !post.new_record?, "Not a new record"
720
699
  assert !letter.new_record?, "Not a new record"
721
- assert_equal Zena::Status[:pub], post.version.status, "Published"
722
- assert_equal Zena::Status[:pub], letter.version.status, "Published"
700
+ assert_equal Zena::Status[:pub], post.v_status, "Published"
701
+ assert_equal Zena::Status[:pub], letter.v_status, "Published"
723
702
  assert !letter.discussion
724
703
  assert post.discussion
725
704
  assert !post.discussion.new_record?
@@ -732,9 +711,9 @@ class NodeTest < Zena::Unit::TestCase
732
711
 
733
712
  def test_auto_create_discussion
734
713
  login(:tiger)
735
- letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
714
+ letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
736
715
  assert !letter.new_record?, "Not a new record"
737
- assert_equal Zena::Status[:pub], letter.version.status, "Published"
716
+ assert_equal Zena::Status[:pub], letter.v_status, "Published"
738
717
  login(:lion)
739
718
  letter = secure!(Node) { Node.find(letter.id) }
740
719
  assert letter.can_auto_create_discussion?
@@ -768,14 +747,14 @@ class NodeTest < Zena::Unit::TestCase
768
747
 
769
748
  def test_other_site_id
770
749
  login(:whale)
771
- node = secure!(Node) { Node.create(:parent_id=>nodes_id(:ocean), :rgroup_id=>groups_id(:aqua), :wgroup_id=>groups_id(:masters), :dgroup_id=>groups_id(:masters), :name=>"fish") }
750
+ node = secure!(Node) { Node.create(:parent_id => nodes_id(:ocean), :rgroup_id => groups_id(:aqua), :wgroup_id => groups_id(:masters), :dgroup_id => groups_id(:masters), :node_name => "fish") }
772
751
  assert !node.new_record?, "Not a new record"
773
752
  assert_equal sites_id(:ocean), node[:site_id]
774
753
  end
775
754
 
776
755
  def test_other_site_id_fool_id
777
756
  login(:whale)
778
- node = secure!(Node) { Node.create(:parent_id=>nodes_id(:ocean), :rgroup_id=>groups_id(:aqua), :wgroup_id=>groups_id(:masters), :dgroup_id=>groups_id(:masters), :name=>"fish", :site_id=>sites_id(:zena)) }
757
+ node = secure!(Node) { Node.create(:parent_id => nodes_id(:ocean), :rgroup_id => groups_id(:aqua), :wgroup_id => groups_id(:masters), :dgroup_id => groups_id(:masters), :node_name => "fish", :site_id => sites_id(:zena)) }
779
758
  assert !node.new_record?, "Not a new record"
780
759
  assert_equal sites_id(:ocean), node[:site_id]
781
760
  end
@@ -788,10 +767,16 @@ class NodeTest < Zena::Unit::TestCase
788
767
  assert_equal original_site_id, node.site_id
789
768
  end
790
769
 
770
+ def test_cannot_set_site_id_with_new_record
771
+ login(:tiger)
772
+ node = Node.new(:site_id => 1234)
773
+ assert_nil node.site_id
774
+ end
775
+
791
776
  def test_zip
792
- next_zip = Zena::Db.fetch_row("SELECT zip FROM zips WHERE site_id = #{sites_id(:zena)}").to_i
777
+ next_zip = Zena::Db.fetch_attribute("SELECT zip FROM zips WHERE site_id = #{sites_id(:zena)}").to_i
793
778
  login(:tiger)
794
- node = secure!(Node) { Node.create(:parent_id=>nodes_id(:zena), :name=>"fly")}
779
+ node = secure!(Node) { Node.create(:parent_id=>nodes_id(:zena), :node_name => "fly")}
795
780
  assert !node.new_record?, "Not a new record"
796
781
  assert_equal (next_zip + 1), node.zip
797
782
  end
@@ -812,7 +797,7 @@ class NodeTest < Zena::Unit::TestCase
812
797
 
813
798
  def test_create_node
814
799
  login(:ant)
815
- node = secure!(Node) { Node.create_node(:parent_id => nodes_zip(:secret), :name => 'funny') }
800
+ node = secure!(Node) { Node.create_node(:parent_id => nodes_zip(:secret), :node_name => 'funny') }
816
801
  assert_equal nodes_id(:secret), node[:parent_id]
817
802
  assert node.new_record?, "Not saved"
818
803
  assert_equal 'invalid reference', node.errors[:parent_id]
@@ -820,7 +805,7 @@ class NodeTest < Zena::Unit::TestCase
820
805
 
821
806
  def test_create_node_with__parent_id
822
807
  login(:ant)
823
- node = secure!(Node) { Node.create_node(:_parent_id => nodes_id(:secret), :name => 'funny') }
808
+ node = secure!(Node) { Node.create_node(:_parent_id => nodes_id(:secret), :node_name => 'funny') }
824
809
  assert_equal nodes_id(:secret), node[:parent_id]
825
810
  assert node.new_record?, "Not saved"
826
811
  assert_equal 'invalid reference', node.errors[:parent_id]
@@ -828,36 +813,36 @@ class NodeTest < Zena::Unit::TestCase
828
813
 
829
814
  def test_create_node_ok
830
815
  login(:tiger)
831
- node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'funny') }
816
+ node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:cleanWater), 'node_name' => 'funny') }
832
817
  assert_equal nodes_id(:cleanWater), node[:parent_id]
833
- assert_equal 'funny', node[:name]
818
+ assert_equal 'funny', node[:node_name]
834
819
  assert !node.new_record?
835
820
  end
836
821
 
837
822
  def test_create_or_update_node_create
838
823
  login(:tiger)
839
- node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'funny') }
824
+ node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'node_name' => 'funny') }
840
825
  assert_equal nodes_id(:cleanWater), node[:parent_id]
841
- assert_equal 'funny', node[:name]
826
+ assert_equal 'funny', node[:node_name]
842
827
  assert !node.new_record?, "Saved"
843
828
  end
844
829
 
845
830
  def test_create_or_update_node_update
846
831
  login(:tiger)
847
- node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'status', 'v_title'=>"It's all broken") }
832
+ node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'node_name' => 'status', 'title'=>"It's all broken") }
848
833
  assert_equal nodes_id(:cleanWater), node[:parent_id]
849
834
  assert_equal nodes_id(:status), node[:id]
850
835
  node = secure!(Node) { nodes(:status) }
851
- assert_equal 'status', node[:name]
852
- assert_equal "It's all broken", node.version.title
836
+ assert_equal 'status', node[:node_name]
837
+ assert_equal "It's all broken", node.title
853
838
  end
854
839
 
855
840
  def test_create_with_klass
856
841
  login(:tiger)
857
- node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:projects), 'name' => 'funny', 'klass' => 'TextDocument', 'c_content_type' => 'application/x-javascript') }
842
+ node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:projects), 'node_name' => 'funny', 'klass' => 'TextDocument', 'content_type' => 'application/x-javascript') }
858
843
  assert_kind_of TextDocument, node
859
844
  assert_equal nodes_id(:projects), node[:parent_id]
860
- assert_equal 'funny', node[:name]
845
+ assert_equal 'funny', node[:node_name]
861
846
  assert !node.new_record?, "Saved"
862
847
  end
863
848
 
@@ -865,7 +850,7 @@ class NodeTest < Zena::Unit::TestCase
865
850
  assert_equal Node, Node.get_class('node')
866
851
  assert_equal Node, Node.get_class('nodes')
867
852
  assert_equal Node, Node.get_class('Node')
868
- assert_equal virtual_classes(:Letter), Node.get_class('Letter')
853
+ assert_equal roles(:Letter), Node.get_class('Letter')
869
854
  assert_equal TextDocument, Node.get_class('TextDocument')
870
855
  end
871
856
 
@@ -893,67 +878,67 @@ done: \"I am done\""
893
878
 
894
879
  def test_create_nodes_from_gzip_file
895
880
  login(:tiger)
896
- parent = secure!(Project) { Project.create(:name => 'import', :parent_id => nodes_id(:zena)) }
881
+ parent = secure!(Project) { Project.create(:node_name => 'import', :parent_id => nodes_id(:zena)) }
897
882
  assert !parent.new_record?, "Not a new record"
898
883
  nodes = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('simple.zml.gz'), :parent_id => parent[:id] )}.values
899
884
  assert_equal 1, nodes.size
900
885
  simple = nodes[0]
901
886
  assert_kind_of Note, simple
902
- assert_equal virtual_classes(:Post), simple.vclass
887
+ assert_equal roles(:Post), simple.vclass
903
888
  assert !simple.new_record?
904
889
  end
905
890
 
906
891
  def test_create_nodes_from_folder_with_defaults
907
892
  login(:tiger)
908
- parent = secure!(Project) { Project.create(:name => 'import', :parent_id => nodes_id(:zena), :rgroup_id => groups_id(:managers), :wgroup_id => groups_id(:managers)) }
893
+ parent = secure!(Project) { Project.create(:node_name => 'import', :parent_id => nodes_id(:zena), :rgroup_id => groups_id(:managers), :wgroup_id => groups_id(:managers)) }
909
894
  assert !parent.new_record?, "Not a new record"
910
895
  result = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => parent[:id] )}.values
911
896
  assert_equal 4, result.size
912
897
 
913
- children = parent.find(:all, 'children order by name ASC')
898
+ children = parent.find(:all, 'children order by node_name asc')
914
899
  assert_equal 2, children.size
915
- assert_equal 'photos', children[0].name
900
+ assert_equal 'Photos', children[0].node_name
916
901
  assert_equal groups_id(:managers), children[0].rgroup_id
917
- assert_equal 'simple', children[1].name
902
+ assert_equal 'simple', children[1].node_name
918
903
  assert_equal groups_id(:managers), children[1].rgroup_id
919
904
 
920
905
  # we use children[1] as parent just to use any empty node
921
906
  result = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => children[1][:id], :defaults => { :rgroup_id => groups_id(:public) } )}.values
922
907
  assert_equal 4, result.size
923
908
 
924
- children = children[1].find(:all, 'children order by name ASC')
909
+ children = children[1].find(:all, 'children order by node_name ASC')
925
910
  assert_equal 2, children.size
926
- assert_equal 'photos', children[0].name
911
+ assert_equal 'Photos', children[0].node_name
927
912
  assert_equal groups_id(:public), children[0].rgroup_id
928
913
  end
929
914
 
930
915
  def test_create_nodes_from_folder_with_publish
931
916
  login(:tiger)
932
917
  nodes = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => nodes_id(:zena) )}.values
933
- assert_equal Zena::Status[:red], nodes[0].version.status
918
+ assert_equal Zena::Status[:red], nodes[0].v_status
934
919
 
935
920
  nodes = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => nodes_id(:cleanWater), :defaults => { :v_status => Zena::Status[:pub] }) }.values
936
- assert_equal Zena::Status[:pub], nodes[0].version.status
921
+ assert_equal Zena::Status[:pub], nodes[0].v_status
937
922
  end
938
923
 
939
924
  def test_create_nodes_from_archive
940
925
  login(:tiger)
941
926
  res = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('import.tgz'), :parent_id => nodes_id(:zena)) }.values
942
- photos = secure!(Section) { Section.find_by_name('photos') }
927
+ photos = secure!(Section) { Section.find_by_node_name('Photos') }
943
928
  assert_kind_of Section, photos
944
- bird = secure!(Node) { Node.find_by_parent_id_and_name(photos[:id], 'bird') }
929
+ bird = secure!(Node) { Node.find_by_parent_id_and_node_name(photos[:id], 'bird') }
945
930
  assert_kind_of Image, bird
946
- assert_equal 56183, bird.version.content.size
947
- assert_equal 'Lucy in the sky', bird.version.title
931
+ assert_equal 56183, bird.size
932
+ assert_equal 'Lucy in the sky', bird.text
948
933
  visitor.lang = 'fr'
949
- bird = secure!(Node) { Node.find_by_parent_id_and_name(photos[:id], 'bird') }
950
- assert_equal 'Le septième ciel', bird.version.title
934
+ bird = secure!(Node) { Node.find_by_parent_id_and_node_name(photos[:id], 'bird') }
935
+ assert_equal 'Le septième ciel', bird.text
951
936
  assert_equal 1, bird[:inherit]
952
937
  assert_equal groups_id(:public), bird[:rgroup_id]
953
938
  assert_equal groups_id(:workers), bird[:wgroup_id]
954
939
  assert_equal groups_id(:managers), bird[:dgroup_id]
955
940
 
956
- simple = secure!(Node) { Node.find_by_parent_id_and_name(nodes_id(:zena), 'simple') }
941
+ simple = secure!(Node) { Node.find_by_parent_id_and_node_name(nodes_id(:zena), 'simple') }
957
942
  assert_equal 0, simple[:inherit]
958
943
  assert_equal groups_id(:managers), simple[:rgroup_id]
959
944
  assert_equal groups_id(:managers), simple[:wgroup_id]
@@ -963,7 +948,7 @@ done: \"I am done\""
963
948
  def test_create_nodes_from_zip_archive
964
949
  login(:tiger)
965
950
  res = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_zip('letter.zip'), :parent_id => nodes_id(:zena), :class => 'Letter') }.values
966
- res.sort!{|a,b| a.name <=> b.name}
951
+ res.sort!{|a,b| a.node_name <=> b.node_name}
967
952
  letter, bird = res[1], res[0]
968
953
  assert_kind_of Note, letter
969
954
  assert_equal 'Letter', letter.klass
@@ -973,17 +958,16 @@ done: \"I am done\""
973
958
  preserving_files('test.host/data') do
974
959
  bird = node = nil
975
960
  login(:tiger)
976
- node = secure!(Page) { Page.create(:parent_id => nodes_id(:status), :name=>'photos', :v_title => 'my photos', :v_text => '![]!') }
961
+ node = secure!(Page) { Page.create(:parent_id => nodes_id(:status), :title => 'Photos', :text => '![]!') }
977
962
  assert !node.new_record?
978
- assert_nothing_raised { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos') } }
979
- assert_raise(ActiveRecord::RecordNotFound) { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos/bird') } }
980
- assert_equal 'photos', node.name
981
- assert_no_match %r{I took during my last vacations}, node.version.text
963
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path('projects/cleanWater/status/Photos') } }
964
+ assert_raise(ActiveRecord::RecordNotFound) { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/Photos/bird') } }
965
+ assert_no_match %r{I took during my last vacations}, node.text
982
966
  v1_id = node.version.id
983
- secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('import.tgz'), :parent_id => nodes_id(:status)) }.values
984
- assert_nothing_raised { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos') } }
985
- assert_nothing_raised { bird = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos/bird') } }
986
- assert_match %r{I took during my last vacations}, node.version.text
967
+ secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('import.tgz'), :parent_id => nodes_id(:status)) }
968
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path('projects/cleanWater/status/Photos') } }
969
+ assert_nothing_raised { bird = secure!(Node) { Node.find_by_path('projects/cleanWater/status/Photos/bird') } }
970
+ assert_match %r{I took during my last vacations}, node.text
987
971
  assert_equal v1_id, node.version.id
988
972
  assert_kind_of Image, bird
989
973
  end
@@ -995,10 +979,10 @@ done: \"I am done\""
995
979
  visitor.time_zone = 'Asia/Jakarta'
996
980
  assert_equal 'Asia/Jakarta', visitor.time_zone
997
981
  status = secure!(Node) { nodes(:status) }
998
- assert status.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :v_text => "This is a \"link\":#{nodes_zip(:projects)}.", :d_foo => "A picture: !#{nodes_zip(:bird_jpg)}!")
982
+ assert status.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :text => "This is a \"link\":#{nodes_zip(:projects)}.", :origin => "A picture: !#{nodes_zip(:bird_jpg)}!")
999
983
  yaml = status.to_yaml
1000
- assert_match %r{v_text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
1001
- assert_match %r{d_foo:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
984
+ assert_match %r{text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
985
+ assert_match %r{origin:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
1002
986
  assert_no_match %r{log_at}, yaml
1003
987
  end
1004
988
 
@@ -1006,11 +990,11 @@ done: \"I am done\""
1006
990
  login(:tiger)
1007
991
  visitor.time_zone = 'Asia/Jakarta'
1008
992
  prop = secure!(Node) { nodes(:proposition) }
1009
- assert prop.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :v_text => "This is a \"link\":#{nodes_zip(:projects)}.", :d_foo => "A picture: !#{nodes_zip(:bird_jpg)}!", :log_at => "2008-10-20 14:53")
993
+ assert prop.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :text => "This is a \"link\":#{nodes_zip(:projects)}.", :origin => "A picture: !#{nodes_zip(:bird_jpg)}!", :log_at => "2008-10-20 14:53")
1010
994
  assert_equal Time.gm(2008,10,20,7,53), prop.log_at
1011
995
  yaml = prop.to_yaml
1012
- assert_match %r{v_text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
1013
- assert_match %r{d_foo:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
996
+ assert_match %r{text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
997
+ assert_match %r{origin:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
1014
998
  assert_match %r{log_at:\s+\"?2008-10-20 14:53:00\"?$}, yaml
1015
999
  end
1016
1000
 
@@ -1019,15 +1003,15 @@ done: \"I am done\""
1019
1003
  parent = secure!(Node) { nodes(:cleanWater) }
1020
1004
  children = parent.find(:all, 'children')
1021
1005
  assert_equal 8, children.size
1022
- assert_equal 'bananas', children[0].name
1023
- assert_equal 'crocodiles', children[1].name
1006
+ assert_equal 'bananas', children[0].node_name
1007
+ assert_equal 'crocodiles', children[1].node_name
1024
1008
 
1025
1009
  Node.connection.execute "UPDATE nodes SET position = -1.0 WHERE id = #{nodes_id(:water_pdf)}"
1026
1010
  Node.connection.execute "UPDATE nodes SET position = -0.5 WHERE id = #{nodes_id(:lake)}"
1027
1011
  children = parent.find(:all, 'children')
1028
1012
  assert_equal 8, children.size
1029
- assert_equal 'water', children[0].name
1030
- assert_equal 'lakeAddress', children[1].name
1013
+ assert_equal 'water', children[0].node_name
1014
+ assert_equal 'lakeAddress', children[1].node_name
1031
1015
  end
1032
1016
 
1033
1017
  def test_plural_relation
@@ -1042,17 +1026,6 @@ done: \"I am done\""
1042
1026
  assert Node.plural_relation?('tagged')
1043
1027
  end
1044
1028
 
1045
- def test_safe_read
1046
- login(:ant)
1047
- node = secure!(Node) {Node.find(:first, :conditions => ['id = ?', nodes_id(:lake)], :select => "*, 'foozibar' AS foobar") }
1048
- status = secure!(Node) { nodes(:status) }
1049
- assert_equal 'lakeAddress', node.safe_read('name')
1050
- assert_equal 'The lake we love', node.safe_read('v_title')
1051
- assert_equal 'gaspard', status.safe_read('d_assigned')
1052
- assert_equal 'Between Tanzania, Congo and Zambia', node.safe_read('c_address')
1053
- assert_equal 'foozibar', node.safe_read('foobar')
1054
- end
1055
-
1056
1029
  def test_classes_for_form
1057
1030
  assert_equal [["Page", "Page"],
1058
1031
  ["  Project", "Project"],
@@ -1069,18 +1042,18 @@ done: \"I am done\""
1069
1042
 
1070
1043
  def test_allowed_change_to_classes
1071
1044
  node_changes = Node.allowed_change_to_classes.reject{|k| k[/Dummy/]} # In case we are testing after Secure
1072
- assert_equal ["Node","Note","Letter","Post","Page","Project","Section","Skin","Reference"], node_changes
1045
+ assert_equal %w{Node Note Letter Post Page Project Section Skin Reference}, node_changes
1073
1046
 
1074
1047
  assert_equal node_changes, Page.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1075
1048
  assert_equal node_changes, Project.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1076
1049
  assert_equal node_changes, Note.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1077
1050
  assert_equal node_changes, Reference.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1078
1051
 
1079
- assert_equal ["Document","TextDocument","Template"], Document.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1052
+ assert_equal %w{Document TextDocument Template}, Document.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1080
1053
 
1081
1054
  assert_equal ["Image"], Image.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1082
1055
 
1083
- assert_equal ["Contact"], Contact.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1056
+ assert_equal ["BaseContact"], BaseContact.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1084
1057
  end
1085
1058
 
1086
1059
  def test_match_one_node_only
@@ -1109,33 +1082,10 @@ done: \"I am done\""
1109
1082
  assert_equal BigDecimal.new("56"), entries[0].value
1110
1083
  end
1111
1084
 
1112
- def test_icon_by_relation
1113
- login(:ant)
1114
- node = secure!(Node) { nodes(:cleanWater) } # has an 'icon' relation
1115
- icon = node.icon
1116
- assert_kind_of Image, icon
1117
- assert_equal nodes_id(:lake_jpg), icon[:id]
1118
- end
1119
-
1120
- def test_icon_by_first_child
1121
- login(:tiger)
1122
- node = secure!(Node) { nodes(:wiki) } # has no 'icon' relation
1123
- icon = node.icon
1124
- assert_kind_of Image, icon
1125
- assert_equal nodes_id(:bird_jpg), icon[:id] # first child
1126
- # define flower as icon
1127
- assert node.update_attributes(:icon_id => nodes_id(:flower_jpg))
1128
- node = secure!(Node) { nodes(:wiki) } # reload
1129
- icon = node.icon
1130
- assert_kind_of Image, icon
1131
- assert_equal nodes_id(:flower_jpg), icon[:id] # icon
1132
- end
1133
-
1134
-
1135
1085
  context 'A class\' native classes hash' do
1136
1086
  should 'be indexed by kpath' do
1137
- assert_equal ['N', 'ND', 'NDI', 'NDT', 'NDTT', 'NN', 'NP', 'NPP', 'NPS', 'NPSS', 'NR', 'NRC', 'NU', 'NUS'], Node.native_classes.keys.sort
1138
- assert_equal ['ND', 'NDI', 'NDT', 'NDTT'], Document.native_classes.keys.sort
1087
+ assert_equal [], %w{N ND NDI NDT NDTT NN NP NPP NPS NPSS NR NRC NU NUS} - Node.native_classes.keys
1088
+ assert_equal [], %w{ND NDI NDT NDTT} - Document.native_classes.keys
1139
1089
  end
1140
1090
 
1141
1091
  should 'should point to real (ruby) sub-classes and self' do
@@ -1168,8 +1118,8 @@ done: \"I am done\""
1168
1118
  assert_equal Node, Node.get_class_from_kpath('N')
1169
1119
  assert_equal Page, Node.get_class_from_kpath('NP')
1170
1120
  assert_equal Image, Node.get_class_from_kpath('NDI')
1171
- assert_equal virtual_classes(:Post), Node.get_class_from_kpath('NNP')
1172
- assert_equal virtual_classes(:Letter), Node.get_class_from_kpath('NNL')
1121
+ assert_equal roles(:Post), Node.get_class_from_kpath('NNP')
1122
+ assert_equal roles(:Letter), Node.get_class_from_kpath('NNL')
1173
1123
  assert_equal TextDocument, Node.get_class_from_kpath('NDT')
1174
1124
  end
1175
1125
  end
@@ -1177,20 +1127,20 @@ done: \"I am done\""
1177
1127
 
1178
1128
  def test_position_on_create
1179
1129
  login(:lion)
1180
- node = secure!(Page) { Page.create(:name=>"yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1130
+ node = secure!(Page) { Page.create(:node_name => "yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1181
1131
  assert !node.new_record?
1182
1132
  assert_equal 0.0, node.position
1183
1133
  assert node.update_attributes(:position => 5.0)
1184
1134
  assert_equal 5.0, node.position
1185
1135
  node = secure!(Page) { Page.find_by_id(node.id) } # reload
1186
1136
  assert_equal 5.0, node.position
1187
- node = secure!(Page) { Page.create(:name=>"babo", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1137
+ node = secure!(Page) { Page.create(:node_name => "babo", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1188
1138
  assert !node.new_record?
1189
1139
  assert_equal 6.0, node.position
1190
1140
 
1191
1141
  # position has different scopes depending on first two letters of kpath: 'ND', 'NN', 'NP', 'NR'
1192
1142
  doc = secure!(Document) { Document.create( :parent_id=>nodes_id(:cleanWater),
1193
- :c_file => uploaded_fixture('water.pdf', 'application/pdf', 'wat'), :v_title => "lazy waters.pdf") }
1143
+ :file => uploaded_fixture('water.pdf', 'application/pdf', 'wat'), :title => "lazy waters.pdf") }
1194
1144
  assert !doc.new_record?
1195
1145
  assert_equal 0.0, doc.position
1196
1146
 
@@ -1211,24 +1161,6 @@ done: \"I am done\""
1211
1161
  assert_equal 0.0, node.position
1212
1162
  end
1213
1163
 
1214
- def test_add_comment
1215
- login(:lion)
1216
- node = secure!(Node) { nodes(:lion) }
1217
- assert node.can_comment?
1218
- assert_nil node.comments
1219
-
1220
- node = secure!(Node) { nodes(:lion) } # reload
1221
- assert node.update_attributes(:m_title => 'changed icon', :m_text => 'new icon is "flower"', :icon_id => nodes_id(:flower_jpg))
1222
-
1223
- node = secure!(Node) { nodes(:lion) } # reload
1224
- comments = node.comments
1225
- assert_equal 1, comments.size
1226
- comment = comments[0]
1227
- assert_equal 'changed icon', comment[:title]
1228
- assert_equal 'new icon is "flower"', comment[:text]
1229
- assert_equal 'Panthera Leo Verneyi', comment.author_name
1230
- end
1231
-
1232
1164
  def test_custom_a
1233
1165
  login(:lion)
1234
1166
  node = secure!(Node) { nodes(:status) }
@@ -1247,16 +1179,26 @@ done: \"I am done\""
1247
1179
  def test_replace_attributes_in_values
1248
1180
  login(:lion)
1249
1181
  node = secure!(Node) { nodes(:status) }
1250
- new_attributes = node.replace_attributes_in_values(:foo => "id: [id], v_title: [v_title]")
1251
- assert_equal "id: 22, v_title: status title", new_attributes[:foo]
1182
+ new_attributes = node.replace_attributes_in_values(:foo => 'id: #{id}, title: #{title}')
1183
+ assert_equal "id: 22, title: status title", new_attributes[:foo]
1252
1184
  end
1253
1185
 
1254
1186
  def test_copy
1255
1187
  login(:lion)
1256
1188
  node = secure!(Node) { nodes(:status) }
1257
- new_attributes = secure(Node) { Node.transform_attributes(:copy_id => nodes_zip(:bird_jpg), :icon_id => '[id]')}
1258
- assert_equal Hash['icon_id', nodes_id(:bird_jpg)], new_attributes
1259
- assert node.update_attributes_with_transformation(:copy_id => nodes_zip(:bird_jpg), :icon_id => '[id]')
1189
+ attributes = {
1190
+ :copy_id => nodes_zip(:bird_jpg),
1191
+ :icon_id => '#{id}',
1192
+ :m_title => 'Changed icon to "#{title}"',
1193
+ :m_text => 'By #{visitor.login}'
1194
+ }
1195
+
1196
+ new_attributes = secure(Node) { Node.transform_attributes(attributes) }
1197
+ assert_equal Hash['icon_id' => nodes_id(:bird_jpg),
1198
+ 'm_title' => 'Changed icon to "bird"',
1199
+ 'm_text' => 'By lion'], new_attributes
1200
+
1201
+ assert node.update_attributes_with_transformation(attributes)
1260
1202
  assert_equal nodes_id(:bird_jpg), node.find(:first, 'icon')[:id]
1261
1203
  end
1262
1204
 
@@ -1266,8 +1208,8 @@ done: \"I am done\""
1266
1208
  export_folder = File.join(SITES_ROOT, 'test.host', 'tmp')
1267
1209
  FileUtils::mkpath(export_folder)
1268
1210
  # Add a page and a text document into 'wiki'
1269
- assert secure!(Node) { Node.create(:v_title=>"Hello World!", :v_text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1270
- assert secure!(TextDocument) { TextDocument.create(:name=>"yoba", :parent_id => nodes_id(:wiki), :v_text => "#header { color:red; }\n#footer { color:blue; }", :c_content_type => 'text/css') }
1211
+ assert secure!(Node) { Node.create(:title=>"Hello World!", :text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1212
+ assert secure!(TextDocument) { TextDocument.create(:node_name => "yoba", :parent_id => nodes_id(:wiki), :text => "#header { color:red; }\n#footer { color:blue; }", :content_type => 'text/css') }
1271
1213
  wiki = secure!(Node) { nodes(:wiki) }
1272
1214
  assert_equal 4, wiki.find(:all, "children").size
1273
1215
  wiki.export_to_folder(export_folder)
@@ -1289,8 +1231,8 @@ done: \"I am done\""
1289
1231
  export_folder = File.join(SITES_ROOT, 'test.host', 'tmp')
1290
1232
  FileUtils::mkpath(export_folder)
1291
1233
  # Add a page and a text document into 'wiki'
1292
- assert secure!(Node) { Node.create(:v_title=>"Hello World!", :v_text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1293
- assert secure!(TextDocument) { TextDocument.create(:name=>"yoba", :parent_id => nodes_id(:wiki), :v_text => "#header { color:red; }\n#footer { color:blue; }", :c_content_type => 'text/css') }
1234
+ assert secure!(Node) { Node.create(:title=>"Hello World!", :text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1235
+ assert secure!(TextDocument) { TextDocument.create(:node_name => "yoba", :parent_id => nodes_id(:wiki), :text => "#header { color:red; }\n#footer { color:blue; }", :content_type => 'text/css') }
1294
1236
  wiki = secure!(Node) { nodes(:wiki) }
1295
1237
  assert_equal 4, wiki.find(:all, "children").size
1296
1238
  archive = wiki.archive
@@ -1322,7 +1264,7 @@ done: \"I am done\""
1322
1264
  lion = secure!(Node) { nodes(:lion) }
1323
1265
  people = secure!(Node) { nodes(:people) }
1324
1266
  cleanWater = secure!(Node) { nodes(:cleanWater) }
1325
- assert lion.update_attributes(:name => 'status')
1267
+ assert lion.update_attributes(:title => 'status', :v_status => Zena::Status[:pub])
1326
1268
  assert_equal 'people/status', lion.fullpath
1327
1269
  # path base_node
1328
1270
  { ['(/projects/cleanWater/status)', nil] => nodes_id(:status),
@@ -1337,201 +1279,172 @@ done: \"I am done\""
1337
1279
  def test_unparse_assets
1338
1280
  login(:lion)
1339
1281
  @node = secure!(Node) { nodes(:status) }
1340
- assert @node.update_attributes(:v_text => "Hello this is \"art\":#{nodes_zip(:art)}. !#{nodes_zip(:bird_jpg)}!")
1341
- assert_equal "Hello this is \"art\":(../../../collections/art). !(../../wiki/bird)!", @node.unparse_assets(@node.version.text, self, 'v_text')
1282
+ assert @node.update_attributes(:text => "Hello this is \"art\":#{nodes_zip(:art)}. !#{nodes_zip(:bird_jpg)}!")
1283
+ assert_equal "Hello this is \"art\":(../../../collections/art). !(../../wiki/bird)!", @node.unparse_assets(@node.text, self, 'text')
1342
1284
  end
1343
1285
 
1344
1286
  def test_parse_assets
1345
1287
  login(:lion)
1346
1288
  @node = secure!(Node) { nodes(:status) }
1347
- assert @node.update_attributes(:v_text => "Hello this is \"art\":(../../../collections/art).")
1348
- assert_equal "Hello this is \"art\":#{nodes_zip(:art)}.", @node.parse_assets(@node.version.text, self, 'v_text')
1289
+ assert @node.update_attributes(:text => "Hello this is \"art\":(../../../collections/art).")
1290
+ assert_equal "Hello this is \"art\":#{nodes_zip(:art)}.", @node.parse_assets(@node.text, self, 'text')
1349
1291
  end
1350
1292
 
1351
1293
  context 'Finding safe method type' do
1352
1294
  context 'for safe methods in class' do
1353
1295
  should 'return method name' do
1354
- ['m_text', 'inherit', 'l_status', 'l_comment', 'm_text', 'inherit'].each do |k|
1355
- assert_equal k, Contact.safe_method_type([k])[:method]
1296
+ ['m_text', 'inherit', 'l_status', 'l_comment', 'm_text', 'inherit', 'v_status'].each do |k|
1297
+ assert_equal k, BaseContact.safe_method_type([k])[:method]
1356
1298
  end
1357
1299
  end
1358
1300
  end
1359
1301
 
1360
1302
  context 'for methods not declared as safe in the class' do
1361
1303
  should 'return nil' do
1362
- ['puts', 'raise', 'blah', 'system', 'id'].each do |k|
1363
- assert_nil Contact.safe_method_type([k])
1304
+ ['puts', 'raise', 'blah', 'system'].each do |k|
1305
+ assert_nil BaseContact.safe_method_type([k])
1364
1306
  end
1365
1307
  end
1366
1308
  end
1367
1309
 
1310
+ context 'for id' do
1311
+ should 'return zip' do
1312
+ assert_equal Hash[:class=>Number, :method=>'zip'], BaseContact.safe_method_type(['id'])
1313
+ end
1314
+ end
1315
+
1368
1316
  context 'for relation pseudo-methods' do
1369
1317
  should 'use rel and try' do
1370
1318
  ['hot_status', 'blah_comment', 'blah_zips', 'blah_id', 'blah_ids'].each do |k|
1371
- assert_match %r{rel\[.#{k.gsub(/_.+/,'')}.\]\.try}, Contact.safe_method_type([k])[:method]
1319
+ assert_match %r{rel\[.#{k.gsub(/_.+/,'')}.\]\.try}, BaseContact.safe_method_type([k])[:method]
1372
1320
  end
1373
1321
  end
1374
1322
  end
1375
1323
 
1376
- context 'for safe methods in version using nested alias' do
1324
+ context 'for safe properties' do
1377
1325
  should 'return version and method name when safe' do
1378
- ['v_status', 'v_title'].each do |k|
1379
- assert_equal "version.#{k[2..-1]}", Contact.safe_method_type([k])[:method]
1326
+ ['text', 'title', 'first_name', 'name'].each do |k|
1327
+ assert_equal "prop['#{k}']", BaseContact.safe_method_type([k])[:method]
1380
1328
  end
1381
1329
  end
1382
1330
 
1383
- should 'return version and safe_read when unsafe' do
1384
- ['v_foo'].each do |k|
1385
- assert_equal "version.safe_read(\"#{k[2..-1]}\")", Contact.safe_method_type([k])[:method]
1331
+ should 'return nil when unsafe' do
1332
+ ['first_name', 'name'].each do |k|
1333
+ assert_nil Node.safe_method_type([k])
1386
1334
  end
1387
1335
  end
1388
1336
  end
1337
+ end
1389
1338
 
1390
- context 'for dynattributes using nested alias' do
1391
- should 'return dyn access' do
1392
- ['d_something', 'd_foo'].each do |k|
1393
- assert_equal "version.dyn[\"#{k[2..-1]}\"]", Contact.safe_method_type([k])[:method]
1394
- end
1395
- end
1339
+ # FIXME: write test
1340
+ def test_assets
1341
+ print 'P'
1342
+ # sweep_cache (save) => remove asset folder
1343
+ # render math ?
1344
+ end
1345
+
1346
+ def find_node_by_pseudo(string, base_node = nil)
1347
+ secure(Node) { Node.find_node_by_pseudo(string, base_node || @node) }
1348
+ end
1349
+
1350
+ def assert_transforms(result, src)
1351
+ if src.kind_of?(Hash)
1352
+ assert_equal result, secure(Node) { Node.transform_attributes( src ) }
1353
+ else
1354
+ assert_equal result, secure(Node) { Node.transform_attributes( 'text' => src )['text'] }
1396
1355
  end
1356
+ end
1397
1357
 
1398
- context 'for methods in content using nested alias' do
1399
- should 'use safe_content_read when method not declared' do
1400
- ['c_first_name', 'c_name', 'c_system'].each do |k|
1401
- assert_equal "version.safe_content_read(\"#{k[2..-1]}\")", Node.safe_method_type([k])[:method]
1402
- end
1358
+ context 'Transforming attributes' do
1359
+ context 'with non-ISO date format' do
1360
+ setup do
1361
+ I18n.locale = 'fr'
1362
+ visitor.time_zone = 'Asia/Jakarta'
1403
1363
  end
1404
1364
 
1405
- should 'use method name when safe' do
1406
- ['c_first_name', 'c_name'].each do |k|
1407
- assert_equal "version.content.#{k[2..-1]}", Contact.safe_method_type([k])[:method]
1408
- end
1365
+ subject do
1366
+ '9-9-2009 15:17'
1367
+ end
1368
+
1369
+ should 'parse event_at date' do
1370
+ assert_transforms Hash['event_at' => Time.utc(2009,9,9,8,17)], Hash['event_at' => '9-9-2009 15:17']
1409
1371
  end
1410
- end
1411
- end
1412
1372
 
1413
- def test_safe_
1414
- ['c_file', 'c_blah', 'c_system'].each do |k|
1415
- assert_match %r{safe_content_read\(.#{k.gsub(/^.+_/,'')}.\)}, Contact.safe_method_type([k])[:method], "#{k} should use safe_read"
1373
+ should 'parse log_at date' do
1374
+ assert_transforms Hash['log_at' => Time.utc(2009,9,9,8,17)], Hash['log_at' => '9-9-2009 15:17']
1375
+ end
1416
1376
  end
1417
1377
 
1378
+ context 'with zazen content' do
1379
+ setup do
1380
+ login(:lion)
1381
+ end
1418
1382
 
1419
- ['c_file'].each do |k|
1420
- assert Image.safe_method_type([k]), "#{k} should be safe"
1421
- end
1422
- end
1383
+ should 'parse pseudo ids' do
1384
+ assert_transforms "Hi, this is just a simple \"test\":25 or \"\":29_life.rss. OK ?\n\n!24_pv!",
1385
+ "Hi, this is just a simple \"test\"::w or \"\"::w+_life.rss. OK ?\n\n!:lake+_pv!"
1386
+ end
1423
1387
 
1424
- def test_sync_name_on_v_title_change_no_sync
1425
- login(:tiger)
1426
- # We do not care anymore if the node was not in sync
1427
- node = secure!(Node) { nodes(:status) }
1428
- assert node.update_attributes(:v_title => 'simply different')
1429
- assert node.publish
1430
- assert_equal 'simplyDifferent', node.name
1431
- visitor.lang = 'fr'
1432
- # not ref lang
1433
- node = secure!(Node) { nodes(:people) }
1434
- assert node.update_attributes(:v_title => 'nice people')
1435
- assert node.publish
1436
- assert_equal 'fr', node.version.lang
1437
- assert_equal 'people', node.name
1438
- end
1388
+ should 'parse pseudo ids with offset in gallery' do
1389
+ assert_transforms "Hi ![30,24]! ![]!",
1390
+ "Hi ![30,:lake+]! ![]!"
1391
+ end
1439
1392
 
1440
- def test_sync_name_on_v_title_change
1441
- login(:tiger)
1442
- # was in sync, correct lang
1443
- node = secure!(Node) { nodes(:people) }
1444
- assert node.update_attributes(:v_title => 'nice people')
1445
- assert_equal 'people', node.name
1446
- assert_equal Zena::Status[:red], node.version.status
1447
- assert node.publish
1448
- assert_equal 'nicePeople', node.name
1449
- end
1393
+ should 'parse pseudo ids in doc_list' do
1394
+ assert_transforms "Hi !{30,24}! !{}!",
1395
+ "Hi !{:bird,:lake+}! !{}!"
1450
1396
 
1451
- def test_sync_name_should_result_on_duplicates
1452
- login(:tiger)
1453
- # was in sync, correct lang
1454
- people = secure!(Node) { nodes(:people) }
1455
- node = secure!(Page) { Page.create(:v_title => 'nice people', :parent_id => people.parent_id)}
1456
- assert !node.new_record?
1457
- assert_equal 'nicePeople', node.name
1458
- # would sync to 'nicePeople'
1459
- assert people.update_attributes(:v_title => 'nice people')
1460
- assert_equal 'people', people.name
1461
- assert people.publish
1462
- assert_equal 'nicePeople-1', people.name
1463
- end
1397
+ end
1464
1398
 
1465
- def test_sync_name_before_publish_if_single_version
1466
- login(:ant)
1467
- node = secure!(Node) { Node.create(:v_title => 'Eve', :parent_id => nodes_id(:people)) }
1468
- assert_equal Zena::Status[:red], node.version.status
1469
- assert_equal 'Eve', node.name
1470
- node.update_attributes(:v_title => 'Lilith')
1471
- assert_equal Zena::Status[:red], node.version.status
1472
- assert_equal 'Lilith', node.name
1473
- end
1399
+ should 'parse pseudo ids in links' do
1400
+ assert_transforms "Hi !30!:21 !30!:21 !30/nice bird!:21 !30_pv/hello ladies!:21",
1401
+ "Hi !30!::clean !:bird!::clean !:bird/nice bird!:21 !30_pv/hello ladies!:21"
1402
+ end
1474
1403
 
1475
- def test_sync_name_on_v_title_change_auto_pub_no_sync
1476
- Site.connection.execute "UPDATE sites set auto_publish = 1, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
1477
- Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:status)},#{nodes_id(:people)})"
1478
- login(:tiger)
1404
+ should 'not alter existing code without pseudo ids' do
1405
+ assert_transforms "Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!",
1406
+ "Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!"
1407
+ end
1408
+ end # with zazen content
1479
1409
 
1480
- node = secure!(Node) { nodes(:status) }
1481
- assert node.update_attributes(:v_title => 'simply different')
1482
- assert_equal 'simplyDifferent', node.name
1483
- visitor.lang = 'fr'
1484
- # not ref lang
1485
- node = secure!(Node) { nodes(:people) }
1486
- assert node.update_attributes(:v_title => 'nice people')
1487
- assert_equal 'fr', node.version.lang
1488
- assert_equal 'people', node.name
1489
- end
1410
+ context 'with ids' do
1411
+ setup do
1412
+ login(:tiger)
1413
+ end
1490
1414
 
1491
- def test_sync_name_on_v_title_change_auto_pub
1492
- test_site('zena')
1493
- Site.connection.execute "UPDATE sites set auto_publish = 1, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
1494
- Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:people)})"
1495
- login(:tiger)
1496
- node = secure!(Node) { nodes(:people) }
1497
- # was in sync, correct lang
1498
- assert_equal node.name, node.version.title
1499
- assert node.update_attributes(:v_title => 'nice people')
1500
- node = secure!(Node) { nodes(:people) }
1501
- assert_equal 'nice people', node.version.title
1502
- assert_equal 'nicePeople', node.name
1503
- end
1415
+ should 'parse pseudo_ids in parent_id' do
1416
+ assert_transforms Hash['parent_id' => nodes_id(:lake_jpg)],
1417
+ Hash['parent_id' => 'lake+']
1418
+ end
1504
1419
 
1505
- # FIXME: write test
1506
- def test_assets
1507
- print 'P'
1508
- # sweep_cache (save) => remove asset folder
1509
- # render math ?
1510
- end
1420
+ should 'parse pseudo_ids in links' do
1421
+ assert_transforms Hash['tag_ids' => [nodes_id(:art), nodes_id(:news)]],
1422
+ Hash['tag_ids' => '33,news']
1423
+ end
1511
1424
 
1512
- def find_node_by_pseudo(string, base_node = nil)
1513
- secure(Node) { Node.find_node_by_pseudo(string, base_node || @node) }
1514
- end
1425
+ should 'leave single bad ids' do
1426
+ assert_transforms Hash['parent_id' => '999', 'hot_id' => '999'],
1427
+ Hash['parent_id' => '999', 'hot_id' => '999']
1428
+ end
1515
1429
 
1516
- def test_should_parse_event_at_date
1517
- I18n.locale = 'fr'
1518
- visitor.time_zone = 'Asia/Jakarta'
1519
- v = secure(Node) {Node.new('event_at' => '9-9-2009 15:17')}
1520
- assert_equal Time.utc(2009,9,9,8,17), v.event_at
1521
- end
1430
+ should 'remove bad values from id lists' do
1431
+ assert_transforms Hash['tag_ids' => [nodes_id(:news),nodes_id(:art)]],
1432
+ Hash['tag_ids' => '999,34,art']
1433
+ end
1522
1434
 
1523
- def test_should_parse_log_at_date
1524
- I18n.locale = 'fr'
1525
- visitor.time_zone = 'Asia/Jakarta'
1526
- v = secure(Node) {Node.new('log_at' => '9-9-2009 15:17')}
1527
- assert_equal Time.utc(2009,9,9,8,17), v.log_at
1528
- end
1435
+ should 'parse dates and ids in rel' do
1436
+ # this should be 14:58 when #255 is fixed (tz support).
1437
+ assert_transforms Hash['link' => {'hot' => {'other_id' => nodes_id(:status), 'date' => Time.gm(2009,7,15,16,58)}}],
1438
+ Hash['link' => {'hot' => {'other_id' => '22', 'date' => '2009-7-15 16:58' }}]
1439
+ end
1440
+ end # with ids
1441
+ end # Transforming attributes
1529
1442
 
1530
1443
  def test_parse_keys
1531
1444
  node = secure(Node) { nodes(:status) }
1532
- assert_equal ['d_assigned', 'v_text', 'v_title', 'v_summary', 'd_problems', 'd_archive'], node.parse_keys
1445
+ assert_equal %w{archive problems summary text title}, node.parse_keys.sort
1533
1446
 
1534
1447
  note = secure(Node) { nodes(:opening) }
1535
- assert_equal ['v_text', 'v_title', 'v_summary'], note.parse_keys
1448
+ assert_equal %w{text title}, note.parse_keys.sort
1536
1449
  end
1537
1450
  end