alchemy_cms 2.1.12 → 2.2.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +20 -16
  3. data/README.md +11 -7
  4. data/alchemy_cms.gemspec +31 -29
  5. data/app/assets/javascripts/alchemy/alchemy.base.js +234 -233
  6. data/app/assets/javascripts/alchemy/alchemy.buttons.js +26 -26
  7. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +32 -32
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js +78 -78
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +103 -103
  10. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +84 -84
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +88 -88
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js +92 -0
  13. data/app/assets/javascripts/alchemy/alchemy.growler.js +23 -23
  14. data/app/assets/javascripts/alchemy/alchemy.html5.js +23 -0
  15. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +53 -52
  16. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +33 -30
  17. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  18. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +14 -14
  19. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +181 -0
  20. data/app/assets/javascripts/alchemy/alchemy.menubar.js +48 -48
  21. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +39 -39
  22. data/app/assets/javascripts/alchemy/alchemy.preview.js +81 -83
  23. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +86 -86
  24. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +23 -23
  25. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +208 -353
  26. data/app/assets/javascripts/alchemy/alchemy.uploader.js +279 -0
  27. data/app/assets/javascripts/alchemy/alchemy.windows.js +268 -268
  28. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +42 -42
  29. data/app/assets/stylesheets/alchemy/_defaults.scss +89 -89
  30. data/app/assets/stylesheets/alchemy/base.css.scss +790 -804
  31. data/app/assets/stylesheets/alchemy/buttons.css.scss +263 -264
  32. data/app/assets/stylesheets/alchemy/dashboard.css.scss +66 -66
  33. data/app/assets/stylesheets/alchemy/elements.css.scss +575 -564
  34. data/app/assets/stylesheets/alchemy/flash.css.scss +45 -45
  35. data/app/assets/stylesheets/alchemy/frame.css.scss +262 -262
  36. data/app/assets/stylesheets/alchemy/icons.css.scss +86 -86
  37. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +706 -707
  38. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +46 -27
  39. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +107 -107
  40. data/app/assets/stylesheets/alchemy/login.css.scss +40 -38
  41. data/app/assets/stylesheets/alchemy/menubar.css.scss +84 -82
  42. data/app/assets/stylesheets/alchemy/modules.css.scss +9 -9
  43. data/app/assets/stylesheets/alchemy/pagination.css.scss +49 -49
  44. data/app/assets/stylesheets/alchemy/print.css +7 -7
  45. data/app/assets/stylesheets/alchemy/sitemap.css.scss +185 -154
  46. data/app/assets/stylesheets/alchemy/standard_set.css +205 -206
  47. data/app/assets/stylesheets/alchemy/tables.css.scss +94 -60
  48. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +34 -34
  49. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +177 -177
  50. data/app/assets/stylesheets/alchemy/upload.css.scss +68 -45
  51. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +222 -221
  52. data/app/controllers/alchemy/admin/attachments_controller.rb +100 -100
  53. data/app/controllers/alchemy/admin/base_controller.rb +116 -116
  54. data/app/controllers/alchemy/admin/clipboard_controller.rb +44 -44
  55. data/app/controllers/alchemy/admin/contents_controller.rb +55 -55
  56. data/app/controllers/alchemy/admin/dashboard_controller.rb +12 -11
  57. data/app/controllers/alchemy/admin/elements_controller.rb +109 -109
  58. data/app/controllers/alchemy/admin/essence_audios_controller.rb +8 -8
  59. data/app/controllers/alchemy/admin/essence_files_controller.rb +20 -20
  60. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +8 -8
  61. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +81 -81
  62. data/app/controllers/alchemy/admin/essence_videos_controller.rb +8 -8
  63. data/app/controllers/alchemy/admin/languages_controller.rb +16 -4
  64. data/app/controllers/alchemy/admin/layoutpages_controller.rb +9 -9
  65. data/app/controllers/alchemy/admin/pages_controller.rb +249 -248
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +105 -105
  67. data/app/controllers/alchemy/admin/resources_controller.rb +111 -166
  68. data/app/controllers/alchemy/admin/trash_controller.rb +18 -18
  69. data/app/controllers/alchemy/admin/users_controller.rb +69 -69
  70. data/app/controllers/alchemy/attachments_controller.rb +27 -27
  71. data/app/controllers/alchemy/base_controller.rb +159 -155
  72. data/app/controllers/alchemy/elements_controller.rb +16 -16
  73. data/app/controllers/alchemy/messages_controller.rb +59 -59
  74. data/app/controllers/alchemy/pages_controller.rb +194 -198
  75. data/app/controllers/alchemy/pictures_controller.rb +57 -57
  76. data/app/controllers/alchemy/user_sessions_controller.rb +70 -70
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +7 -7
  78. data/app/helpers/alchemy/admin/base_helper.rb +425 -425
  79. data/app/helpers/alchemy/admin/contents_helper.rb +72 -72
  80. data/app/helpers/alchemy/admin/elements_helper.rb +108 -107
  81. data/app/helpers/alchemy/admin/essences_helper.rb +108 -108
  82. data/app/helpers/alchemy/admin/pages_helper.rb +42 -42
  83. data/app/helpers/alchemy/admin/pictures_helper.rb +26 -26
  84. data/app/helpers/alchemy/base_helper.rb +90 -90
  85. data/app/helpers/alchemy/elements_helper.rb +167 -168
  86. data/app/helpers/alchemy/essences_helper.rb +133 -133
  87. data/app/helpers/alchemy/pages_helper.rb +515 -526
  88. data/app/helpers/alchemy/pictures_helper.rb +19 -0
  89. data/app/mailers/alchemy/messages.rb +13 -13
  90. data/app/mailers/alchemy/notifications.rb +19 -19
  91. data/app/models/alchemy.rb +3 -3
  92. data/app/models/alchemy/attachment.rb +52 -78
  93. data/app/models/alchemy/cell.rb +48 -48
  94. data/app/models/alchemy/content.rb +196 -196
  95. data/app/models/alchemy/element.rb +500 -490
  96. data/app/models/alchemy/essence_audio.rb +7 -7
  97. data/app/models/alchemy/essence_date.rb +10 -10
  98. data/app/models/alchemy/essence_file.rb +7 -7
  99. data/app/models/alchemy/essence_flash.rb +6 -6
  100. data/app/models/alchemy/essence_html.rb +9 -9
  101. data/app/models/alchemy/essence_picture.rb +17 -17
  102. data/app/models/alchemy/essence_richtext.rb +53 -53
  103. data/app/models/alchemy/essence_text.rb +21 -21
  104. data/app/models/alchemy/essence_video.rb +7 -7
  105. data/app/models/alchemy/folded_page.rb +3 -3
  106. data/app/models/alchemy/language.rb +91 -91
  107. data/app/models/alchemy/language/code.rb +14 -14
  108. data/app/models/alchemy/message.rb +48 -45
  109. data/app/models/alchemy/page.rb +555 -558
  110. data/app/models/alchemy/picture.rb +100 -99
  111. data/app/models/alchemy/user.rb +76 -74
  112. data/app/models/alchemy/user_session.rb +8 -8
  113. data/app/sweepers/alchemy/content_sweeper.rb +15 -15
  114. data/app/sweepers/alchemy/pages_sweeper.rb +50 -50
  115. data/app/sweepers/alchemy/pictures_sweeper.rb +14 -14
  116. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +23 -23
  117. data/app/views/alchemy/admin/attachments/_attachment.html.erb +56 -56
  118. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -15
  119. data/app/views/alchemy/admin/attachments/_files_list.html.erb +16 -16
  120. data/app/views/alchemy/admin/attachments/create.js.erb +2 -2
  121. data/app/views/alchemy/admin/attachments/destroy.js.erb +3 -3
  122. data/app/views/alchemy/admin/attachments/edit.html.erb +10 -10
  123. data/app/views/alchemy/admin/attachments/index.html.erb +14 -14
  124. data/app/views/alchemy/admin/attachments/new.html.erb +9 -9
  125. data/app/views/alchemy/admin/clipboard/index.html.erb +21 -21
  126. data/app/views/alchemy/admin/clipboard/insert.js.erb +5 -5
  127. data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
  128. data/app/views/alchemy/admin/contents/create.js.erb +33 -33
  129. data/app/views/alchemy/admin/contents/destroy.js.erb +5 -5
  130. data/app/views/alchemy/admin/contents/new.html.erb +13 -13
  131. data/app/views/alchemy/admin/contents/order.js.erb +2 -2
  132. data/app/views/alchemy/admin/dashboard/index.html.erb +96 -92
  133. data/app/views/alchemy/admin/elements/_add_content.html.erb +12 -12
  134. data/app/views/alchemy/admin/elements/_element.html.erb +3 -3
  135. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +28 -28
  136. data/app/views/alchemy/admin/elements/_picture_editor.html.erb +21 -21
  137. data/app/views/alchemy/admin/elements/create.js.erb +32 -32
  138. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  139. data/app/views/alchemy/admin/elements/new.html.erb +31 -31
  140. data/app/views/alchemy/admin/elements/order.js.erb +3 -3
  141. data/app/views/alchemy/admin/elements/trash.js.erb +13 -13
  142. data/app/views/alchemy/admin/elements/update.js.erb +6 -6
  143. data/app/views/alchemy/admin/essence_files/assign.js.erb +6 -6
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +32 -32
  145. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +1 -1
  146. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
  147. data/app/views/alchemy/admin/essence_pictures/update.js.erb +11 -11
  148. data/app/views/alchemy/admin/languages/_form.html.erb +51 -45
  149. data/app/views/alchemy/admin/languages/_language.html.erb +45 -45
  150. data/app/views/alchemy/admin/languages/_table.html.erb +25 -25
  151. data/app/views/alchemy/admin/layoutpages/index.html.erb +35 -35
  152. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +42 -42
  153. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  154. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +27 -27
  155. data/app/views/alchemy/admin/pages/_page.html.erb +112 -112
  156. data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
  157. data/app/views/alchemy/admin/pages/configure.html.erb +71 -69
  158. data/app/views/alchemy/admin/pages/configure_external.html.erb +38 -38
  159. data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
  160. data/app/views/alchemy/admin/pages/edit.html.erb +165 -165
  161. data/app/views/alchemy/admin/pages/fold.js.erb +2 -2
  162. data/app/views/alchemy/admin/pages/index.html.erb +66 -66
  163. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  164. data/app/views/alchemy/admin/pages/new.html.erb +40 -40
  165. data/app/views/alchemy/admin/pages/sort.js.erb +4 -4
  166. data/app/views/alchemy/admin/pages/unlock.js.erb +6 -6
  167. data/app/views/alchemy/admin/pages/update.js.erb +19 -19
  168. data/app/views/alchemy/admin/partials/_flash.html.erb +2 -2
  169. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +1 -1
  170. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +38 -0
  171. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -15
  172. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +8 -8
  173. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +35 -35
  174. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -14
  175. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +6 -6
  176. data/app/views/alchemy/admin/partials/_upload_form.html.erb +56 -118
  177. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -11
  178. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +71 -71
  179. data/app/views/alchemy/admin/pictures/_picture.html.erb +32 -32
  180. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +26 -26
  181. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +6 -6
  182. data/app/views/alchemy/admin/pictures/create.js.erb +7 -7
  183. data/app/views/alchemy/admin/pictures/index.html.erb +67 -67
  184. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +5 -4
  185. data/app/views/alchemy/admin/resources/_form.html.erb +25 -19
  186. data/app/views/alchemy/admin/resources/_resource.html.erb +37 -36
  187. data/app/views/alchemy/admin/resources/_table.html.erb +17 -17
  188. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
  189. data/app/views/alchemy/admin/resources/index.html.erb +14 -14
  190. data/app/views/alchemy/admin/trash/index.html.erb +20 -20
  191. data/app/views/alchemy/admin/users/_table.html.erb +52 -52
  192. data/app/views/alchemy/admin/users/_user.html.erb +35 -36
  193. data/app/views/alchemy/admin/users/index.html.erb +26 -27
  194. data/app/views/alchemy/base/error_notice.html.erb +2 -2
  195. data/app/views/alchemy/base/update.js.erb +1 -1
  196. data/app/views/alchemy/elements/_contactform_view.html.erb +76 -76
  197. data/app/views/alchemy/elements/_download_view.html.erb +1 -1
  198. data/app/views/alchemy/elements/_editor_not_found.html.erb +3 -3
  199. data/app/views/alchemy/elements/_searchresult_view.html.erb +2 -2
  200. data/app/views/alchemy/elements/_sitemap_editor.html.erb +1 -1
  201. data/app/views/alchemy/essences/_essence_audio_view.html.erb +13 -13
  202. data/app/views/alchemy/essences/_essence_date_editor.html.erb +10 -10
  203. data/app/views/alchemy/essences/_essence_file_editor.html.erb +62 -62
  204. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -8
  205. data/app/views/alchemy/essences/_essence_flash_view.html.erb +19 -19
  206. data/app/views/alchemy/essences/_essence_html_editor.html.erb +6 -6
  207. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +73 -73
  208. data/app/views/alchemy/essences/_essence_picture_view.html.erb +34 -34
  209. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +7 -7
  210. data/app/views/alchemy/essences/_essence_text_editor.html.erb +8 -8
  211. data/app/views/alchemy/navigation/_image_link.html.erb +12 -12
  212. data/app/views/alchemy/navigation/_link.html.erb +13 -13
  213. data/app/views/alchemy/navigation/_renderer.html.erb +17 -17
  214. data/app/views/alchemy/page_layouts/_layout_footer.html.erb +1 -1
  215. data/app/views/alchemy/page_layouts/_layout_header.html.erb +1 -1
  216. data/app/views/alchemy/pages/show.rss.builder +14 -14
  217. data/app/views/alchemy/search/_result.html.erb +7 -7
  218. data/app/views/alchemy/user_sessions/leave.html.erb +9 -9
  219. data/app/views/alchemy/user_sessions/login.html.erb +39 -39
  220. data/app/views/alchemy/user_sessions/logout.html.erb +1 -1
  221. data/app/views/layouts/alchemy/admin.html.erb +81 -81
  222. data/app/views/layouts/alchemy/login.html.erb +36 -36
  223. data/app/views/layouts/alchemy/pages.html.erb +48 -27
  224. data/bin/alchemy +136 -134
  225. data/config/alchemy/config.yml +13 -9
  226. data/config/locales/alchemy.de.yml +24 -30
  227. data/config/locales/alchemy.en.yml +11 -28
  228. data/config/routes.rb +146 -146
  229. data/db/migrate/20100607193638_create_essence_pictures.rb +3 -3
  230. data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +1 -1
  231. data/db/migrate/20101109151812_create_languages.rb +3 -3
  232. data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +3 -3
  233. data/db/migrate/20110224105120_change_pages_visible_default.rb +3 -3
  234. data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +2 -2
  235. data/db/migrate/20110414163140_remove_display_name_from_elements.rb +3 -3
  236. data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +2 -2
  237. data/db/migrate/20110529130500_add_cell_id_to_elements.rb +3 -3
  238. data/db/migrate/20110530102804_change_pages_page_layout_column.rb +3 -3
  239. data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +1 -1
  240. data/db/migrate/20111116125112_namespace_alchemy_models.rb +21 -21
  241. data/lib/alchemy/auth_engine.rb +5 -5
  242. data/lib/alchemy/capistrano.rb +64 -64
  243. data/lib/alchemy/config.rb +47 -44
  244. data/lib/alchemy/engine.rb +41 -41
  245. data/lib/alchemy/essence.rb +50 -51
  246. data/lib/alchemy/i18n.rb +48 -48
  247. data/lib/alchemy/modules.rb +30 -30
  248. data/lib/alchemy/mount_point.rb +6 -6
  249. data/lib/alchemy/page_layout.rb +94 -93
  250. data/lib/alchemy/resource.rb +82 -0
  251. data/lib/alchemy/resources_helper.rb +56 -0
  252. data/lib/alchemy/scoped_pagination_url_helper.rb +8 -8
  253. data/lib/alchemy/seeder.rb +88 -88
  254. data/lib/alchemy/tinymce.rb +49 -49
  255. data/lib/alchemy/upgrader.rb +103 -103
  256. data/lib/alchemy/version.rb +1 -1
  257. data/lib/alchemy_cms.rb +26 -27
  258. data/lib/extensions/action_view.rb +1 -1
  259. data/lib/extensions/array.rb +3 -3
  260. data/lib/extensions/hash.rb +3 -3
  261. data/lib/middleware/flash_session_cookie.rb +1 -1
  262. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +24 -24
  263. data/lib/rails/generators/alchemy/elements/elements_generator.rb +7 -7
  264. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -17
  265. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +6 -6
  266. data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +8 -8
  267. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +7 -7
  268. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +36 -36
  269. data/lib/rails/templates/alchemy.rb +1 -1
  270. data/lib/tasks/ferret.rake +2 -2
  271. data/lib/tasks/fleximage.rake +32 -32
  272. data/lib/tasks/install.rake +12 -12
  273. data/lib/tasks/upgrade.rake +4 -4
  274. data/spec/controllers/admin/clipboard_controller_spec.rb +43 -43
  275. data/spec/controllers/admin/contents_controller_spec.rb +22 -22
  276. data/spec/controllers/admin/elements_controller_spec.rb +13 -13
  277. data/spec/controllers/admin/languages_controller_spec.rb +31 -0
  278. data/spec/controllers/admin/pages_controller_spec.rb +10 -41
  279. data/spec/controllers/admin/resources_controller_spec.rb +19 -0
  280. data/spec/controllers/admin/trash_controller_spec.rb +11 -11
  281. data/spec/controllers/base_controller_spec.rb +46 -46
  282. data/spec/controllers/pages_controller_spec.rb +102 -92
  283. data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
  284. data/spec/dummy/app/controllers/errors_controller.rb +5 -0
  285. data/spec/dummy/app/models/event.rb +3 -0
  286. data/spec/dummy/config.ru +1 -1
  287. data/spec/dummy/config/application.rb +3 -0
  288. data/spec/dummy/config/authorization_rules.rb +7 -0
  289. data/spec/dummy/config/environments/development.rb +8 -1
  290. data/spec/dummy/config/environments/production.rb +1 -1
  291. data/spec/dummy/config/environments/test.rb +5 -2
  292. data/spec/dummy/config/routes.rb +9 -1
  293. data/spec/dummy/db/schema.rb +47 -35
  294. data/spec/dummy/public/404.html +19 -7
  295. data/spec/dummy/public/404.html.bak +26 -0
  296. data/spec/dummy/public/422.html +19 -7
  297. data/spec/dummy/public/500.html +19 -7
  298. data/spec/dummy/script/rails +2 -2
  299. data/spec/factories.rb +76 -76
  300. data/spec/helpers/admin/base_helper_spec.rb +21 -21
  301. data/spec/helpers/admin/contents_helper_spec.rb +14 -14
  302. data/spec/helpers/admin/elements_helper_spec.rb +40 -40
  303. data/spec/helpers/admin/essences_helper_spec.rb +7 -7
  304. data/spec/helpers/elements_helper_spec.rb +154 -154
  305. data/spec/helpers/essences_helper_spec.rb +10 -10
  306. data/spec/helpers/pages_helper_spec.rb +369 -372
  307. data/spec/helpers/pictures_helper_spec.rb +14 -0
  308. data/spec/helpers/url_helpers_spec.rb +29 -34
  309. data/spec/integration/admin/pages_controller_spec.rb +50 -50
  310. data/spec/integration/admin/resources_integration_spec.rb +100 -0
  311. data/spec/integration/navigation_spec.rb +1 -1
  312. data/spec/integration/pages_controller_spec.rb +205 -207
  313. data/spec/integration/security_spec.rb +47 -47
  314. data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +42 -0
  315. data/spec/javascripts/alchemy_integration_spec.coffee +12 -0
  316. data/spec/javascripts/fixtures/select.html +3 -0
  317. data/spec/javascripts/helpers/.gitkeep +0 -0
  318. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +289 -0
  319. data/spec/javascripts/helpers/mock-ajax.js +207 -0
  320. data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
  321. data/spec/javascripts/spec.css +3 -0
  322. data/spec/javascripts/spec.js +2 -0
  323. data/spec/libraries/resource_spec.rb +122 -0
  324. data/spec/libraries/resources_helper_spec.rb +105 -0
  325. data/spec/models/content_spec.rb +67 -67
  326. data/spec/models/element_spec.rb +133 -133
  327. data/spec/models/essence_picture_spec.rb +5 -5
  328. data/spec/models/essence_richtext_spec.rb +4 -4
  329. data/spec/models/language_spec.rb +89 -89
  330. data/spec/models/page_spec.rb +436 -506
  331. data/spec/models/picture_spec.rb +34 -34
  332. data/spec/models/user_spec.rb +2 -2
  333. data/spec/page_layout_spec.rb +24 -20
  334. data/spec/routing_spec.rb +253 -253
  335. data/spec/spec_helper.rb +51 -50
  336. data/spec/support/alchemy/controller_hacks.rb +25 -25
  337. data/spec/support/alchemy/specs_helpers.rb +25 -25
  338. data/spec/support/integration_spec_helper.rb +24 -0
  339. data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +271 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +86 -85
  341. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +380 -377
  342. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +285 -279
  343. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +3 -3
  344. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +47 -47
  345. data/vendor/assets/javascripts/swfupload/swfupload.js +612 -612
  346. data/vendor/assets/javascripts/swfupload/swfupload.queue.js +93 -93
  347. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +337 -337
  348. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +706 -102
  349. data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
  350. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
  351. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +386 -376
  352. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
  353. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
  354. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +20 -17
  355. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
  356. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +183 -173
  357. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
  358. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
  359. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
  360. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +282 -280
  361. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
  362. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +204 -204
  363. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +435 -435
  364. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +24 -22
  365. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +144 -136
  366. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +184 -168
  367. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +62 -46
  368. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +17 -16
  369. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +56 -47
  370. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +67 -54
  371. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +852 -1
  372. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +79 -69
  373. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
  374. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +28 -28
  375. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
  376. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +248 -246
  377. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +246 -246
  378. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +146 -146
  379. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +31 -31
  380. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
  381. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
  382. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
  383. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  384. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +53 -46
  385. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +57 -45
  386. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +182 -47
  387. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +399 -92
  388. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +891 -187
  389. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +102 -24
  390. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +377 -78
  391. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +452 -77
  392. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +167 -45
  393. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +399 -92
  394. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +890 -190
  395. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +33 -7
  396. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +15 -4
  397. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +18 -15
  398. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
  399. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
  400. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
  401. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
  402. metadata +102 -115
  403. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +0 -216
  404. data/lib/tasks/routes.rake +0 -29
  405. data/spec/integration/admin/resources_spec.rb +0 -19
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Alchemy::PicturesHelper do
4
+
5
+ describe "alchemy_picture_path" do
6
+
7
+ it "should route to show_picture_path" do
8
+ pic = mock_model("Picture", :urlname => 'cute-kitten', :id => 1)
9
+ helper.alchemy_picture_path(pic).should == '/alchemy/pictures/1/show/cute-kitten.jpg'
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -2,39 +2,34 @@ require 'spec_helper'
2
2
 
3
3
  describe "URL generating" do
4
4
 
5
- it "should generate a url string for cropped picture" do
6
- p = show_picture_path(:id => 3, :crop => "crop", :size => "100x33", :name => "kitten", :format => "jpg")
7
- p.should == "/alchemy/pictures/3/show/100x33/crop/kitten.jpg"
8
- end
9
-
10
- it "should generate a url string for cropped and masked picture" do
11
- p = show_picture_path(:id => 3, :crop => "crop", :crop_from => "0x0", :crop_size => "900x300", :size => "100x33", :name => "kitten", :format => :jpg)
12
- p.should == "/alchemy/pictures/3/show/100x33/crop/0x0/900x300/kitten.jpg"
13
- end
14
-
15
- it "should generate a url string for picture with default format" do
16
- p = show_picture_path(:id => 3, :size => "100x33", :name => 'kitten')
17
- p.should == "/alchemy/pictures/3/show/100x33/kitten.#{Alchemy::Config.get(:image_output_format)}"
18
- end
19
-
20
- it "should generate a url string for cropped thumbnail" do
21
- p = thumbnail_path(:id => 3, :crop => "crop", :size => "100x33", :name => "kitten", :format => :jpg)
22
- p.should == "/alchemy/pictures/3/thumbnails/100x33/crop/kitten.jpg"
23
- end
24
-
25
- it "should generate a url string for thumbnail with default name and format" do
26
- p = thumbnail_path(:id => 3, :size => "100x33")
27
- p.should == "/alchemy/pictures/3/thumbnails/100x33/thumbnail.png"
28
- end
29
-
30
- it "should generate a url string for cropped and masked thumbnail" do
31
- p = thumbnail_path(:id => 3, :crop_from => "0x0", :crop_size => "900x300", :size => "100x33", :name => "kitten", :format => :jpg)
32
- p.should == "/alchemy/pictures/3/thumbnails/100x33/0x0/900x300/kitten.jpg"
33
- end
34
-
35
- it "should generate a url string for zoomed image" do
36
- p = zoom_picture_path(:id => 3, :name => "kitten", :format => :jpg)
37
- p.should == "/alchemy/pictures/3/zoom/kitten.jpg"
38
- end
5
+ it "should generate a url string for cropped picture" do
6
+ p = show_picture_path(:id => 3, :crop => "crop", :size => "100x33", :name => "kitten", :format => "jpg")
7
+ p.should == "/alchemy/pictures/3/show/100x33/crop/kitten.jpg"
8
+ end
9
+
10
+ it "should generate a url string for cropped and masked picture" do
11
+ p = show_picture_path(:id => 3, :crop => "crop", :crop_from => "0x0", :crop_size => "900x300", :size => "100x33", :name => "kitten", :format => :jpg)
12
+ p.should == "/alchemy/pictures/3/show/100x33/crop/0x0/900x300/kitten.jpg"
13
+ end
14
+
15
+ it "should generate a url string for cropped thumbnail" do
16
+ p = thumbnail_path(:id => 3, :crop => "crop", :size => "100x33", :name => "kitten", :format => :jpg)
17
+ p.should == "/alchemy/pictures/3/thumbnails/100x33/crop/kitten.jpg"
18
+ end
19
+
20
+ it "should generate a url string for thumbnail with default name and format" do
21
+ p = thumbnail_path(:id => 3, :size => "100x33")
22
+ p.should == "/alchemy/pictures/3/thumbnails/100x33/thumbnail.png"
23
+ end
24
+
25
+ it "should generate a url string for cropped and masked thumbnail" do
26
+ p = thumbnail_path(:id => 3, :crop_from => "0x0", :crop_size => "900x300", :size => "100x33", :name => "kitten", :format => :jpg)
27
+ p.should == "/alchemy/pictures/3/thumbnails/100x33/0x0/900x300/kitten.jpg"
28
+ end
29
+
30
+ it "should generate a url string for zoomed image" do
31
+ p = zoom_picture_path(:id => 3, :name => "kitten", :format => :jpg)
32
+ p.should == "/alchemy/pictures/3/zoom/kitten.jpg"
33
+ end
39
34
 
40
35
  end
@@ -1,73 +1,73 @@
1
1
  # Skipping on Travis-CI, because capybara-webkit does not install on travis.
2
2
  unless ENV["CI"]
3
3
 
4
- require 'spec_helper'
4
+ require 'spec_helper'
5
5
 
6
- describe Alchemy::Admin::PagesController, :js => true do
6
+ describe Alchemy::Admin::PagesController, :js => true do
7
7
 
8
- describe "language tree switching" do
8
+ describe "language tree switching" do
9
9
 
10
- context "in a multilangual environment" do
10
+ context "in a multilangual environment" do
11
11
 
12
- before(:all) do
13
- Factory.build(:admin_user).save_without_session_maintenance
14
- @language = Factory(:language)
15
- @german_root = Factory(:language_root_page, :language => Alchemy::Language.get_default, :name => 'Deutsch')
16
- @klingonian_root = Factory(:language_root_page, :name => 'Klingonian')
17
- end
12
+ before(:all) do
13
+ Factory.build(:admin_user).save_without_session_maintenance
14
+ @language = Factory(:language)
15
+ @german_root = Factory(:language_root_page, :language => Alchemy::Language.get_default, :name => 'Deutsch')
16
+ @klingonian_root = Factory(:language_root_page, :name => 'Klingonian')
17
+ end
18
18
 
19
- it "one should be able to switch the language tree" do
20
- login_into_alchemy
21
- visit('/alchemy/admin/pages')
22
- page.select 'Klingonian', :from => 'language'
23
- page.should have_selector('#sitemap .sitemap_pagename_link', :text => 'Klingonian')
24
- end
19
+ it "one should be able to switch the language tree" do
20
+ login_into_alchemy
21
+ visit('/alchemy/admin/pages')
22
+ page.select 'Klingonian', :from => 'language'
23
+ page.should have_selector('#sitemap .sitemap_pagename_link', :text => 'Klingonian')
24
+ end
25
25
 
26
- after(:all) {
27
- @language.destroy
28
- @klingonian_root.delete
29
- @german_root.delete
30
- }
26
+ after(:all) {
27
+ @language.destroy
28
+ @klingonian_root.delete
29
+ @german_root.delete
30
+ }
31
31
 
32
- end
32
+ end
33
33
 
34
- context "with no language root page" do
34
+ context "with no language root page" do
35
35
 
36
- before(:all) do
37
- Factory.build(:admin_user).save_without_session_maintenance
38
- @language = Factory(:language)
39
- end
36
+ before(:all) do
37
+ Factory.build(:admin_user).save_without_session_maintenance
38
+ @language = Factory(:language)
39
+ end
40
40
 
41
- it "it should display the form for creating language root" do
42
- login_into_alchemy
43
- visit('/alchemy/admin/pages')
44
- page.select 'Klingonian', :from => 'language'
45
- page.should have_content('This language tree does not exist')
46
- end
41
+ it "it should display the form for creating language root" do
42
+ login_into_alchemy
43
+ visit('/alchemy/admin/pages')
44
+ page.select 'Klingonian', :from => 'language'
45
+ page.should have_content('This language tree does not exist')
46
+ end
47
47
 
48
- after(:all) {
49
- @language.destroy
50
- }
48
+ after(:all) {
49
+ @language.destroy
50
+ }
51
51
 
52
- end
52
+ end
53
53
 
54
- end
54
+ end
55
55
 
56
- describe "flush complete page cache" do
56
+ describe "flush complete page cache" do
57
57
 
58
- before(:all) do
59
- Factory.build(:admin_user).save_without_session_maintenance
60
- end
58
+ before(:all) do
59
+ Factory.build(:admin_user).save_without_session_maintenance
60
+ end
61
61
 
62
- it "should remove the cache of all pages" do
63
- login_into_alchemy
64
- visit '/alchemy/admin/pages'
65
- click_link 'Flush page cache'
66
- page.should have_content('Page cache flushed')
67
- end
62
+ it "should remove the cache of all pages" do
63
+ login_into_alchemy
64
+ visit '/alchemy/admin/pages'
65
+ click_link 'Flush page cache'
66
+ page.should have_content('Page cache flushed')
67
+ end
68
68
 
69
- end
69
+ end
70
70
 
71
- end
71
+ end
72
72
 
73
73
  end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+ require 'support/integration_spec_helper'
3
+
4
+ describe "Resources" do
5
+
6
+ before(:all) do
7
+ Event.create!(:name => 'My Event',
8
+ :hidden_name => 'not shown',
9
+ :starts_at => DateTime.new(2012, 03, 02, 8, 15),
10
+ :ends_at => DateTime.new(2012, 03, 02, 19, 30),
11
+ :description => "something\nfancy",
12
+ :published => false,
13
+ :entrance_fee => 12.32)
14
+ end
15
+
16
+ describe "index view" do
17
+
18
+ it "should have a button for creating a new resource items" do
19
+ without_access_control { visit '/admin/events' }
20
+ page.should have_selector('#toolbar div.button_with_label a.icon_button span.icon.create')
21
+ end
22
+
23
+ it "should list existing items" do
24
+ without_access_control {
25
+ visit '/admin/events'
26
+ page.should have_content("My Event")
27
+ page.should have_content("something fancy")
28
+ page.should have_content("12.32")
29
+ }
30
+ end
31
+
32
+ it "should list existing resource-items nicely formatted"
33
+
34
+ end
35
+
36
+ describe "form for creating and updating items" do
37
+ it "renders an input field according to the attribute's type"
38
+ end
39
+
40
+ describe "create resource item" do
41
+
42
+ context "when form filled with valid data" do
43
+ it "lists the new item" do
44
+ without_access_control {
45
+ create_admin_user
46
+ login_with_admin_user
47
+ visit '/admin/events/new'
48
+ fill_in 'event_name', :with => 'My second event'
49
+ fill_in 'event_starts_at', :with => DateTime.new(2012, 03, 03, 20, 00)
50
+ click_on 'Save'
51
+ page.should have_content "My second event"
52
+ page.should have_content "2012-03-03"
53
+ }
54
+ end
55
+ end
56
+
57
+ context "when form filled with invalid data" do
58
+ it "shows the form again" do
59
+ without_access_control {
60
+ create_admin_user
61
+ login_with_admin_user
62
+ visit '/admin/events/new'
63
+ fill_in 'event_name', :with => '' #invalid!
64
+ click_on 'Save'
65
+ page.should have_selector "input#event_name"
66
+ }
67
+ end
68
+ it "lists invalid fields"
69
+ end
70
+
71
+ end
72
+
73
+ describe "updating an item" do
74
+ it "shows the updated value"
75
+ end
76
+
77
+ describe "destroying an item" do
78
+ it "should'n be on the list anymore", :js => true do
79
+ pending "Needs js, but doesn't work, neither with selenium nor webkit.
80
+ When trying to create an user inside the 'without-access-control'-block
81
+ it's saved but not found anymore when trying to login"
82
+
83
+ Event.create!(:name => 'My second Event',
84
+ :starts_at => DateTime.new(2012, 03, 02, 8, 15),
85
+ :ends_at => DateTime.new(2012, 03, 02, 19, 30),
86
+ :description => "something\nfancy",
87
+ :published => false,
88
+ :entrance_fee => 12.32)
89
+
90
+ without_access_control {
91
+ create_admin_user
92
+ visit '/admin/events'
93
+ click_link 'Delete'
94
+ page.should have_content "My Event"
95
+ page.should_not have_content "My second Event"
96
+ }
97
+ end
98
+ end
99
+
100
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "Dummy App" do
4
4
  include Capybara::DSL
5
-
5
+
6
6
  it "should be a valid app" do
7
7
  ::Rails.application.should be_a(Dummy::Application)
8
8
  end
@@ -1,256 +1,254 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Alchemy::PagesController do
4
-
5
- before(:each) do
6
- @default_language = Alchemy::Language.get_default
7
- @default_language_root = Factory(:language_root_page, :language => @default_language, :name => 'Home')
8
- end
9
-
10
- describe "#show" do
11
-
12
- it "should include all its elements and contents" do
13
- p = Factory(:public_page, :language => @default_language)
14
- article = p.elements.find_by_name('article')
15
- article.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
16
- visit '/alchemy/a-public-page'
17
- within('div#content div.article div.intro') { page.should have_content('Welcome to Peters Petshop') }
18
- end
19
-
20
- it "should show the navigation with all visible pages" do
21
- pages = [
22
- Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 1', :parent_id => @default_language_root.id),
23
- Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 2', :parent_id => @default_language_root.id)
24
- ]
25
- visit '/alchemy/'
26
- within('div#navigation ul') { page.should have_selector('li a[href="/alchemy/page-1"], li a[href="/alchemy/page-2"]') }
27
- end
28
-
29
- context "when a global page with the same urlname as the requested page exists in the language tree" do
30
-
31
- it "should render the content page, not the global page" do
32
- globalpage = Factory(:public_page, :layoutpage => true, :language => @default_language, :name => "samename", :urlname => "samename", :parent_id => @default_language_root.id)
33
- contentpage = Factory(:public_page, :layoutpage => false, :language => @default_language, :name => "samename", :urlname => "samename", :parent_id => @default_language_root.id)
34
- article = contentpage.elements.find_by_name('article')
35
- article.content_by_name('intro').essence.update_attributes(:body => 'rendered on contentpage', :public => true)
36
- visit("/alchemy/samename")
37
- within('div#content div.article div.intro') { page.should have_content('rendered on contentpage') }
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- describe "fulltext search" do
45
-
46
- before(:each) do
47
- @page = Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 1', :parent_id => @default_language_root.id)
48
- @element = Factory(:element, :name => 'article', :page => @page)
49
- Factory(:public_page, :language => @default_language, :name => 'Suche', :page_layout => 'search', :parent_id => @default_language_root.id)
50
- end
51
-
52
- it "should have a correct path in the form tag" do
53
- visit('/alchemy/suche')
54
- page.should have_selector('div#content form[action="/alchemy/suche"]')
55
- end
56
-
57
- context "performing the search" do
58
-
59
- it "should display search results for richtext essences" do
60
- @element.content_by_name('text').essence.update_attributes(:body => '<p>Welcome to Peters Petshop</p>', :public => true)
61
- visit('/alchemy/suche?query=Petshop')
62
- within('div#content .search_result') { page.should have_content('Petshop') }
63
- end
64
-
65
- it "should display search results for text essences" do
66
- @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
67
- visit('/alchemy/suche?query=Petshop')
68
- within('div#content .search_result') { page.should have_content('Petshop') }
69
- end
70
-
71
- it "should not find contents placed on global-pages (layoutpage => true)" do
72
- @page.update_attributes(:layoutpage => true)
73
- @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
74
- visit('/alchemy/suche?query=Petshop')
75
- within('div#content') { page.should have_css('h2.no_search_results') }
76
- end
77
-
78
- it "should not find contents placed on unpublished pages (public => false)" do
79
- @page.update_attributes(:public => false)
80
- @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
81
- visit('/alchemy/suche?query=Petshop')
82
- within('div#content') { page.should have_css('h2.no_search_results') }
83
- end
84
-
85
- it "should not find contents placed on restricted pages (restricted => true)" do
86
- @page.update_attributes(:restricted => true)
87
- @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
88
- visit('/alchemy/suche?query=Petshop')
89
- within('div#content') { page.should have_css('h2.no_search_results') }
90
- end
91
-
92
- end
93
-
94
- end
95
-
96
- describe "redirecting" do
97
4
 
98
- context "in multi language mode" do
5
+ before(:each) do
6
+ @default_language = Alchemy::Language.get_default
7
+ @default_language_root = Factory(:language_root_page, :language => @default_language, :name => 'Home')
8
+ end
9
+
10
+ describe "#show" do
11
+
12
+ it "should include all its elements and contents" do
13
+ p = Factory(:public_page, :language => @default_language)
14
+ article = p.elements.find_by_name('article')
15
+ article.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
16
+ visit '/alchemy/a-public-page'
17
+ within('div#content div.article div.intro') { page.should have_content('Welcome to Peters Petshop') }
18
+ end
19
+
20
+ it "should show the navigation with all visible pages" do
21
+ pages = [
22
+ Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 1', :parent_id => @default_language_root.id),
23
+ Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 2', :parent_id => @default_language_root.id)
24
+ ]
25
+ visit '/alchemy/'
26
+ within('div#navigation ul') { page.should have_selector('li a[href="/alchemy/page-1"], li a[href="/alchemy/page-2"]') }
27
+ end
28
+
29
+ end
30
+
31
+ describe "fulltext search" do
32
+
33
+ before(:each) do
34
+ @page = Factory(:public_page, :language => @default_language, :visible => true, :name => 'Page 1', :parent_id => @default_language_root.id)
35
+ @element = Factory(:element, :name => 'article', :page => @page)
36
+ Factory(:public_page, :language => @default_language, :name => 'Suche', :page_layout => 'search', :parent_id => @default_language_root.id)
37
+ end
38
+
39
+ it "should have a correct path in the form tag" do
40
+ visit('/alchemy/suche')
41
+ page.should have_selector('div#content form[action="/alchemy/suche"]')
42
+ end
43
+
44
+ context "performing the search" do
45
+
46
+ it "should display search results for richtext essences" do
47
+ @element.content_by_name('text').essence.update_attributes(:body => '<p>Welcome to Peters Petshop</p>', :public => true)
48
+ visit('/alchemy/suche?query=Petshop')
49
+ within('div#content .search_result') { page.should have_content('Petshop') }
50
+ end
51
+
52
+ it "should display search results for text essences" do
53
+ @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
54
+ visit('/alchemy/suche?query=Petshop')
55
+ within('div#content .search_result') { page.should have_content('Petshop') }
56
+ end
57
+
58
+ it "should not find contents placed on global-pages (layoutpage => true)" do
59
+ @page.update_attributes(:layoutpage => true)
60
+ @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
61
+ visit('/alchemy/suche?query=Petshop')
62
+ within('div#content') { page.should have_css('h2.no_search_results') }
63
+ end
64
+
65
+ it "should not find contents placed on unpublished pages (public => false)" do
66
+ @page.update_attributes(:public => false)
67
+ @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
68
+ visit('/alchemy/suche?query=Petshop')
69
+ within('div#content') { page.should have_css('h2.no_search_results') }
70
+ end
71
+
72
+ it "should not find contents placed on restricted pages (restricted => true)" do
73
+ @page.update_attributes(:restricted => true)
74
+ @element.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
75
+ visit('/alchemy/suche?query=Petshop')
76
+ within('div#content') { page.should have_css('h2.no_search_results') }
77
+ end
99
78
 
100
- before(:each) do
101
- @page = Factory(:public_page)
102
- Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
103
- end
79
+ end
104
80
 
105
- it "should redirect to url with nested language code" do
106
- visit '/alchemy/a-public-page'
107
- page.current_path.should == '/alchemy/de/a-public-page'
108
- end
81
+ end
109
82
 
110
- context "should redirect to public child" do
83
+ describe "redirecting" do
111
84
 
112
- before(:each) do
113
- @page.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
114
- @child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id)
115
- Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
116
- end
85
+ context "in multi language mode" do
117
86
 
118
- it "if requested page is unpublished" do
119
- visit '/alchemy/kl/not-public'
120
- page.current_path.should == '/alchemy/kl/public-child'
121
- end
87
+ before(:each) do
88
+ @page = Factory(:public_page)
89
+ Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
90
+ end
122
91
 
123
- it "with nested language code, if requested page is unpublished and url has no language code" do
124
- visit '/alchemy/not-public'
125
- page.current_path.should == '/alchemy/kl/public-child'
126
- end
92
+ it "should redirect to url with nested language code" do
93
+ visit '/alchemy/a-public-page'
94
+ page.current_path.should == '/alchemy/de/a-public-page'
95
+ end
127
96
 
128
- end
97
+ context "should redirect to public child" do
129
98
 
130
- it "should redirect to pages url, if requested url is index url" do
131
- visit '/alchemy/'
132
- page.current_path.should == '/alchemy/de/home'
133
- end
99
+ before(:each) do
100
+ @page.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
101
+ @child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id)
102
+ Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
103
+ end
134
104
 
135
- it "should redirect to pages url, if requested url is only the language code" do
136
- visit '/alchemy/de'
137
- page.current_path.should == '/alchemy/de/home'
138
- end
105
+ it "if requested page is unpublished" do
106
+ visit '/alchemy/kl/not-public'
107
+ page.current_path.should == '/alchemy/kl/public-child'
108
+ end
139
109
 
140
- it "should keep additional params" do
141
- visit '/alchemy/a-public-page?query=Peter'
142
- page.current_url.should match(/\?query=Peter/)
143
- end
110
+ it "with nested language code, if requested page is unpublished and url has no language code" do
111
+ visit '/alchemy/not-public'
112
+ page.current_path.should == '/alchemy/kl/public-child'
113
+ end
144
114
 
145
- context "url nesting" do
115
+ end
146
116
 
147
- before(:each) do
148
- @level1 = Factory(:public_page, :parent_id => @default_language_root.id, :name => 'catalog', :language => @default_language)
149
- @level2 = Factory(:public_page, :parent_id => @level1.id, :name => 'products', :language => @default_language)
150
- @level3 = Factory(:public_page, :parent_id => @level2.id, :name => 'screwdriver', :language => @default_language)
151
- end
117
+ it "should redirect to pages url, if requested url is index url" do
118
+ visit '/alchemy/'
119
+ page.current_path.should == '/alchemy/de/home'
120
+ end
152
121
 
153
- context "enabled" do
122
+ it "should redirect to pages url, if requested url is only the language code" do
123
+ visit '/alchemy/de'
124
+ page.current_path.should == '/alchemy/de/home'
125
+ end
154
126
 
155
- before(:each) do
156
- Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
157
- end
127
+ it "should keep additional params" do
128
+ visit '/alchemy/a-public-page?query=Peter'
129
+ page.current_url.should match(/\?query=Peter/)
130
+ end
158
131
 
159
- context "requesting a non nested url" do
132
+ context "with url nesting" do
160
133
 
161
- it "should redirect to nested url" do
162
- visit "/alchemy/de/screwdriver"
163
- page.current_path.should == '/alchemy/de/catalog/products/screwdriver'
164
- end
134
+ before(:each) do
135
+ @level1 = Factory(:public_page, :parent_id => @default_language_root.id, :name => 'catalog', :language => @default_language)
136
+ @level2 = Factory(:public_page, :parent_id => @level1.id, :name => 'products', :language => @default_language)
137
+ @level3 = Factory(:public_page, :parent_id => @level2.id, :name => 'screwdriver', :language => @default_language)
138
+ end
165
139
 
166
- it "should only redirect to nested url if page is nested" do
167
- visit "/alchemy/de/catalog"
168
- page.status_code.should == 200
169
- page.current_path.should == "/alchemy/de/catalog"
170
- end
140
+ context "enabled" do
171
141
 
172
- end
142
+ before(:each) do
143
+ Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? true : Alchemy::Config.parameter(arg) }
144
+ end
173
145
 
174
- end
146
+ context "requesting a non nested url" do
175
147
 
176
- context "disabled" do
148
+ it "should redirect to nested url" do
149
+ visit "/alchemy/de/screwdriver"
150
+ page.current_path.should == '/alchemy/de/catalog/products/screwdriver'
151
+ end
177
152
 
178
- before(:each) do
179
- Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
180
- end
153
+ it "should only redirect to nested url if page is nested" do
154
+ visit "/alchemy/de/catalog"
155
+ page.status_code.should == 200
156
+ page.current_path.should == "/alchemy/de/catalog"
157
+ end
181
158
 
182
- context "requesting a nested url" do
159
+ end
183
160
 
184
- it "should redirect to not nested url" do
185
- visit "/alchemy/de/catalog/products/screwdriver"
186
- page.current_path.should == "/alchemy/de/screwdriver"
187
- end
161
+ end
188
162
 
189
- end
163
+ context "disabled" do
190
164
 
191
- end
165
+ before(:each) do
166
+ Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
167
+ end
192
168
 
193
- end
169
+ context "requesting a nested url" do
194
170
 
195
- end
171
+ it "should redirect to not nested url" do
172
+ visit "/alchemy/de/catalog/products/screwdriver"
173
+ page.current_path.should == "/alchemy/de/screwdriver"
174
+ end
196
175
 
197
- context "not in multi language mode" do
176
+ end
198
177
 
199
- before(:each) do
200
- @page = Factory(:public_page, :language => @default_language, :parent_id => @default_language_root.id)
201
- Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
202
- end
178
+ end
203
179
 
204
- it "should redirect from nested language code url to normal url" do
205
- visit '/alchemy/de/a-public-page'
206
- page.current_path.should == '/alchemy/a-public-page'
207
- end
180
+ end
208
181
 
209
- context "with no lang parameter" do
182
+ end
210
183
 
211
- it "should have defaults language language_id in the session" do
212
- get show_page_path(:urlname => 'a-public-page')
213
- controller.session[:language_id].should == Alchemy::Language.get_default.id
214
- end
184
+ context "not in multi language mode" do
215
185
 
216
- it "should have defaults language language_code in the session" do
217
- get show_page_path(:urlname => 'a-public-page')
218
- controller.session[:language_code].should == Alchemy::Language.get_default.code
219
- end
186
+ before(:each) do
187
+ @page = Factory(:public_page, :language => @default_language, :parent_id => @default_language_root.id)
188
+ Alchemy::Config.stub!(:get) { |arg| arg == :url_nesting ? false : Alchemy::Config.parameter(arg) }
189
+ end
220
190
 
221
- end
191
+ it "should redirect from nested language code url to normal url" do
192
+ visit '/alchemy/de/a-public-page'
193
+ page.current_path.should == '/alchemy/a-public-page'
194
+ end
222
195
 
223
- context "should redirect to public child" do
196
+ context "with no lang parameter" do
224
197
 
225
- before(:each) do
226
- @page.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
227
- @child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id, :language => @default_language)
228
- end
198
+ it "should have defaults language language_id in the session" do
199
+ get show_page_path(:urlname => 'a-public-page')
200
+ controller.session[:language_id].should == Alchemy::Language.get_default.id
201
+ end
229
202
 
230
- it "if requested page is unpublished" do
231
- visit '/alchemy/not-public'
232
- page.current_path.should == '/alchemy/public-child'
233
- end
203
+ it "should have defaults language language_code in the session" do
204
+ get show_page_path(:urlname => 'a-public-page')
205
+ controller.session[:language_code].should == Alchemy::Language.get_default.code
206
+ end
234
207
 
235
- it "with normal url, if requested url has nested language code and is not public" do
236
- visit '/alchemy/de/not-public'
237
- page.current_path.should == '/alchemy/public-child'
238
- end
208
+ end
239
209
 
240
- end
210
+ context "should redirect to public child" do
241
211
 
242
- it "should redirect to pages url, if requested url is index url" do
243
- visit '/alchemy/'
244
- page.current_path.should == '/alchemy/home'
245
- end
212
+ before(:each) do
213
+ @page.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
214
+ @child = Factory(:public_page, :name => 'Public Child', :parent_id => @page.id, :language => @default_language)
215
+ end
246
216
 
247
- it "should keep additional params" do
248
- visit '/alchemy/de/a-public-page?query=Peter'
249
- page.current_url.should match(/\?query=Peter/)
250
- end
217
+ it "if requested page is unpublished" do
218
+ visit '/alchemy/not-public'
219
+ page.current_path.should == '/alchemy/public-child'
220
+ end
251
221
 
252
- end
222
+ it "with normal url, if requested url has nested language code and is not public" do
223
+ visit '/alchemy/de/not-public'
224
+ page.current_path.should == '/alchemy/public-child'
225
+ end
253
226
 
254
- end
227
+ end
255
228
 
229
+ it "should redirect to pages url, if requested url is index url" do
230
+ visit '/alchemy/'
231
+ page.current_path.should == '/alchemy/home'
232
+ end
233
+
234
+ it "should keep additional params" do
235
+ visit '/alchemy/de/a-public-page?query=Peter'
236
+ page.current_url.should match(/\?query=Peter/)
237
+ end
238
+
239
+ end
240
+
241
+ end
242
+
243
+ describe "Handling of non-existing pages" do
244
+
245
+ context "404-Errors are handled by Rails now, so no need to test anymore.
246
+ However, it still serves as documentation how they can be handled, so we leave it here" do
247
+
248
+ it "should render public/404.html when it exists"
249
+ it "can be handled by matching /404 and routing it to a controller of choice when no public/404.html exists"
250
+
251
+ end
252
+
253
+ end
256
254
  end