alchemy_cms 3.2.1 → 3.3.0.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 (556) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +28 -0
  3. data/.gitignore +2 -2
  4. data/.travis.yml +11 -3
  5. data/CHANGELOG.md +100 -0
  6. data/CONTRIBUTING.md +1 -1
  7. data/Gemfile +12 -1
  8. data/README.md +25 -7
  9. data/Rakefile +1 -3
  10. data/alchemy_cms.gemspec +7 -15
  11. data/app/assets/fonts/alchemy/icons.eot +0 -0
  12. data/app/assets/fonts/alchemy/icons.svg +28 -66
  13. data/app/assets/fonts/alchemy/icons.ttf +0 -0
  14. data/app/assets/fonts/alchemy/icons.woff +0 -0
  15. data/app/assets/images/alchemy/icons.png +0 -0
  16. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -3
  17. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +15 -6
  18. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +10 -4
  21. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +16 -22
  22. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +69 -32
  23. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +147 -83
  24. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +14 -14
  25. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
  26. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
  27. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +55 -0
  28. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +8 -1
  29. data/app/assets/javascripts/alchemy/alchemy.js +3 -1
  30. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +36 -31
  31. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +35 -29
  32. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +51 -5
  33. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +26 -10
  34. data/app/assets/javascripts/alchemy/{alchemy.windows.js.coffee → alchemy.trash_window.js.coffee} +1 -13
  35. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +15 -17
  36. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +3 -3
  37. data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
  38. data/app/assets/stylesheets/alchemy/_mixins.scss +27 -0
  39. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  40. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  41. data/app/assets/stylesheets/alchemy/archive.scss +0 -57
  42. data/app/assets/stylesheets/alchemy/base.scss +1 -18
  43. data/app/assets/stylesheets/alchemy/buttons.scss +30 -25
  44. data/app/assets/stylesheets/alchemy/dialogs.scss +25 -9
  45. data/app/assets/stylesheets/alchemy/elements.scss +182 -126
  46. data/app/assets/stylesheets/alchemy/form_fields.scss +14 -8
  47. data/app/assets/stylesheets/alchemy/forms.scss +10 -1
  48. data/app/assets/stylesheets/alchemy/frame.scss +3 -10
  49. data/app/assets/stylesheets/alchemy/icon-font.scss +13 -6
  50. data/app/assets/stylesheets/alchemy/icons.scss +16 -0
  51. data/app/assets/stylesheets/alchemy/image_library.scss +269 -0
  52. data/app/assets/stylesheets/alchemy/selects.scss +1 -0
  53. data/app/assets/stylesheets/alchemy/sitemap.scss +12 -1
  54. data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
  55. data/app/assets/stylesheets/alchemy/upload.scss +97 -87
  56. data/app/assets/stylesheets/alchemy/welcome.sass +49 -0
  57. data/app/controllers/alchemy/admin/attachments_controller.rb +21 -29
  58. data/app/controllers/alchemy/admin/base_controller.rb +23 -4
  59. data/app/controllers/alchemy/admin/clipboard_controller.rb +0 -1
  60. data/app/controllers/alchemy/admin/contents_controller.rb +2 -4
  61. data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -4
  62. data/app/controllers/alchemy/admin/elements_controller.rb +20 -11
  63. data/app/controllers/alchemy/admin/essence_files_controller.rb +2 -2
  64. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +10 -9
  65. data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
  66. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -2
  67. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +0 -1
  68. data/app/controllers/alchemy/admin/pages_controller.rb +46 -29
  69. data/app/controllers/alchemy/admin/pictures_controller.rb +44 -55
  70. data/app/controllers/alchemy/admin/resources_controller.rb +8 -75
  71. data/app/controllers/alchemy/admin/tags_controller.rb +10 -8
  72. data/app/controllers/alchemy/admin/trash_controller.rb +0 -6
  73. data/app/controllers/alchemy/api/contents_controller.rb +0 -1
  74. data/app/controllers/alchemy/api/elements_controller.rb +0 -1
  75. data/app/controllers/alchemy/api/pages_controller.rb +4 -1
  76. data/app/controllers/alchemy/attachments_controller.rb +4 -5
  77. data/app/controllers/alchemy/base_controller.rb +6 -5
  78. data/app/controllers/alchemy/elements_controller.rb +1 -1
  79. data/app/controllers/alchemy/messages_controller.rb +9 -4
  80. data/app/controllers/alchemy/pages_controller.rb +133 -137
  81. data/app/controllers/alchemy/pictures_controller.rb +12 -10
  82. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +41 -0
  83. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +56 -0
  84. data/app/controllers/concerns/alchemy/locale_redirects.rb +38 -0
  85. data/app/controllers/concerns/alchemy/page_redirects.rb +80 -0
  86. data/app/controllers/concerns/alchemy/site_redirects.rb +22 -0
  87. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -2
  88. data/app/helpers/alchemy/admin/base_helper.rb +36 -62
  89. data/app/helpers/alchemy/admin/contents_helper.rb +6 -80
  90. data/app/helpers/alchemy/admin/elements_helper.rb +36 -15
  91. data/app/helpers/alchemy/admin/essences_helper.rb +15 -8
  92. data/app/helpers/alchemy/admin/form_helper.rb +6 -10
  93. data/app/helpers/alchemy/admin/navigation_helper.rb +4 -7
  94. data/app/helpers/alchemy/admin/pages_helper.rb +14 -35
  95. data/app/helpers/alchemy/admin/pictures_helper.rb +12 -14
  96. data/app/helpers/alchemy/admin/tags_helper.rb +5 -7
  97. data/app/helpers/alchemy/base_helper.rb +9 -17
  98. data/app/helpers/alchemy/elements_block_helper.rb +5 -13
  99. data/app/helpers/alchemy/elements_helper.rb +6 -6
  100. data/app/helpers/alchemy/essences_helper.rb +3 -16
  101. data/app/helpers/alchemy/pages_helper.rb +32 -25
  102. data/app/helpers/alchemy/url_helper.rb +14 -16
  103. data/app/mailers/alchemy/messages.rb +0 -2
  104. data/app/models/alchemy.rb +0 -2
  105. data/app/models/alchemy/attachment.rb +45 -56
  106. data/app/models/alchemy/cell.rb +7 -8
  107. data/app/models/alchemy/content.rb +39 -24
  108. data/app/models/alchemy/content/factory.rb +27 -44
  109. data/app/models/alchemy/element.rb +101 -267
  110. data/app/models/alchemy/element/definitions.rb +9 -8
  111. data/app/models/alchemy/element/element_contents.rb +150 -0
  112. data/app/models/alchemy/element/element_essences.rb +109 -0
  113. data/app/models/alchemy/element/presenters.rb +18 -7
  114. data/app/models/alchemy/essence_date.rb +1 -2
  115. data/app/models/alchemy/essence_file.rb +10 -6
  116. data/app/models/alchemy/essence_html.rb +0 -1
  117. data/app/models/alchemy/essence_picture.rb +12 -4
  118. data/app/models/alchemy/essence_richtext.rb +6 -3
  119. data/app/models/alchemy/language.rb +48 -21
  120. data/app/models/alchemy/language/code.rb +1 -4
  121. data/app/models/alchemy/page.rb +33 -35
  122. data/app/models/alchemy/page/page_cells.rb +6 -10
  123. data/app/models/alchemy/page/page_elements.rb +130 -100
  124. data/app/models/alchemy/page/page_naming.rb +2 -3
  125. data/app/models/alchemy/page/page_natures.rb +50 -16
  126. data/app/models/alchemy/page/page_scopes.rb +7 -7
  127. data/app/models/alchemy/page/page_users.rb +3 -3
  128. data/app/models/alchemy/picture.rb +48 -33
  129. data/app/models/alchemy/picture/transformations.rb +8 -9
  130. data/app/models/alchemy/site.rb +19 -17
  131. data/app/models/alchemy/site/layout.rb +9 -9
  132. data/app/models/alchemy/tag.rb +0 -2
  133. data/app/models/alchemy/tree_node.rb +5 -4
  134. data/app/serializers/alchemy/attachment_serializer.rb +0 -1
  135. data/app/serializers/alchemy/base_serializer.rb +30 -0
  136. data/app/serializers/alchemy/cell_serializer.rb +0 -1
  137. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -1
  138. data/app/serializers/alchemy/essence_date_serializer.rb +0 -1
  139. data/app/serializers/alchemy/essence_file_serializer.rb +0 -1
  140. data/app/serializers/alchemy/essence_html_serializer.rb +0 -1
  141. data/app/serializers/alchemy/essence_link_serializer.rb +0 -1
  142. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -1
  143. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -1
  144. data/app/serializers/alchemy/essence_select_serializer.rb +0 -1
  145. data/app/serializers/alchemy/essence_text_serializer.rb +0 -1
  146. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -1
  147. data/app/serializers/alchemy/page_serializer.rb +0 -1
  148. data/app/serializers/alchemy/page_tree_serializer.rb +90 -0
  149. data/app/serializers/alchemy/picture_serializer.rb +0 -1
  150. data/app/views/alchemy/_menubar.html.erb +3 -3
  151. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +11 -16
  152. data/app/views/alchemy/admin/attachments/_attachment.html.erb +9 -9
  153. data/app/views/alchemy/admin/attachments/_files_list.html.erb +7 -15
  154. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  155. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  156. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -3
  157. data/app/views/alchemy/admin/attachments/index.html.erb +10 -17
  158. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
  160. data/app/views/alchemy/admin/clipboard/insert.js.erb +3 -3
  161. data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
  162. data/app/views/alchemy/admin/contents/_missing.html.erb +5 -7
  163. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  164. data/app/views/alchemy/admin/contents/new.html.erb +2 -2
  165. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +6 -6
  166. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +2 -2
  167. data/app/views/alchemy/admin/dashboard/_users.html.erb +2 -2
  168. data/app/views/alchemy/admin/dashboard/help.html.erb +15 -15
  169. data/app/views/alchemy/admin/dashboard/index.html.erb +6 -6
  170. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -5
  171. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  172. data/app/views/alchemy/admin/elements/_element.html.erb +52 -18
  173. data/app/views/alchemy/admin/elements/_element_footer.html.erb +11 -0
  174. data/app/views/alchemy/admin/elements/{_element_head.html.erb → _element_header.html.erb} +8 -8
  175. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +49 -0
  176. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +7 -6
  177. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  178. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
  179. data/app/views/alchemy/admin/elements/create.js.erb +13 -8
  180. data/app/views/alchemy/admin/elements/fold.js.erb +12 -7
  181. data/app/views/alchemy/admin/elements/index.html.erb +12 -8
  182. data/app/views/alchemy/admin/elements/list.html.erb +3 -3
  183. data/app/views/alchemy/admin/elements/new.html.erb +4 -4
  184. data/app/views/alchemy/admin/elements/order.js.erb +3 -4
  185. data/app/views/alchemy/admin/elements/publish.js.erb +15 -0
  186. data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
  187. data/app/views/alchemy/admin/elements/update.js.erb +7 -8
  188. data/app/views/alchemy/admin/essence_files/edit.html.erb +16 -13
  189. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +3 -3
  190. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +8 -8
  191. data/app/views/alchemy/admin/languages/_form.html.erb +12 -3
  192. data/app/views/alchemy/admin/languages/_language.html.erb +8 -2
  193. data/app/views/alchemy/admin/languages/_table.html.erb +11 -5
  194. data/app/views/alchemy/admin/languages/index.html.erb +1 -1
  195. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +8 -8
  196. data/app/views/alchemy/admin/layoutpages/edit.html.erb +2 -2
  197. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -13
  198. data/app/views/alchemy/admin/leave.html.erb +5 -5
  199. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +1 -1
  200. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +4 -4
  201. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  202. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +9 -9
  203. data/app/views/alchemy/admin/pages/_external_link.html.erb +6 -6
  204. data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
  205. data/app/views/alchemy/admin/pages/_form.html.erb +6 -6
  206. data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -11
  207. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +3 -3
  208. data/app/views/alchemy/admin/pages/_locked_page.html.erb +4 -4
  209. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -2
  210. data/app/views/alchemy/admin/pages/_page.html.erb +95 -80
  211. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +22 -22
  212. data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -0
  213. data/app/views/alchemy/admin/pages/_page_status.html.erb +7 -9
  214. data/app/views/alchemy/admin/pages/_sitemap.html.erb +35 -6
  215. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -3
  216. data/app/views/alchemy/admin/pages/configure.html.erb +1 -1
  217. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  218. data/app/views/alchemy/admin/pages/edit.html.erb +39 -44
  219. data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
  220. data/app/views/alchemy/admin/pages/fold.js.erb +2 -3
  221. data/app/views/alchemy/admin/pages/index.html.erb +15 -22
  222. data/app/views/alchemy/admin/pages/info.html.erb +8 -8
  223. data/app/views/alchemy/admin/pages/link.html.erb +3 -3
  224. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  225. data/app/views/alchemy/admin/pages/new.html.erb +4 -4
  226. data/app/views/alchemy/admin/pages/sort.js.erb +1 -2
  227. data/app/views/alchemy/admin/pages/unlock.js.erb +1 -1
  228. data/app/views/alchemy/admin/pages/update.js.erb +3 -3
  229. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
  230. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  231. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
  232. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -15
  233. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -13
  234. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
  235. data/app/views/alchemy/admin/pictures/_archive.html.erb +14 -14
  236. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +30 -36
  237. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +5 -5
  238. data/app/views/alchemy/admin/pictures/{edit.html.erb → _form.html.erb} +7 -6
  239. data/app/views/alchemy/admin/pictures/_infos.html.erb +50 -0
  240. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  241. data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -51
  242. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  243. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  244. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
  245. data/app/views/alchemy/admin/pictures/index.html.erb +28 -36
  246. data/app/views/alchemy/admin/pictures/show.html.erb +46 -9
  247. data/app/views/alchemy/admin/pictures/update.js.erb +6 -0
  248. data/app/views/alchemy/admin/resources/_form.html.erb +3 -3
  249. data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
  250. data/app/views/alchemy/admin/resources/_table.html.erb +5 -6
  251. data/app/views/alchemy/admin/resources/index.csv.erb +12 -10
  252. data/app/views/alchemy/admin/resources/index.html.erb +4 -4
  253. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  254. data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
  255. data/app/views/alchemy/admin/tags/edit.html.erb +5 -5
  256. data/app/views/alchemy/admin/tags/index.html.erb +8 -8
  257. data/app/views/alchemy/admin/tags/new.html.erb +2 -2
  258. data/app/views/alchemy/admin/trash/clear.js.erb +1 -1
  259. data/app/views/alchemy/admin/trash/index.html.erb +8 -6
  260. data/app/views/alchemy/admin/uploader/_button.html.erb +39 -0
  261. data/app/views/alchemy/admin/uploader/_setup.html.erb +13 -0
  262. data/app/views/alchemy/base/500.html.erb +4 -4
  263. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  264. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +3 -4
  265. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
  266. data/app/views/alchemy/essences/_essence_date_editor.html.erb +2 -6
  267. data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -1
  268. data/app/views/alchemy/essences/_essence_file_editor.html.erb +9 -11
  269. data/app/views/alchemy/essences/_essence_file_view.html.erb +11 -5
  270. data/app/views/alchemy/essences/_essence_html_editor.html.erb +1 -1
  271. data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
  272. data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -1
  273. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -52
  274. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  275. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -1
  276. data/app/views/alchemy/essences/_essence_select_editor.html.erb +23 -13
  277. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  278. data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -1
  279. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -36
  280. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +5 -5
  281. data/app/views/alchemy/language_links/_language.html.erb +15 -9
  282. data/app/views/alchemy/messages/contact_form_mail.de.text.erb +1 -1
  283. data/app/views/alchemy/messages/contact_form_mail.en.text.erb +1 -1
  284. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +1 -1
  285. data/app/views/alchemy/navigation/_link.html.erb +0 -1
  286. data/app/views/alchemy/pages/show.rss.builder +6 -4
  287. data/app/views/alchemy/welcome.html.erb +28 -0
  288. data/app/views/layouts/alchemy/admin.html.erb +14 -10
  289. data/bin/alchemy +3 -4
  290. data/bin/rspec +7 -0
  291. data/bin/spring +15 -0
  292. data/config/alchemy/config.yml +16 -17
  293. data/config/initializers/assets.rb +13 -0
  294. data/config/locales/alchemy.de.yml +27 -29
  295. data/config/locales/alchemy.en.yml +23 -29
  296. data/config/locales/alchemy.es.yml +23 -29
  297. data/config/locales/alchemy.fr.yml +19 -28
  298. data/config/locales/alchemy.nl.yml +19 -27
  299. data/config/locales/alchemy.ru.yml +19 -28
  300. data/config/routes.rb +53 -54
  301. data/config/spring.rb +2 -0
  302. data/db/migrate/20130827094554_alchemy_two_point_six.rb +1 -3
  303. data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +6 -0
  304. data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +5 -0
  305. data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +7 -0
  306. data/lib/alchemy/auth_accessors.rb +1 -1
  307. data/lib/alchemy/cache_digests/template_tracker.rb +7 -13
  308. data/lib/alchemy/config.rb +5 -7
  309. data/lib/alchemy/configuration_methods.rb +11 -1
  310. data/lib/alchemy/controller_actions.rb +9 -12
  311. data/lib/alchemy/engine.rb +11 -28
  312. data/lib/alchemy/errors.rb +0 -1
  313. data/lib/alchemy/essence.rb +20 -20
  314. data/lib/alchemy/filetypes.rb +1 -3
  315. data/lib/alchemy/forms/builder.rb +0 -2
  316. data/lib/alchemy/hints.rb +1 -3
  317. data/lib/alchemy/i18n.rb +81 -53
  318. data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +0 -2
  319. data/lib/alchemy/locale.rb +0 -1
  320. data/lib/alchemy/logger.rb +1 -3
  321. data/lib/alchemy/modules.rb +3 -3
  322. data/lib/alchemy/mount_point.rb +0 -2
  323. data/lib/alchemy/name_conversions.rb +1 -3
  324. data/lib/alchemy/on_page_layout.rb +37 -23
  325. data/lib/alchemy/on_page_layout/callbacks_runner.rb +34 -0
  326. data/lib/alchemy/page_layout.rb +23 -24
  327. data/lib/alchemy/paths.rb +32 -0
  328. data/lib/alchemy/permissions.rb +20 -20
  329. data/lib/alchemy/picture_attributes.rb +0 -3
  330. data/lib/alchemy/resource.rb +66 -22
  331. data/lib/alchemy/resources_helper.rb +48 -11
  332. data/lib/alchemy/routing_constraints.rb +4 -5
  333. data/lib/alchemy/seeder.rb +1 -4
  334. data/lib/alchemy/shell.rb +12 -14
  335. data/lib/alchemy/tasks/helpers.rb +5 -7
  336. data/lib/alchemy/test_support/essence_shared_examples.rb +24 -24
  337. data/lib/alchemy/test_support/factories.rb +2 -146
  338. data/lib/alchemy/test_support/factories/attachment_factory.rb +9 -0
  339. data/lib/alchemy/test_support/factories/cell_factory.rb +9 -0
  340. data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
  341. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +21 -0
  342. data/lib/alchemy/test_support/factories/element_factory.rb +21 -0
  343. data/lib/alchemy/test_support/factories/essence_file_factory.rb +8 -0
  344. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +8 -0
  345. data/lib/alchemy/test_support/factories/essence_text_factory.rb +7 -0
  346. data/lib/alchemy/test_support/factories/language_factory.rb +28 -0
  347. data/lib/alchemy/test_support/factories/page_factory.rb +45 -0
  348. data/lib/alchemy/test_support/factories/picture_factory.rb +10 -0
  349. data/lib/alchemy/test_support/factories/site_factory.rb +12 -0
  350. data/lib/alchemy/test_support/integration_helpers.rb +0 -3
  351. data/lib/alchemy/tinymce.rb +24 -35
  352. data/lib/alchemy/touching.rb +5 -6
  353. data/lib/alchemy/upgrader.rb +3 -5
  354. data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +155 -0
  355. data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +71 -0
  356. data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +31 -0
  357. data/lib/alchemy/upgrader/three_point_three.rb +50 -0
  358. data/lib/alchemy/upgrader/three_point_two.rb +3 -32
  359. data/lib/alchemy/upgrader/three_point_zero.rb +0 -1
  360. data/lib/alchemy/version.rb +1 -1
  361. data/lib/rails/generators/alchemy/base.rb +1 -1
  362. data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -7
  363. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +5 -7
  364. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +6 -8
  365. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +6 -7
  366. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
  367. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
  368. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
  369. data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -3
  370. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  371. data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +2 -2
  372. data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +2 -2
  373. data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +3 -3
  374. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -1
  375. data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +2 -2
  376. data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +1 -1
  377. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  378. data/lib/rails/templates/alchemy.rb +2 -2
  379. data/lib/tasks/alchemy/convert.rake +4 -8
  380. data/lib/tasks/alchemy/db.rake +2 -3
  381. data/lib/tasks/alchemy/install.rake +3 -4
  382. data/lib/tasks/alchemy/tidy.rake +4 -5
  383. data/lib/tasks/alchemy/upgrade.rake +2 -4
  384. data/spec/controllers/{admin → alchemy/admin}/attachments_controller_spec.rb +26 -44
  385. data/spec/controllers/{admin → alchemy/admin}/base_controller_spec.rb +14 -1
  386. data/spec/controllers/{admin → alchemy/admin}/clipboard_controller_spec.rb +3 -3
  387. data/spec/controllers/{admin → alchemy/admin}/contents_controller_spec.rb +4 -4
  388. data/spec/controllers/{admin → alchemy/admin}/dashboard_controller_spec.rb +11 -6
  389. data/spec/controllers/{admin → alchemy/admin}/elements_controller_spec.rb +54 -31
  390. data/spec/controllers/{admin → alchemy/admin}/essence_files_controller_spec.rb +8 -3
  391. data/spec/controllers/{admin → alchemy/admin}/essence_pictures_controller_spec.rb +3 -3
  392. data/spec/controllers/{admin → alchemy/admin}/languages_controller_spec.rb +13 -1
  393. data/spec/controllers/{admin → alchemy/admin}/layoutpages_controller_spec.rb +0 -6
  394. data/spec/controllers/{admin → alchemy/admin}/pages_controller_spec.rb +103 -35
  395. data/spec/controllers/{admin → alchemy/admin}/pictures_controller_spec.rb +133 -108
  396. data/spec/controllers/alchemy/admin/resources_controller_spec.rb +81 -0
  397. data/spec/controllers/{admin → alchemy/admin}/trash_controller_spec.rb +12 -13
  398. data/spec/controllers/alchemy/api/contents_controller_spec.rb +12 -13
  399. data/spec/controllers/alchemy/api/elements_controller_spec.rb +8 -9
  400. data/spec/controllers/alchemy/api/pages_controller_spec.rb +40 -7
  401. data/spec/controllers/{attachments_controller_spec.rb → alchemy/attachments_controller_spec.rb} +7 -7
  402. data/spec/controllers/alchemy/base_controller_spec.rb +106 -0
  403. data/spec/controllers/{elements_controller_spec.rb → alchemy/elements_controller_spec.rb} +4 -4
  404. data/spec/controllers/{messages_controller_spec.rb → alchemy/messages_controller_spec.rb} +14 -9
  405. data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +330 -0
  406. data/spec/controllers/{pages_controller_spec.rb → alchemy/pages_controller_spec.rb} +167 -89
  407. data/spec/controllers/{pictures_controller_spec.rb → alchemy/pictures_controller_spec.rb} +42 -20
  408. data/spec/dummy/app/models/dummy_user.rb +4 -0
  409. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +31 -0
  410. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +6 -10
  411. data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +9 -24
  412. data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +3 -0
  413. data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +5 -0
  414. data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +6 -0
  415. data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +16 -0
  416. data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +3 -0
  417. data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +5 -0
  418. data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +3 -0
  419. data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +5 -0
  420. data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +3 -0
  421. data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +5 -0
  422. data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +5 -0
  423. data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +1 -0
  424. data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +4 -0
  425. data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +3 -0
  426. data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +5 -0
  427. data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +2 -0
  428. data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +4 -0
  429. data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +3 -0
  430. data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +5 -0
  431. data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +1 -0
  432. data/spec/dummy/config/alchemy/elements.yml +10 -13
  433. data/spec/dummy/config/alchemy/page_layouts.yml +1 -1
  434. data/spec/dummy/config/initializers/alchemy.rb +1 -0
  435. data/spec/dummy/config/locales/kl.yml +2 -0
  436. data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +1 -0
  437. data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +1 -0
  438. data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +1 -0
  439. data/spec/dummy/db/schema.rb +10 -6
  440. data/spec/factories.rb +13 -0
  441. data/spec/features/admin/admin_layout_spec.rb +14 -0
  442. data/spec/features/admin/dashboard_spec.rb +1 -2
  443. data/spec/features/admin/edit_elements_feature_spec.rb +36 -0
  444. data/spec/features/admin/language_tree_feature_spec.rb +7 -8
  445. data/spec/features/admin/languages_features_spec.rb +65 -0
  446. data/spec/features/admin/legacy_page_url_management_spec.rb +3 -3
  447. data/spec/features/admin/link_overlay_spec.rb +16 -17
  448. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  449. data/spec/features/admin/modules_integration_spec.rb +0 -1
  450. data/spec/features/admin/navigation_feature_spec.rb +11 -2
  451. data/spec/features/admin/page_creation_feature_spec.rb +5 -5
  452. data/spec/features/admin/page_editing_feature_spec.rb +6 -6
  453. data/spec/features/admin/picture_library_integration_spec.rb +3 -3
  454. data/spec/features/admin/resources_integration_spec.rb +7 -12
  455. data/spec/features/admin/site_select_feature_spec.rb +1 -2
  456. data/spec/features/admin/tinymce_feature_spec.rb +0 -1
  457. data/spec/features/page_feature_spec.rb +57 -158
  458. data/spec/features/page_redirects_spec.rb +358 -0
  459. data/spec/features/picture_security_spec.rb +1 -7
  460. data/spec/fixtures/animated.gif +0 -0
  461. data/spec/helpers/{admin → alchemy/admin}/attachments_helper_spec.rb +0 -0
  462. data/spec/helpers/{admin → alchemy/admin}/base_helper_spec.rb +39 -29
  463. data/spec/helpers/{admin → alchemy/admin}/contents_helper_spec.rb +4 -23
  464. data/spec/helpers/{admin → alchemy/admin}/elements_helper_spec.rb +141 -5
  465. data/spec/helpers/{admin → alchemy/admin}/essences_helper_spec.rb +69 -8
  466. data/spec/helpers/{admin → alchemy/admin}/navigation_helper_spec.rb +43 -37
  467. data/spec/helpers/{admin → alchemy/admin}/pages_helper_spec.rb +6 -38
  468. data/spec/helpers/{admin → alchemy/admin}/pictures_helper_spec.rb +0 -1
  469. data/spec/helpers/{admin → alchemy/admin}/tags_helper_spec.rb +1 -3
  470. data/spec/helpers/{base_helper_spec.rb → alchemy/base_helper_spec.rb} +1 -2
  471. data/spec/helpers/{elements_block_helper_spec.rb → alchemy/elements_block_helper_spec.rb} +3 -3
  472. data/spec/helpers/{elements_helper_spec.rb → alchemy/elements_helper_spec.rb} +18 -19
  473. data/spec/helpers/alchemy/essences_helper_spec.rb +85 -0
  474. data/spec/helpers/{pages_helper_spec.rb → alchemy/pages_helper_spec.rb} +125 -39
  475. data/spec/helpers/alchemy/picture_url_helpers_spec.rb +78 -0
  476. data/spec/helpers/{url_helper_spec.rb → alchemy/url_helper_spec.rb} +66 -40
  477. data/spec/libraries/config_spec.rb +2 -3
  478. data/spec/libraries/controller_actions_spec.rb +18 -18
  479. data/spec/libraries/i18n_spec.rb +7 -0
  480. data/spec/libraries/page_layout_spec.rb +13 -7
  481. data/spec/libraries/paths_spec.rb +15 -0
  482. data/spec/libraries/permissions_spec.rb +6 -7
  483. data/spec/libraries/resource_spec.rb +48 -75
  484. data/spec/libraries/resources_helper_spec.rb +55 -6
  485. data/spec/libraries/shell_spec.rb +0 -4
  486. data/spec/libraries/template_tracker_spec.rb +4 -13
  487. data/spec/libraries/tinymce_spec.rb +53 -9
  488. data/spec/mailers/{messages_spec.rb → alchemy/messages_spec.rb} +0 -2
  489. data/spec/models/{attachment_spec.rb → alchemy/attachment_spec.rb} +43 -20
  490. data/spec/models/{cell_spec.rb → alchemy/cell_spec.rb} +2 -3
  491. data/spec/models/{content_spec.rb → alchemy/content_spec.rb} +179 -70
  492. data/spec/models/{element_spec.rb → alchemy/element_spec.rb} +315 -70
  493. data/spec/models/{element_to_page_spec.rb → alchemy/element_to_page_spec.rb} +0 -1
  494. data/spec/models/{essence_boolean_spec.rb → alchemy/essence_boolean_spec.rb} +0 -0
  495. data/spec/models/{essence_date_spec.rb → alchemy/essence_date_spec.rb} +2 -3
  496. data/spec/models/{essence_file_spec.rb → alchemy/essence_file_spec.rb} +2 -5
  497. data/spec/models/{essence_html_spec.rb → alchemy/essence_html_spec.rb} +1 -1
  498. data/spec/models/{essence_link_spec.rb → alchemy/essence_link_spec.rb} +0 -0
  499. data/spec/models/{essence_picture_spec.rb → alchemy/essence_picture_spec.rb} +101 -29
  500. data/spec/models/{essence_richtext_spec.rb → alchemy/essence_richtext_spec.rb} +7 -2
  501. data/spec/models/{essence_select_spec.rb → alchemy/essence_select_spec.rb} +0 -0
  502. data/spec/models/{essence_text_spec.rb → alchemy/essence_text_spec.rb} +4 -8
  503. data/spec/models/alchemy/language_spec.rb +243 -0
  504. data/spec/models/{legacy_page_url_spec.rb → alchemy/legacy_page_url_spec.rb} +1 -1
  505. data/spec/models/{message_spec.rb → alchemy/message_spec.rb} +0 -0
  506. data/spec/models/{page_spec.rb → alchemy/page_spec.rb} +460 -248
  507. data/spec/models/{picture_spec.rb → alchemy/picture_spec.rb} +118 -30
  508. data/spec/models/{site_spec.rb → alchemy/site_spec.rb} +19 -84
  509. data/spec/models/{tag_spec.rb → alchemy/tag_spec.rb} +1 -3
  510. data/spec/models/dummy_model_spec.rb +1 -2
  511. data/spec/requests/alchemy/admin/resources_requests_spec.rb +26 -0
  512. data/spec/requests/alchemy/admin/site_requests_spec.rb +19 -0
  513. data/spec/requests/alchemy/site_requests_spec.rb +18 -0
  514. data/spec/requests/alchemy/sitemap_spec.rb +56 -0
  515. data/spec/routing/api_routing_spec.rb +1 -1
  516. data/spec/routing/routing_spec.rb +121 -15
  517. data/spec/spec_helper.rb +2 -1
  518. data/spec/support/hint_examples.rb +1 -3
  519. data/spec/support/test_tweaks.rb +3 -3
  520. data/spec/support/transformation_examples.rb +6 -7
  521. data/spec/tasks/helpers_spec.rb +2 -4
  522. data/spec/views/admin/pictures/show_spec.rb +43 -0
  523. data/spec/views/essences/essence_boolean_editor_spec.rb +0 -1
  524. data/spec/views/essences/essence_boolean_view_spec.rb +2 -4
  525. data/spec/views/essences/essence_date_view_spec.rb +0 -1
  526. data/spec/views/essences/essence_file_editor_spec.rb +4 -6
  527. data/spec/views/essences/essence_file_view_spec.rb +56 -3
  528. data/spec/views/essences/essence_link_view_spec.rb +1 -1
  529. data/spec/views/essences/essence_picture_editor_spec.rb +80 -0
  530. data/spec/views/essences/essence_picture_view_spec.rb +0 -1
  531. data/spec/views/essences/essence_select_view_spec.rb +0 -1
  532. data/spec/views/essences/essence_text_view_spec.rb +0 -1
  533. data/vendor/assets/javascripts/handlebars.js +4608 -0
  534. data/vendor/assets/javascripts/tinymce/langs/de.js +19 -0
  535. data/vendor/assets/javascripts/tinymce/langs/es.js +19 -0
  536. data/vendor/assets/javascripts/tinymce/langs/fr.js +23 -4
  537. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -3
  538. data/vendor/assets/javascripts/tinymce/langs/ru.js +22 -3
  539. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  540. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  541. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  542. data/vendor/assets/javascripts/tinymce/tinymce.min.js +12 -13
  543. metadata +274 -256
  544. data/app/views/alchemy/admin/attachments/create.js.erb +0 -11
  545. data/app/views/alchemy/admin/attachments/new.html.erb +0 -14
  546. data/app/views/alchemy/admin/elements/_element_foot.html.erb +0 -36
  547. data/app/views/alchemy/admin/partials/_upload_form.html.erb +0 -67
  548. data/app/views/alchemy/admin/pictures/info.html.erb +0 -38
  549. data/app/views/alchemy/admin/pictures/new.html.erb +0 -16
  550. data/lib/alchemy/middleware/rescue_old_cookies.rb +0 -27
  551. data/spec/controllers/admin/resources_controller_spec.rb +0 -53
  552. data/spec/controllers/base_controller_spec.rb +0 -51
  553. data/spec/helpers/essences_helper_spec.rb +0 -156
  554. data/spec/helpers/picture_url_helpers_spec.rb +0 -35
  555. data/spec/libraries/on_page_layout_spec.rb +0 -112
  556. data/spec/models/language_spec.rb +0 -123
@@ -6,8 +6,8 @@ RSpec.feature "Picture Library" do
6
6
  end
7
7
 
8
8
  describe "Tagging" do
9
- let!(:picture_1) { create(:picture, tag_list: 'tag1', name: 'TaggedWith1') }
10
- let!(:picture_2) { create(:picture, tag_list: 'tag2', name: 'TaggedWith2') }
9
+ let!(:picture_1) { create(:alchemy_picture, tag_list: 'tag1', name: 'TaggedWith1') }
10
+ let!(:picture_2) { create(:alchemy_picture, tag_list: 'tag2', name: 'TaggedWith2') }
11
11
 
12
12
  scenario "it's possible to filter tags by clicking on its name in the tag list." do
13
13
  visit alchemy.admin_pictures_path
@@ -43,7 +43,7 @@ RSpec.feature "Picture Library" do
43
43
  end
44
44
 
45
45
  describe "Filter by tag" do
46
- let!(:picture) { create(:picture, tag_list: 'bla') }
46
+ let!(:picture) { create(:alchemy_picture, tag_list: 'bla') }
47
47
 
48
48
  scenario "lists all applied tags." do
49
49
  visit alchemy.admin_pictures_path
@@ -1,13 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Resources" do
4
- let(:event) { FactoryGirl.create(:event) }
5
- let(:second_event) { FactoryGirl.create(:event, :name => 'My second Event', :entrance_fee => 12.32) }
4
+ let(:event) { create(:event) }
5
+ let(:second_event) { create(:event, name: 'My second Event', entrance_fee: 12.32) }
6
6
 
7
7
  before { authorize_user(:as_admin) }
8
8
 
9
9
  describe "index view" do
10
-
11
10
  it "should have a button for creating a new resource items" do
12
11
  visit '/admin/events'
13
12
  expect(page).to have_selector('#toolbar div.button_with_label a.icon_button span.icon.create')
@@ -27,7 +26,6 @@ describe "Resources" do
27
26
  visit '/admin/events'
28
27
  expect(page).to have_selector('div#archive_all table.list')
29
28
  end
30
-
31
29
  end
32
30
 
33
31
  describe "form for creating and updating items" do
@@ -53,12 +51,11 @@ describe "Resources" do
53
51
  end
54
52
 
55
53
  describe "create resource item" do
56
-
57
54
  context "when form filled with valid data" do
58
55
  before do
59
56
  visit '/admin/events/new'
60
- fill_in 'event_name', :with => 'My second event'
61
- fill_in 'event_starts_at', :with => DateTime.new(2012, 03, 03, 20, 00)
57
+ fill_in 'event_name', with: 'My second event'
58
+ fill_in 'event_starts_at', with: DateTime.new(2012, 03, 03, 20, 00)
62
59
  click_on 'Save'
63
60
  end
64
61
 
@@ -75,7 +72,7 @@ describe "Resources" do
75
72
  context "when form filled with invalid data" do
76
73
  before do
77
74
  visit '/admin/events/new'
78
- fill_in 'event_name', :with => '' #invalid!
75
+ fill_in 'event_name', with: '' # invalid!
79
76
  click_on 'Save'
80
77
  end
81
78
 
@@ -91,13 +88,12 @@ describe "Resources" do
91
88
  expect(page).not_to have_content("successfully created")
92
89
  end
93
90
  end
94
-
95
91
  end
96
92
 
97
93
  describe "updating an item" do
98
94
  before do
99
95
  visit("/admin/events/#{event.id}/edit")
100
- fill_in 'event_name', :with => 'New event name'
96
+ fill_in 'event_name', with: 'New event name'
101
97
  click_on 'Save'
102
98
  end
103
99
 
@@ -115,7 +111,7 @@ describe "Resources" do
115
111
  event
116
112
  second_event
117
113
  visit '/admin/events'
118
- within('tr', :text => 'My second Event') do
114
+ within('tr', text: 'My second Event') do
119
115
  click_on 'Delete'
120
116
  end
121
117
  end
@@ -129,5 +125,4 @@ describe "Resources" do
129
125
  expect(page).to have_content("Succesfully removed")
130
126
  end
131
127
  end
132
-
133
128
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Site select' do
4
-
5
4
  before do
6
5
  authorize_user(:as_admin)
7
6
  end
@@ -12,7 +11,7 @@ describe 'Site select' do
12
11
  end
13
12
 
14
13
  context "multiple sites" do
15
- let!(:a_site) { FactoryGirl.create(:site) }
14
+ let!(:a_site) { create(:alchemy_site) }
16
15
 
17
16
  it "contains all sites in a selectbox" do
18
17
  visit admin_dashboard_path
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'TinyMCE Editor' do
4
-
5
4
  before do
6
5
  authorize_user(:as_admin)
7
6
  end
@@ -1,168 +1,61 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
- describe 'Page' do
5
- let(:default_language) { Language.default }
6
- let(:default_language_root) { create(:language_root_page, :language => default_language, :name => 'Home') }
7
- let(:public_page_1) { create(:public_page, :visible => true, :name => 'Page 1') }
8
- let(:public_child) { create(:public_page, :name => 'Public Child', :parent_id => public_page_1.id) }
4
+ describe 'Show page feature:' do
5
+ let!(:default_language) { Language.default }
9
6
 
10
- before { default_language_root }
11
-
12
- it "should include all its elements and contents" do
13
- p = create(:public_page, :do_not_autogenerate => false)
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 "/#{p.urlname}"
17
- within('div#content div.article div.intro') { expect(page).to have_content('Welcome to Peters Petshop') }
7
+ let!(:default_language_root) do
8
+ create(:alchemy_page, :language_root, language: default_language, name: 'Home')
18
9
  end
19
10
 
20
- it "should show the navigation with all visible pages" do
21
- pages = [
22
- create(:public_page, :visible => true, :name => 'Page 1'),
23
- create(:public_page, :visible => true, :name => 'Page 2')
24
- ]
25
- visit '/'
26
- within('div#navigation ul') { expect(page).to have_selector('li a[href="/page-1"], li a[href="/page-2"]') }
11
+ let(:public_page) do
12
+ create(:alchemy_page, :public, visible: true, name: 'Page 1')
27
13
  end
28
14
 
29
- describe "redirecting" do
30
- context "in multi language mode" do
31
- before do
32
- allow(Config).to receive(:get) { |arg| arg == :url_nesting ? true : Config.parameter(arg) }
33
- allow_any_instance_of(PagesController).to receive(:multi_language?).and_return(true)
34
- end
35
-
36
- let(:second_page) { create(:public_page, name: 'Second Page') }
37
- let(:legacy_url) { LegacyPageUrl.create(urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69', page: second_page) }
38
-
39
- it "should redirect legacy url with unknown format & query string" do
40
- visit "/#{legacy_url.urlname}"
41
- uri = URI.parse(page.current_url)
42
- expect(uri.query).to be_nil
43
- expect(uri.request_uri).to eq("/en/#{second_page.urlname}")
44
- end
45
-
46
- context "if no language params are given" do
47
- it "should redirect to url with nested language code" do
48
- visit "/#{public_page_1.urlname}"
49
- expect(page.current_path).to eq("/#{public_page_1.language_code}/#{public_page_1.urlname}")
50
- end
51
- end
52
-
53
- context "if requested page is unpublished" do
54
- before do
55
- allow(Config).to receive(:get) { |arg| arg == :url_nesting ? false : Config.parameter(arg) }
56
- public_page_1.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
57
- public_child
58
- end
59
-
60
- it "should redirect to public child" do
61
- visit "/#{default_language.code}/not-public"
62
- expect(page.current_path).to eq("/#{default_language.code}/public-child")
63
- end
64
-
65
- context "and url has no language code" do
66
- it "should redirect to url of public child with language code of default language" do
67
- visit '/not-public'
68
- expect(page.current_path).to eq("/#{default_language.code}/public-child")
69
- end
70
- end
71
- end
72
-
73
- context "if requested url is index url" do
74
- it "should redirect to pages url with default language" do
75
- visit '/'
76
- expect(page.current_path).to eq("/#{default_language.code}/home")
77
- end
78
- end
79
-
80
- context "if requested url is only the language code" do
81
- it "should redirect to pages url with default language" do
82
- visit "/#{default_language.code}"
83
- expect(page.current_path).to eq("/#{default_language.code}/home")
84
- end
85
- end
86
-
87
- context "requested url is only the urlname" do
88
- it "then it should redirect to pages url with nested language." do
89
- visit '/home'
90
- expect(page.current_path).to eq('/en/home')
91
- end
92
- end
93
-
94
- it "should keep additional params" do
95
- visit "/#{public_page_1.urlname}?query=Peter"
96
- expect(page.current_url).to match(/\?query=Peter/)
97
- end
98
-
99
- context "wrong language requested" do
100
- before { allow(Alchemy.user_class).to receive(:admins).and_return([1, 2]) }
101
-
102
- it "should render 404 if urlname and lang parameter do not belong to same page" do
103
- create(:klingonian)
104
- expect {
105
- visit "/kl/#{public_page_1.urlname}"
106
- }.to raise_error(ActionController::RoutingError)
107
- end
15
+ let(:public_child) do
16
+ create(:alchemy_page, :public, name: 'Public Child', parent_id: public_page.id)
17
+ end
108
18
 
109
- it "should render 404 if requested language does not exist" do
110
- public_page_1
111
- LegacyPageUrl.delete_all
112
- expect {
113
- visit "/fo/#{public_page_1.urlname}"
114
- }.to raise_error(ActionController::RoutingError)
115
- end
116
- end
19
+ context "When no page is present" do
20
+ before do
21
+ Alchemy::Page.delete_all
117
22
  end
118
23
 
119
- context "not in multi language mode" do
24
+ context "and no admin user is present yet" do
120
25
  before do
121
- allow_any_instance_of(PagesController).to receive(:multi_language?).and_return(false)
122
- allow(Config).to receive(:get) { |arg| arg == :url_nesting ? false : Config.parameter(arg) }
123
- end
124
-
125
- let(:second_page) { create(:public_page, name: 'Second Page') }
126
- let(:legacy_url) { LegacyPageUrl.create(urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69', page: second_page) }
127
-
128
- it "should redirect legacy url with unknown format & query string" do
129
- visit "/#{legacy_url.urlname}"
130
- uri = URI.parse(page.current_url)
131
- expect(uri.query).to be_nil
132
- expect(uri.request_uri).to eq("/#{second_page.urlname}")
26
+ Alchemy.user_class.delete_all
133
27
  end
134
28
 
135
- it "should redirect from nested language code url to normal url" do
136
- visit "/en/#{public_page_1.urlname}"
137
- expect(page.current_path).to eq("/#{public_page_1.urlname}")
29
+ it 'shows a welcome page' do
30
+ visit "/"
31
+ expect(page).to have_content('Welcome to Alchemy')
138
32
  end
33
+ end
34
+ end
139
35
 
140
- context "should redirect to public child" do
141
- before do
142
- public_page_1.update_attributes(:public => false, :name => 'Not Public', :urlname => '')
143
- public_child
144
- end
145
-
146
- it "if requested page is unpublished" do
147
- visit '/not-public'
148
- expect(page.current_path).to eq('/public-child')
149
- end
36
+ context 'rendered' do
37
+ let(:public_page) { create(:alchemy_page, :public, do_not_autogenerate: false) }
38
+ let(:article) { public_page.elements.find_by_name('article') }
39
+ let(:essence) { article.content_by_name('intro').essence }
150
40
 
151
- it "with normal url, if requested url has nested language code and is not public" do
152
- visit '/en/not-public'
153
- expect(page.current_path).to eq('/public-child')
154
- end
155
- end
41
+ before do
42
+ essence.update_attributes(body: 'Welcome to Peters Petshop', public: true)
43
+ end
156
44
 
157
- it "should redirect to pages url, if requested url is index url" do
158
- visit '/'
159
- expect(page.current_path).to eq('/home')
45
+ it "should include all its elements and contents" do
46
+ visit "/#{public_page.urlname}"
47
+ within('div#content div.article div.intro') do
48
+ expect(page).to have_content('Welcome to Peters Petshop')
160
49
  end
50
+ end
51
+ end
161
52
 
162
- it "should keep additional params" do
163
- visit "/en/#{public_page_1.urlname}?query=Peter"
164
- expect(page.current_url).to match(/\?query=Peter/)
165
- end
53
+ it "should show the navigation with all visible pages" do
54
+ create(:alchemy_page, :public, visible: true, name: 'Page 1')
55
+ create(:alchemy_page, :public, visible: true, name: 'Page 2')
56
+ visit '/'
57
+ within('div#navigation ul') do
58
+ expect(page).to have_selector('li a[href="/page-1"], li a[href="/page-2"]')
166
59
  end
167
60
  end
168
61
 
@@ -188,7 +81,7 @@ module Alchemy
188
81
  describe "menubar" do
189
82
  context "rendering for guest users" do
190
83
  it "is prohibited" do
191
- visit "/#{public_page_1.urlname}"
84
+ visit "/#{public_page.urlname}"
192
85
  within('body') { expect(page).not_to have_selector('#alchemy_menubar') }
193
86
  end
194
87
  end
@@ -196,7 +89,7 @@ module Alchemy
196
89
  context "rendering for members" do
197
90
  it "is prohibited" do
198
91
  authorize_user(build(:alchemy_dummy_user))
199
- visit "/#{public_page_1.urlname}"
92
+ visit "/#{public_page.urlname}"
200
93
  within('body') { expect(page).not_to have_selector('#alchemy_menubar') }
201
94
  end
202
95
  end
@@ -204,7 +97,7 @@ module Alchemy
204
97
  context "rendering for authors" do
205
98
  it "is allowed" do
206
99
  authorize_user(:as_author)
207
- visit "/#{public_page_1.urlname}"
100
+ visit "/#{public_page.urlname}"
208
101
  within('body') { expect(page).to have_selector('#alchemy_menubar') }
209
102
  end
210
103
  end
@@ -212,7 +105,7 @@ module Alchemy
212
105
  context "rendering for editors" do
213
106
  it "is allowed" do
214
107
  authorize_user(:as_editor)
215
- visit "/#{public_page_1.urlname}"
108
+ visit "/#{public_page.urlname}"
216
109
  within('body') { expect(page).to have_selector('#alchemy_menubar') }
217
110
  end
218
111
  end
@@ -220,7 +113,7 @@ module Alchemy
220
113
  context "rendering for admins" do
221
114
  it "is allowed" do
222
115
  authorize_user(:as_admin)
223
- visit "/#{public_page_1.urlname}"
116
+ visit "/#{public_page.urlname}"
224
117
  within('body') { expect(page).to have_selector('#alchemy_menubar') }
225
118
  end
226
119
  end
@@ -228,24 +121,26 @@ module Alchemy
228
121
  context "contains" do
229
122
  before do
230
123
  authorize_user(:as_admin)
231
- visit "/#{public_page_1.urlname}"
124
+ visit "/#{public_page.urlname}"
232
125
  end
233
126
 
234
127
  it "a link to the admin area" do
235
128
  within('#alchemy_menubar') do
236
- expect(page).to have_selector("li a[href='#{alchemy.admin_dashboard_path}']")
129
+ expect(page).to have_selector("li a[href='#{alchemy.admin_dashboard_url}']")
237
130
  end
238
131
  end
239
132
 
240
133
  it "a link to edit the current page" do
241
134
  within('#alchemy_menubar') do
242
- expect(page).to have_selector("li a[href='#{alchemy.edit_admin_page_path(public_page_1)}']")
135
+ expect(page).to \
136
+ have_selector("li a[href='#{alchemy.edit_admin_page_url(public_page)}']")
243
137
  end
244
138
  end
245
139
 
246
140
  it "a form and button to logout of alchemy" do
247
141
  within('#alchemy_menubar') do
248
- expect(page).to have_selector("li form[action='#{Alchemy.logout_path}'], li button[type='submit']")
142
+ expect(page).to \
143
+ have_selector("li form[action='#{Alchemy.logout_path}'], li button[type='submit']")
249
144
  end
250
145
  end
251
146
  end
@@ -253,10 +148,12 @@ module Alchemy
253
148
 
254
149
  describe 'navigation rendering' do
255
150
  context 'with page having an external url without protocol' do
256
- let!(:external_page) { create(:page, urlname: 'google.com', page_layout: 'external', visible: true) }
151
+ let!(:external_page) do
152
+ create(:alchemy_page, urlname: 'google.com', page_layout: 'external', visible: true)
153
+ end
257
154
 
258
155
  it "adds an prefix to url" do
259
- visit "/#{public_page_1.urlname}"
156
+ visit "/#{public_page.urlname}"
260
157
  within '#navigation' do
261
158
  expect(page.body).to match('http://google.com')
262
159
  end
@@ -265,7 +162,7 @@ module Alchemy
265
162
  end
266
163
 
267
164
  describe 'accessing restricted pages' do
268
- let!(:restricted_page) { create(:restricted_page, public: true) }
165
+ let!(:restricted_page) { create(:alchemy_page, :restricted, public: true) }
269
166
 
270
167
  context 'as a guest user' do
271
168
  it "I am not able to visit the page" do
@@ -275,7 +172,9 @@ module Alchemy
275
172
  end
276
173
 
277
174
  context 'as a member user' do
278
- before { authorize_user(create(:alchemy_dummy_user)) }
175
+ before do
176
+ authorize_user(create(:alchemy_dummy_user))
177
+ end
279
178
 
280
179
  it "I am able to visit the page" do
281
180
  visit restricted_page.urlname
@@ -0,0 +1,358 @@
1
+ require 'spec_helper'
2
+
3
+ module Alchemy
4
+ describe 'Requesting a page' do
5
+ let!(:default_language) { Language.default }
6
+
7
+ let!(:default_language_root) do
8
+ create(:alchemy_page, :language_root, language: default_language, name: 'Home')
9
+ end
10
+
11
+ let(:public_page) do
12
+ create(:alchemy_page, :public, visible: true, name: 'Page 1')
13
+ end
14
+
15
+ let(:public_child) do
16
+ create(:alchemy_page, :public, name: 'Public Child', parent_id: public_page.id)
17
+ end
18
+
19
+ context "in multi language mode" do
20
+ let(:second_page) { create(:alchemy_page, :public, name: 'Second Page') }
21
+
22
+ let(:legacy_url) do
23
+ LegacyPageUrl.create(
24
+ urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69',
25
+ page: second_page
26
+ )
27
+ end
28
+
29
+ before do
30
+ allow_any_instance_of(PagesController).to receive(:multi_language?).and_return(true)
31
+ end
32
+
33
+ context 'if language params are given' do
34
+ context "and page locale is default locale" do
35
+ it "redirects to unprefixed locale url" do
36
+ allow(::I18n).to receive(:default_locale) { public_page.language_code.to_sym }
37
+ visit("/#{public_page.language_code}/#{public_page.urlname}")
38
+ expect(page.current_path).to eq("/#{public_page.urlname}")
39
+ end
40
+ end
41
+
42
+ context "and page locale is not default locale" do
43
+ it "does not redirect" do
44
+ allow(::I18n).to receive(:default_locale).and_return(:de)
45
+ visit("/#{public_page.language_code}/#{public_page.urlname}")
46
+ expect(page.current_path).to eq("/#{public_page.language_code}/#{public_page.urlname}")
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'if no language params are given' do
52
+ context "and page locale is default locale" do
53
+ it "doesn't prepend the url with the locale string" do
54
+ allow(::I18n).to receive(:default_locale) { public_page.language_code.to_sym }
55
+ visit("/#{public_page.urlname}")
56
+ expect(page.current_path).to eq("/#{public_page.urlname}")
57
+ end
58
+
59
+ it "redirects legacy url with unknown format & query string without locale prefix" do
60
+ allow(::I18n).to receive(:default_locale) { second_page.language_code.to_sym }
61
+ visit "/#{legacy_url.urlname}"
62
+ uri = URI.parse(page.current_url)
63
+ expect(uri.query).to be_nil
64
+ expect(uri.request_uri).to eq("/#{second_page.urlname}")
65
+ end
66
+ end
67
+
68
+ context "and page locale is not default locale" do
69
+ before do
70
+ allow(::I18n).to receive(:default_locale).and_return(:de)
71
+ end
72
+
73
+ it "redirects to url with the locale prefixed" do
74
+ visit("/#{public_page.urlname}")
75
+ expect(page.current_path).to eq("/en/#{public_page.urlname}")
76
+ end
77
+
78
+ it "redirects legacy url with unknown format & query string with locale prefix" do
79
+ visit "/#{legacy_url.urlname}"
80
+ uri = URI.parse(page.current_url)
81
+ expect(uri.query).to be_nil
82
+ expect(uri.request_uri).to eq("/en/#{second_page.urlname}")
83
+ end
84
+ end
85
+ end
86
+
87
+ context "if requested page is unpublished" do
88
+ before do
89
+ public_page.update_attributes(
90
+ public: false,
91
+ visible: false,
92
+ name: 'Not Public',
93
+ urlname: ''
94
+ )
95
+ public_child
96
+ end
97
+
98
+ it "redirects to public child" do
99
+ visit "/not-public"
100
+ expect(page.current_path).to eq("/public-child")
101
+ end
102
+
103
+ context "with only unpublished pages in page tree" do
104
+ before do
105
+ public_child.update_attributes(public: false)
106
+ end
107
+
108
+ it "should raise not found error" do
109
+ expect {
110
+ visit "/not-public"
111
+ }.to raise_error(ActionController::RoutingError)
112
+ end
113
+ end
114
+
115
+ context "if page locale is the default locale" do
116
+ it "redirects to public child with prefixed locale" do
117
+ allow(::I18n).to receive(:default_locale).and_return(:de)
118
+ visit "/not-public"
119
+ expect(page.current_path).to eq("/en/public-child")
120
+ end
121
+ end
122
+ end
123
+
124
+ context "if requested url is the index url" do
125
+ context 'and redirect_index is set to true' do
126
+ before do
127
+ allow(Config).to receive(:get) do |arg|
128
+ arg == :redirect_index ? true : Config.parameter(arg)
129
+ end
130
+ if Alchemy.version == "4.0.0.rc1"
131
+ raise "Remove deprecated `redirect_index` configuration!"
132
+ end
133
+ ActiveSupport::Deprecation.silenced = true
134
+ end
135
+
136
+ after do
137
+ ActiveSupport::Deprecation.silenced = false
138
+ end
139
+
140
+ context "and if page locale is the default locale" do
141
+ it "redirects to the default language root page without prefixed locale" do
142
+ visit '/'
143
+ expect(page.current_path).to eq('/home')
144
+ end
145
+
146
+ context "having additional parameter" do
147
+ it "redirects to the default language root page with prefixed locale while keeping the additional params" do
148
+ visit '/?search=kitten'
149
+ expect(page.current_url).to eq('http://www.example.com/home?search=kitten')
150
+ end
151
+ end
152
+ end
153
+
154
+ context "and if page locale is not the default locale" do
155
+ before do
156
+ allow(::I18n).to receive(:default_locale).and_return(:de)
157
+ end
158
+
159
+ it "redirects to the default language root page with prefixed locale" do
160
+ visit '/'
161
+ expect(page.current_path).to eq('/en/home')
162
+ end
163
+
164
+ context "having additional parameter" do
165
+ it "redirects to the default language root page with prefixed locale while keeping the additional params" do
166
+ visit '/?search=kitten'
167
+ expect(page.current_url).to eq('http://www.example.com/en/home?search=kitten')
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ context 'and redirect_index is set to false' do
174
+ before do
175
+ allow(Config).to receive(:get) do |arg|
176
+ arg == :redirect_index ? false : Config.parameter(arg)
177
+ end
178
+ end
179
+
180
+ it "does not redirect" do
181
+ visit '/'
182
+ expect(page.current_path).to eq('/')
183
+ end
184
+ end
185
+ end
186
+
187
+ context "if requested url is only the language code" do
188
+ context 'and redirect_index is set to true' do
189
+ before do
190
+ allow(Config).to receive(:get) do |arg|
191
+ arg == :redirect_index ? true : Config.parameter(arg)
192
+ end
193
+ if Alchemy.version == "4.0.0.rc1"
194
+ raise "Remove deprecated `redirect_index` configuration!"
195
+ end
196
+ ActiveSupport::Deprecation.silenced = true
197
+ end
198
+
199
+ after do
200
+ ActiveSupport::Deprecation.silenced = false
201
+ end
202
+
203
+ context "if page locale is the default locale" do
204
+ it "redirects to pages url without locale prefixed" do
205
+ visit "/#{default_language.code}"
206
+ expect(page.current_path).to eq("/home")
207
+ end
208
+ end
209
+
210
+ context "if page locale is not the default locale" do
211
+ it "redirects to the default language root url with prefixed locale" do
212
+ allow(::I18n).to receive(:default_locale).and_return(:de)
213
+ visit "/#{default_language.code}"
214
+ expect(page.current_path).to eq('/en/home')
215
+ end
216
+ end
217
+ end
218
+
219
+ context 'and redirect_index is set to false' do
220
+ before do
221
+ allow(Config).to receive(:get) do |arg|
222
+ arg == :redirect_index ? false : Config.parameter(arg)
223
+ end
224
+ end
225
+
226
+ context "if requested locale is the default locale" do
227
+ before do
228
+ allow(::I18n).to receive(:default_locale) { default_language.code }
229
+ end
230
+
231
+ it "redirects to '/'" do
232
+ visit "/#{default_language.code}"
233
+ expect(page.current_path).to eq('/')
234
+ end
235
+ end
236
+
237
+ context "if page locale is not the default locale" do
238
+ before do
239
+ allow(::I18n).to receive(:default_locale) { :de }
240
+ end
241
+
242
+ it "does not redirect" do
243
+ visit "/#{default_language.code}"
244
+ expect(page.current_path).to eq("/#{default_language.code}")
245
+ end
246
+ end
247
+ end
248
+ end
249
+
250
+ it "should keep additional params" do
251
+ visit "/#{public_page.urlname}?query=Peter"
252
+ expect(page.current_url).to match(/\?query=Peter/)
253
+ end
254
+
255
+ context "wrong language requested" do
256
+ before do
257
+ allow(Alchemy.user_class).to receive(:admins).and_return([1, 2])
258
+ end
259
+
260
+ it "should render 404 if urlname and lang parameter do not belong to same page" do
261
+ create(:alchemy_language, :klingon)
262
+ expect {
263
+ visit "/kl/#{public_page.urlname}"
264
+ }.to raise_error(ActionController::RoutingError)
265
+ end
266
+
267
+ it "should render 404 if requested language does not exist" do
268
+ public_page
269
+ LegacyPageUrl.delete_all
270
+ expect {
271
+ visit "/fo/#{public_page.urlname}"
272
+ }.to raise_error(ActionController::RoutingError)
273
+ end
274
+ end
275
+ end
276
+
277
+ context "not in multi language mode" do
278
+ let(:second_page) { create(:alchemy_page, :public, name: 'Second Page') }
279
+
280
+ let(:legacy_url) do
281
+ LegacyPageUrl.create(
282
+ urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69',
283
+ page: second_page
284
+ )
285
+ end
286
+
287
+ before do
288
+ allow_any_instance_of(PagesController).to receive(:multi_language?).and_return(false)
289
+ end
290
+
291
+ it "redirects legacy url with unknown format & query string" do
292
+ visit "/#{legacy_url.urlname}"
293
+ uri = URI.parse(page.current_url)
294
+ expect(uri.query).to be_nil
295
+ expect(uri.request_uri).to eq("/#{second_page.urlname}")
296
+ end
297
+
298
+ it "redirects from nested language code url to normal url" do
299
+ visit "/en/#{public_page.urlname}"
300
+ expect(page.current_path).to eq("/#{public_page.urlname}")
301
+ end
302
+
303
+ context "redirects to public child" do
304
+ before do
305
+ public_page.update_attributes(
306
+ public: false,
307
+ visible: false,
308
+ name: 'Not Public',
309
+ urlname: ''
310
+ )
311
+ public_child
312
+ end
313
+
314
+ it "if requested page is unpublished" do
315
+ visit '/not-public'
316
+ expect(page.current_path).to eq('/public-child')
317
+ end
318
+
319
+ it "with normal url, if requested url has nested language code and is not public" do
320
+ visit '/en/not-public'
321
+ expect(page.current_path).to eq('/public-child')
322
+ end
323
+ end
324
+
325
+ context 'if requested url is index url' do
326
+ context "when locale is prefixed" do
327
+ it "redirects to normal url" do
328
+ visit "/en"
329
+ expect(page.current_path).to eq("/")
330
+ end
331
+ end
332
+
333
+ context "when redirect_index is enabled" do
334
+ before do
335
+ allow(Config).to receive(:get) do |arg|
336
+ arg == :redirect_index ? true : Config.parameter(arg)
337
+ end
338
+ if Alchemy.version == "4.0.0.rc1"
339
+ raise "Remove deprecated `redirect_index` configuration!"
340
+ end
341
+ end
342
+
343
+ it "redirects to pages url" do
344
+ ActiveSupport::Deprecation.silence do
345
+ visit '/'
346
+ expect(page.current_path).to eq('/home')
347
+ end
348
+ end
349
+ end
350
+ end
351
+
352
+ it "should keep additional params" do
353
+ visit "/en/#{public_page.urlname}?query=Peter"
354
+ expect(page.current_url).to match(/\?query=Peter/)
355
+ end
356
+ end
357
+ end
358
+ end