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,243 +0,0 @@
1
- # encoding: UTF-8
2
- require 'spec_helper'
3
-
4
- module Alchemy
5
- describe Language do
6
- let(:default_language) { Alchemy::Language.default }
7
- let(:language) { create(:alchemy_language, :klingon) }
8
- let(:page) { create(:alchemy_page, language: language) }
9
-
10
- it 'is valid with uppercase country code' do
11
- language = Alchemy::Language.new(
12
- country_code: 'AT',
13
- language_code: 'de',
14
- name: 'Österreich',
15
- frontpage_name: 'Start',
16
- page_layout: 'index'
17
- )
18
- expect(language).to be_valid
19
- end
20
-
21
- it "should return a label for code" do
22
- expect(language.label(:code)).to eq('kl')
23
- end
24
-
25
- it "should return a label for name" do
26
- expect(language.label(:name)).to eq('Klingon')
27
- end
28
-
29
- context "with language_code and empty country_code" do
30
- it "#code should return language locale only" do
31
- language.country_code = ''
32
- expect(language.code).to eq('kl')
33
- end
34
-
35
- context "adding a value for country code" do
36
- it "#code should return a joined locale" do
37
- language.country_code = 'cr'
38
- expect(language.code).to eq('kl-cr')
39
- end
40
-
41
- it "should update all associated Pages with self.code as value for Page#language_code" do
42
- page = create(:alchemy_page, language: language)
43
- language.country_code = 'cr'
44
- language.save
45
- page.reload; expect(page.language_code).to eq('kl-cr')
46
- end
47
- end
48
- end
49
-
50
- context "with country_code and_language_code" do
51
- context "removing the country_code" do
52
- it "should update all associated Pages´s language_code with Language#code" do
53
- language = create(:alchemy_language, country_code: 'kl')
54
- language.country_code = ''
55
- language.save
56
- page.reload; expect(page.language_code).to eq("kl")
57
- end
58
- end
59
- end
60
-
61
- it "should not be deletable if it is the default language" do
62
- expect {
63
- default_language.destroy
64
- }.to raise_error(DefaultLanguageNotDeletable)
65
- end
66
-
67
- describe "before save" do
68
- describe "#remove_old_default if default attribute has changed to true" do
69
- it "should unset the default status of the old default language" do
70
- default_language
71
- language.update_attributes(default: true)
72
- default_language.reload
73
- expect(default_language.default).to be_falsey
74
- end
75
- end
76
- end
77
-
78
- context "after_update" do
79
- describe "#set_pages_language if language´s code has changed" do
80
- it "should update all its pages with the new code" do
81
- @other_page = create(:alchemy_page, language: language)
82
- language.update_attributes(code: "fo")
83
- language.reload; page.reload; @other_page.reload
84
- expect([page.language_code, @other_page.language_code]).to eq([language.code, language.code])
85
- end
86
- end
87
-
88
- describe "#unpublish_pages" do
89
- it "should set all pages to unpublic if it gets set to unpublic" do
90
- page = create(:alchemy_page, language: language)
91
- @other_page = create(:alchemy_page, language: language)
92
- language.update_attributes(public: false)
93
- language.reload; page.reload; @other_page.reload
94
- expect([page.public?, @other_page.public?]).to eq([false, false])
95
- end
96
- end
97
- end
98
-
99
- describe '.find_by_code' do
100
- context "with only the language code given" do
101
- it "should find the language" do
102
- expect(Language.find_by_code(language.code)).to eq(language)
103
- end
104
- end
105
- end
106
-
107
- describe 'validations' do
108
- let(:language) { Language.new(default: true, public: false) }
109
-
110
- describe 'publicity_of_default_language' do
111
- context 'if language is not published' do
112
- it "should add an error to the object" do
113
- expect(language.valid?).to eq(false)
114
- expect(language.errors.messages).to have_key(:public)
115
- end
116
- end
117
- end
118
-
119
- describe 'presence_of_default_language' do
120
- context 'if no default language would exist anymore' do
121
- before do
122
- allow(Language).to receive(:default).and_return(language)
123
- allow(language).to receive(:default_changed?).and_return(true)
124
- end
125
-
126
- it "should add an error to the object" do
127
- expect(language.valid?).to eq(false)
128
- expect(language.errors.messages).to have_key(:default)
129
- end
130
- end
131
- end
132
-
133
- describe 'before' do
134
- subject do
135
- language.valid?
136
- language.locale
137
- end
138
-
139
- before do
140
- allow(::I18n).to receive(:available_locales) do
141
- [:de, :'de-at', :en, :'en-uk']
142
- end
143
- end
144
-
145
- context 'when locale is already set' do
146
- let(:language) do
147
- build(:alchemy_language, language_code: 'de', locale: 'de')
148
- end
149
-
150
- it 'does not set the locale again' do
151
- expect(language).to_not receive(:set_locale)
152
- end
153
- end
154
-
155
- context 'when code is an available locale' do
156
- let(:language) do
157
- build(:alchemy_language, language_code: 'de', country_code: 'at')
158
- end
159
-
160
- it 'sets the locale to code' do
161
- is_expected.to eq('de-at')
162
- end
163
- end
164
-
165
- context 'when code is not is an available locale, but language_code is' do
166
- let(:language) do
167
- build(:alchemy_language, language_code: 'de', country_code: 'ch')
168
- end
169
-
170
- it 'sets the locale to language code' do
171
- is_expected.to eq('de')
172
- end
173
- end
174
-
175
- context "when language_code is an available locale" do
176
- let(:language) do
177
- build(:alchemy_language, language_code: 'en')
178
- end
179
-
180
- it 'sets the locale to language_code' do
181
- is_expected.to eq('en')
182
- end
183
- end
184
-
185
- context "when neither language_code nor code is an available locale" do
186
- it { is_expected.to be_nil }
187
- end
188
- end
189
-
190
- describe 'presence_of_locale_file' do
191
- context "when locale file is missing for selected language code" do
192
- let(:language) do
193
- build(:alchemy_language, language_code: 'jp')
194
- end
195
-
196
- it 'adds errors to locale attribute' do
197
- expect(language).to_not be_valid
198
- expect(language.errors).to have_key(:locale)
199
- end
200
- end
201
-
202
- context "when locale file is present for selected language code" do
203
- let(:language) do
204
- build(:alchemy_language, :klingon)
205
- end
206
-
207
- it 'adds no errors to locale attribute' do
208
- expect(language).to be_valid
209
- expect(language.errors).to_not have_key(:locale)
210
- end
211
- end
212
- end
213
- end
214
-
215
- describe '#matching_locales' do
216
- let(:language) do
217
- build(:alchemy_language, language_code: 'de')
218
- end
219
-
220
- subject do
221
- language.matching_locales
222
- end
223
-
224
- before do
225
- expect(::I18n).to receive(:available_locales) do
226
- [:de, :'de-at', :'en-uk']
227
- end
228
- end
229
-
230
- it 'returns locales matching the language code' do
231
- is_expected.to eq [:de, :'de-at']
232
- end
233
-
234
- context 'when language code is not is an available locale' do
235
- let(:language) do
236
- build(:alchemy_language, language_code: 'jp')
237
- end
238
-
239
- it { is_expected.to eq [] }
240
- end
241
- end
242
- end
243
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Alchemy::LegacyPageUrl do
4
- let(:page) { build_stubbed(:alchemy_page) }
5
-
6
- let(:page_url_with_parameters) do
7
- Alchemy::LegacyPageUrl.new(urlname: 'index.php?id=2', page: page)
8
- end
9
-
10
- let(:valid_page_url) do
11
- Alchemy::LegacyPageUrl.new(urlname: 'my/0-work+is-nice_stuff', page: page)
12
- end
13
-
14
- it 'is only valid with correct urlname format' do
15
- expect(valid_page_url).to be_valid
16
- end
17
-
18
- it 'is also valid with get parameters in urlname' do
19
- expect(page_url_with_parameters).to be_valid
20
- end
21
- end
@@ -1,55 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Alchemy
4
- Config.get(:mailer)['fields'].push('email_of_my_boss')
5
- Config.get(:mailer)['validate_fields'].push('email_of_my_boss')
6
-
7
- describe Message do
8
- let(:message) { Message.new }
9
-
10
- describe '.config' do
11
- it "should return the mailer config" do
12
- expect(Config).to receive(:get).with(:mailer)
13
- Message.config
14
- end
15
- end
16
-
17
- it "has attributes writers and getters for all fields defined in mailer config" do
18
- Config.get(:mailer)['fields'].each do |field|
19
- expect(message).to respond_to(field)
20
- expect(message).to respond_to("#{field}=")
21
- end
22
- end
23
-
24
- context "validation of" do
25
- context "all fields defined in mailer config" do
26
- it "adds errors on that fields" do
27
- Config.get(:mailer)['validate_fields'].each do |field|
28
- expect(message).to_not be_valid
29
- expect(message.errors[field].size).to eq(1)
30
- end
31
- end
32
- end
33
-
34
- context 'field containing email in its name' do
35
- context "when field has a value" do
36
- before { message.email_of_my_boss = 'wrong email format' }
37
-
38
- it "adds error notice (is invalid) to the field" do
39
- expect(message).to_not be_valid
40
- expect(message.errors[:email_of_my_boss]).to include("is invalid")
41
- end
42
- end
43
-
44
- context "when field is blank" do
45
- before { message.email_of_my_boss = '' }
46
-
47
- it "adds error notice (can't be blank) to the field" do
48
- expect(message).to_not be_valid
49
- expect(message.errors[:email_of_my_boss]).to include("can't be blank")
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,2108 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'spec_helper'
4
-
5
- module Alchemy
6
- describe Page do
7
- let(:rootpage) { Page.root }
8
- let(:language) { Language.default }
9
- let(:klingon) { create(:alchemy_language, :klingon) }
10
- let(:language_root) { create(:alchemy_page, :language_root) }
11
- let(:page) { mock_model(Page, page_layout: 'foo') }
12
- let(:public_page) { create(:alchemy_page, :public) }
13
- let(:news_page) { create(:alchemy_page, :public, page_layout: 'news', do_not_autogenerate: false) }
14
-
15
- # Validations
16
-
17
- context 'validations' do
18
- context "Creating a normal content page" do
19
- let(:contentpage) { build(:alchemy_page) }
20
- let(:with_same_urlname) { create(:alchemy_page, urlname: "existing_twice") }
21
- let(:global_with_same_urlname) { create(:alchemy_page, urlname: "existing_twice", layoutpage: true) }
22
-
23
- context "when its urlname exists as global page" do
24
- before { global_with_same_urlname }
25
-
26
- it "it should be possible to save." do
27
- contentpage.urlname = "existing_twice"
28
- expect(contentpage).to be_valid
29
- end
30
- end
31
-
32
- it "should validate the page_layout" do
33
- contentpage.page_layout = nil
34
- expect(contentpage).not_to be_valid
35
- contentpage.valid?
36
- expect(contentpage.errors[:page_layout].size).to eq(1)
37
- end
38
-
39
- it "should validate the parent_id" do
40
- contentpage.parent_id = nil
41
- expect(contentpage).not_to be_valid
42
- contentpage.valid?
43
- expect(contentpage.errors[:parent_id].size).to eq(1)
44
- end
45
-
46
- context 'with page having same urlname' do
47
- before { with_same_urlname }
48
-
49
- it "should not be valid" do
50
- contentpage.urlname = 'existing_twice'
51
- expect(contentpage).not_to be_valid
52
- end
53
- end
54
-
55
- context "with url_nesting set to true" do
56
- let(:other_parent) { create(:alchemy_page, parent_id: Page.root.id, visible: true) }
57
-
58
- before do
59
- allow(Config).to receive(:get).and_return(true)
60
- with_same_urlname
61
- end
62
-
63
- it "should only validate urlname dependent of parent" do
64
- contentpage.urlname = 'existing_twice'
65
- contentpage.parent_id = other_parent.id
66
- expect(contentpage).to be_valid
67
- end
68
-
69
- it "should validate urlname dependent of parent" do
70
- contentpage.urlname = 'existing_twice'
71
- expect(contentpage).not_to be_valid
72
- end
73
- end
74
- end
75
-
76
- context "creating the rootpage without parent_id and page_layout" do
77
- let(:rootpage) { build(:alchemy_page, parent_id: nil, page_layout: nil, name: 'Rootpage') }
78
-
79
- before do
80
- Page.delete_all
81
- end
82
-
83
- it "should be valid" do
84
- expect(rootpage).to be_valid
85
- end
86
- end
87
-
88
- context "saving a systempage" do
89
- let(:systempage) { build(:alchemy_page, :system) }
90
-
91
- it "should not validate the page_layout" do
92
- expect(systempage).to be_valid
93
- end
94
- end
95
-
96
- context 'saving an external page' do
97
- let(:external_page) { build(:alchemy_page, page_layout: 'external') }
98
-
99
- it "does not pass with invalid url given" do
100
- external_page.urlname = 'not, a valid page url'
101
- expect(external_page).to_not be_valid
102
- end
103
-
104
- it "only be valid with correct url given" do
105
- external_page.urlname = 'www.google.com&utf_src=alchemy;page_id=%20'
106
- expect(external_page).to be_valid
107
- end
108
-
109
- context 'on create' do
110
- it "is valid without urlname given" do
111
- external_page.urlname = ''
112
- expect(external_page).to be_valid
113
- end
114
- end
115
-
116
- context 'on update' do
117
- before { external_page.save! }
118
-
119
- it "is not valid without urlname given" do
120
- external_page.urlname = ''
121
- expect(external_page).to_not be_valid
122
- end
123
- end
124
- end
125
- end
126
-
127
- # Callbacks
128
-
129
- context 'callbacks' do
130
- let(:page) do
131
- create(:alchemy_page, name: 'My Testpage', language: language, parent_id: language_root.id)
132
- end
133
-
134
- context 'before_save' do
135
- it "should not set the title automatically if the name changed but title is not blank" do
136
- page.name = "My Renaming Test"
137
- page.save; page.reload
138
- expect(page.title).to eq("My Testpage")
139
- end
140
-
141
- it "should not automatically set the title if it changed its value" do
142
- page.title = "I like SEO"
143
- page.save; page.reload
144
- expect(page.title).to eq("I like SEO")
145
- end
146
- end
147
-
148
- context 'after_update' do
149
- context "urlname has changed" do
150
- it "should store legacy url if page is not redirect to external page" do
151
- page.urlname = 'new-urlname'
152
- page.save!
153
- expect(page.legacy_urls).not_to be_empty
154
- expect(page.legacy_urls.first.urlname).to eq('my-testpage')
155
- end
156
-
157
- it "should not store legacy url if page is redirect to external page" do
158
- page.urlname = 'new-urlname'
159
- page.page_layout = "external"
160
- page.save!
161
- expect(page.legacy_urls).to be_empty
162
- end
163
-
164
- it "should not store legacy url twice for same urlname" do
165
- page.urlname = 'new-urlname'
166
- page.save!
167
- page.urlname = 'my-testpage'
168
- page.save!
169
- page.urlname = 'another-urlname'
170
- page.save!
171
- expect(page.legacy_urls.select { |u| u.urlname == 'my-testpage' }.size).to eq(1)
172
- end
173
- end
174
-
175
- context "urlname has not changed" do
176
- it "should not store a legacy url" do
177
- page.urlname = 'my-testpage'
178
- page.save!
179
- expect(page.legacy_urls).to be_empty
180
- end
181
- end
182
-
183
- context "public has changed" do
184
- it "should update published_at" do
185
- expect {
186
- page.update_attributes!(public: true)
187
- }.to change { page.read_attribute(:published_at) }
188
- end
189
-
190
- it "should not update already set published_at" do
191
- page.update_attributes!(published_at: 2.weeks.ago)
192
- expect {
193
- page.update_attributes!(public: true)
194
- }.to_not change { page.read_attribute(:published_at) }
195
- end
196
- end
197
-
198
- context "public has not changed" do
199
- it "should not update published_at" do
200
- page.update_attributes!(name: 'New Name')
201
- expect(page.read_attribute(:published_at)).to be_nil
202
- end
203
- end
204
- end
205
-
206
- context 'after_move' do
207
- let(:parent_1) { create(:alchemy_page, name: 'Parent 1', visible: true) }
208
- let(:parent_2) { create(:alchemy_page, name: 'Parent 2', visible: true) }
209
- let(:page) { create(:alchemy_page, parent_id: parent_1.id, name: 'Page', visible: true) }
210
-
211
- it "updates the urlname" do
212
- expect(page.urlname).to eq('parent-1/page')
213
- page.move_to_child_of parent_2
214
- expect(page.urlname).to eq('parent-2/page')
215
- end
216
-
217
- context 'of an external page' do
218
- let(:external) { create(:alchemy_page, parent_id: parent_1.id, name: 'external', page_layout: 'external', urlname: 'http://google.com') }
219
-
220
- it "the urlname does not get updated" do
221
- external.move_to_child_of parent_2
222
- expect(external.urlname).to eq('http://google.com')
223
- end
224
- end
225
- end
226
-
227
- context "Saving a normal page" do
228
- let(:page) do
229
- build(:alchemy_page, language_code: nil, language: klingon, do_not_autogenerate: false)
230
- end
231
-
232
- it "sets the language code" do
233
- page.save!
234
- expect(page.language_code).to eq("kl")
235
- end
236
-
237
- it "autogenerates the elements" do
238
- page.save!
239
- expect(page.elements).not_to be_empty
240
- end
241
-
242
- context 'with elements already on the page' do
243
- before do
244
- page.elements << create(:alchemy_element, name: 'header')
245
- end
246
-
247
- it "does not autogenerate" do
248
- page.save!
249
- expect(page.elements.select { |e| e.name == 'header' }.length).to eq(1)
250
- end
251
- end
252
-
253
- context "with cells" do
254
- before do
255
- allow(page).to receive(:definition) do
256
- {
257
- 'cells' => %w(header main),
258
- 'autogenerate' => %w(article)
259
- }
260
- end
261
- end
262
-
263
- context 'with elements defined in cells' do
264
- before do
265
- allow(page).to receive(:cell_definitions) do
266
- [{'name' => 'header', 'elements' => %w(article)}]
267
- end
268
- end
269
-
270
- it "has the generated elements in their cells" do
271
- page.save!
272
- expect(page.cells.where(name: 'header').first.elements).not_to be_empty
273
- end
274
- end
275
-
276
- context "and no elements in cell definitions" do
277
- before do
278
- allow(page).to receive(:cell_definitions) do
279
- [{'name' => 'header', 'elements' => []}]
280
- end
281
- end
282
-
283
- it "should have the elements in the nil cell" do
284
- page.save!
285
- expect(page.cells.collect(&:elements).flatten).to be_empty
286
- end
287
- end
288
- end
289
-
290
- context "with children getting restricted set to true" do
291
- before do
292
- page.save
293
- @child1 = create(:alchemy_page, name: 'Child 1', parent_id: page.id)
294
- page.reload
295
- page.restricted = true
296
- page.save
297
- end
298
-
299
- it "restricts all its children" do
300
- @child1.reload
301
- expect(@child1.restricted?).to be_truthy
302
- end
303
- end
304
-
305
- context "with restricted parent gets created" do
306
- before do
307
- page.save
308
- page.parent.update!(restricted: true)
309
- @new_page = create(:alchemy_page, name: 'New Page', parent_id: page.id)
310
- end
311
-
312
- it "is also be restricted" do
313
- expect(@new_page.restricted?).to be_truthy
314
- end
315
- end
316
-
317
- context "with do_not_autogenerate set to true" do
318
- before do
319
- page.do_not_autogenerate = true
320
- end
321
-
322
- it "should not autogenerate the elements" do
323
- page.save
324
- expect(page.elements).to be_empty
325
- end
326
- end
327
- end
328
-
329
- context "Creating a systempage" do
330
- let!(:page) { create(:alchemy_page, :system) }
331
-
332
- it "does not get the language code from language" do
333
- expect(page.language_code).to be_nil
334
- end
335
-
336
- it "does not autogenerate the elements" do
337
- expect(page.elements).to be_empty
338
- end
339
- end
340
-
341
- context "after changing the page layout" do
342
- let(:news_element) { news_page.elements.find_by(name: 'news') }
343
-
344
- it "all elements not allowed on this page should be trashed" do
345
- expect(news_page.trashed_elements).to be_empty
346
- news_page.update_attributes(page_layout: 'standard')
347
- trashed = news_page.trashed_elements.pluck(:name)
348
- expect(trashed).to eq(['news'])
349
- expect(trashed).to_not include('article', 'header')
350
- end
351
-
352
- it "should autogenerate elements" do
353
- news_page.update_attributes(page_layout: 'contact')
354
- expect(news_page.elements.pluck(:name)).to include('contactform')
355
- end
356
- end
357
- end
358
-
359
- # ClassMethods (a-z)
360
-
361
- describe '.all_from_clipboard_for_select' do
362
- context "with clipboard holding pages having non unique page layout" do
363
- it "should return the pages" do
364
- page_1 = create(:alchemy_page, language: language)
365
- page_2 = create(:alchemy_page, language: language, name: 'Another page')
366
- clipboard = [
367
- {'id' => page_1.id.to_s, 'action' => 'copy'},
368
- {'id' => page_2.id.to_s, 'action' => 'copy'}
369
- ]
370
- expect(Page.all_from_clipboard_for_select(clipboard, language.id)).to include(page_1, page_2)
371
- end
372
- end
373
-
374
- context "with clipboard holding a page having unique page layout" do
375
- it "should not return any pages" do
376
- page_1 = create(:alchemy_page, language: language, page_layout: 'contact')
377
- clipboard = [
378
- {'id' => page_1.id.to_s, 'action' => 'copy'}
379
- ]
380
- expect(Page.all_from_clipboard_for_select(clipboard, language.id)).to eq([])
381
- end
382
- end
383
-
384
- context "with clipboard holding two pages. One having a unique page layout." do
385
- it "should return one page" do
386
- page_1 = create(:alchemy_page, language: language, page_layout: 'standard')
387
- page_2 = create(:alchemy_page, name: 'Another page', language: language, page_layout: 'contact')
388
- clipboard = [
389
- {'id' => page_1.id.to_s, 'action' => 'copy'},
390
- {'id' => page_2.id.to_s, 'action' => 'copy'}
391
- ]
392
- expect(Page.all_from_clipboard_for_select(clipboard, language.id)).to eq([page_1])
393
- end
394
- end
395
- end
396
-
397
- describe '.locked' do
398
- it "should return 1 page that is blocked by a user at the moment" do
399
- create(:alchemy_page, :public, locked: true, name: 'First Public Child', parent_id: language_root.id, language: language)
400
- expect(Page.locked.size).to eq(1)
401
- end
402
- end
403
-
404
- describe '.locked_by' do
405
- let(:user) { double(:user, id: 1, class: DummyUser) }
406
-
407
- before do
408
- create(:alchemy_page, :public, locked: true, locked_by: 53) # This page must not be part of the collection
409
- allow(user.class)
410
- .to receive(:primary_key)
411
- .and_return('id')
412
- end
413
-
414
- it "should return the correct page collection blocked by a certain user" do
415
- page = create(:alchemy_page, :public, locked: true, locked_by: 1)
416
- expect(Page.locked_by(user).pluck(:id)).to eq([page.id])
417
- end
418
-
419
- context 'with user class having a different primary key' do
420
- let(:user) { double(:user, user_id: 123, class: DummyUser) }
421
-
422
- before do
423
- allow(user.class)
424
- .to receive(:primary_key)
425
- .and_return('user_id')
426
- end
427
-
428
- it "should return the correct page collection blocked by a certain user" do
429
- page = create(:alchemy_page, :public, locked: true, locked_by: 123)
430
- expect(Page.locked_by(user).pluck(:id)).to eq([page.id])
431
- end
432
- end
433
- end
434
-
435
- describe '.ancestors_for' do
436
- let(:lang_root) { Page.language_root_for(Language.default.id) }
437
- let(:parent) { create(:alchemy_page, :public) }
438
- let(:page) { create(:alchemy_page, :public, parent_id: parent.id) }
439
-
440
- it "returns an array of all parents including self" do
441
- expect(Page.ancestors_for(page)).to eq([lang_root, parent, page])
442
- end
443
-
444
- it "does not include the root page" do
445
- expect(Page.ancestors_for(page)).not_to include(Page.root)
446
- end
447
-
448
- context "with current page nil" do
449
- it "should return an empty array" do
450
- expect(Page.ancestors_for(nil)).to eq([])
451
- end
452
- end
453
- end
454
-
455
- describe '.contentpages' do
456
- let!(:layoutroot) do
457
- Page.find_or_create_layout_root_for(klingon.id)
458
- end
459
-
460
- let!(:layoutpage) do
461
- create :alchemy_page, :public, {
462
- name: 'layoutpage',
463
- layoutpage: true,
464
- parent_id: layoutroot.id,
465
- language: klingon
466
- }
467
- end
468
-
469
- let!(:klingon_lang_root) do
470
- create :alchemy_page, :language_root, {
471
- name: 'klingon_lang_root',
472
- layoutpage: nil,
473
- language: klingon
474
- }
475
- end
476
-
477
- let!(:contentpage) do
478
- create :alchemy_page, :public, {
479
- name: 'contentpage',
480
- parent_id: language_root.id,
481
- language: language
482
- }
483
- end
484
-
485
- it "returns a collection of contentpages" do
486
- expect(Page.contentpages.to_a).to include(
487
- language_root,
488
- klingon_lang_root,
489
- contentpage
490
- )
491
- end
492
-
493
- it "does not contain pages with attribute :layoutpage set to true" do
494
- expect(Page.contentpages.to_a.select { |p| p.layoutpage == true }).to be_empty
495
- end
496
-
497
- it "contains pages with attribute :layoutpage set to nil" do
498
- expect(Page.contentpages.to_a.select do |page|
499
- page.layoutpage.nil?
500
- end).to include(klingon_lang_root)
501
- end
502
- end
503
-
504
- describe '.copy' do
505
- let(:page) { create(:alchemy_page, name: 'Source') }
506
- subject { Page.copy(page) }
507
-
508
- it "the copy should have added (copy) to name" do
509
- expect(subject.name).to eq("#{page.name} (Copy)")
510
- end
511
-
512
- context "page with tags" do
513
- before { page.tag_list = 'red, yellow'; page.save }
514
-
515
- it "the copy should have source tag_list" do
516
- # The order of tags varies between postgresql and sqlite/mysql
517
- # This is related to acts-as-taggable-on v.2.4.1
518
- # To fix the spec we sort the tags until the issue is solved (https://github.com/mbleigh/acts-as-taggable-on/issues/363)
519
- expect(subject.tag_list).not_to be_empty
520
- expect(subject.tag_list.sort).to eq(page.tag_list.sort)
521
- end
522
- end
523
-
524
- context "page with elements" do
525
- before { page.elements << create(:alchemy_element) }
526
-
527
- it "the copy should have source elements" do
528
- expect(subject.elements).not_to be_empty
529
- expect(subject.elements.count).to eq(page.elements.count)
530
- end
531
- end
532
-
533
- context "page with trashed elements" do
534
- before do
535
- page.elements << create(:alchemy_element)
536
- page.elements.first.trash!
537
- end
538
-
539
- it "the copy should not hold a copy of the trashed elements" do
540
- expect(subject.elements).to be_empty
541
- end
542
- end
543
-
544
- context "page with cells" do
545
- before { page.cells << create(:alchemy_cell) }
546
-
547
- it "the copy should have source cells" do
548
- expect(subject.cells).not_to be_empty
549
- expect(subject.cells.count).to eq(page.cells.length) # It must be length, because!
550
- end
551
- end
552
-
553
- context "page with autogenerate elements" do
554
- before do
555
- page = create(:alchemy_page)
556
- allow(page).to receive(:definition).and_return({'name' => 'standard', 'elements' => ['headline'], 'autogenerate' => ['headline']})
557
- end
558
-
559
- it "the copy should not autogenerate elements" do
560
- expect(subject.elements).to be_empty
561
- end
562
- end
563
-
564
- context "with different page name given" do
565
- subject { Page.copy(page, {name: 'Different name'}) }
566
-
567
- it "should take this name" do
568
- expect(subject.name).to eq('Different name')
569
- end
570
- end
571
- end
572
-
573
- describe '.create' do
574
- context "before/after filter" do
575
- it "should automatically set the title from its name" do
576
- page = create(:alchemy_page, name: 'My Testpage', language: language, parent_id: language_root.id)
577
- expect(page.title).to eq('My Testpage')
578
- end
579
-
580
- it "should get a webfriendly urlname" do
581
- page = create(:alchemy_page, name: 'klingon$&stößel ', language: language, parent_id: language_root.id)
582
- expect(page.urlname).to eq('klingon-stoessel')
583
- end
584
-
585
- context "with no name set" do
586
- it "should not set a urlname" do
587
- page = Page.create(name: '', language: language, parent_id: language_root.id)
588
- expect(page.urlname).to be_blank
589
- end
590
- end
591
-
592
- it "should generate a three letter urlname from two letter name" do
593
- page = create(:alchemy_page, name: 'Au', language: language, parent_id: language_root.id)
594
- expect(page.urlname).to eq('-au')
595
- end
596
-
597
- it "should generate a three letter urlname from two letter name with umlaut" do
598
- page = create(:alchemy_page, name: 'Aü', language: language, parent_id: language_root.id)
599
- expect(page.urlname).to eq('aue')
600
- end
601
-
602
- it "should generate a three letter urlname from one letter name" do
603
- page = create(:alchemy_page, name: 'A', language: language, parent_id: language_root.id)
604
- expect(page.urlname).to eq('--a')
605
- end
606
-
607
- it "should add a user stamper" do
608
- page = create(:alchemy_page, name: 'A', language: language, parent_id: language_root.id)
609
- expect(page.class.stamper_class.to_s).to eq('DummyUser')
610
- end
611
-
612
- context "with language given" do
613
- it "does not set the language from parent" do
614
- expect_any_instance_of(Page).not_to receive(:set_language_from_parent_or_default)
615
- Page.create!(name: 'A', parent_id: language_root.id, page_layout: 'standard', language: language)
616
- end
617
- end
618
-
619
- context "with no language given" do
620
- it "sets the language from parent" do
621
- expect_any_instance_of(Page).to receive(:set_language_from_parent_or_default)
622
- Page.create!(name: 'A', parent_id: language_root.id, page_layout: 'standard')
623
- end
624
- end
625
- end
626
- end
627
-
628
- describe '.find_or_create_layout_root_for' do
629
- subject { Page.find_or_create_layout_root_for(language_id) }
630
-
631
- let(:language) { mock_model('Language', name: 'English') }
632
- let(:language_id) { language.id }
633
-
634
- before { allow(Language).to receive(:find).and_return(language) }
635
-
636
- context 'if no layout root page for given language id could be found' do
637
- before do
638
- expect(Page).to receive(:create!).and_return(page)
639
- end
640
-
641
- it "creates one" do
642
- is_expected.to eq(page)
643
- end
644
- end
645
-
646
- context 'if layout root page for given language id could be found' do
647
- let(:page) { mock_model('Page') }
648
-
649
- before do
650
- expect(Page).to receive(:layout_root_for).and_return(page)
651
- end
652
-
653
- it "returns layout root page" do
654
- is_expected.to eq(page)
655
- end
656
- end
657
- end
658
-
659
- describe '.language_roots' do
660
- it "should return 1 language_root" do
661
- create(:alchemy_page, :public, name: 'First Public Child', parent_id: language_root.id, language: language)
662
- expect(Page.language_roots.size).to eq(1)
663
- end
664
- end
665
-
666
- describe '.layoutpages' do
667
- it "should return 1 layoutpage" do
668
- create(:alchemy_page, :public, layoutpage: true, name: 'Layoutpage', parent_id: rootpage.id, language: language)
669
- expect(Page.layoutpages.size).to eq(1)
670
- end
671
- end
672
-
673
- describe '.not_locked' do
674
- it "should return pages that are not blocked by a user at the moment" do
675
- create(:alchemy_page, :public, locked: true, name: 'First Public Child', parent_id: language_root.id, language: language)
676
- create(:alchemy_page, :public, name: 'Second Public Child', parent_id: language_root.id, language: language)
677
- expect(Page.not_locked.size).to eq(3)
678
- end
679
- end
680
-
681
- describe '.not_restricted' do
682
- it "should return 2 accessible pages" do
683
- create(:alchemy_page, :public, name: 'First Public Child', restricted: true, parent_id: language_root.id, language: language)
684
- expect(Page.not_restricted.size).to eq(2)
685
- end
686
- end
687
-
688
- describe '.public' do
689
- it "should return pages that are public" do
690
- create(:alchemy_page, :public, name: 'First Public Child', parent_id: language_root.id, language: language)
691
- create(:alchemy_page, :public, name: 'Second Public Child', parent_id: language_root.id, language: language)
692
- expect(Page.published.size).to eq(3)
693
- end
694
- end
695
-
696
- describe '.public_language_roots' do
697
- it "should return pages that public language roots" do
698
- create(:alchemy_page, :public, name: 'First Public Child', parent_id: language_root.id, language: language)
699
- expect(Page.public_language_roots.size).to eq(1)
700
- end
701
- end
702
-
703
- describe '.restricted' do
704
- it "should return 1 restricted page" do
705
- create(:alchemy_page, :public, name: 'First Public Child', restricted: true, parent_id: language_root.id, language: language)
706
- expect(Page.restricted.size).to eq(1)
707
- end
708
- end
709
-
710
- describe '.rootpage' do
711
- it "should contain one rootpage" do
712
- expect(Page.rootpage).to be_instance_of(Page)
713
- end
714
- end
715
-
716
- describe '.visible' do
717
- it "should return 1 visible page" do
718
- create(:alchemy_page, :public, name: 'First Public Child', visible: true, parent_id: language_root.id, language: language)
719
- expect(Page.visible.size).to eq(1)
720
- end
721
- end
722
-
723
- # InstanceMethods (a-z)
724
-
725
- describe '#available_element_definitions' do
726
- let(:page) { build_stubbed(:alchemy_page, :public) }
727
-
728
- it "returns all element definitions of available elements" do
729
- expect(page.available_element_definitions).to be_an(Array)
730
- expect(page.available_element_definitions.collect { |e| e['name'] }).to include('header')
731
- end
732
-
733
- context "with unique elements already on page" do
734
- let(:element) { build_stubbed(:alchemy_element, :unique) }
735
-
736
- before do
737
- allow(page)
738
- .to receive(:elements)
739
- .and_return double(not_trashed: double(pluck: [element.name]))
740
- end
741
-
742
- it "does not return unique element definitions" do
743
- expect(page.available_element_definitions.collect { |e| e['name'] }).to include('article')
744
- expect(page.available_element_definitions.collect { |e| e['name'] }).not_to include('header')
745
- end
746
- end
747
-
748
- context 'limited amount' do
749
- let(:page) { build_stubbed(:alchemy_page, page_layout: 'columns') }
750
- let(:unique_element) do
751
- build_stubbed(:alchemy_element, :unique, name: 'unique_headline')
752
- end
753
- let(:element_1) { build_stubbed(:alchemy_element, name: 'column_headline') }
754
- let(:element_2) { build_stubbed(:alchemy_element, name: 'column_headline') }
755
- let(:element_3) { build_stubbed(:alchemy_element, name: 'column_headline') }
756
-
757
- before {
758
- allow(Element).to receive(:definitions).and_return([
759
- {
760
- 'name' => 'column_headline',
761
- 'amount' => 3,
762
- 'contents' => [{'name' => 'headline', 'type' => 'EssenceText'}]
763
- },
764
- {
765
- 'name' => 'unique_headline',
766
- 'unique' => true,
767
- 'amount' => 3,
768
- 'contents' => [{'name' => 'headline', 'type' => 'EssenceText'}]
769
- }
770
- ])
771
- allow(PageLayout).to receive(:get).and_return({
772
- 'name' => 'columns',
773
- 'elements' => ['column_headline', 'unique_headline'],
774
- 'autogenerate' => ['unique_headline', 'column_headline', 'column_headline', 'column_headline']
775
- })
776
- allow(page).to receive(:elements).and_return double(
777
- not_trashed: double(pluck: [
778
- unique_element.name,
779
- element_1.name,
780
- element_2.name,
781
- element_3.name
782
- ])
783
- )
784
- }
785
-
786
- it "should be readable" do
787
- element = page.element_definitions_by_name('column_headline').first
788
- expect(element['amount']).to be 3
789
- end
790
-
791
- it "should limit elements" do
792
- expect(page.available_element_definitions.collect { |e| e['name'] }).not_to include('column_headline')
793
- end
794
-
795
- it "should be ignored if unique" do
796
- expect(page.available_element_definitions.collect { |e| e['name'] }).not_to include('unique_headline')
797
- end
798
- end
799
- end
800
-
801
- describe '#available_element_names' do
802
- let(:page) { build_stubbed(:alchemy_page) }
803
-
804
- it "returns all names of elements that could be placed on current page" do
805
- page.available_element_names == %w(header article)
806
- end
807
- end
808
-
809
- describe '#cache_key' do
810
- let(:page) do
811
- stub_model(Page, updated_at: Time.current, published_at: Time.current - 1.week)
812
- end
813
-
814
- subject { page.cache_key }
815
-
816
- before do
817
- expect(Page).to receive(:current_preview).and_return(preview)
818
- end
819
-
820
- context "when current page rendered in preview mode" do
821
- let(:preview) { page }
822
-
823
- it { is_expected.to eq("alchemy/pages/#{page.id}-#{page.updated_at}") }
824
- end
825
-
826
- context "when current page not in preview mode" do
827
- let(:preview) { nil }
828
-
829
- it { is_expected.to eq("alchemy/pages/#{page.id}-#{page.published_at}") }
830
- end
831
- end
832
-
833
- describe '#cell_definitions' do
834
- before do
835
- @page = build(:alchemy_page, page_layout: 'foo')
836
- allow(@page).to receive(:definition).and_return({'name' => "foo", 'cells' => ["foo_cell"]})
837
- @cell_definitions = [{'name' => "foo_cell", 'elements' => ["1", "2"]}]
838
- allow(Cell).to receive(:definitions).and_return(@cell_definitions)
839
- end
840
-
841
- it "should return all cell definitions for its page_layout" do
842
- expect(@page.cell_definitions).to eq(@cell_definitions)
843
- end
844
-
845
- it "should return empty array if no cells defined in page layout" do
846
- allow(@page).to receive(:definition).and_return({'name' => "foo"})
847
- expect(@page.cell_definitions).to eq([])
848
- end
849
- end
850
-
851
- describe '#destroy' do
852
- context "with trashed but still assigned elements" do
853
- before { news_page.elements.map(&:trash!) }
854
-
855
- it "should not delete the trashed elements" do
856
- news_page.destroy
857
- expect(Element.trashed).not_to be_empty
858
- end
859
- end
860
- end
861
-
862
- describe "#elements" do
863
- let(:page) { create(:alchemy_page) }
864
- let!(:element_1) { create(:alchemy_element, page: page) }
865
- let!(:element_2) { create(:alchemy_element, page: page) }
866
- let!(:element_3) { create(:alchemy_element, page: page) }
867
-
868
- before do
869
- element_3.move_to_top
870
- end
871
-
872
- it 'returns a ordered active record collection of elements on that page' do
873
- expect(page.elements).to eq([element_3, element_1, element_2])
874
- end
875
-
876
- context 'with nestable elements' do
877
- let(:nestable_element) { create(:alchemy_element, :with_nestable_elements) }
878
-
879
- before do
880
- nestable_element.nested_elements << create(:alchemy_element, name: 'slide')
881
- page.elements << nestable_element
882
- end
883
-
884
- it 'does not contain nested elements of an element' do
885
- expect(nestable_element.nested_elements).to_not be_empty
886
- expect(page.elements).to_not include(nestable_element.nested_elements.first)
887
- end
888
- end
889
- end
890
-
891
- describe "#descendent_elements" do
892
- let!(:page) do
893
- create(:alchemy_page)
894
- end
895
-
896
- let!(:element_1) do
897
- create(:alchemy_element, page_id: page.id)
898
- end
899
-
900
- let!(:element_2) do
901
- create(:alchemy_element, :with_nestable_elements, page_id: page.id, parent_element_id: element_1.id)
902
- end
903
-
904
- let!(:element_3) do
905
- create(:alchemy_element, page_id: page.id)
906
- end
907
-
908
- it 'returns an active record collection of all elements including nested elements on that page' do
909
- expect(page.descendent_elements.count).to eq(3)
910
- end
911
- end
912
-
913
- describe "#descendent_contents" do
914
- let!(:page) do
915
- create(:alchemy_page)
916
- end
917
-
918
- let!(:element_1) do
919
- create(:alchemy_element, :with_nestable_elements, :with_contents, name: 'slider', page_id: page.id)
920
- end
921
-
922
- let!(:element_2) do
923
- create :alchemy_element,
924
- :with_contents, {
925
- name: 'slide',
926
- page_id: page.id,
927
- parent_element_id: element_1.id
928
- }
929
- end
930
-
931
- let!(:element_3) do
932
- create(:alchemy_element, :with_contents, name: 'slide', page_id: page.id)
933
- end
934
-
935
- it 'returns an active record collection of all content including nested elements on that page' do
936
- expect(page.descendent_contents.count).to eq(2)
937
- end
938
- end
939
-
940
- describe '#element_definitions' do
941
- let(:page) { build_stubbed(:alchemy_page) }
942
- subject { page.element_definitions }
943
- before { expect(Element).to receive(:definitions).and_return([{'name' => 'article'}, {'name' => 'header'}]) }
944
-
945
- it "returns all element definitions that could be placed on current page" do
946
- is_expected.to include({'name' => 'article'})
947
- is_expected.to include({'name' => 'header'})
948
- end
949
- end
950
-
951
- describe '#element_definitions_by_name' do
952
- let(:page) { build_stubbed(:alchemy_page, :public) }
953
-
954
- context "with no name given" do
955
- it "returns empty array" do
956
- expect(page.element_definitions_by_name(nil)).to eq([])
957
- end
958
- end
959
-
960
- context "with 'all' passed as name" do
961
- it "returns all element definitions" do
962
- expect(Element).to receive(:definitions)
963
- page.element_definitions_by_name('all')
964
- end
965
- end
966
-
967
- context "with :all passed as name" do
968
- it "returns all element definitions" do
969
- expect(Element).to receive(:definitions)
970
- page.element_definitions_by_name(:all)
971
- end
972
- end
973
- end
974
-
975
- describe '#element_definition_names' do
976
- let(:page) { build_stubbed(:alchemy_page, :public) }
977
-
978
- subject { page.element_definition_names }
979
-
980
- before do
981
- allow(page).to receive(:definition) { page_definition }
982
- allow(page).to receive(:cell_definitions) { cell_definitions }
983
- end
984
-
985
- context "with elements only assigned in page definition" do
986
- let(:page_definition) do
987
- {'elements' => %w(article)}
988
- end
989
-
990
- let(:cell_definitions) { [] }
991
-
992
- it "returns an array of the page's element names" do
993
- is_expected.to eq %w(article)
994
- end
995
- end
996
-
997
- context "with elements assigned only in cell definition" do
998
- before do
999
- allow(page).to receive(:definition).and_return({})
1000
- allow(page).to receive(:cell_definitions) do
1001
- [{'elements' => ['search']}]
1002
- end
1003
- end
1004
-
1005
- it "returns an array of the cell's element names" do
1006
- is_expected.to eq(['search'])
1007
- end
1008
- end
1009
-
1010
- context "with elements assigned in page and cell definition" do
1011
- let(:page_definition) do
1012
- {'elements' => %w(header article)}
1013
- end
1014
-
1015
- let(:cell_definitions) do
1016
- [{'elements' => %w(search)}]
1017
- end
1018
-
1019
- it "returns the combined element names" do
1020
- is_expected.to eq %w(header article search)
1021
- end
1022
-
1023
- context "and cell definition contains same element name as page definition" do
1024
- let(:page_definition) do
1025
- {'elements' => %w(header article)}
1026
- end
1027
-
1028
- let(:cell_definitions) do
1029
- [{'elements' => %w(header search)}]
1030
- end
1031
-
1032
- it "includes no duplicates" do
1033
- is_expected.to eq %w(header article search)
1034
- end
1035
- end
1036
- end
1037
-
1038
- context "without elements assigned in page definition or cell definition" do
1039
- let(:page_definition) { {} }
1040
- let(:cell_definitions) { [] }
1041
-
1042
- it { is_expected.to eq([]) }
1043
- end
1044
- end
1045
-
1046
- describe '#elements_grouped_by_cells' do
1047
- let(:page) { create(:alchemy_page, :public, do_not_autogenerate: false) }
1048
-
1049
- before do
1050
- allow(PageLayout).to receive(:get).and_return({
1051
- 'name' => 'standard',
1052
- 'cells' => ['header'],
1053
- 'elements' => ['header', 'text'],
1054
- 'autogenerate' => ['header', 'text']
1055
- })
1056
- allow(Cell).to receive(:definitions).and_return([{
1057
- 'name' => "header",
1058
- 'elements' => ["header"]
1059
- }])
1060
- end
1061
-
1062
- it "should return elements grouped by cell" do
1063
- elements = page.elements_grouped_by_cells
1064
- expect(elements.keys.first).to be_instance_of(Cell)
1065
- expect(elements.values.first.first).to be_instance_of(Element)
1066
- end
1067
-
1068
- it "should only include elements beeing in a cell " do
1069
- expect(page.elements_grouped_by_cells.keys).not_to include(nil)
1070
- end
1071
- end
1072
-
1073
- describe '#feed_elements' do
1074
- let(:news_element) { create(:alchemy_element, name: 'news', public: false, page: news_page) }
1075
-
1076
- it "should return all published rss feed elements" do
1077
- expect(news_page.feed_elements).not_to be_empty
1078
- expect(news_page.feed_elements).to eq(Element.where(name: 'news').available.to_a)
1079
- end
1080
-
1081
- it "should not return unpublished rss feed elements" do
1082
- expect(news_page.feed_elements).not_to include(news_element)
1083
- end
1084
-
1085
- it "should not return trashed rss feed elements" do
1086
- news_element.update(public: true)
1087
- news_element.trash!
1088
- expect(news_page.feed_elements).not_to include(news_element)
1089
- end
1090
- end
1091
-
1092
- describe '#find_elements' do
1093
- before do
1094
- create(:alchemy_element, public: false, page: public_page)
1095
- create(:alchemy_element, public: false, page: public_page)
1096
- end
1097
-
1098
- context "with show_non_public argument TRUE" do
1099
- it "should return all elements from empty options" do
1100
- expect(public_page.find_elements({}, true).to_a).to eq(public_page.elements.to_a)
1101
- end
1102
-
1103
- it "should only return the elements passed as options[:only]" do
1104
- expect(public_page.find_elements({only: ['article']}, true).to_a).to eq(public_page.elements.named('article').to_a)
1105
- end
1106
-
1107
- it "should not return the elements passed as options[:except]" do
1108
- expect(public_page.find_elements({except: ['article']}, true).to_a).to eq(public_page.elements - public_page.elements.named('article').to_a)
1109
- end
1110
-
1111
- it "should return elements offsetted" do
1112
- expect(public_page.find_elements({offset: 2}, true).to_a).to eq(public_page.elements.offset(2))
1113
- end
1114
-
1115
- it "should return elements limitted in count" do
1116
- expect(public_page.find_elements({count: 1}, true).to_a).to eq(public_page.elements.limit(1))
1117
- end
1118
- end
1119
-
1120
- context "with options[:from_cell]" do
1121
- let(:element) { build_stubbed(:alchemy_element) }
1122
-
1123
- context "given as String" do
1124
- context 'with elements present' do
1125
- before do
1126
- expect(public_page.cells)
1127
- .to receive(:find_by_name)
1128
- .and_return double(elements: double(offset: double(limit: double(published: [element]))))
1129
- end
1130
-
1131
- it "returns only the elements from given cell" do
1132
- expect(public_page.find_elements(from_cell: 'A Cell').to_a).to eq([element])
1133
- end
1134
- end
1135
-
1136
- context "that can not be found" do
1137
- let(:elements) { [] }
1138
-
1139
- before do
1140
- allow(elements)
1141
- .to receive(:offset)
1142
- .and_return double(limit: double(published: elements))
1143
- end
1144
-
1145
- it "returns empty set" do
1146
- expect(Element).to receive(:none).and_return(elements)
1147
- expect(public_page.find_elements(from_cell: 'Lolo').to_a).to eq([])
1148
- end
1149
-
1150
- it "loggs a warning" do
1151
- expect(Rails.logger).to receive(:debug)
1152
- public_page.find_elements(from_cell: 'Lolo')
1153
- end
1154
- end
1155
- end
1156
-
1157
- context "given as cell object" do
1158
- let(:cell) { build_stubbed(:alchemy_cell, page: public_page) }
1159
-
1160
- it "returns only the elements from given cell" do
1161
- expect(cell)
1162
- .to receive(:elements)
1163
- .and_return double(offset: double(limit: double(published: [element])))
1164
-
1165
- expect(public_page.find_elements(from_cell: cell).to_a).to eq([element])
1166
- end
1167
- end
1168
- end
1169
-
1170
- context "with show_non_public argument FALSE" do
1171
- it "should return all elements from empty arguments" do
1172
- expect(public_page.find_elements.to_a).to eq(public_page.elements.published.to_a)
1173
- end
1174
-
1175
- it "should only return the public elements passed as options[:only]" do
1176
- expect(public_page.find_elements(only: ['article']).to_a).to eq(public_page.elements.published.named('article').to_a)
1177
- end
1178
-
1179
- it "should return all public elements except the ones passed as options[:except]" do
1180
- expect(public_page.find_elements(except: ['article']).to_a).to eq(public_page.elements.published.to_a - public_page.elements.published.named('article').to_a)
1181
- end
1182
-
1183
- it "should return elements offsetted" do
1184
- expect(public_page.find_elements({offset: 2}).to_a).to eq(public_page.elements.published.offset(2))
1185
- end
1186
-
1187
- it "should return elements limitted in count" do
1188
- expect(public_page.find_elements({count: 1}).to_a).to eq(public_page.elements.published.limit(1))
1189
- end
1190
- end
1191
- end
1192
-
1193
- describe '#first_public_child' do
1194
- before do
1195
- create(:alchemy_page, name: "First child", language: language, public: false, parent_id: language_root.id)
1196
- end
1197
-
1198
- it "should return first_public_child" do
1199
- first_public_child = create(:alchemy_page, :public, name: "First public child", language: language, parent_id: language_root.id)
1200
- expect(language_root.first_public_child).to eq(first_public_child)
1201
- end
1202
-
1203
- it "should return nil if no public child exists" do
1204
- expect(language_root.first_public_child).to eq(nil)
1205
- end
1206
- end
1207
-
1208
- context 'folding' do
1209
- let(:user) { mock_model('DummyUser') }
1210
-
1211
- describe '#fold!' do
1212
- context "with folded status set to true" do
1213
- it "should create a folded page for user" do
1214
- public_page.fold!(user.id, true)
1215
- expect(public_page.folded_pages.first.user_id).to eq(user.id)
1216
- end
1217
- end
1218
- end
1219
-
1220
- describe '#folded?' do
1221
- let(:page) { Page.new }
1222
-
1223
- context 'with user is a active record model' do
1224
- before do
1225
- expect(Alchemy.user_class).to receive(:'<').and_return(true)
1226
- end
1227
-
1228
- context 'if page is folded' do
1229
- before do
1230
- expect(page)
1231
- .to receive(:folded_pages)
1232
- .and_return double(where: double(any?: true))
1233
- end
1234
-
1235
- it "should return true" do
1236
- expect(page.folded?(user.id)).to eq(true)
1237
- end
1238
- end
1239
-
1240
- context 'if page is not folded' do
1241
- it "should return false" do
1242
- expect(page.folded?(101_093)).to eq(false)
1243
- end
1244
- end
1245
- end
1246
- end
1247
- end
1248
-
1249
- describe '#get_language_root' do
1250
- before { language_root }
1251
- subject { public_page.get_language_root }
1252
-
1253
- it "returns the language root page" do
1254
- is_expected.to eq language_root
1255
- end
1256
- end
1257
-
1258
- describe '#definition' do
1259
- context 'if the page layout could not be found in the definition file' do
1260
- let(:page) { build_stubbed(:alchemy_page, page_layout: 'notexisting') }
1261
-
1262
- it "it loggs a warning." do
1263
- expect(Alchemy::Logger).to receive(:warn)
1264
- page.definition
1265
- end
1266
-
1267
- it "it returns empty hash." do
1268
- expect(page.definition).to eq({})
1269
- end
1270
- end
1271
-
1272
- context "for a language root page" do
1273
- it "it returns the page layout definition as hash." do
1274
- expect(language_root.definition['name']).to eq('index')
1275
- end
1276
-
1277
- it "it returns an empty hash for root page." do
1278
- expect(rootpage.definition).to eq({})
1279
- end
1280
- end
1281
- end
1282
-
1283
- describe '#lock_to!' do
1284
- let(:page) { create(:alchemy_page) }
1285
- let(:user) { mock_model('DummyUser') }
1286
-
1287
- it "should set locked to true" do
1288
- page.lock_to!(user)
1289
- page.reload
1290
- expect(page.locked).to eq(true)
1291
- end
1292
-
1293
- it "should not update the timestamps " do
1294
- expect { page.lock!(user) }.to_not change(page, :updated_at)
1295
- end
1296
-
1297
- it "should set locked_by to the users id" do
1298
- page.lock_to!(user)
1299
- page.reload
1300
- expect(page.locked_by).to eq(user.id)
1301
- end
1302
- end
1303
-
1304
- describe '#copy_and_paste' do
1305
- let(:source) { build_stubbed(:alchemy_page) }
1306
- let(:new_parent) { build_stubbed(:alchemy_page) }
1307
- let(:page_name) { "Pagename (pasted)" }
1308
- let(:copied_page) { mock_model('Page') }
1309
-
1310
- subject { Page.copy_and_paste(source, new_parent, page_name) }
1311
-
1312
- it "should copy the source page with the given name to the new parent" do
1313
- expect(Page).to receive(:copy).with(source, {
1314
- parent_id: new_parent.id,
1315
- language: new_parent.language,
1316
- name: page_name,
1317
- title: page_name
1318
- })
1319
- subject
1320
- end
1321
-
1322
- it "should return the copied page" do
1323
- allow(Page).to receive(:copy).and_return(copied_page)
1324
- expect(subject).to be_a(copied_page.class)
1325
- end
1326
-
1327
- context "if source page has children" do
1328
- it "should also copy and paste the children" do
1329
- allow(Page).to receive(:copy).and_return(copied_page)
1330
- allow(source).to receive(:children).and_return([mock_model('Page')])
1331
- expect(source).to receive(:copy_children_to).with(copied_page)
1332
- subject
1333
- end
1334
- end
1335
- end
1336
-
1337
- context 'previous and next.' do
1338
- let(:center_page) { create(:alchemy_page, :public, name: 'Center Page') }
1339
- let(:next_page) { create(:alchemy_page, :public, name: 'Next Page') }
1340
- let(:non_public_page) { create(:alchemy_page, name: 'Not public Page') }
1341
- let(:restricted_page) { create(:alchemy_page, :restricted, public: true) }
1342
-
1343
- before do
1344
- public_page
1345
- restricted_page
1346
- non_public_page
1347
- center_page
1348
- next_page
1349
- end
1350
-
1351
- describe '#previous' do
1352
- it "should return the previous page on the same level" do
1353
- expect(center_page.previous).to eq(public_page)
1354
- expect(next_page.previous).to eq(center_page)
1355
- end
1356
-
1357
- context "no previous page on same level present" do
1358
- it "should return nil" do
1359
- expect(public_page.previous).to be_nil
1360
- end
1361
- end
1362
-
1363
- context "with options restricted" do
1364
- context "set to true" do
1365
- it "returns previous restricted page" do
1366
- expect(center_page.previous(restricted: true)).to eq(restricted_page)
1367
- end
1368
- end
1369
-
1370
- context "set to false" do
1371
- it "skips restricted page" do
1372
- expect(center_page.previous(restricted: false)).to eq(public_page)
1373
- end
1374
- end
1375
- end
1376
-
1377
- context "with options public" do
1378
- context "set to true" do
1379
- it "returns previous public page" do
1380
- expect(center_page.previous(public: true)).to eq(public_page)
1381
- end
1382
- end
1383
-
1384
- context "set to false" do
1385
- it "skips public page" do
1386
- expect(center_page.previous(public: false)).to eq(non_public_page)
1387
- end
1388
- end
1389
- end
1390
- end
1391
-
1392
- describe '#next' do
1393
- it "should return the next page on the same level" do
1394
- expect(center_page.next).to eq(next_page)
1395
- end
1396
-
1397
- context "no next page on same level present" do
1398
- it "should return nil" do
1399
- expect(next_page.next).to be_nil
1400
- end
1401
- end
1402
- end
1403
- end
1404
-
1405
- describe '#publish!' do
1406
- let(:page) { build_stubbed(:alchemy_page, public: false) }
1407
- let(:current_time) { Time.current }
1408
-
1409
- before do
1410
- current_time
1411
- allow(Time).to receive(:now).and_return(current_time)
1412
- page.publish!
1413
- end
1414
-
1415
- it "sets public attribute to true" do
1416
- expect(page.public).to eq(true)
1417
- end
1418
-
1419
- it "sets published_at attribute to current time" do
1420
- expect(page.published_at).to eq(current_time)
1421
- end
1422
- end
1423
-
1424
- describe '#set_language_from_parent_or_default' do
1425
- let(:default_language) { mock_model('Language', code: 'es') }
1426
- let(:page) { Page.new }
1427
-
1428
- before { allow(page).to receive(:parent).and_return(parent) }
1429
-
1430
- subject { page }
1431
-
1432
- context "parent has a language" do
1433
- let(:parent) { mock_model('Page', language: default_language, language_id: default_language.id, language_code: default_language.code) }
1434
-
1435
- before do
1436
- page.send(:set_language_from_parent_or_default)
1437
- end
1438
-
1439
- describe '#language_id' do
1440
- subject { super().language_id }
1441
- it { is_expected.to eq(parent.language_id) }
1442
- end
1443
- end
1444
-
1445
- context "parent has no language" do
1446
- let(:parent) { mock_model('Page', language: nil, language_id: nil, language_code: nil) }
1447
-
1448
- before do
1449
- allow(Language).to receive(:default).and_return(default_language)
1450
- page.send(:set_language_from_parent_or_default)
1451
- end
1452
-
1453
- describe '#language_id' do
1454
- subject { super().language_id }
1455
- it { is_expected.to eq(default_language.id) }
1456
- end
1457
- end
1458
- end
1459
-
1460
- describe '#taggable?' do
1461
- context "definition has 'taggable' key with true value" do
1462
- it "should return true" do
1463
- page = build(:alchemy_page)
1464
- allow(page).to receive(:definition).and_return({'name' => 'standard', 'taggable' => true})
1465
- expect(page.taggable?).to be_truthy
1466
- end
1467
- end
1468
-
1469
- context "definition has 'taggable' key with foo value" do
1470
- it "should return false" do
1471
- page = build(:alchemy_page)
1472
- allow(page).to receive(:definition).and_return({'name' => 'standard', 'taggable' => 'foo'})
1473
- expect(page.taggable?).to be_falsey
1474
- end
1475
- end
1476
-
1477
- context "definition has no 'taggable' key" do
1478
- it "should return false" do
1479
- page = build(:alchemy_page)
1480
- allow(page).to receive(:definition).and_return({'name' => 'standard'})
1481
- expect(page.taggable?).to be_falsey
1482
- end
1483
- end
1484
- end
1485
-
1486
- describe '#unlock!' do
1487
- let(:page) { create(:alchemy_page, locked: true, locked_by: 1) }
1488
-
1489
- before do
1490
- allow(page).to receive(:save).and_return(true)
1491
- end
1492
-
1493
- it "should set the locked status to false" do
1494
- page.unlock!
1495
- page.reload
1496
- expect(page.locked).to eq(false)
1497
- end
1498
-
1499
- it "should not update the timestamps " do
1500
- expect { page.unlock! }.to_not change(page, :updated_at)
1501
- end
1502
-
1503
- it "should set locked_by to nil" do
1504
- page.unlock!
1505
- page.reload
1506
- expect(page.locked_by).to eq(nil)
1507
- end
1508
-
1509
- it "sets current preview to nil" do
1510
- Page.current_preview = page
1511
- page.unlock!
1512
- expect(Page.current_preview).to be_nil
1513
- end
1514
- end
1515
-
1516
- context 'urlname updating' do
1517
- let(:parentparent) { create(:alchemy_page, name: 'parentparent', visible: true) }
1518
- let(:parent) { create(:alchemy_page, parent_id: parentparent.id, name: 'parent', visible: true) }
1519
- let(:page) { create(:alchemy_page, parent_id: parent.id, name: 'page', visible: true) }
1520
- let(:invisible) { create(:alchemy_page, parent_id: page.id, name: 'invisible', visible: false) }
1521
- let(:contact) { create(:alchemy_page, parent_id: invisible.id, name: 'contact', visible: true) }
1522
- let(:external) { create(:alchemy_page, parent_id: parent.id, name: 'external', page_layout: 'external', urlname: 'http://google.com') }
1523
- let(:language_root) { parentparent.parent }
1524
-
1525
- context "with activated url_nesting" do
1526
- before { allow(Config).to receive(:get).and_return(true) }
1527
-
1528
- it "should store all parents urlnames delimited by slash" do
1529
- expect(page.urlname).to eq('parentparent/parent/page')
1530
- end
1531
-
1532
- it "should not include the root page" do
1533
- Page.root.update_column(:urlname, 'root')
1534
- language_root.update(urlname: 'new-urlname')
1535
- expect(language_root.urlname).not_to match(/root/)
1536
- end
1537
-
1538
- it "should not include the language root page" do
1539
- expect(page.urlname).not_to match(/startseite/)
1540
- end
1541
-
1542
- it "should not include invisible pages" do
1543
- expect(contact.urlname).not_to match(/invisible/)
1544
- end
1545
-
1546
- context "with an invisible parent" do
1547
- before { parent.update_attribute(:visible, false) }
1548
-
1549
- it "does not change if set_urlname is called" do
1550
- expect { page.send(:set_urlname) }.not_to change { page.urlname }
1551
- end
1552
-
1553
- it "does not change if update_urlname! is called" do
1554
- expect { page.update_urlname! }.not_to change { page.urlname }
1555
- end
1556
- end
1557
-
1558
- context "after changing page's urlname" do
1559
- it "updates urlnames of descendants" do
1560
- page
1561
- parentparent.urlname = 'new-urlname'
1562
- parentparent.save!
1563
- page.reload
1564
- expect(page.urlname).to eq('new-urlname/parent/page')
1565
- end
1566
-
1567
- context 'with descendants that are redirecting to external' do
1568
- it "it skips this page" do
1569
- external
1570
- parent.urlname = 'new-urlname'
1571
- parent.save!
1572
- external.reload
1573
- expect(external.urlname).to eq('http://google.com')
1574
- end
1575
- end
1576
-
1577
- it "should create a legacy url" do
1578
- allow(page).to receive(:slug).and_return('foo')
1579
- page.update_urlname!
1580
- expect(page.legacy_urls).not_to be_empty
1581
- expect(page.legacy_urls.pluck(:urlname)).to include('parentparent/parent/page')
1582
- end
1583
- end
1584
-
1585
- context "after updating my visibility" do
1586
- it "should update urlnames of descendants" do
1587
- page
1588
- parentparent.visible = false
1589
- parentparent.save!
1590
- page.reload
1591
- expect(page.urlname).to eq('parent/page')
1592
- end
1593
- end
1594
- end
1595
-
1596
- context "with disabled url_nesting" do
1597
- before { allow(Config).to receive(:get).and_return(false) }
1598
-
1599
- it "should only store my urlname" do
1600
- expect(page.urlname).to eq('page')
1601
- end
1602
- end
1603
- end
1604
-
1605
- describe "#update_node!" do
1606
- let(:original_url) { "sample-url" }
1607
- let(:page) { create(:alchemy_page, language: language, parent_id: language_root.id, urlname: original_url, restricted: false) }
1608
- let(:node) { TreeNode.new(10, 11, 12, 13, "another-url", true) }
1609
-
1610
- context "when nesting is enabled" do
1611
- before { allow(Alchemy::Config).to receive(:get).with(:url_nesting) { true } }
1612
-
1613
- context "when page is not external" do
1614
- before do
1615
- expect(page).to receive(:redirects_to_external?).and_return(false)
1616
- end
1617
-
1618
- it "should update all attributes" do
1619
- page.update_node!(node)
1620
- page.reload
1621
- expect(page.lft).to eq(node.left)
1622
- expect(page.rgt).to eq(node.right)
1623
- expect(page.parent_id).to eq(node.parent)
1624
- expect(page.depth).to eq(node.depth)
1625
- expect(page.urlname).to eq(node.url)
1626
- expect(page.restricted).to eq(node.restricted)
1627
- end
1628
-
1629
- context "when url is the same" do
1630
- let(:node) { TreeNode.new(10, 11, 12, 13, original_url, true) }
1631
-
1632
- it "should not create a legacy url" do
1633
- page.update_node!(node)
1634
- page.reload
1635
- expect(page.legacy_urls.size).to eq(0)
1636
- end
1637
- end
1638
-
1639
- context "when url is not the same" do
1640
- it "should create a legacy url" do
1641
- page.update_node!(node)
1642
- page.reload
1643
- expect(page.legacy_urls.size).to eq(1)
1644
- end
1645
- end
1646
- end
1647
-
1648
- context "when page is external" do
1649
- before do
1650
- expect(page)
1651
- .to receive(:redirects_to_external?)
1652
- .and_return(true)
1653
- end
1654
-
1655
- it "should update all attributes except url" do
1656
- page.update_node!(node)
1657
- page.reload
1658
- expect(page.lft).to eq(node.left)
1659
- expect(page.rgt).to eq(node.right)
1660
- expect(page.parent_id).to eq(node.parent)
1661
- expect(page.depth).to eq(node.depth)
1662
- expect(page.urlname).to eq(original_url)
1663
- expect(page.restricted).to eq(node.restricted)
1664
- end
1665
-
1666
- it "should not create a legacy url" do
1667
- page.update_node!(node)
1668
- page.reload
1669
- expect(page.legacy_urls.size).to eq(0)
1670
- end
1671
- end
1672
- end
1673
-
1674
- context "when nesting is disabled" do
1675
- before do
1676
- allow(Alchemy::Config).to receive(:get).with(:url_nesting) { false }
1677
- end
1678
-
1679
- context "when page is not external" do
1680
- before do
1681
- allow(page).to receive(:redirects_to_external?).and_return(false)
1682
- end
1683
-
1684
- it "should update all attributes except url" do
1685
- page.update_node!(node)
1686
- page.reload
1687
- expect(page.lft).to eq(node.left)
1688
- expect(page.rgt).to eq(node.right)
1689
- expect(page.parent_id).to eq(node.parent)
1690
- expect(page.depth).to eq(node.depth)
1691
- expect(page.urlname).to eq(original_url)
1692
- expect(page.restricted).to eq(node.restricted)
1693
- end
1694
-
1695
- it "should not create a legacy url" do
1696
- page.update_node!(node)
1697
- page.reload
1698
- expect(page.legacy_urls.size).to eq(0)
1699
- end
1700
- end
1701
-
1702
- context "when page is external" do
1703
- before do
1704
- expect(Alchemy::Config).to receive(:get).and_return(true)
1705
- allow(page).to receive(:redirects_to_external?).and_return(true)
1706
- end
1707
-
1708
- it "should update all attributes except url" do
1709
- page.update_node!(node)
1710
- page.reload
1711
- expect(page.lft).to eq(node.left)
1712
- expect(page.rgt).to eq(node.right)
1713
- expect(page.parent_id).to eq(node.parent)
1714
- expect(page.depth).to eq(node.depth)
1715
- expect(page.urlname).to eq(original_url)
1716
- expect(page.restricted).to eq(node.restricted)
1717
- end
1718
-
1719
- it "should not create a legacy url" do
1720
- page.update_node!(node)
1721
- page.reload
1722
- expect(page.legacy_urls.size).to eq(0)
1723
- end
1724
- end
1725
- end
1726
- end
1727
-
1728
- describe '#cache_page?' do
1729
- let(:page) { Page.new(page_layout: "news") }
1730
- subject { page.cache_page? }
1731
-
1732
- before { Rails.application.config.action_controller.perform_caching = true }
1733
- after { Rails.application.config.action_controller.perform_caching = false }
1734
-
1735
- it 'returns true when everthing is alright' do
1736
- expect(subject).to be true
1737
- end
1738
-
1739
- it 'returns false when the Rails app does not perform caching' do
1740
- Rails.application.config.action_controller.perform_caching = false
1741
- expect(subject).to be false
1742
- end
1743
-
1744
- it 'returns false when caching is deactivated in the Alchemy config' do
1745
- allow(Alchemy::Config).to receive(:get).with(:cache_pages).and_return(false)
1746
- expect(subject).to be false
1747
- end
1748
-
1749
- it 'returns false when the page layout is set to cache = false' do
1750
- page_layout = PageLayout.get('news')
1751
- page_layout['cache'] = false
1752
- allow(PageLayout).to receive(:get).with('news').and_return(page_layout)
1753
- expect(subject).to be false
1754
- end
1755
-
1756
- it 'returns false when the page layout is set to searchresults = true' do
1757
- page_layout = PageLayout.get('news')
1758
- page_layout['searchresults'] = true
1759
- allow(PageLayout).to receive(:get).with('news').and_return(page_layout)
1760
- expect(subject).to be false
1761
- end
1762
- end
1763
-
1764
- describe '#slug' do
1765
- context "with parents path saved in urlname" do
1766
- let(:page) { build(:alchemy_page, urlname: 'root/parent/my-name') }
1767
-
1768
- it "should return the last part of the urlname" do
1769
- expect(page.slug).to eq('my-name')
1770
- end
1771
- end
1772
-
1773
- context "with single urlname" do
1774
- let(:page) { build(:alchemy_page, urlname: 'my-name') }
1775
-
1776
- it "should return the last part of the urlname" do
1777
- expect(page.slug).to eq('my-name')
1778
- end
1779
- end
1780
-
1781
- context "with nil as urlname" do
1782
- let(:page) { build(:alchemy_page, urlname: nil) }
1783
-
1784
- it "should return nil" do
1785
- expect(page.slug).to be_nil
1786
- end
1787
- end
1788
- end
1789
-
1790
- describe '#external_urlname' do
1791
- let(:external_page) { build(:alchemy_page, page_layout: 'external') }
1792
-
1793
- context 'with missing protocol' do
1794
- before { external_page.urlname = 'google.com' }
1795
-
1796
- it "returns an urlname prefixed with http://" do
1797
- expect(external_page.external_urlname).to eq 'http://google.com'
1798
- end
1799
- end
1800
-
1801
- context 'with protocol present' do
1802
- before { external_page.urlname = 'ftp://google.com' }
1803
-
1804
- it "returns the urlname" do
1805
- expect(external_page.external_urlname).to eq 'ftp://google.com'
1806
- end
1807
- end
1808
-
1809
- context 'beginngin with a slash' do
1810
- before { external_page.urlname = '/internal-url' }
1811
-
1812
- it "returns the urlname" do
1813
- expect(external_page.external_urlname).to eq '/internal-url'
1814
- end
1815
- end
1816
- end
1817
-
1818
- context 'page status methods' do
1819
- let(:page) { build(:alchemy_page, public: true, visible: true, restricted: false, locked: false) }
1820
-
1821
- describe '#status' do
1822
- it "returns a combined status hash" do
1823
- expect(page.status).to eq({public: true, visible: true, restricted: false, locked: false})
1824
- end
1825
- end
1826
-
1827
- describe '#status_title' do
1828
- it "returns a translated status string for public status" do
1829
- expect(page.status_title(:public)).to eq('Page is published.')
1830
- end
1831
-
1832
- it "returns a translated status string for visible status" do
1833
- expect(page.status_title(:visible)).to eq('Page is visible in navigation.')
1834
- end
1835
-
1836
- it "returns a translated status string for locked status" do
1837
- expect(page.status_title(:locked)).to eq('')
1838
- end
1839
-
1840
- it "returns a translated status string for restricted status" do
1841
- expect(page.status_title(:restricted)).to eq('Page is not restricted.')
1842
- end
1843
- end
1844
- end
1845
-
1846
- context 'indicate page editors' do
1847
- let(:page) { Page.new }
1848
- let(:user) { create(:alchemy_dummy_user, :as_editor) }
1849
-
1850
- describe '#creator' do
1851
- before { page.update(creator_id: user.id) }
1852
-
1853
- it "returns the user that created the page" do
1854
- expect(page.creator).to eq(user)
1855
- end
1856
-
1857
- context 'with user class having a different primary key' do
1858
- before do
1859
- allow(Alchemy.user_class)
1860
- .to receive(:primary_key)
1861
- .and_return('user_id')
1862
-
1863
- allow(page)
1864
- .to receive(:creator_id)
1865
- .and_return(1)
1866
- end
1867
-
1868
- it "returns the user that created the page" do
1869
- expect(Alchemy.user_class)
1870
- .to receive(:find_by)
1871
- .with({'user_id' => 1})
1872
-
1873
- page.creator
1874
- end
1875
- end
1876
- end
1877
-
1878
- describe '#updater' do
1879
- before { page.update(updater_id: user.id) }
1880
-
1881
- it "returns the user that updated the page" do
1882
- expect(page.updater).to eq(user)
1883
- end
1884
-
1885
- context 'with user class having a different primary key' do
1886
- before do
1887
- allow(Alchemy.user_class)
1888
- .to receive(:primary_key)
1889
- .and_return('user_id')
1890
-
1891
- allow(page)
1892
- .to receive(:updater_id)
1893
- .and_return(1)
1894
- end
1895
-
1896
- it "returns the user that updated the page" do
1897
- expect(Alchemy.user_class)
1898
- .to receive(:find_by)
1899
- .with({'user_id' => 1})
1900
-
1901
- page.updater
1902
- end
1903
- end
1904
- end
1905
-
1906
- describe '#locker' do
1907
- before { page.update(locked_by: user.id) }
1908
-
1909
- it "returns the user that locked the page" do
1910
- expect(page.locker).to eq(user)
1911
- end
1912
-
1913
- context 'with user class having a different primary key' do
1914
- before do
1915
- allow(Alchemy.user_class)
1916
- .to receive(:primary_key)
1917
- .and_return('user_id')
1918
-
1919
- allow(page)
1920
- .to receive(:locked_by)
1921
- .and_return(1)
1922
- end
1923
-
1924
- it "returns the user that locked the page" do
1925
- expect(Alchemy.user_class)
1926
- .to receive(:find_by)
1927
- .with({'user_id' => 1})
1928
-
1929
- page.locker
1930
- end
1931
- end
1932
- end
1933
-
1934
- context 'with user that can not be found' do
1935
- it 'does not raise not found error' do
1936
- %w(creator updater locker).each do |user_type|
1937
- expect {
1938
- page.send(user_type)
1939
- }.to_not raise_error
1940
- end
1941
- end
1942
- end
1943
-
1944
- context 'with user class having a name accessor' do
1945
- let(:user) { double(name: 'Paul Page') }
1946
-
1947
- describe '#creator_name' do
1948
- before { allow(page).to receive(:creator).and_return(user) }
1949
-
1950
- it "returns the name of the creator" do
1951
- expect(page.creator_name).to eq('Paul Page')
1952
- end
1953
- end
1954
-
1955
- describe '#updater_name' do
1956
- before { allow(page).to receive(:updater).and_return(user) }
1957
-
1958
- it "returns the name of the updater" do
1959
- expect(page.updater_name).to eq('Paul Page')
1960
- end
1961
- end
1962
-
1963
- describe '#locker_name' do
1964
- before { allow(page).to receive(:locker).and_return(user) }
1965
-
1966
- it "returns the name of the current page editor" do
1967
- expect(page.locker_name).to eq('Paul Page')
1968
- end
1969
- end
1970
- end
1971
-
1972
- context 'with user class not having a name accessor' do
1973
- let(:user) { Alchemy.user_class.new }
1974
-
1975
- describe '#creator_name' do
1976
- before { allow(page).to receive(:creator).and_return(user) }
1977
-
1978
- it "returns unknown" do
1979
- expect(page.creator_name).to eq('unknown')
1980
- end
1981
- end
1982
-
1983
- describe '#updater_name' do
1984
- before { allow(page).to receive(:updater).and_return(user) }
1985
-
1986
- it "returns unknown" do
1987
- expect(page.updater_name).to eq('unknown')
1988
- end
1989
- end
1990
-
1991
- describe '#locker_name' do
1992
- before { allow(page).to receive(:locker).and_return(user) }
1993
-
1994
- it "returns unknown" do
1995
- expect(page.locker_name).to eq('unknown')
1996
- end
1997
- end
1998
- end
1999
- end
2000
-
2001
- describe '#controller_and_action' do
2002
- let(:page) { Page.new }
2003
-
2004
- context 'if the page has a custom controller defined in its definition' do
2005
- before do
2006
- allow(page).to receive(:has_controller?).and_return(true)
2007
- allow(page).to receive(:definition).and_return({'controller' => 'comments', 'action' => 'index'})
2008
- end
2009
- it "should return a Hash with controller and action key-value pairs" do
2010
- expect(page.controller_and_action).to eq({controller: '/comments', action: 'index'})
2011
- end
2012
- end
2013
- end
2014
-
2015
- it_behaves_like "having a hint" do
2016
- let(:subject) { Page.new }
2017
- end
2018
-
2019
- describe '#layout_partial_name' do
2020
- let(:page) { Page.new(page_layout: 'Standard Page') }
2021
-
2022
- it "returns a partial renderer compatible name" do
2023
- expect(page.layout_partial_name).to eq('standard_page')
2024
- end
2025
- end
2026
-
2027
- describe '#published_at' do
2028
- context 'with published_at date set' do
2029
- let(:published_at) { Time.current }
2030
- let(:page) { build_stubbed(:alchemy_page, published_at: published_at) }
2031
-
2032
- it "returns the published_at value from database" do
2033
- expect(page.published_at).to eq(published_at)
2034
- end
2035
- end
2036
-
2037
- context 'with published_at is nil' do
2038
- let(:updated_at) { Time.current }
2039
- let(:page) { build_stubbed(:alchemy_page, published_at: nil, updated_at: updated_at) }
2040
-
2041
- it "returns the updated_at value" do
2042
- expect(page.published_at).to eq(updated_at)
2043
- end
2044
- end
2045
- end
2046
-
2047
- describe "#richtext_contents_ids" do
2048
- let!(:page) { create(:alchemy_page) }
2049
-
2050
- let!(:expanded_element) do
2051
- create :alchemy_element,
2052
- name: 'article',
2053
- page: page,
2054
- folded: false,
2055
- create_contents_after_create: true
2056
- end
2057
-
2058
- let!(:folded_element) do
2059
- create :alchemy_element,
2060
- name: 'article',
2061
- page: page,
2062
- folded: true,
2063
- create_contents_after_create: true
2064
- end
2065
-
2066
- subject(:richtext_contents_ids) { page.richtext_contents_ids }
2067
-
2068
- it 'returns content ids for all expanded elements that have tinymce enabled' do
2069
- expanded_rtf_contents = expanded_element.contents.essence_richtexts
2070
- expect(richtext_contents_ids).to eq(expanded_rtf_contents.pluck(:id))
2071
- folded_rtf_content = folded_element.contents.essence_richtexts.first
2072
- expect(richtext_contents_ids).to_not include(folded_rtf_content.id)
2073
- end
2074
-
2075
- context 'with nested elements' do
2076
- let!(:nested_expanded_element) do
2077
- create :alchemy_element,
2078
- name: 'article',
2079
- page: page,
2080
- parent_element: expanded_element,
2081
- folded: false,
2082
- create_contents_after_create: true
2083
- end
2084
-
2085
- let!(:nested_folded_element) do
2086
- create :alchemy_element,
2087
- name: 'article',
2088
- page: page,
2089
- parent_element: folded_element,
2090
- folded: true,
2091
- create_contents_after_create: true
2092
- end
2093
-
2094
- it 'returns content ids for all expanded nested elements that have tinymce enabled' do
2095
- expanded_rtf_contents = expanded_element.contents.essence_richtexts
2096
- nested_expanded_rtf_contents = nested_expanded_element.contents.essence_richtexts
2097
- rtf_content_ids = expanded_rtf_contents.pluck(:id) +
2098
- nested_expanded_rtf_contents.pluck(:id)
2099
- expect(richtext_contents_ids.sort).to eq(rtf_content_ids)
2100
-
2101
- nested_folded_rtf_content = nested_folded_element.contents.essence_richtexts.first
2102
-
2103
- expect(richtext_contents_ids).to_not include(nested_folded_rtf_content.id)
2104
- end
2105
- end
2106
- end
2107
- end
2108
- end