alchemy_cms 3.3.0.rc1 → 3.3.0.rc2

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 (269) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -2
  3. data/Gemfile +1 -0
  4. data/alchemy_cms.gemspec +6 -6
  5. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -7
  6. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +4 -4
  7. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +51 -5
  8. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +0 -2
  9. data/app/assets/stylesheets/alchemy/elements.scss +2 -2
  10. data/app/controllers/alchemy/admin/elements_controller.rb +2 -0
  11. data/app/controllers/alchemy/admin/pages_controller.rb +11 -3
  12. data/app/controllers/alchemy/admin/pictures_controller.rb +1 -0
  13. data/app/models/alchemy/element.rb +3 -1
  14. data/app/models/alchemy/element/element_contents.rb +2 -7
  15. data/app/models/alchemy/element/presenters.rb +11 -4
  16. data/app/models/alchemy/page.rb +3 -1
  17. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +0 -1
  18. data/app/views/alchemy/admin/contents/create.js.erb +0 -1
  19. data/app/views/alchemy/admin/elements/_element_header.html.erb +3 -1
  20. data/app/views/alchemy/admin/elements/order.js.erb +25 -10
  21. data/app/views/alchemy/admin/elements/update.js.erb +1 -2
  22. data/app/views/alchemy/admin/essence_files/assign.js.erb +0 -1
  23. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -1
  24. data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +0 -1
  25. data/app/views/alchemy/admin/pages/destroy.js.erb +0 -1
  26. data/app/views/alchemy/admin/pages/update.js.erb +6 -4
  27. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +2 -1
  28. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -7
  29. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +0 -1
  30. data/bin/alchemy +1 -1
  31. data/bin/rspec +3 -2
  32. data/bin/spring +6 -6
  33. data/config/alchemy/config.yml +6 -1
  34. data/lib/alchemy/seeder.rb +9 -3
  35. data/lib/alchemy/version.rb +1 -1
  36. metadata +6 -471
  37. data/spec/controllers/alchemy/admin/attachments_controller_spec.rb +0 -193
  38. data/spec/controllers/alchemy/admin/base_controller_spec.rb +0 -87
  39. data/spec/controllers/alchemy/admin/clipboard_controller_spec.rb +0 -60
  40. data/spec/controllers/alchemy/admin/contents_controller_spec.rb +0 -78
  41. data/spec/controllers/alchemy/admin/dashboard_controller_spec.rb +0 -144
  42. data/spec/controllers/alchemy/admin/elements_controller_spec.rb +0 -496
  43. data/spec/controllers/alchemy/admin/essence_files_controller_spec.rb +0 -76
  44. data/spec/controllers/alchemy/admin/essence_pictures_controller_spec.rb +0 -202
  45. data/spec/controllers/alchemy/admin/languages_controller_spec.rb +0 -73
  46. data/spec/controllers/alchemy/admin/layoutpages_controller_spec.rb +0 -21
  47. data/spec/controllers/alchemy/admin/pages_controller_spec.rb +0 -639
  48. data/spec/controllers/alchemy/admin/pictures_controller_spec.rb +0 -383
  49. data/spec/controllers/alchemy/admin/resources_controller_spec.rb +0 -81
  50. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +0 -63
  51. data/spec/controllers/alchemy/admin/trash_controller_spec.rb +0 -67
  52. data/spec/controllers/alchemy/api/contents_controller_spec.rb +0 -125
  53. data/spec/controllers/alchemy/api/elements_controller_spec.rb +0 -124
  54. data/spec/controllers/alchemy/api/pages_controller_spec.rb +0 -167
  55. data/spec/controllers/alchemy/attachments_controller_spec.rb +0 -64
  56. data/spec/controllers/alchemy/base_controller_spec.rb +0 -106
  57. data/spec/controllers/alchemy/elements_controller_spec.rb +0 -48
  58. data/spec/controllers/alchemy/messages_controller_spec.rb +0 -204
  59. data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +0 -330
  60. data/spec/controllers/alchemy/pages_controller_spec.rb +0 -343
  61. data/spec/controllers/alchemy/pictures_controller_spec.rb +0 -415
  62. data/spec/dummy/Rakefile +0 -6
  63. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  64. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  65. data/spec/dummy/app/controllers/admin/events_controller.rb +0 -3
  66. data/spec/dummy/app/controllers/application_controller.rb +0 -15
  67. data/spec/dummy/app/controllers/login_controller.rb +0 -5
  68. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  69. data/spec/dummy/app/mailers/.gitkeep +0 -0
  70. data/spec/dummy/app/models/ability.rb +0 -9
  71. data/spec/dummy/app/models/dummy_model.rb +0 -3
  72. data/spec/dummy/app/models/dummy_user.rb +0 -15
  73. data/spec/dummy/app/models/event.rb +0 -10
  74. data/spec/dummy/app/models/location.rb +0 -3
  75. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_editor.html.erb +0 -11
  76. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +0 -31
  77. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +0 -6
  78. data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +0 -10
  79. data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +0 -3
  80. data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +0 -5
  81. data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +0 -6
  82. data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +0 -16
  83. data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +0 -3
  84. data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +0 -5
  85. data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +0 -3
  86. data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +0 -5
  87. data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +0 -3
  88. data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +0 -5
  89. data/spec/dummy/app/views/alchemy/elements/_headline_editor.html.erb +0 -1
  90. data/spec/dummy/app/views/alchemy/elements/_headline_view.html.erb +0 -1
  91. data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +0 -5
  92. data/spec/dummy/app/views/alchemy/elements/_news_view.html.erb +0 -11
  93. data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +0 -1
  94. data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +0 -4
  95. data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +0 -3
  96. data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +0 -5
  97. data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +0 -2
  98. data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +0 -4
  99. data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +0 -3
  100. data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +0 -5
  101. data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +0 -15
  102. data/spec/dummy/app/views/layouts/application.html.erb +0 -17
  103. data/spec/dummy/bin/bundle +0 -3
  104. data/spec/dummy/bin/rails +0 -4
  105. data/spec/dummy/bin/rake +0 -4
  106. data/spec/dummy/config.ru +0 -4
  107. data/spec/dummy/config/alchemy/cells.yml +0 -5
  108. data/spec/dummy/config/alchemy/elements.yml +0 -109
  109. data/spec/dummy/config/alchemy/page_layouts.yml +0 -32
  110. data/spec/dummy/config/application.rb +0 -32
  111. data/spec/dummy/config/boot.rb +0 -5
  112. data/spec/dummy/config/database.yml +0 -32
  113. data/spec/dummy/config/environment.rb +0 -5
  114. data/spec/dummy/config/environments/development.rb +0 -41
  115. data/spec/dummy/config/environments/production.rb +0 -77
  116. data/spec/dummy/config/environments/test.rb +0 -43
  117. data/spec/dummy/config/initializers/alchemy.rb +0 -3
  118. data/spec/dummy/config/initializers/assets.rb +0 -11
  119. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  120. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -3
  121. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  122. data/spec/dummy/config/initializers/inflections.rb +0 -16
  123. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  124. data/spec/dummy/config/initializers/secret_token.rb +0 -12
  125. data/spec/dummy/config/initializers/session_store.rb +0 -3
  126. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  127. data/spec/dummy/config/locales/kl.yml +0 -2
  128. data/spec/dummy/config/routes.rb +0 -12
  129. data/spec/dummy/config/secrets.yml +0 -22
  130. data/spec/dummy/db/migrate/20121026104128_create_events.rb +0 -20
  131. data/spec/dummy/db/migrate/20130328101418_create_locations.rb +0 -9
  132. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -1
  133. data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +0 -1
  134. data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +0 -1
  135. data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +0 -1
  136. data/spec/dummy/db/migrate/20131209225243_create_dummy_users.rb +0 -9
  137. data/spec/dummy/db/migrate/20150122213511_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +0 -31
  138. data/spec/dummy/db/migrate/20150122213512_add_missing_unique_indices.acts_as_taggable_on_engine.rb +0 -20
  139. data/spec/dummy/db/migrate/20150122213513_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +0 -15
  140. data/spec/dummy/db/migrate/20150122213514_add_missing_taggable_index.acts_as_taggable_on_engine.rb +0 -10
  141. data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +0 -7
  142. data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +0 -1
  143. data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +0 -1
  144. data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +0 -1
  145. data/spec/dummy/db/schema.rb +0 -326
  146. data/spec/dummy/db/seeds.rb +0 -1
  147. data/spec/dummy/lib/assets/.gitkeep +0 -0
  148. data/spec/dummy/public/404.html +0 -67
  149. data/spec/dummy/public/422.html +0 -67
  150. data/spec/dummy/public/500.html +0 -66
  151. data/spec/dummy/public/favicon.ico +0 -0
  152. data/spec/dummy/spec/javascripts +0 -1
  153. data/spec/factories.rb +0 -13
  154. data/spec/features/admin/admin_layout_spec.rb +0 -14
  155. data/spec/features/admin/dashboard_spec.rb +0 -81
  156. data/spec/features/admin/edit_elements_feature_spec.rb +0 -36
  157. data/spec/features/admin/language_tree_feature_spec.rb +0 -32
  158. data/spec/features/admin/languages_features_spec.rb +0 -65
  159. data/spec/features/admin/legacy_page_url_management_spec.rb +0 -62
  160. data/spec/features/admin/link_overlay_spec.rb +0 -53
  161. data/spec/features/admin/locale_select_feature_spec.rb +0 -25
  162. data/spec/features/admin/modules_integration_spec.rb +0 -23
  163. data/spec/features/admin/navigation_feature_spec.rb +0 -22
  164. data/spec/features/admin/page_creation_feature_spec.rb +0 -51
  165. data/spec/features/admin/page_editing_feature_spec.rb +0 -135
  166. data/spec/features/admin/picture_library_integration_spec.rb +0 -62
  167. data/spec/features/admin/resources_integration_spec.rb +0 -128
  168. data/spec/features/admin/site_select_feature_spec.rb +0 -31
  169. data/spec/features/admin/tinymce_feature_spec.rb +0 -33
  170. data/spec/features/navigation_spec.rb +0 -9
  171. data/spec/features/page_feature_spec.rb +0 -186
  172. data/spec/features/page_redirects_spec.rb +0 -358
  173. data/spec/features/picture_security_spec.rb +0 -29
  174. data/spec/features/security_spec.rb +0 -24
  175. data/spec/features/translation_integration_spec.rb +0 -51
  176. data/spec/fixtures/500x500.png +0 -0
  177. data/spec/fixtures/80x60.png +0 -0
  178. data/spec/fixtures/animated.gif +0 -0
  179. data/spec/fixtures/image with spaces.png +0 -0
  180. data/spec/fixtures/image.png +0 -0
  181. data/spec/fixtures/image2.PNG +0 -0
  182. data/spec/fixtures/image3.jpeg +0 -0
  183. data/spec/helpers/alchemy/admin/attachments_helper_spec.rb +0 -15
  184. data/spec/helpers/alchemy/admin/base_helper_spec.rb +0 -280
  185. data/spec/helpers/alchemy/admin/contents_helper_spec.rb +0 -46
  186. data/spec/helpers/alchemy/admin/elements_helper_spec.rb +0 -314
  187. data/spec/helpers/alchemy/admin/essences_helper_spec.rb +0 -201
  188. data/spec/helpers/alchemy/admin/navigation_helper_spec.rb +0 -294
  189. data/spec/helpers/alchemy/admin/pages_helper_spec.rb +0 -63
  190. data/spec/helpers/alchemy/admin/pictures_helper_spec.rb +0 -28
  191. data/spec/helpers/alchemy/admin/tags_helper_spec.rb +0 -111
  192. data/spec/helpers/alchemy/base_helper_spec.rb +0 -44
  193. data/spec/helpers/alchemy/elements_block_helper_spec.rb +0 -135
  194. data/spec/helpers/alchemy/elements_helper_spec.rb +0 -326
  195. data/spec/helpers/alchemy/essences_helper_spec.rb +0 -85
  196. data/spec/helpers/alchemy/pages_helper_spec.rb +0 -499
  197. data/spec/helpers/alchemy/picture_url_helpers_spec.rb +0 -78
  198. data/spec/helpers/alchemy/url_helper_spec.rb +0 -200
  199. data/spec/javascripts/alchemy/dialog_spec.coffee +0 -82
  200. data/spec/javascripts/alchemy/link_overlay_spec.coffee +0 -25
  201. data/spec/javascripts/alchemy_integration_spec.coffee +0 -3
  202. data/spec/javascripts/fixtures/select.html +0 -3
  203. data/spec/javascripts/helpers/mock-ajax.js +0 -199
  204. data/spec/javascripts/helpers/test_responses/test_responses.js +0 -1
  205. data/spec/javascripts/support/jasmine.yml +0 -29
  206. data/spec/libraries/auth_accessors_spec.rb +0 -40
  207. data/spec/libraries/config_spec.rb +0 -111
  208. data/spec/libraries/controller_actions_spec.rb +0 -133
  209. data/spec/libraries/i18n_spec.rb +0 -37
  210. data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +0 -30
  211. data/spec/libraries/modules_spec.rb +0 -67
  212. data/spec/libraries/mount_point_spec.rb +0 -77
  213. data/spec/libraries/page_layout_spec.rb +0 -150
  214. data/spec/libraries/paths_spec.rb +0 -15
  215. data/spec/libraries/permissions_spec.rb +0 -260
  216. data/spec/libraries/resource_spec.rb +0 -344
  217. data/spec/libraries/resources_helper_spec.rb +0 -193
  218. data/spec/libraries/shell_spec.rb +0 -121
  219. data/spec/libraries/template_tracker_spec.rb +0 -85
  220. data/spec/libraries/tinymce_spec.rb +0 -111
  221. data/spec/libraries/userstamp_spec.rb +0 -10
  222. data/spec/mailers/alchemy/messages_spec.rb +0 -21
  223. data/spec/models/alchemy/attachment_spec.rb +0 -250
  224. data/spec/models/alchemy/cell_spec.rb +0 -101
  225. data/spec/models/alchemy/content_spec.rb +0 -513
  226. data/spec/models/alchemy/element_spec.rb +0 -862
  227. data/spec/models/alchemy/element_to_page_spec.rb +0 -13
  228. data/spec/models/alchemy/essence_boolean_spec.rb +0 -10
  229. data/spec/models/alchemy/essence_date_spec.rb +0 -28
  230. data/spec/models/alchemy/essence_file_spec.rb +0 -40
  231. data/spec/models/alchemy/essence_html_spec.rb +0 -18
  232. data/spec/models/alchemy/essence_link_spec.rb +0 -10
  233. data/spec/models/alchemy/essence_picture_spec.rb +0 -255
  234. data/spec/models/alchemy/essence_richtext_spec.rb +0 -23
  235. data/spec/models/alchemy/essence_select_spec.rb +0 -10
  236. data/spec/models/alchemy/essence_text_spec.rb +0 -110
  237. data/spec/models/alchemy/language_spec.rb +0 -243
  238. data/spec/models/alchemy/legacy_page_url_spec.rb +0 -21
  239. data/spec/models/alchemy/message_spec.rb +0 -55
  240. data/spec/models/alchemy/page_spec.rb +0 -2108
  241. data/spec/models/alchemy/picture_spec.rb +0 -418
  242. data/spec/models/alchemy/site_spec.rb +0 -168
  243. data/spec/models/alchemy/tag_spec.rb +0 -29
  244. data/spec/models/dummy_model_spec.rb +0 -10
  245. data/spec/requests/alchemy/admin/resources_requests_spec.rb +0 -26
  246. data/spec/requests/alchemy/admin/site_requests_spec.rb +0 -19
  247. data/spec/requests/alchemy/site_requests_spec.rb +0 -18
  248. data/spec/requests/alchemy/sitemap_spec.rb +0 -56
  249. data/spec/routing/api_routing_spec.rb +0 -150
  250. data/spec/routing/routing_spec.rb +0 -340
  251. data/spec/spec_helper.rb +0 -90
  252. data/spec/support/ci/install_phantomjs +0 -7
  253. data/spec/support/hint_examples.rb +0 -28
  254. data/spec/support/test_tweaks.rb +0 -31
  255. data/spec/support/transformation_examples.rb +0 -179
  256. data/spec/tasks/helpers_spec.rb +0 -217
  257. data/spec/views/admin/pictures/show_spec.rb +0 -43
  258. data/spec/views/essences/essence_boolean_editor_spec.rb +0 -32
  259. data/spec/views/essences/essence_boolean_view_spec.rb +0 -23
  260. data/spec/views/essences/essence_date_view_spec.rb +0 -38
  261. data/spec/views/essences/essence_file_editor_spec.rb +0 -59
  262. data/spec/views/essences/essence_file_view_spec.rb +0 -77
  263. data/spec/views/essences/essence_html_view_spec.rb +0 -22
  264. data/spec/views/essences/essence_link_view_spec.rb +0 -41
  265. data/spec/views/essences/essence_picture_editor_spec.rb +0 -80
  266. data/spec/views/essences/essence_picture_view_spec.rb +0 -128
  267. data/spec/views/essences/essence_richtext_view_spec.rb +0 -32
  268. data/spec/views/essences/essence_select_view_spec.rb +0 -11
  269. data/spec/views/essences/essence_text_view_spec.rb +0 -51
@@ -1,76 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Alchemy
4
- describe Admin::EssenceFilesController do
5
- before do
6
- authorize_user(:as_admin)
7
- end
8
-
9
- let(:essence_file) { mock_model('EssenceFile', :attachment= => nil, content: content) }
10
- let(:content) { mock_model('Content') }
11
- let(:attachment) { mock_model('Attachment') }
12
-
13
- describe '#edit' do
14
- before do
15
- expect(EssenceFile).to receive(:find)
16
- .with(essence_file.id.to_s)
17
- .and_return(essence_file)
18
- end
19
-
20
- it "assigns @essence_file with the EssenceFile found by id" do
21
- alchemy_get :edit, id: essence_file.id
22
- expect(assigns(:essence_file)).to eq(essence_file)
23
- end
24
-
25
- it "should assign @content with essence_file's content" do
26
- alchemy_get :edit, id: essence_file.id
27
- expect(assigns(:content)).to eq(content)
28
- end
29
- end
30
-
31
- describe '#update' do
32
- let(:essence_file) { create(:alchemy_essence_file) }
33
-
34
- before do
35
- expect(EssenceFile).to receive(:find).and_return(essence_file)
36
- end
37
-
38
- it "should update the attributes of essence_file" do
39
- alchemy_xhr :put, :update, id: essence_file.id, essence_file: {
40
- title: 'new title',
41
- css_class: 'left',
42
- link_text: 'Download this file'
43
- }
44
- expect(essence_file.title).to eq 'new title'
45
- expect(essence_file.css_class).to eq 'left'
46
- expect(essence_file.link_text).to eq 'Download this file'
47
- end
48
- end
49
-
50
- describe '#assign' do
51
- let(:content) { create(:alchemy_content) }
52
-
53
- before do
54
- expect(Content).to receive(:find_by).and_return(content)
55
- expect(Attachment).to receive(:find_by).and_return(attachment)
56
- allow(content).to receive(:essence).and_return(essence_file)
57
- end
58
-
59
- it "should assign @attachment with the Attachment found by attachment_id" do
60
- alchemy_xhr :put, :assign, content_id: content.id, attachment_id: attachment.id
61
- expect(assigns(:attachment)).to eq(attachment)
62
- end
63
-
64
- it "should assign @content.essence.attachment with the attachment found by id" do
65
- expect(content.essence).to receive(:attachment=).with(attachment)
66
- alchemy_xhr :put, :assign, content_id: content.id, attachment_id: attachment.id
67
- end
68
-
69
- it "updates the @content.updated_at column" do
70
- expect {
71
- alchemy_xhr :put, :assign, content_id: content.id, attachment_id: attachment.id
72
- }.to change(content, :updated_at)
73
- end
74
- end
75
- end
76
- end
@@ -1,202 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Alchemy
4
- describe Admin::EssencePicturesController do
5
- before { authorize_user(:as_admin) }
6
-
7
- let(:essence) { EssencePicture.new }
8
- let(:content) { Content.new }
9
- let(:picture) { Picture.new }
10
-
11
- describe '#edit' do
12
- before do
13
- expect(EssencePicture).to receive(:find).and_return(essence)
14
- expect(Content).to receive(:find).and_return(content)
15
- end
16
-
17
- it 'should assign @essence_picture and @content instance variables' do
18
- alchemy_post :edit, id: 1, content_id: 1
19
- expect(assigns(:essence_picture)).to be_a(EssencePicture)
20
- expect(assigns(:content)).to be_a(Content)
21
- end
22
- end
23
-
24
- describe '#crop' do
25
- before do
26
- expect(EssencePicture).to receive(:find).and_return(essence)
27
- end
28
-
29
- context 'with no picture assigned' do
30
- before do
31
- expect(essence).to receive(:picture).at_least(:once).and_return(nil)
32
- end
33
-
34
- it "renders error message" do
35
- alchemy_get :crop, id: 1
36
- expect(assigns(:no_image_notice)).to eq(Alchemy.t(:no_image_for_cropper_found))
37
- end
38
- end
39
-
40
- context 'with picture assigned' do
41
- let(:default_mask) do
42
- {
43
- x1: 0,
44
- y1: 0,
45
- x2: 300,
46
- y2: 250
47
- }
48
- end
49
-
50
- before do
51
- picture.image_file_width = 300
52
- picture.image_file_height = 250
53
- expect(essence).to receive(:picture).at_least(:once).and_return(picture)
54
- end
55
-
56
- context 'with no render_size present in essence' do
57
- before do
58
- expect(essence).to receive(:render_size).at_least(:once).and_return(nil)
59
- end
60
-
61
- context 'with sizes in params' do
62
- it "sets sizes to given values" do
63
- alchemy_get :crop, id: 1, options: {image_size: '300x250'}
64
- expect(assigns(:min_size)).to eq({ width: 300, height: 250 })
65
- end
66
- end
67
-
68
- context 'with no sizes in params' do
69
- it "sets sizes to zero" do
70
- alchemy_get :crop, id: 1
71
- expect(assigns(:min_size)).to eq({ width: 0, height: 0 })
72
- end
73
- end
74
- end
75
-
76
- context 'with render_size present in essence' do
77
- it "sets sizes from these values" do
78
- expect(essence).to receive(:render_size).at_least(:once).and_return('30x25')
79
-
80
- alchemy_get :crop, id: 1
81
- expect(assigns(:min_size)).to eq({ width: 30, height: 25 })
82
- end
83
-
84
- context 'when width or height is not fixed' do
85
- it 'infers the height from the image file preserving the aspect ratio' do
86
- expect(essence).to receive(:render_size).at_least(:once).and_return('30x')
87
-
88
- alchemy_get :crop, id: 1
89
- expect(assigns(:min_size)).to eq({ width: 30, height: 0})
90
- end
91
-
92
- it 'does not infer the height from the image file preserving the aspect ratio' do
93
- expect(essence).to receive(:render_size).at_least(:once).and_return('x25')
94
-
95
- alchemy_get :crop, id: 1, options: { fixed_ratio: "2"}
96
- expect(assigns(:min_size)).to eq({ width: 50, height: 25 })
97
- end
98
- end
99
-
100
- context 'when width or height is not fixed and an aspect ratio is given' do
101
- it 'width is given, it infers the height from width and ratio' do
102
- expect(essence).to receive(:render_size).at_least(:once).and_return('30x')
103
-
104
- alchemy_get :crop, id: 1, options: { fixed_ratio: "0.5" }
105
- expect(assigns(:min_size)).to eq({ width: 30, height: 60 })
106
- end
107
-
108
- it 'infers the height from the image file preserving the aspect ratio' do
109
- expect(essence).to receive(:render_size).at_least(:once).and_return('x25')
110
-
111
- alchemy_get :crop, id: 1
112
- expect(assigns(:min_size)).to eq({ width: 0, height: 25})
113
- end
114
- end
115
- end
116
-
117
- context 'no crop sizes present in essence' do
118
- before do
119
- expect(essence).to receive(:crop_from).and_return(nil)
120
- allow(essence).to receive(:crop_size).and_return(nil)
121
- end
122
-
123
- it "assigns default mask boxes" do
124
- alchemy_get :crop, id: 1
125
- expect(assigns(:initial_box)).to eq(default_mask)
126
- expect(assigns(:default_box)).to eq(default_mask)
127
- end
128
- end
129
-
130
- context 'crop sizes present in essence' do
131
- let(:mask) { {'x1' => '0', 'y1' => '0', 'x2' => '120', 'y2' => '160'} }
132
-
133
- before do
134
- allow(essence).to receive(:crop_from).and_return('0x0')
135
- allow(essence).to receive(:crop_size).and_return('120x160')
136
- end
137
-
138
- it "assigns cropping boxes" do
139
- expect(essence).to receive(:cropping_mask).and_return(mask)
140
- alchemy_get :crop, id: 1
141
- expect(assigns(:initial_box)).to eq(mask)
142
- expect(assigns(:default_box)).to eq(default_mask)
143
- end
144
- end
145
-
146
- context 'with fixed_ratio set to false' do
147
- it "sets ratio to false" do
148
- alchemy_get :crop, id: 1, options: {fixed_ratio: false}
149
- expect(assigns(:ratio)).to eq(false)
150
- end
151
- end
152
-
153
- context 'with no fixed_ratio set in params' do
154
- it "sets a fixed ratio from sizes" do
155
- alchemy_get :crop, id: 1, options: {image_size: '80x60'}
156
- expect(assigns(:ratio)).to eq(80.0 / 60.0)
157
- end
158
- end
159
- end
160
- end
161
-
162
- describe '#update' do
163
- before do
164
- expect(EssencePicture).to receive(:find).and_return(essence)
165
- expect(Content).to receive(:find).and_return(content)
166
- end
167
-
168
- let(:attributes) { {render_size: '1x1', alt_tag: 'Alt Tag', caption: 'Caption', css_class: 'CSS Class', title: 'Title'} }
169
-
170
- it "updates the essence attributes" do
171
- expect(essence).to receive(:update).and_return(true)
172
- alchemy_xhr :put, :update, id: 1, essence_picture: attributes
173
- end
174
-
175
- it "saves the cropping mask" do
176
- expect(essence).to receive(:update).and_return(true)
177
- alchemy_xhr :put, :update, id: 1, essence_picture: {render_size: '1x1', crop_from: '0x0', crop_size: '100x100'}
178
- end
179
- end
180
-
181
- describe '#assign' do
182
- let(:content) { create(:alchemy_content) }
183
-
184
- before do
185
- expect(Content).to receive(:find).and_return(content)
186
- expect(content).to receive(:essence).at_least(:once).and_return(essence)
187
- expect(Picture).to receive(:find_by).and_return(picture)
188
- end
189
-
190
- it "should assign a Picture" do
191
- alchemy_xhr :put, :assign, content_id: '1', picture_id: '1'
192
- expect(assigns(:content).essence.picture).to eq(picture)
193
- end
194
-
195
- it "updates the content timestamp" do
196
- expect {
197
- alchemy_xhr :put, :assign, content_id: '1', picture_id: '1'
198
- }.to change(content, :updated_at)
199
- end
200
- end
201
- end
202
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Alchemy::Admin::LanguagesController do
4
- before do
5
- authorize_user(:as_admin)
6
- end
7
-
8
- describe "#new" do
9
- context "when default_language.page_layout is set" do
10
- before do
11
- allow(Alchemy::Config).to receive(:get) do |arg|
12
- if arg == :default_language
13
- {'page_layout' => "new_standard"}
14
- else
15
- Alchemy::Config.show[arg.to_s]
16
- end
17
- end
18
- end
19
-
20
- it "uses it as page_layout-default for the new language" do
21
- alchemy_get :new
22
- expect(assigns(:language).page_layout).to eq("new_standard")
23
- end
24
- end
25
-
26
- context "when default_language is not configured" do
27
- before do
28
- allow(Alchemy::Config).to receive(:get) do |arg|
29
- if arg == :default_language
30
- nil
31
- else
32
- Alchemy::Config.show[arg.to_s]
33
- end
34
- end
35
- end
36
-
37
- it "falls back to default database value." do
38
- alchemy_get :new
39
- expect(assigns(:language).page_layout).to eq("intro")
40
- end
41
- end
42
-
43
- context "when default language page_layout is not configured" do
44
- before do
45
- allow(Alchemy::Config).to receive(:get) do |arg|
46
- if arg == :default_language
47
- {}
48
- else
49
- Alchemy::Config.show[arg.to_s]
50
- end
51
- end
52
- end
53
-
54
- it "falls back to default database value." do
55
- alchemy_get :new
56
- expect(assigns(:language).page_layout).to eq("intro")
57
- end
58
- end
59
- end
60
-
61
- describe "#index" do
62
- context "editor users" do
63
- before do
64
- authorize_user(:as_editor)
65
- end
66
-
67
- it "should be able to index language" do
68
- alchemy_get :index
69
- expect(response).to render_template(:index)
70
- end
71
- end
72
- end
73
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Alchemy
4
- describe Admin::LayoutpagesController do
5
- before(:each) do
6
- authorize_user(:as_admin)
7
- end
8
-
9
- describe "#index" do
10
- it "should assign @layout_root" do
11
- alchemy_get :index
12
- expect(assigns(:layout_root)).to be_a(Page)
13
- end
14
-
15
- it "should assign @languages" do
16
- alchemy_get :index
17
- expect(assigns(:languages).first).to be_a(Language)
18
- end
19
- end
20
- end
21
- end
@@ -1,639 +0,0 @@
1
- require 'ostruct'
2
- require 'spec_helper'
3
-
4
- module Alchemy
5
- describe Admin::PagesController do
6
- context 'a guest' do
7
- it 'can not access page tree' do
8
- alchemy_get :index
9
- expect(request).to redirect_to(Alchemy.login_path)
10
- end
11
- end
12
-
13
- context 'a member' do
14
- before { authorize_user(build(:alchemy_dummy_user)) }
15
-
16
- it 'can not access page tree' do
17
- alchemy_get :index
18
- expect(request).to redirect_to(root_path)
19
- end
20
- end
21
-
22
- context 'with logged in editor user' do
23
- let(:user) { build(:alchemy_dummy_user, :as_editor) }
24
-
25
- before { authorize_user(user) }
26
-
27
- describe '#index' do
28
- let(:language) { build_stubbed(:alchemy_language) }
29
- let(:language_root) { build_stubbed(:alchemy_page, :language_root) }
30
-
31
- context 'with existing language root page' do
32
- before do
33
- expect(Language).to receive(:current_root_page).and_return(language_root)
34
- end
35
-
36
- it "assigns @page_root variable" do
37
- alchemy_get :index
38
- expect(assigns(:page_root)).to be(language_root)
39
- end
40
- end
41
-
42
- context 'without language root page' do
43
- before do
44
- expect(Language).to receive(:current_root_page).and_return(nil)
45
- expect(Language).to receive(:find_by).and_return(language)
46
- expect(Language).to receive(:all).and_return([language])
47
- expect(Language).to receive(:with_root_page).and_return([language])
48
- end
49
-
50
- it "it assigns current language" do
51
- alchemy_get :index
52
- expect(assigns(:language)).to be(language)
53
- end
54
- end
55
- end
56
-
57
- describe '#tree' do
58
- let(:page_1) { create(:alchemy_page, visible: true, name: 'one') }
59
- let(:page_2) { create(:alchemy_page, visible: true, name: 'two', parent_id: page_1.id) }
60
- let(:page_3) { create(:alchemy_page, visible: true, name: 'three', parent_id: page_2.id) }
61
- let(:pages) { [page_1, page_2, page_3] }
62
-
63
- before do
64
- pages
65
- end
66
-
67
- it 'returns a tree as JSON' do
68
- alchemy_get :tree, id: page_1.id, full: 'true'
69
-
70
- expect(response.status).to eq(200)
71
- expect(response.content_type).to eq('application/json')
72
-
73
- result = JSON.parse(response.body)
74
-
75
- expect(result).to have_key('pages')
76
- expect(result['pages'].count).to eq(1)
77
-
78
- page = result['pages'].first
79
-
80
- expect(page).to have_key('id')
81
- expect(page['id']).to eq(page_1.id)
82
- expect(page).to have_key('name')
83
- expect(page['name']).to eq(page_1.name)
84
- expect(page).to have_key('children')
85
- expect(page['children'].count).to eq(1)
86
-
87
- page = page['children'].first
88
-
89
- expect(page).to have_key('id')
90
- expect(page['id']).to eq(page_2.id)
91
- expect(page).to have_key('name')
92
- expect(page['name']).to eq(page_2.name)
93
- expect(page).to have_key('children')
94
- expect(page['children'].count).to eq(1)
95
-
96
- page = page['children'].first
97
-
98
- expect(page).to have_key('id')
99
- expect(page['id']).to eq(page_3.id)
100
- expect(page).to have_key('name')
101
- expect(page['name']).to eq(page_3.name)
102
- expect(page).to have_key('children')
103
- expect(page['children'].count).to eq(0)
104
- end
105
-
106
- it 'does not return a branch that is folded' do
107
- alchemy_xhr :post, :fold, id: page_2.id
108
- alchemy_get :tree, id: page_1.id, full: 'false'
109
-
110
- expect(response.status).to eq(200)
111
- expect(response.content_type).to eq('application/json')
112
-
113
- result = JSON.parse(response.body)
114
- page = result['pages'].first['children'].first
115
-
116
- expect(page['children'].count).to eq(0)
117
- end
118
- end
119
-
120
- describe "#flush" do
121
- let(:content_page_1) { create(:alchemy_page, :public, name: "content page 1", published_at: Time.current - 5.days) }
122
- let(:content_page_2) { create(:alchemy_page, :public, name: "content page 2", published_at: Time.current - 8.days) }
123
- let(:layout_page_1) { create(:alchemy_page, layoutpage: true, name: "layout_page 1", published_at: Time.current - 5.days) }
124
- let(:layout_page_2) { create(:alchemy_page, layoutpage: true, name: "layout_page 2", published_at: Time.current - 8.days) }
125
- let(:content_pages) { [content_page_1, content_page_2] }
126
- let(:layout_pages) { [layout_page_1, layout_page_2] }
127
-
128
- before do
129
- content_pages
130
- layout_pages
131
- end
132
-
133
- it "should update the published_at field of content pages" do
134
- travel_to(Time.current) do
135
- alchemy_xhr :post, :flush
136
- content_pages.map(&:reload) # Reloading because published_at was directly updated in the database.
137
- content_pages.each do |page|
138
- expect(page.published_at).to eq(Time.current)
139
- end
140
- end
141
- end
142
-
143
- it "should update the published_at field of layout pages" do
144
- travel_to(Time.current) do
145
- alchemy_xhr :post, :flush
146
- layout_pages.map(&:reload) # Reloading because published_at was directly updated in the database.
147
- layout_pages.each do |page|
148
- expect(page.published_at).to eq(Time.current)
149
- end
150
- end
151
- end
152
- end
153
-
154
- describe '#new' do
155
- context "pages in clipboard" do
156
- let(:clipboard) { session[:alchemy_clipboard] = {} }
157
- let(:page) { mock_model(Alchemy::Page, name: 'Foobar') }
158
-
159
- before { clipboard['pages'] = [{'id' => page.id.to_s, 'action' => 'copy'}] }
160
-
161
- it "should load all pages from clipboard" do
162
- alchemy_xhr :get, :new, {page_id: page.id}
163
- expect(assigns(:clipboard_items)).to be_kind_of(Array)
164
- end
165
- end
166
- end
167
-
168
- describe '#show' do
169
- let(:language) { build_stubbed(:alchemy_language, locale: 'nl') }
170
- let(:page) { build_stubbed(:alchemy_page, language: language) }
171
-
172
- before do
173
- expect(Page).to receive(:find).with(page.id.to_s).and_return(page)
174
- allow(Page).to receive(:language_root_for).and_return(mock_model(Alchemy::Page))
175
- end
176
-
177
- it "should assign @preview_mode with true" do
178
- alchemy_get :show, id: page.id
179
- expect(assigns(:preview_mode)).to eq(true)
180
- end
181
-
182
- it "should store page as current preview" do
183
- Page.current_preview = nil
184
- alchemy_get :show, id: page.id
185
- expect(Page.current_preview).to eq(page)
186
- end
187
-
188
- it "should set the I18n locale to the pages language code" do
189
- alchemy_get :show, id: page.id
190
- expect(::I18n.locale).to eq(:nl)
191
- end
192
-
193
- it "renders the application layout" do
194
- alchemy_get :show, id: page.id
195
- expect(response).to render_template(layout: 'application')
196
- end
197
- end
198
-
199
- describe '#order' do
200
- let(:page_1) { create(:alchemy_page, visible: true) }
201
- let(:page_2) { create(:alchemy_page, visible: true) }
202
- let(:page_3) { create(:alchemy_page, visible: true) }
203
- let(:page_item_1) { {id: page_1.id, slug: page_1.slug, restricted: false, external: page_1.redirects_to_external?, visible: page_1.visible?, children: [page_item_2]} }
204
- let(:page_item_2) { {id: page_2.id, slug: page_2.slug, restricted: false, external: page_2.redirects_to_external?, visible: page_2.visible?, children: [page_item_3]} }
205
- let(:page_item_3) { {id: page_3.id, slug: page_3.slug, restricted: false, external: page_3.redirects_to_external?, visible: page_3.visible? } }
206
- let(:set_of_pages) { [page_item_1] }
207
-
208
- it "stores the new order" do
209
- alchemy_xhr :post, :order, set: set_of_pages.to_json
210
- page_1.reload
211
- expect(page_1.descendants).to eq([page_2, page_3])
212
- end
213
-
214
- context 'with url nesting enabled' do
215
- before do
216
- expect(Alchemy::Config).to receive(:get).with(:url_nesting).at_least(:once).and_return(true)
217
- end
218
-
219
- it "updates the pages urlnames" do
220
- alchemy_xhr :post, :order, set: set_of_pages.to_json
221
- [page_1, page_2, page_3].map(&:reload)
222
- expect(page_1.urlname).to eq(page_1.slug.to_s)
223
- expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
224
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_2.slug}/#{page_3.slug}")
225
- end
226
-
227
- context 'with invisible page in tree' do
228
- let(:page_item_2) do
229
- {
230
- id: page_2.id,
231
- slug: page_2.slug,
232
- children: [page_item_3],
233
- visible: false
234
- }
235
- end
236
-
237
- it "does not use this pages slug in urlnames of descendants" do
238
- alchemy_xhr :post, :order, set: set_of_pages.to_json
239
- [page_1, page_2, page_3].map(&:reload)
240
- expect(page_1.urlname).to eq(page_1.slug.to_s)
241
- expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
242
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
243
- end
244
- end
245
-
246
- context 'with external page in tree' do
247
- let(:page_item_2) do
248
- {
249
- id: page_2.id,
250
- slug: page_2.slug,
251
- children: [page_item_3],
252
- external: true
253
- }
254
- end
255
-
256
- it "does not use this pages slug in urlnames of descendants" do
257
- alchemy_xhr :post, :order, set: set_of_pages.to_json
258
- [page_1, page_2, page_3].map(&:reload)
259
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
260
- end
261
- end
262
-
263
- context 'with restricted page in tree' do
264
- let(:page_2) { create(:alchemy_page, restricted: true) }
265
- let(:page_item_2) do
266
- {
267
- id: page_2.id,
268
- slug: page_2.slug,
269
- children: [page_item_3],
270
- restricted: true
271
- }
272
- end
273
-
274
- it "updates restricted status of descendants" do
275
- alchemy_xhr :post, :order, set: set_of_pages.to_json
276
- page_3.reload
277
- expect(page_3.restricted).to be_truthy
278
- end
279
- end
280
-
281
- context 'with page having number as slug' do
282
- let(:page_item_2) do
283
- {
284
- id: page_2.id,
285
- slug: 42,
286
- children: [page_item_3]
287
- }
288
- end
289
-
290
- it "does not raise error" do
291
- expect {
292
- alchemy_xhr :post, :order, set: set_of_pages.to_json
293
- }.not_to raise_error
294
- end
295
-
296
- it "still generates the correct urlname on page_3" do
297
- alchemy_xhr :post, :order, set: set_of_pages.to_json
298
- [page_1, page_2, page_3].map(&:reload)
299
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_2.slug}/#{page_3.slug}")
300
- end
301
- end
302
-
303
- it "creates legacy urls" do
304
- alchemy_xhr :post, :order, set: set_of_pages.to_json
305
- [page_2, page_3].map(&:reload)
306
- expect(page_2.legacy_urls.size).to eq(1)
307
- expect(page_3.legacy_urls.size).to eq(1)
308
- end
309
- end
310
- end
311
-
312
- describe "#configure" do
313
- render_views
314
-
315
- context "with page having nested urlname" do
316
- let(:page) { create(:alchemy_page, name: 'Foobar', urlname: 'foobar') }
317
-
318
- it "should always show the slug" do
319
- alchemy_xhr :get, :configure, {id: page.id}
320
- expect(response.body).to match /value="foobar"/
321
- end
322
- end
323
- end
324
-
325
- describe '#create' do
326
- let(:language) { mock_model('Language', code: 'kl') }
327
- let(:parent) { mock_model('Page', language: language) }
328
- let(:page_params) { {parent_id: parent.id, name: 'new Page'} }
329
-
330
- context "a new page" do
331
- before do
332
- allow_any_instance_of(Page).to receive(:set_language_from_parent_or_default)
333
- allow_any_instance_of(Page).to receive(:save).and_return(true)
334
- end
335
-
336
- it "is nested under given parent" do
337
- allow(controller).to receive(:edit_admin_page_path).and_return('bla')
338
- alchemy_xhr :post, :create, {page: page_params}
339
- expect(assigns(:page).parent_id).to eq(parent.id)
340
- end
341
-
342
- it "redirects to edit page template" do
343
- expect(controller).to receive(:edit_admin_page_path).and_return('bla')
344
- alchemy_post :create, page: page_params
345
- expect(response).to redirect_to('bla')
346
- end
347
-
348
- context "if new page can not be saved" do
349
- it "renders the create form" do
350
- allow_any_instance_of(Page).to receive(:save).and_return(false)
351
- alchemy_post :create, page: {name: 'page'}
352
- expect(response).to render_template('new')
353
- end
354
- end
355
-
356
- context "with redirect_to in params" do
357
- let(:page_params) do
358
- {name: "Foobar", page_layout: 'standard', parent_id: parent.id}
359
- end
360
-
361
- it "should redirect to given url" do
362
- alchemy_post :create, page: page_params, redirect_to: admin_pictures_path
363
- expect(response).to redirect_to(admin_pictures_path)
364
- end
365
-
366
- context "but new page can not be saved" do
367
- render_views
368
-
369
- it "should render the `new` template" do
370
- allow_any_instance_of(Page).to receive(:save).and_return(false)
371
- alchemy_xhr :post, :create, page: {name: 'page'}, redirect_to: admin_pictures_path
372
- expect(response.body).to match /form.+action=\"\/admin\/pages\"/
373
- end
374
- end
375
- end
376
-
377
- context 'with page redirecting to external' do
378
- it "redirects to sitemap" do
379
- expect_any_instance_of(Page).to receive(:redirects_to_external?).and_return(true)
380
- alchemy_post :create, page: page_params
381
- expect(response).to redirect_to(admin_pages_path)
382
- end
383
- end
384
- end
385
-
386
- context "with paste_from_clipboard in parameters" do
387
- let(:page_in_clipboard) { mock_model(Alchemy::Page) }
388
-
389
- before do
390
- allow(Page).to receive(:find_by).with(id: parent.id.to_s).and_return(parent)
391
- allow(Page).to receive(:find).with(page_in_clipboard.id.to_s).and_return(page_in_clipboard)
392
- end
393
-
394
- it "should call Page#copy_and_paste" do
395
- expect(Page).to receive(:copy_and_paste).with(
396
- page_in_clipboard,
397
- parent,
398
- 'pasted Page'
399
- ).and_return(
400
- mock_model('Page', save: true, name: 'pasted Page', redirects_to_external?: false)
401
- )
402
- alchemy_xhr :post, :create, {paste_from_clipboard: page_in_clipboard.id, page: {parent_id: parent.id, name: 'pasted Page'}}
403
- end
404
- end
405
- end
406
-
407
- describe '#copy_language_tree' do
408
- let(:params) { {languages: {new_lang_id: '2', old_lang_id: '1'}} }
409
- let(:language_root_to_copy_from) { build_stubbed(:alchemy_page, :language_root) }
410
- let(:copy_of_language_root) { build_stubbed(:alchemy_page, :language_root) }
411
- let(:root_page) { mock_model('Page') }
412
-
413
- before do
414
- allow(Page).to receive(:copy).and_return(copy_of_language_root)
415
- allow(Page).to receive(:root).and_return(root_page)
416
- allow(Page).to receive(:language_root_for).and_return(language_root_to_copy_from)
417
- allow_any_instance_of(Page).to receive(:move_to_child_of)
418
- allow_any_instance_of(Page).to receive(:copy_children_to)
419
- allow(controller).to receive(:store_current_language)
420
- allow(Language).to receive(:current).and_return(mock_model('Language', locale: 'de', code: 'de'))
421
- end
422
-
423
- it "should copy the language root page over to the other language" do
424
- expect(Page).to receive(:copy).with(language_root_to_copy_from, {language_id: '2', language_code: 'de'})
425
- alchemy_post :copy_language_tree, params
426
- end
427
-
428
- it "should move the newly created language-root-page below the absolute root page" do
429
- expect(copy_of_language_root).to receive(:move_to_child_of).with(root_page)
430
- alchemy_post :copy_language_tree, params
431
- end
432
-
433
- it "should copy all childs of the original page over to the new created one" do
434
- expect(controller).to receive(:language_root_to_copy_from).and_return(language_root_to_copy_from)
435
- expect(controller).to receive(:copy_of_language_root).and_return(copy_of_language_root)
436
- expect(language_root_to_copy_from).to receive(:copy_children_to).with(copy_of_language_root)
437
- alchemy_post :copy_language_tree, params
438
- end
439
-
440
- it "should redirect to admin_pages_path" do
441
- allow(controller).to receive(:copy_of_language_root)
442
- allow(controller).to receive(:language_root_to_copy_from).and_return(double(copy_children_to: nil))
443
- alchemy_post :copy_language_tree, params
444
- expect(response).to redirect_to(admin_pages_path)
445
- end
446
- end
447
-
448
- describe '#edit' do
449
- let!(:page) { create(:alchemy_page) }
450
- let!(:other_user) { create(:alchemy_dummy_user, :as_author) }
451
-
452
- context 'if page is locked by another user' do
453
- before { page.lock_to!(other_user) }
454
-
455
- context 'that is signed in' do
456
- before do
457
- expect_any_instance_of(DummyUser).to receive(:logged_in?).and_return(true)
458
- end
459
-
460
- it 'redirects to sitemap' do
461
- alchemy_get :edit, id: page.id
462
- expect(response).to redirect_to(admin_pages_path)
463
- end
464
- end
465
-
466
- context 'that is not signed in' do
467
- before do
468
- expect_any_instance_of(DummyUser).to receive(:logged_in?).and_return(false)
469
- end
470
-
471
- it 'renders the edit view' do
472
- alchemy_get :edit, id: page.id
473
- expect(response).to render_template(:edit)
474
- end
475
- end
476
- end
477
-
478
- context 'if page is locked by myself' do
479
- before do
480
- expect_any_instance_of(Page).to receive(:locker).and_return(user)
481
- expect(user).to receive(:logged_in?).and_return(true)
482
- end
483
-
484
- it 'renders the edit view' do
485
- alchemy_get :edit, id: page.id
486
- expect(response).to render_template(:edit)
487
- end
488
- end
489
-
490
- context 'if page is not locked' do
491
- before do
492
- expect_any_instance_of(Page).to receive(:locker).and_return(nil)
493
- end
494
-
495
- it 'renders the edit view' do
496
- alchemy_get :edit, id: page.id
497
- expect(response).to render_template(:edit)
498
- end
499
-
500
- it "lockes the page to myself" do
501
- expect_any_instance_of(Page).to receive(:lock_to!)
502
- alchemy_get :edit, id: page.id
503
- end
504
- end
505
- end
506
-
507
- describe '#destroy' do
508
- let(:clipboard) { session[:alchemy_clipboard] = {} }
509
- let(:page) { create(:alchemy_page, :public) }
510
-
511
- before { clipboard['pages'] = [{'id' => page.id.to_s}] }
512
-
513
- it "should also remove the page from clipboard" do
514
- alchemy_xhr :post, :destroy, {id: page.id, _method: :delete}
515
- expect(clipboard['pages']).to be_empty
516
- end
517
- end
518
-
519
- describe '#publish' do
520
- let(:page) { stub_model(Page, published_at: nil, public: false, name: "page", parent_id: 1, urlname: "page", language: stub_model(Language), page_layout: "bla") }
521
-
522
- before do
523
- allow(@controller).to receive(:load_page).and_return(page)
524
- @controller.instance_variable_set("@page", page)
525
- end
526
-
527
- it "should publish the page" do
528
- expect(page).to receive(:publish!)
529
- alchemy_post :publish, { id: page.id }
530
- end
531
- end
532
-
533
- describe '#visit' do
534
- let(:page) { mock_model(Alchemy::Page, urlname: 'home') }
535
-
536
- before do
537
- allow(Page).to receive(:find).with(page.id.to_s).and_return(page)
538
- allow(page).to receive(:unlock!).and_return(true)
539
- allow(@controller).to receive(:multi_language?).and_return(false)
540
- end
541
-
542
- it "should redirect to the page path" do
543
- expect(alchemy_post(:visit, id: page.id)).to redirect_to(show_page_path(urlname: 'home'))
544
- end
545
- end
546
-
547
- describe '#fold' do
548
- let(:page) { mock_model(Alchemy::Page) }
549
- before { allow(Page).to receive(:find).and_return(page) }
550
-
551
- context "if page is currently not folded" do
552
- before { allow(page).to receive(:folded?).and_return(false) }
553
-
554
- it "should fold the page" do
555
- expect(page).to receive(:fold!).with(user.id, true).and_return(true)
556
- alchemy_xhr :post, :fold, id: page.id
557
- end
558
- end
559
-
560
- context "if page is already folded" do
561
- before { allow(page).to receive(:folded?).and_return(true) }
562
-
563
- it "should unfold the page" do
564
- expect(page).to receive(:fold!).with(user.id, false).and_return(true)
565
- alchemy_xhr :post, :fold, id: page.id
566
- end
567
- end
568
- end
569
-
570
- describe '#sort' do
571
- before { allow(Page).to receive(:language_root_for).and_return(mock_model(Alchemy::Page)) }
572
-
573
- it "should assign @sorting with true" do
574
- alchemy_xhr :get, :sort
575
- expect(assigns(:sorting)).to eq(true)
576
- end
577
- end
578
-
579
- describe '#unlock' do
580
- let(:page) { mock_model(Alchemy::Page, name: 'Best practices') }
581
-
582
- before do
583
- allow(Page).to receive(:find).with(page.id.to_s).and_return(page)
584
- allow(Page).to receive(:from_current_site).and_return(double(locked_by: nil))
585
- expect(page).to receive(:unlock!).and_return(true)
586
- end
587
-
588
- it "should unlock the page" do
589
- alchemy_xhr :post, :unlock, id: page.id.to_s
590
- end
591
-
592
- context 'requesting for html format' do
593
- it "should redirect to admin_pages_path" do
594
- expect(alchemy_post(:unlock, id: page.id)).to redirect_to(admin_pages_path)
595
- end
596
-
597
- context 'if passing :redirect_to through params' do
598
- it "should redirect to the given path" do
599
- expect(
600
- alchemy_post(:unlock, id: page.id, redirect_to: 'this/path')
601
- ).to redirect_to('this/path')
602
- end
603
- end
604
- end
605
- end
606
-
607
- describe "#switch_language" do
608
- let(:language) { build_stubbed(:alchemy_language, :klingon) }
609
-
610
- before do
611
- allow(Language).to receive(:find_by).and_return(language)
612
- end
613
-
614
- it "should store the current language in session" do
615
- alchemy_get :switch_language, {language_id: language.id}
616
- expect(session[:alchemy_language_id]).to eq(language.id)
617
- end
618
-
619
- it "should redirect to sitemap" do
620
- expect(
621
- alchemy_get(:switch_language, language_id: language.id)
622
- ).to redirect_to(admin_pages_path)
623
- end
624
-
625
- context "coming from layoutpages" do
626
- before {
627
- allow(request).to receive(:referer).and_return('admin/layoutpages')
628
- }
629
-
630
- it "should redirect to layoutpages" do
631
- expect(
632
- alchemy_get(:switch_language, language_id: language.id)
633
- ).to redirect_to(admin_layoutpages_path)
634
- end
635
- end
636
- end
637
- end
638
- end
639
- end