zena 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (407) hide show
  1. data/History.txt +80 -25
  2. data/Rakefile +2 -2
  3. data/app/controllers/columns_controller.rb +2 -2
  4. data/app/controllers/nodes_controller.rb +22 -29
  5. data/app/controllers/user_sessions_controller.rb +35 -10
  6. data/app/controllers/users_controller.rb +2 -2
  7. data/app/controllers/versions_controller.rb +2 -2
  8. data/app/models/group.rb +15 -1
  9. data/app/models/node.rb +109 -8
  10. data/app/models/role.rb +4 -0
  11. data/app/models/site.rb +64 -58
  12. data/app/models/template.rb +1 -1
  13. data/app/models/user.rb +135 -29
  14. data/app/models/user_session.rb +0 -1
  15. data/app/models/virtual_class.rb +11 -6
  16. data/app/views/columns/_form.html.erb +3 -1
  17. data/app/views/columns/_li.html.erb +1 -1
  18. data/app/views/columns/create.rjs +1 -1
  19. data/app/views/groups/_form.rhtml +16 -13
  20. data/app/views/relations/_form.erb +18 -6
  21. data/app/views/sites/_form.erb +12 -6
  22. data/app/views/users/_form.rhtml +23 -8
  23. data/app/views/users/_li.rhtml +14 -3
  24. data/app/views/users/index.rhtml +1 -1
  25. data/app/views/virtual_classes/_form.erb +12 -2
  26. data/app/views/zafu/default/Node-+login.zafu +8 -1
  27. data/app/views/zafu/default/Node-+search.zafu +1 -1
  28. data/bricks/acls/lib/bricks/acls.rb +1 -0
  29. data/bricks/acls/zena/migrate/20130903150356_longer_names_for_acl.rb +9 -0
  30. data/bricks/acls/zena/test/integration/acl_integration_test.rb +2 -2
  31. data/bricks/currency/lib/bricks/currency.rb +120 -0
  32. data/bricks/currency/zena/test/unit/currency_test.rb +43 -0
  33. data/bricks/fs_skin/lib/bricks/fs_skin.rb +1 -1
  34. data/bricks/fs_skin/zena/skins/blog/Node-+search.zafu +1 -1
  35. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  36. data/bricks/fs_skin/zena/test/unit/fs_skin_view_test.rb +35 -0
  37. data/bricks/pdf/lib/bricks/pdf.rb +1 -1
  38. data/bricks/sphinx/lib/bricks/sphinx.rb +2 -0
  39. data/bricks/sphinx/zena/init.rb +14 -0
  40. data/bricks/tags/zena/test/zafu/tags.yml +5 -1
  41. data/bricks/worker/lib/bricks/worker.rb +3 -2
  42. data/bricks/zena/zena/migrate/20130829093753_add_versioned_flag_to_column.rb +10 -0
  43. data/bricks/zena/zena/migrate/20130903084909_count_login_attempts.rb +11 -0
  44. data/bricks/zena/zena/migrate/20131104153126_index_fullpath.rb +10 -0
  45. data/bricks/zena/zena/migrate/20131104210011_rebuild_fullpath_after_change.rb +10 -0
  46. data/bricks/zena/zena/migrate/20131105160420_add_skin_id_to_sites.rb +9 -0
  47. data/bricks/zena/zena/migrate/20131105175822_add_profile_to_users.rb +11 -0
  48. data/bricks/zena/zena/migrate/20140213120038_fix_idx_scope.rb +13 -0
  49. data/bricks/zena/zena/migrate/20140628140247_add_site_readonly.rb +9 -0
  50. data/config/bricks.yml +8 -4
  51. data/config/gems.yml +5 -3
  52. data/db/init/base/skins/default/Node-+login.zafu +8 -1
  53. data/db/init/base/skins/default/Node-+search.zafu +1 -1
  54. data/lib/bricks/loader.rb +5 -5
  55. data/lib/gettext_strings.rb +3 -0
  56. data/lib/tasks/zena.rake +25 -22
  57. data/lib/zafu/process/context.rb +4 -0
  58. data/lib/zena/acts/secure_node.rb +3 -3
  59. data/lib/zena/app.rb +1 -0
  60. data/lib/zena/deploy.rb +1 -1
  61. data/lib/zena/deploy/template.rb +1 -1
  62. data/lib/zena/foxy_parser.rb +5 -2
  63. data/lib/zena/info.rb +1 -1
  64. data/lib/zena/site_worker.rb +2 -2
  65. data/lib/zena/test_controller.rb +5 -2
  66. data/lib/zena/use/action.rb +9 -2
  67. data/lib/zena/use/ajax.rb +20 -4
  68. data/lib/zena/use/ancestry.rb +89 -15
  69. data/lib/zena/use/authlogic.rb +8 -2
  70. data/lib/zena/use/context.rb +1 -0
  71. data/lib/zena/use/display.rb +1 -97
  72. data/lib/zena/use/forms.rb +28 -8
  73. data/lib/zena/use/html_tags.rb +16 -7
  74. data/lib/zena/use/i18n.rb +1 -1
  75. data/lib/zena/use/prop_eval.rb +6 -1
  76. data/lib/zena/use/query_node.rb +69 -4
  77. data/lib/zena/use/recursion.rb +1 -1
  78. data/lib/zena/use/refactor.rb +5 -2
  79. data/lib/zena/use/relations.rb +1 -0
  80. data/lib/zena/use/rendering.rb +7 -4
  81. data/lib/zena/use/test_helper.rb +8 -4
  82. data/lib/zena/use/upload.rb +14 -0
  83. data/lib/zena/use/urls.rb +39 -23
  84. data/lib/zena/use/version_hash.rb +5 -2
  85. data/lib/zena/use/workflow.rb +116 -70
  86. data/lib/zena/use/zafu_eval.rb +41 -0
  87. data/lib/zena/use/zafu_safe_definitions.rb +1 -0
  88. data/lib/zena/use/zafu_templates.rb +32 -26
  89. data/lib/zena/use/zazen.rb +8 -7
  90. data/locale/app.pot +5 -1
  91. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  92. data/locale/de/zena.po +385 -281
  93. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  94. data/locale/en/zena.po +378 -271
  95. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  96. data/locale/fr/zena.po +387 -272
  97. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  98. data/locale/it/zena.po +433 -404
  99. data/locale/zena.pot +362 -268
  100. data/public/javascripts/grid.js +280 -104
  101. data/public/javascripts/zena.js +43 -15
  102. data/public/stylesheets/admin.css +8 -2
  103. data/public/stylesheets/grid.css +5 -2
  104. data/public/stylesheets/popup.css +1 -1
  105. data/test/fixtures/files/TestNode.zafu +51 -0
  106. data/test/functional/nodes_controller_test.rb +20 -5
  107. data/test/functional/user_sessions_controller_test.rb +41 -6
  108. data/test/functional/users_controller_test.rb +1 -2
  109. data/test/integration/navigation_test.rb +22 -4
  110. data/test/integration/query_node/basic.yml +7 -0
  111. data/test/integration/query_node/complex.yml +1 -1
  112. data/test/integration/query_node/errors.yml +1 -1
  113. data/test/integration/query_node/filters.yml +34 -1
  114. data/test/integration/query_node/relations.yml +6 -13
  115. data/test/integration/query_node_test.rb +22 -3
  116. data/test/integration/zafu_compiler/action.yml +1 -1
  117. data/test/integration/zafu_compiler/alias_site.yml +52 -0
  118. data/test/integration/zafu_compiler/complex.yml +1 -1
  119. data/test/integration/zafu_compiler/complex_ok.yml +5 -5
  120. data/test/integration/zafu_compiler/context.yml +1 -1
  121. data/test/integration/zafu_compiler/display.yml +56 -5
  122. data/test/integration/zafu_compiler/forms.yml +35 -2
  123. data/test/integration/zafu_compiler/meta.yml +4 -0
  124. data/test/integration/zafu_compiler/rubyless.yml +1 -1
  125. data/test/integration/zafu_compiler/safe_definitions.yml +4 -0
  126. data/test/integration/zafu_compiler/security.yml +10 -0
  127. data/test/integration/zafu_compiler/site.yml +5 -1
  128. data/test/integration/zafu_compiler/urls.yml +8 -2
  129. data/test/integration/zafu_compiler/zafu_attributes.yml +2 -1
  130. data/test/integration/zafu_compiler/zazen.yml +4 -0
  131. data/test/integration/zafu_compiler_test.rb +47 -4
  132. data/test/selenium/Grid/grid1.rsel +8 -8
  133. data/test/sites/complex/sites.yml +2 -2
  134. data/test/sites/complex/users.yml +1 -0
  135. data/test/sites/zena/columns.yml +4 -0
  136. data/test/sites/zena/sites.yml +1 -0
  137. data/test/sites/zena/users.yml +1 -0
  138. data/test/unit/node_test.rb +53 -5
  139. data/test/unit/note_test.rb +1 -1
  140. data/test/unit/relation_proxy_test.rb +20 -0
  141. data/test/unit/role_test.rb +2 -0
  142. data/test/unit/site_test.rb +28 -6
  143. data/test/unit/user_test.rb +332 -1
  144. data/test/unit/virtual_class_test.rb +55 -0
  145. data/test/unit/workflow_test.rb +175 -0
  146. data/test/unit/zena/use/ancestry_test.rb +52 -10
  147. data/test/unit/zena/use/prop_eval_test.rb +44 -0
  148. data/test/unit/zena/use/rendering_test.rb +48 -2
  149. data/test/unit/zena/use/upload_test.rb +15 -13
  150. data/test/unit/zena/use/urls_test.rb +1 -0
  151. data/vendor/plugins/ar_mysql_full_text/lib/ar_mysql_full_text.rb +39 -25
  152. data/zena.gemspec +69 -307
  153. metadata +143 -368
  154. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
  155. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
  156. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
  218. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
  219. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
  220. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
  221. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
  222. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
  223. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
  224. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
  225. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
  226. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
  227. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
  228. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
  229. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  230. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
  231. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  232. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
  233. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
  234. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
  235. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
  236. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
  237. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
  238. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
  239. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  240. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
  241. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  242. data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
  243. data/vendor/plugins/selenium-on-rails/CHANGELOG +0 -125
  244. data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +0 -202
  245. data/vendor/plugins/selenium-on-rails/README.md +0 -202
  246. data/vendor/plugins/selenium-on-rails/Rakefile +0 -38
  247. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +0 -265
  248. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +0 -148
  249. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +0 -126
  250. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +0 -231
  251. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +0 -195
  252. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +0 -295
  253. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +0 -219
  254. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +0 -156
  255. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +0 -179
  256. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +0 -223
  257. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +0 -441
  258. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +0 -3098
  259. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +0 -2080
  260. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +0 -116
  261. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +0 -116
  262. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +0 -150
  263. data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +0 -422
  264. data/vendor/plugins/selenium-on-rails/doc/files/README.html +0 -321
  265. data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +0 -108
  266. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +0 -101
  267. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +0 -222
  268. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +0 -109
  269. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +0 -111
  270. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +0 -101
  271. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +0 -101
  272. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +0 -118
  273. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +0 -101
  274. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +0 -101
  275. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +0 -114
  276. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +0 -113
  277. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +0 -120
  278. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +0 -108
  279. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +0 -115
  280. data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +0 -42
  281. data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +0 -43
  282. data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +0 -182
  283. data/vendor/plugins/selenium-on-rails/doc/index.html +0 -24
  284. data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +0 -208
  285. data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +0 -19
  286. data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +0 -50
  287. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +0 -16
  288. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +0 -14
  289. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +0 -11
  290. data/vendor/plugins/selenium-on-rails/init.rb +0 -15
  291. data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +0 -122
  292. data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +0 -16
  293. data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +0 -8
  294. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +0 -11
  295. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +0 -215
  296. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +0 -57
  297. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +0 -36
  298. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +0 -61
  299. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +0 -20
  300. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +0 -44
  301. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +0 -87
  302. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +0 -56
  303. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +0 -116
  304. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +0 -1002
  305. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +0 -514
  306. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +0 -91
  307. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +0 -24
  308. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +0 -30
  309. data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +0 -18
  310. data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +0 -5
  311. data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +0 -9
  312. data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +0 -67
  313. data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +0 -26
  314. data/vendor/plugins/selenium-on-rails/routes.rb +0 -24
  315. data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +0 -7
  316. data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +0 -8
  317. data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +0 -110
  318. data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +0 -109
  319. data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +0 -145
  320. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +0 -55
  321. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +0 -177
  322. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +0 -177
  323. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
  324. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
  325. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +0 -298
  326. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +0 -16
  327. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +0 -205
  328. data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
  329. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
  330. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
  331. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
  332. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
  333. data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
  334. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
  335. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
  336. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +0 -1759
  337. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +0 -1800
  338. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  339. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  340. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  341. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  342. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  343. data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +0 -2006
  344. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +0 -101
  345. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +0 -815
  346. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  347. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +0 -958
  348. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  349. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +0 -283
  350. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +0 -383
  351. data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +0 -91
  352. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +0 -69
  353. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +0 -1616
  354. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +0 -72
  355. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +0 -3184
  356. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +0 -2300
  357. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +0 -153
  358. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  359. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +0 -175
  360. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +0 -148
  361. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +0 -695
  362. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +0 -1362
  363. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +0 -5
  364. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +0 -803
  365. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +0 -1537
  366. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +0 -979
  367. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +0 -3
  368. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +0 -75
  369. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +0 -153
  370. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
  371. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +0 -43
  372. data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +0 -316
  373. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +0 -566
  374. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +0 -2816
  375. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +0 -549
  376. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +0 -149
  377. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +0 -2450
  378. data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +0 -8
  379. data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +0 -37
  380. data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +0 -27
  381. data/vendor/plugins/selenium-on-rails/test/paths_test.rb +0 -72
  382. data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +0 -157
  383. data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +0 -708
  384. data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +0 -242
  385. data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +0 -67
  386. data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +0 -43
  387. data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +0 -35
  388. data/vendor/plugins/selenium-on-rails/test/setup_test.rb +0 -31
  389. data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +0 -109
  390. data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +0 -17
  391. data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +0 -51
  392. data/vendor/plugins/selenium-on-rails/test/test_helper.rb +0 -101
  393. data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +0 -1
  394. data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +0 -12
  395. data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +0 -6
  396. data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +0 -2
  397. data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +0 -6
  398. data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +0 -1
  399. data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +0 -5
  400. data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +0 -5
  401. data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +0 -7
  402. data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +0 -8
  403. data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +0 -7
  404. data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +0 -1
  405. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +0 -1
  406. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +0 -1
  407. data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +0 -1
@@ -163,7 +163,8 @@ show_attr_anchor:
163
163
  res: "<a class='anchor' name='node22'></a>status title"
164
164
 
165
165
  anchor_in_link:
166
- src: "<r:link class='xx' anchor='true'/>"
166
+ old_src: "<r:link class='xx' anchor='true'/>"
167
+ src: "<a class='xx' href='#node#{id}' do='title'/>"
167
168
  res: "<a class='xx' href='#node22'>status title</a>"
168
169
 
169
170
  anchor_tag:
@@ -15,6 +15,10 @@ link_anchor:
15
15
  tem: "<%= zazen('see \"\":22#') %>"
16
16
  res: "<p>see <a href=\"#node22\">status title</a></p>"
17
17
 
18
+ link_anchor_remote:
19
+ tem: "<%= zazen('see \"\":18#foo') %>"
20
+ res: "<p>see <a href=\"/oo/page18.html#foo\">projects list</a></p>"
21
+
18
22
  link_anchor_attribute:
19
23
  tem: "<%= zazen('see \"\":22#[title]') %>"
20
24
  res: "<p>see <a href=\"#status-title\">status title</a></p>"
@@ -5,6 +5,7 @@ class ZafuCompilerTest < Zena::Controller::TestCase
5
5
  OK = [
6
6
  'action',
7
7
  'asset',
8
+ 'alias_site',
8
9
  'conditional',
9
10
  'calendar',
10
11
  'dates',
@@ -98,18 +99,19 @@ class ZafuCompilerTest < Zena::Controller::TestCase
98
99
  end
99
100
 
100
101
  context = yt_get('context', file, test)
101
- site = Site.setup_master(sites(context.delete('site') || 'zena'))
102
- $_test_site = site.name
102
+ site = Site.setup_master(Site.find_by_host(context.delete('host') || 'test.host'))
103
+ # This is used to find fixtures: returns master name (not alias)
104
+ $_test_site = site.name
103
105
  @request.host = site.host
104
106
 
105
107
  # set context
106
108
  params = {}
107
109
  #params[:user_id] = users_id(context.delete('visitor').to_sym)
108
- params['user'] = context.delete 'visitor'
110
+ params['user'] = context.delete 'visitor'
109
111
  params['node_id'] = nodes_id(context.delete('node').to_sym)
110
112
  params['prefix'] = context.delete('lang')
111
113
  params['date'] = context['ref_date'] ? context.delete('ref_date').to_s : nil
112
- params['url'] = "#{file}/#{test.to_s.gsub('_', '/')}"
114
+ params['url'] = "#{file}/#{test.to_s.gsub('_', '/')}"
113
115
  params.merge!(context) # merge the rest of the context as query parameters
114
116
 
115
117
  compiled_files = {}
@@ -381,5 +383,46 @@ class ZafuCompilerTest < Zena::Controller::TestCase
381
383
  yt_do_test('display', 'with_a_custom_img_tag_field_with_JS')
382
384
  end
383
385
 
386
+ def test_alias_site_from_home
387
+ login(:lion)
388
+ node = secure(Page) { Page.create(:title => 'one', :parent_id => nodes_id(:wiki))}
389
+ sub = secure(Page) { Page.create(:title => 'two', :parent_id => node.id)}
390
+ secure(Page) { Page.create(:title => 'three', :parent_id => sub.id)}
391
+ yt_do_test('alias_site', 'from_home')
392
+ end
393
+
394
+ def test_alias_site_in_home
395
+ login(:lion)
396
+ node = secure(Page) { Page.create(:title => 'one', :parent_id => nodes_id(:wiki))}
397
+ sub = secure(Page) { Page.create(:title => 'two', :parent_id => node.id)}
398
+ secure(Page) { Page.create(:title => 'three', :parent_id => sub.id)}
399
+ yt_do_test('alias_site', 'in_home')
400
+ end
401
+
402
+ def test_alias_site_link_with_custom_base
403
+ login(:lion)
404
+ secure(Node) { nodes(:wiki) }.tap do |w|
405
+ w.update_attributes(:custom_base => true)
406
+ err w
407
+ end
408
+ node = secure(Page) { Page.create(:title => 'one', :parent_id => nodes_id(:wiki), :custom_base => true)}
409
+ sub = secure(Page) { Page.create(:title => 'two', :parent_id => node.id)}
410
+ secure(Page) { Page.create(:title => 'three', :parent_id => sub.id)}
411
+ yt_do_test('alias_site', 'link_with_custom_base')
412
+ end
413
+
414
+ def test_forms_auth_profile
415
+ login(:lion)
416
+ tiger = users(:tiger)
417
+ assert tiger.update_attributes(:profile => :ant)
418
+ yt_do_test('forms', 'auth_profile')
419
+ end
420
+
421
+ def test_site_readonly
422
+ login(:lion)
423
+ current_site.update_attributes("site_readonly" => true)
424
+ yt_do_test('site', 'readonly')
425
+ end
426
+
384
427
  yt_make
385
428
  end
@@ -1,11 +1,11 @@
1
1
  # Add first element
2
2
  open '/oo/testnode37.html?test=grid1'
3
- # THIS DOES NOT WORK. FIND ANOTHER WAY TO TEST THIS GRID.
4
- # verify_text 'css=.grid tr:nth-child(2) td:nth-child(1)', '[title]'
5
- # verify_text 'css=.grid tr:nth-child(3) td:nth-child(1)', 'value'
6
- # # Change title
7
- # click 'css=.grid td:nth-child(3)'
8
- # type 'css=.grid input', 'my title'
9
- # click 'css=#grid1 input[type="submit"]'
10
- # verify_text 'css=.grid tr:nth-child(2) td:nth-child(1)', 'my title'
3
+ wait_for_text_present('grid setup done')
4
+ verify_text "//table[@class='grid']/tbody/tr[2]/th", 'type to edit'
5
+ # Change title
6
+ click "//table[@class='grid']/tbody/tr[3]/td"
7
+ type "//table[@class='grid']/tbody/tr[3]/td", 'some value'
8
+ click 'css=#grid1 input[type="submit"]'
9
+ # THIS DOES NOT WORK. CANNOT TYPE IN CONTENTEDITABLE.
10
+ # verify_text "//table[@class='grid']/tbody/tr[3]/td", 'some value'
11
11
 
@@ -1,7 +1,7 @@
1
1
  complex:
2
2
  host: complex.host
3
3
  root: complex
4
- anon: anon
4
+ anon: complex_anon
5
5
  public_group: public
6
6
  site_group: complex
7
7
  authentication: yes
@@ -9,4 +9,4 @@ complex:
9
9
  redit_time: 7200
10
10
  languages: fr
11
11
  default_lang: fr
12
- formats_updated_at: 2003-02-01
12
+ formats_updated_at: 2003-02-01
@@ -5,6 +5,7 @@ DEFAULTS:
5
5
  lang: fr
6
6
 
7
7
  complex_anon:
8
+ groups: public
8
9
  status: moderated
9
10
  node: anonymous
10
11
 
@@ -27,6 +27,10 @@ Letter_search_mono:
27
27
  Contact_name:
28
28
  index: string
29
29
 
30
+ Contact_cart:
31
+ ptype: hash
32
+ versioned: 0
33
+
30
34
  Post_date:
31
35
  index: '.idx_datetime1'
32
36
  ptype: datetime
@@ -22,6 +22,7 @@ alias:
22
22
  host: alias.host
23
23
  root: zena
24
24
  home: wiki
25
+ skin: wikiSkin
25
26
  anon: anon
26
27
  public_group: public
27
28
  site_group: workers
@@ -15,6 +15,7 @@ ant:
15
15
  groups: public, workers
16
16
  status: user
17
17
  lang: fr
18
+ is_profile: true
18
19
 
19
20
  tiger:
20
21
  login: tiger
@@ -155,6 +155,25 @@ class NodeTest < Zena::Unit::TestCase
155
155
  end
156
156
  end
157
157
 
158
+ context 'destroying a node with failing before_destroy' do
159
+ ::Page.send(:before_destroy, :test_before_destroy)
160
+ class ::Page
161
+ attr_accessor :fail_on_destroy
162
+ def test_before_destroy
163
+ return false if @fail_on_destroy
164
+ end
165
+ end
166
+
167
+ should 'not touch node versions' do
168
+ node = secure(Node) { nodes(:status) }
169
+ node.fail_on_destroy = true
170
+ assert_difference('Node.count', 0) do
171
+ assert_difference('Version.count', 0) do
172
+ node.destroy
173
+ end
174
+ end
175
+ end
176
+ end
158
177
  end # on a node with write access
159
178
  end # A logged in user
160
179
 
@@ -199,11 +218,12 @@ class NodeTest < Zena::Unit::TestCase
199
218
  assert node.save , "Save succeeds"
200
219
  end
201
220
 
202
- def test_page_new_without_title
221
+ def test_node_new_without_title
203
222
  login(:tiger)
204
223
  node = secure!(Node) { Node.new(:parent_id => nodes_id(:cleanWater)) }
205
- assert ! node.save, 'Save fails'
206
- assert_equal 'can\'t be blank', node.errors[:title]
224
+ node.save
225
+ assert !node.new_record?, 'Not a new record'
226
+ assert_equal 'Node', node.title
207
227
  end
208
228
 
209
229
  def test_new_set_section_id
@@ -247,12 +267,25 @@ class NodeTest < Zena::Unit::TestCase
247
267
  assert node.save , "Save succeeds"
248
268
  end
249
269
 
270
+ def test_set_hash_attribute
271
+ login(:lion)
272
+ node = secure!(Node) { nodes(:lake) }
273
+ assert node.update_attributes(:'cart' => {'foo' => 'hello', 'bar' => 'bye'})
274
+ ant = secure!(Node) { nodes(:ant) }
275
+ ant.cart = node.cart
276
+ assert ant.save
277
+ # reload
278
+ ant = secure!(Node) { nodes(:ant) }
279
+ assert_equal 'hello', ant.cart['foo']
280
+ assert_equal 'bye', ant.cart['bar']
281
+ end
282
+
250
283
  def test_page_update_without_title
251
284
  login(:tiger)
252
285
  node = secure!(Node) { nodes(:status) }
253
286
  node.title = nil
254
- assert !node.save
255
- assert_equal 'can\'t be blank', node.errors[:title]
287
+ assert node.save
288
+ assert_equal 'Page', node.title
256
289
  end
257
290
 
258
291
  def test_update_set_section_id
@@ -1488,4 +1521,19 @@ done: \"I am done\""
1488
1521
  assert_equal nodes_zip(:status).to_s, node.safe_send("id")
1489
1522
  assert_equal nil, node.safe_send("object_id")
1490
1523
  end
1524
+
1525
+ context 'a node with invalid properties' do
1526
+ setup do
1527
+ version = secure(Node) { nodes(:status) }.version
1528
+ Zena::Db.set_attribute(version, 'properties', '{"foo":')
1529
+ end
1530
+
1531
+ subject do
1532
+ secure(Node) { nodes(:status) }
1533
+ end
1534
+
1535
+ should 'return the failover property value' do
1536
+ assert_equal 'INVALID PROPERTY', subject.title
1537
+ end
1538
+ end
1491
1539
  end
@@ -7,7 +7,7 @@ class NoteTest < Zena::Unit::TestCase
7
7
  test_page = secure!(Note) { Note.create(:title => "yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
8
8
  assert ! test_page.new_record? , "Not a new record"
9
9
  assert_equal nodes_id(:cleanWater), test_page.parent[:id]
10
- assert_equal "18/21/#{test_page.zip}", test_page.fullpath
10
+ assert_equal "11/18/21/#{test_page.zip}", test_page.fullpath
11
11
  assert_equal '18/21', test_page.basepath
12
12
  end
13
13
 
@@ -601,4 +601,24 @@ class RelationProxyTest < Zena::Unit::TestCase
601
601
  end
602
602
  end
603
603
  end # With many links
604
+
605
+ context 'with a native writer' do
606
+ subject do
607
+ node = secure(Node) { nodes(:cleanWater)}
608
+ class << node
609
+ def reference_zips=(list)
610
+ @list=list
611
+ end
612
+ end
613
+ node
614
+ end
615
+
616
+ should 'update with string list of ids' do
617
+ login(:lion)
618
+ assert_difference('Link.count', 0) do
619
+ subject.update_attributes_with_transformation('reference_ids' => [:art, :menu, :bird_jpg].map {|s| nodes_zip(s)}.join(', '))
620
+ assert_equal '30,33,35', subject.instance_variable_get(:@list).sort.join(',')
621
+ end
622
+ end
623
+ end
604
624
  end
@@ -432,6 +432,8 @@ class RoleTest < Zena::Unit::TestCase
432
432
  end
433
433
  end # with duplicate column names
434
434
  end # importing virtual classes
435
+
436
+
435
437
  end # An admin
436
438
 
437
439
  # Indexed columns in role tested in NodeTest
@@ -289,19 +289,19 @@ class SiteTest < Zena::Unit::TestCase
289
289
  opening = secure(Node) { nodes(:opening) }
290
290
  cleanWater = secure(Node) { nodes(:cleanWater) }
291
291
  art = secure(Node) { nodes(:art) }
292
- assert_equal fullpath(:projects, :cleanWater, :status), status.fullpath
292
+ assert_equal fullpath(:zena, :projects, :cleanWater, :status), status.fullpath
293
293
  assert_equal fullpath(:projects, :cleanWater), status.basepath
294
294
  assert_equal false, status.custom_base
295
295
 
296
- assert_equal fullpath(:projects, :cleanWater, :opening), opening.fullpath
296
+ assert_equal fullpath(:zena, :projects, :cleanWater, :opening), opening.fullpath
297
297
  assert_equal fullpath(:projects, :cleanWater), opening.basepath
298
298
  assert_equal false, opening.custom_base
299
299
 
300
- assert_equal fullpath(:projects, :cleanWater), cleanWater.fullpath
300
+ assert_equal fullpath(:zena, :projects, :cleanWater), cleanWater.fullpath
301
301
  assert_equal fullpath(:projects, :cleanWater), cleanWater.basepath
302
302
  assert_equal true, cleanWater.custom_base
303
303
 
304
- assert_equal fullpath(:collections, :art), art.fullpath
304
+ assert_equal fullpath(:zena, :collections, :art), art.fullpath
305
305
  assert_equal '', art.basepath
306
306
  assert_equal false, art.custom_base
307
307
  end
@@ -317,10 +317,10 @@ class SiteTest < Zena::Unit::TestCase
317
317
 
318
318
  should 'not alter fullpath' do
319
319
  node = secure!(Node) { nodes(:status) }
320
- assert_equal fullpath(:projects, :cleanWater, :status), node.fullpath
320
+ assert_equal fullpath(:zena, :projects, :cleanWater, :status), node.fullpath
321
321
  subject.clear_cache
322
322
  node = secure!(Node) { nodes(:status) }
323
- assert_equal fullpath(:projects, :cleanWater, :status), node.fullpath
323
+ assert_equal fullpath(:zena, :projects, :cleanWater, :status), node.fullpath
324
324
  end
325
325
  end
326
326
 
@@ -406,6 +406,10 @@ class SiteTest < Zena::Unit::TestCase
406
406
  should 'return alias home node' do
407
407
  assert_equal nodes_id(:wiki), subject.home_id
408
408
  end
409
+
410
+ should 'return alias skin node' do
411
+ assert_equal nodes_id(:wikiSkin), subject.skin_id
412
+ end
409
413
  end
410
414
 
411
415
  context 'Creating a site alias' do
@@ -434,6 +438,24 @@ class SiteTest < Zena::Unit::TestCase
434
438
  end
435
439
  end
436
440
 
441
+ context 'Editing a site alias skin' do
442
+ subject do
443
+ secure(Site) { sites(:alias) }
444
+ end
445
+
446
+ should 'allow setting skin' do
447
+ assert_equal nodes_id(:wikiSkin), subject.skin_id
448
+ assert subject.update_attributes(:skin_zip => nodes_zip(:default))
449
+ assert_equal nodes_id(:default), sites(:alias).skin.id
450
+ end
451
+
452
+ should 'allow setting skin to nil' do
453
+ assert_equal nodes_id(:wikiSkin), subject.skin_id
454
+ assert subject.update_attributes(:skin_zip => '')
455
+ assert_nil sites(:alias).skin_id
456
+ end
457
+ end
458
+
437
459
  private
438
460
  def fullpath(*args)
439
461
  args.map {|sym| nodes_zip(sym).to_s}.join('/')
@@ -296,7 +296,7 @@ class UserTest < Zena::Unit::TestCase
296
296
  login(:lion)
297
297
  user = secure!(User) { users(:lion) }
298
298
  assert !user.update_attributes(:status => User::Status[:user])
299
- assert_equal 'You do not have the rights to do this.', user.errors[:status]
299
+ assert_equal 'You cannot remove your own access rights.', user.errors[:status]
300
300
  user = secure!(User) { users(:lion) }
301
301
  assert user.update_attributes('status' => User::Status[:admin].to_s, 'time_zone' => 'Europe/Berlin')
302
302
  end
@@ -468,4 +468,335 @@ class UserTest < Zena::Unit::TestCase
468
468
  assert subject.api_authorized?
469
469
  end
470
470
  end # A user in the api_group
471
+
472
+ context 'Setting user profile' do
473
+ setup do
474
+ login(:lion)
475
+ secure(User) { users(:ant) }.update_attributes(:group_ids => [groups_id(:admin)])
476
+ end
477
+
478
+ subject do
479
+ secure(User) { User.create(:login => 'foobar', :password => 'foobar', :status => User::Status[:deleted]) }
480
+ end
481
+
482
+ should 'copy groups' do
483
+ assert_equal %w{public workers}, subject.groups.map(&:name).sort
484
+ assert subject.update_attributes(:profile => 'ant')
485
+ assert_equal %w{admin public workers}, subject.groups.map(&:name).sort
486
+ end
487
+
488
+ context 'changing profile' do
489
+ setup do
490
+ subject.update_attributes(:profile => 'ant')
491
+ end
492
+
493
+ should 'sync groups in dependant users' do
494
+ assert_equal %w{admin public workers}, subject.groups.map(&:name).sort
495
+
496
+ assert secure(User) { users(:ant) }.update_attributes(:group_ids => [])
497
+ # reload
498
+ user = User.find(subject.id)
499
+ assert_equal %w{public workers}, user.groups.map(&:name).sort
500
+ end
501
+
502
+ should 'sync status in dependant users' do
503
+ assert_equal %w{admin public workers}, subject.groups.map(&:name).sort
504
+
505
+ assert secure(User) { users(:ant) }.update_attributes(:status => User::Status[:deleted])
506
+ # reload
507
+ user = User.find(subject.id)
508
+ assert_equal User::Status[:deleted], user.status
509
+ end
510
+
511
+ context 'through group edit' do
512
+ should 'sync groups in dependant users' do
513
+ assert_equal %w{admin public workers}, subject.groups.map(&:name).sort
514
+ grp = secure(Group) { groups(:admin) }
515
+ assert grp.update_attributes(:user_ids => [])
516
+ # Remove user
517
+ # reload
518
+ user = User.find(subject.id)
519
+ assert_equal %w{public workers}, user.groups.map(&:name).sort
520
+
521
+ assert grp.update_attributes(:user_ids => [users_id(:ant)])
522
+ # Add user
523
+ # reload
524
+ user = User.find(subject.id)
525
+ assert_equal %w{admin public workers}, user.groups.map(&:name).sort
526
+ end
527
+ end
528
+
529
+ context 'removing is_profile' do
530
+ context 'with dependant users' do
531
+ should 'error on is_profile' do
532
+ subject
533
+ ant = secure(User) { users(:ant) }
534
+ assert !ant.update_attributes(:is_profile => false)
535
+ assert_equal 'Cannot be removed (profile used).', ant.errors.on(:is_profile)
536
+ end
537
+ end
538
+ end
539
+ end
540
+ end # Setting user profile
541
+
542
+ context 'reading through contact node' do
543
+ setup do
544
+ login(:lion)
545
+ end
546
+
547
+ subject do
548
+ secure(Node) { nodes(:ant) }
549
+ end
550
+
551
+ should 'read user settings' do
552
+ assert_equal 'ant', subject.auth_user.login
553
+ end
554
+ end
555
+
556
+ context 'updating through contact node' do
557
+ setup do
558
+ login(:lion)
559
+ end
560
+
561
+ subject do
562
+ secure(Node) { nodes(:ant) }
563
+ end
564
+
565
+ should 'update auth settings' do
566
+ assert subject.update_attributes('auth' => {'login' => 'antidote'})
567
+ assert_equal 'antidote', users(:ant).login
568
+ end
569
+
570
+ should 'update password' do
571
+ assert subject.update_attributes('auth' => {'password' => 'hello world'})
572
+ assert_equal Zena::CryptoProvider::Initial.encrypt('hello world'), users(:ant).crypted_password
573
+ end
574
+
575
+ should 'not update password if blank' do
576
+ assert subject.update_attributes('auth' => {'password' => ''})
577
+ assert_equal Zena::CryptoProvider::Initial.encrypt('ant'), users(:ant).crypted_password
578
+ end
579
+
580
+ should 'update profile' do
581
+ secure(User) { users(:tiger) }.update_attributes(:is_profile => true)
582
+ assert subject.update_attributes('auth' => {'profile' => 'tiger', 'is_profile' => false})
583
+ assert_equal users_id(:tiger), users(:ant).profile_id
584
+ end
585
+
586
+ should 'not update inaccessible fields' do
587
+ assert subject.update_attributes('auth' => {'site_id' => 5})
588
+ assert_equal sites_id(:zena), subject.reload.site_id
589
+ end
590
+ end
591
+
592
+ context 'creating through contact node' do
593
+ setup do
594
+ login(:lion)
595
+ end
596
+
597
+ subject do
598
+ secure(Node) { nodes(:people).new_child({
599
+ :first_name => 'My',
600
+ :name => 'Giraffe',
601
+ :klass => 'Contact',
602
+ :auth => {:password => 'long big neck', :profile => 'ant' }
603
+ })}.tap do |obj|
604
+ assert obj.save
605
+ end
606
+ end
607
+
608
+ should 'create user' do
609
+ err subject
610
+ assert !subject.new_record?
611
+ # Reload all
612
+ user = secure(User) { User.find_by_login('My Giraffe') }
613
+ node = user.node
614
+ assert_equal 'My Giraffe', node.title
615
+ assert_equal 'My Giraffe', user.login
616
+ assert_equal node.id, user.node_id
617
+ end
618
+
619
+ context 'with defined login' do
620
+ setup do
621
+ secure(Node) { nodes(:people).new_child({
622
+ :first_name => 'My',
623
+ :name => 'Giraffe',
624
+ :klass => 'Contact',
625
+ :auth => {:password => 'long big neck', :profile => 'ant', :login => 'giraffe' }
626
+ })}.tap do |obj|
627
+ assert obj.save
628
+ end
629
+ end
630
+
631
+ should 'use defined login' do
632
+ user = secure(User) { User.find_by_login('giraffe') }
633
+ assert_equal 'My Giraffe', user.node.title
634
+ end
635
+ end
636
+ end
637
+
638
+ context 'Destroying node' do
639
+ subject do
640
+ secure(Node) { nodes(:tiger) }
641
+ end
642
+
643
+ context 'as an admin' do
644
+ setup do
645
+ login(:lion)
646
+ end
647
+
648
+ should 'mark user as deleted' do
649
+ assert_difference('User.count', 0) do
650
+ assert_difference('Node.count', -1) do
651
+ subject.destroy
652
+ end
653
+ end
654
+ user = users(:tiger)
655
+ assert_nil user.node_id
656
+ assert_equal User::Status[:deleted], user.status
657
+ end
658
+
659
+ context 'from a user with profile' do
660
+ subject do
661
+ tiger = secure(Node) { nodes(:tiger) }
662
+ assert tiger.update_attributes('auth' => {'profile' => 'ant'})
663
+ secure(Node) { nodes(:tiger) }
664
+ end
665
+
666
+ should 'remove profile' do
667
+ assert_equal 'ant', subject.auth['profile']
668
+ assert_difference('User.count', 0) do
669
+ assert_difference('Node.count', -1) do
670
+ subject.destroy
671
+ end
672
+ end
673
+ user = users(:tiger)
674
+ assert_nil user.node_id
675
+ assert_nil user.profile_id
676
+ assert_equal User::Status[:deleted], user.status
677
+ end
678
+ end
679
+ end
680
+
681
+ context 'not as an admin' do
682
+ setup do
683
+ login(:tiger)
684
+ end
685
+
686
+ should 'refuse to delete contact node' do
687
+ assert_difference('User.count', 0) do
688
+ assert_difference('Node.count', 0) do
689
+ assert !subject.destroy
690
+ end
691
+ end
692
+ assert_equal 'Cannot destroy: node is a user', subject.errors[:base]
693
+ end
694
+ end
695
+ end
696
+
697
+ context 'not an admin' do
698
+
699
+ context 'updating through contact node' do
700
+ setup do
701
+ login(:tiger)
702
+ end
703
+
704
+ subject do
705
+ secure(Node) { nodes(:ant) }
706
+ end
707
+
708
+ should 'ignore user settings' do
709
+ assert subject.update_attributes('auth' => {'login' => 'antidote', 'password' => 'a fool is a fool'})
710
+ ant = users(:ant)
711
+ assert_equal 'ant', ant.login
712
+ assert_equal Zena::CryptoProvider::Initial.encrypt('ant'), ant.crypted_password
713
+ end
714
+ end
715
+ end
716
+
717
+ context 'a manager' do
718
+ setup do
719
+ login(:lion)
720
+ manager = secure(User) { User.create({
721
+ 'lang' => 'fr',
722
+ 'time_zone' => 'Europe/Zurich',
723
+ 'status' => '55',
724
+ 'password' => 'secret',
725
+ 'login' => 'bolomey',
726
+ 'group_ids' => [groups_id(:public), ''],
727
+ 'node_attributes' => {
728
+ 'name' => 'Dupont',
729
+ 'first_name' => 'Paul',
730
+ 'email' => 'paul.bolomey@brainfuck.com'
731
+ }
732
+ })
733
+ }
734
+ err manager
735
+ assert !manager.new_record?
736
+ login(manager.id)
737
+ end
738
+
739
+ context 'editing a user' do
740
+ subject do
741
+ users(:tiger)
742
+ end
743
+
744
+ should 'not be allowed to change groups' do
745
+ assert_equal %w{managers public workers}, subject.groups.map{|g| g.name}.sort
746
+ assert !subject.update_attributes(:group_ids => [])
747
+ assert_equal 'Only admin can change groups.', subject.errors[:group_ids]
748
+ assert_equal %w{managers public workers}, subject.reload.groups.map{|g| g.name}.sort
749
+ end
750
+
751
+ should 'be allowed to change profile' do
752
+ assert_equal %w{managers public workers}, subject.groups.map{|g| g.name}.sort
753
+ assert subject.update_attributes(:profile => 'ant')
754
+ assert_equal %w{public workers}, subject.reload.groups.map{|g| g.name}.sort
755
+ end
756
+
757
+ should 'be allowed to change status' do
758
+ assert subject.update_attributes(:status => User::Status[:reader])
759
+ assert_equal User::Status[:reader], subject.reload.status
760
+ end
761
+
762
+ should 'not be allowed to set admin status' do
763
+ assert subject.update_attributes(:profile => 'ant')
764
+ assert_equal %w{public workers}, subject.reload.groups.map{|g| g.name}.sort
765
+ end
766
+
767
+ context 'through node' do
768
+ subject do
769
+ secure(Node) { nodes(:tiger) }
770
+ end
771
+
772
+ should 'update auth settings' do
773
+ assert subject.update_attributes('auth' => {'login' => 'antidote'})
774
+ assert_equal 'antidote', users(:tiger).login
775
+ end
776
+ end
777
+
778
+ context 'on an admin' do
779
+ subject do
780
+ users(:lion)
781
+ end
782
+
783
+ should 'not be allowed to edit' do
784
+ assert !subject.update_attributes(:login => 'lionixbar')
785
+ assert_equal 'You cannot edit this user (high status).', subject.errors[:base]
786
+ end
787
+ end
788
+
789
+ context 'on self' do
790
+ subject do
791
+ visitor.reload
792
+ end
793
+
794
+ should 'be allowed to edit' do
795
+ assert subject.update_attributes(:login => 'lionixbar')
796
+ assert_equal 'lionixbar', subject.reload.login
797
+ end
798
+ end
799
+ end
800
+ end
801
+
471
802
  end