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,85 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Alchemy::EssencesHelper do
4
- let(:element) { build_stubbed(:alchemy_element) }
5
- let(:content) { build_stubbed(:alchemy_content, element: element, ingredient: 'hello!') }
6
- let(:essence) { mock_model('EssenceText', link: nil, partial_name: 'essence_text', ingredient: 'hello!') }
7
-
8
- before do
9
- allow_message_expectations_on_nil
10
- allow(content).to receive(:essence).and_return(essence)
11
- end
12
-
13
- describe 'render_essence' do
14
- subject { render_essence(content) }
15
-
16
- it "renders an essence view partial" do
17
- is_expected.to have_content 'hello!'
18
- end
19
-
20
- context 'with editor given as view part' do
21
- subject { helper.render_essence(content, :editor) }
22
-
23
- before do
24
- allow(helper).to receive(:content_label)
25
- allow(content).to receive(:settings).and_return({})
26
- end
27
-
28
- it "renders an essence editor partial" do
29
- expect(content).to receive(:form_field_name)
30
- is_expected.to have_selector 'input[type="text"]'
31
- end
32
- end
33
-
34
- context 'if content is nil' do
35
- let(:content) { nil }
36
-
37
- it "returns empty string" do
38
- is_expected.to eq('')
39
- end
40
-
41
- context 'editor given as part' do
42
- subject { helper.render_essence(content, :editor) }
43
-
44
- before { allow(Alchemy).to receive(:t).and_return('') }
45
-
46
- it "displays warning" do
47
- expect(helper).to receive(:warning).and_return('')
48
- is_expected.to eq('')
49
- end
50
- end
51
- end
52
-
53
- context 'if essence is nil' do
54
- let(:essence) { nil }
55
-
56
- it "returns empty string" do
57
- is_expected.to eq('')
58
- end
59
-
60
- context 'editor given as part' do
61
- subject { helper.render_essence(content, :editor) }
62
-
63
- before { allow(Alchemy).to receive(:t).and_return('') }
64
-
65
- it "displays warning" do
66
- expect(helper).to receive(:warning).and_return('')
67
- is_expected.to eq('')
68
- end
69
- end
70
- end
71
- end
72
-
73
- describe 'render_essence_view' do
74
- it "renders an essence view partial" do
75
- expect(render_essence_view(content)).to have_content 'hello!'
76
- end
77
- end
78
-
79
- describe "render_essence_view_by_name" do
80
- it "renders an essence view partial by content name" do
81
- expect(element).to receive(:content_by_name).and_return(content)
82
- expect(render_essence_view_by_name(element, 'intro')).to have_content 'hello!'
83
- end
84
- end
85
- end
@@ -1,499 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- module Alchemy
5
- describe PagesHelper do
6
- # Fixtures
7
- let(:language) { mock_model('Language', code: 'en') }
8
- let(:default_language) { Language.default }
9
- let(:language_root) { create(:alchemy_page, :language_root) }
10
- let(:public_page) { create(:alchemy_page, :public) }
11
- let(:visible_page) { create(:alchemy_page, :public, visible: true) }
12
- let(:restricted_page) { create(:alchemy_page, :public, visible: true, restricted: true) }
13
- let(:level_2_page) { create(:alchemy_page, :public, parent_id: visible_page.id, visible: true, name: 'Level 2') }
14
- let(:level_3_page) { create(:alchemy_page, :public, parent_id: level_2_page.id, visible: true, name: 'Level 3') }
15
- let(:level_4_page) { create(:alchemy_page, :public, parent_id: level_3_page.id, visible: true, name: 'Level 4') }
16
- let(:klingon) { create(:alchemy_language, :klingon) }
17
- let(:klingon_language_root) { create(:alchemy_page, :language_root, language: klingon) }
18
- let(:klingon_public_page) { create(:alchemy_page, :public, language: klingon, parent_id: klingon_language_root.id) }
19
-
20
- before do
21
- helper.controller.class_eval { include Alchemy::ConfigurationMethods }
22
- allow(Config).to receive(:get) { |arg| arg == :url_nesting ? true : Config.parameter(arg) }
23
- @root_page = language_root # We need this instance variable in the helpers
24
- end
25
-
26
- describe "#render_page_layout" do
27
- it "should render the current page layout" do
28
- @page = public_page
29
- expect(helper.render_page_layout).to have_selector('div#content')
30
- end
31
- end
32
-
33
- describe '#render_site_layout' do
34
- let(:default_site) { Alchemy::Site.default }
35
-
36
- it "renders the partial for current site" do
37
- expect(helper).to receive(:current_alchemy_site).and_return(default_site)
38
- expect(helper).to receive(:render).with(default_site)
39
- helper.render_site_layout
40
- end
41
-
42
- context "with missing partial" do
43
- it "returns empty string and logges warning" do
44
- expect(helper).to receive(:current_alchemy_site).twice.and_return(default_site)
45
- expect(helper.render_site_layout).to eq("")
46
- end
47
- end
48
- end
49
-
50
- describe "#render_navigation" do
51
- let(:user) { nil }
52
-
53
- before do
54
- visible_page
55
- allow(helper).to receive(:current_ability).and_return(Alchemy::Permissions.new(user))
56
- end
57
-
58
- it "should render only visible pages" do
59
- not_visible_page = create(:alchemy_page, visible: false)
60
- expect(helper.render_navigation).not_to match(/#{not_visible_page.name}/)
61
- end
62
-
63
- it "should render visible unpublished pages" do
64
- unpublished_visible_page = create(:alchemy_page, visible: true, public: false)
65
- expect(helper.render_navigation).to match(/#{unpublished_visible_page.name}/)
66
- end
67
-
68
- context "not in multi_language mode" do
69
- before { allow(helper).to receive(:multi_language?).and_return(false) }
70
-
71
- it "should render the page navigation" do
72
- expect(helper.render_navigation).to have_selector("ul.navigation.level_1 li.#{visible_page.urlname} a[href=\"/#{visible_page.urlname}\"]")
73
- end
74
-
75
- context "as guest user" do
76
- before { restricted_page }
77
-
78
- it "should not render restricted pages" do
79
- expect(helper.render_navigation).not_to have_selector("ul.navigation.level_1 li a[href=\"/#{restricted_page.urlname}\"]")
80
- end
81
- end
82
-
83
- context "as member user" do
84
- let(:user) { build(:alchemy_dummy_user) }
85
-
86
- before { restricted_page }
87
-
88
- it "should render also restricted pages" do
89
- not_restricted_page = create(:alchemy_page, :public, restricted: false, visible: true)
90
- expect(helper.render_navigation).to match(/#{restricted_page.name}/)
91
- expect(helper.render_navigation).to match(/#{not_restricted_page.name}/)
92
- end
93
- end
94
-
95
- context "with enabled url nesting" do
96
- before do
97
- allow(helper).to receive(:configuration).and_return(true)
98
- level_3_page
99
- end
100
-
101
- it "should render nested page links" do
102
- expect(helper.render_navigation(all_sub_menues: true)).to have_selector("ul li a[href=\"/#{level_3_page.urlname}\"]")
103
- end
104
- end
105
- end
106
-
107
- context "with id and class in the html options" do
108
- it "should append id to the generated ul tag" do
109
- expect(helper.render_navigation({}, {id: 'foobar_id'})).to have_selector("ul[id='foobar_id']")
110
- end
111
-
112
- it "should replace the default css class from the generated ul tag" do
113
- expect(helper.render_navigation({}, {class: 'foobar_class'})).to have_selector("ul[class='foobar_class']")
114
- end
115
- end
116
-
117
- context "with options[:deepness] set" do
118
- before { level_3_page }
119
-
120
- it "shows only pages up to this depth" do
121
- output = helper.render_navigation(deepness: 3, all_sub_menues: true)
122
- expect(output).to have_selector("ul li a[href=\"/#{level_2_page.urlname}\"]")
123
- expect(output).not_to have_selector("ul li a[href=\"/#{level_3_page.urlname}\"]")
124
- end
125
- end
126
-
127
- context "with options[:spacer] set" do
128
- before { visible_page }
129
-
130
- context "with two pages on same level" do
131
- before { create(:alchemy_page, :public, visible: true) }
132
-
133
- it "should render the given spacer" do
134
- expect(helper.render_navigation(spacer: '•')).to match(/•/)
135
- end
136
- end
137
-
138
- context "only one page in current level" do
139
- it "should not render the spacer" do
140
- expect(helper.render_navigation(spacer: '•')).not_to match(/•/)
141
- end
142
- end
143
- end
144
-
145
- context "with options[:from_page] set" do
146
- before { level_2_page }
147
-
148
- context "passing a page object" do
149
- it "should render the pages underneath the given one" do
150
- output = helper.render_navigation(from_page: visible_page)
151
- expect(output).not_to have_selector("ul li a[href=\"/#{visible_page.urlname}\"]")
152
- expect(output).to have_selector("ul li a[href=\"/#{level_2_page.urlname}\"]")
153
- end
154
- end
155
-
156
- context "passing a page_layout" do
157
- it "should render the pages underneath the page with the given page_layout" do
158
- allow(helper).to receive(:page_or_find).with('contact').and_return(visible_page)
159
- output = helper.render_navigation(from_page: 'contact')
160
- expect(output).not_to have_selector("ul li a[href=\"/#{visible_page.urlname}\"]")
161
- expect(output).to have_selector("ul li a[href=\"/#{level_2_page.urlname}\"]")
162
- end
163
- end
164
-
165
- context "passing a page_layout of a not existing page" do
166
- it "should render nothing" do
167
- expect(helper.render_navigation(from_page: 'news')).to be_nil
168
- end
169
- end
170
- end
171
- end
172
-
173
- describe '#render_subnavigation' do
174
- let(:user) { nil }
175
-
176
- before {
177
- allow(helper).to receive(:multi_language?).and_return(false)
178
- allow(helper).to receive(:current_ability).and_return(Alchemy::Permissions.new(user))
179
- }
180
-
181
- it "should return nil if no @page is set" do
182
- expect(helper.render_subnavigation).to be(nil)
183
- end
184
-
185
- context "showing a page with level 2" do
186
- before { @page = level_2_page }
187
-
188
- it "should render the navigation from current page" do
189
- expect(helper.render_subnavigation).to have_selector("ul > li > a[href='/#{level_2_page.urlname}']")
190
- end
191
-
192
- it "should set current page active" do
193
- expect(helper.render_subnavigation).to have_selector("a[href='/#{level_2_page.urlname}'].active")
194
- end
195
- end
196
-
197
- context "showing a page with level 3" do
198
- before { @page = level_3_page }
199
-
200
- it "should render the navigation from current pages parent" do
201
- expect(helper.render_subnavigation).to have_selector("ul > li > ul > li > a[href='/#{level_3_page.urlname}']")
202
- end
203
-
204
- it "should set current page active" do
205
- expect(helper.render_subnavigation).to have_selector("a[href='/#{level_3_page.urlname}'].active")
206
- end
207
- end
208
-
209
- context "showing a page with level 4" do
210
- before { @page = level_4_page }
211
-
212
- it "should render the navigation from current pages parents parent" do
213
- expect(helper.render_subnavigation).to have_selector("ul > li > ul > li > ul > li > a[href='/#{level_4_page.urlname}']")
214
- end
215
-
216
- it "should set current page active" do
217
- expect(helper.render_subnavigation).to have_selector("a[href='/#{level_4_page.urlname}'].active")
218
- end
219
-
220
- context "beginning with level 3" do
221
- it "should render the navigation beginning from its parent" do
222
- expect(helper.render_subnavigation(level: 3)).to have_selector("ul > li > ul > li > a[href='/#{level_4_page.urlname}']")
223
- end
224
- end
225
- end
226
- end
227
-
228
- describe "#render_breadcrumb" do
229
- let(:parent) { create(:alchemy_page, :public, visible: true) }
230
- let(:page) { create(:alchemy_page, :public, parent_id: parent.id, visible: true) }
231
- let(:user) { nil }
232
-
233
- before do
234
- allow(helper).to receive(:multi_language?).and_return(false)
235
- allow(helper).to receive(:current_ability).and_return(Alchemy::Permissions.new(user))
236
- end
237
-
238
- it "should render a breadcrumb to current page" do
239
- expect(helper.render_breadcrumb(page: page)).to have_selector(".active.last[contains('#{page.name}')]")
240
- end
241
-
242
- context "with options[:separator] given" do
243
- it "should render a breadcrumb with an alternative separator" do
244
- expect(helper.render_breadcrumb(page: page, separator: '<span>###</span>')).to have_selector('span[contains("###")]')
245
- end
246
- end
247
-
248
- context "with options[:reverse] set to true" do
249
- it "should render a breadcrumb in reversed order" do
250
- expect(helper.render_breadcrumb(page: page, reverse: true)).to have_selector('.active.first[contains("A Public Page")]')
251
- end
252
- end
253
-
254
- context "with options[:restricted_only] set to true" do
255
- let(:user) { build(:alchemy_dummy_user) }
256
-
257
- it "should render a breadcrumb of restricted pages only" do
258
- page.update_attributes!(restricted: true, urlname: 'a-restricted-public-page', name: 'A restricted Public Page', title: 'A restricted Public Page')
259
- result = helper.render_breadcrumb(page: page, restricted_only: true).strip
260
- expect(result).to have_selector("*[contains(\"#{page.name}\")]")
261
- expect(result).to_not have_selector("*[contains(\"#{parent.name}\")]")
262
- end
263
- end
264
-
265
- it "should render a breadcrumb of visible pages only" do
266
- page.update_attributes!(visible: false, urlname: 'a-invisible-page', name: 'A Invisible Page', title: 'A Invisible Page')
267
- expect(helper.render_breadcrumb(page: page)).not_to match(/A Invisible Page/)
268
- end
269
-
270
- it "should render a breadcrumb of visible and unpublished pages" do
271
- page.update_attributes!(public: false, urlname: 'a-unpublic-page', name: 'A Unpublic Page', title: 'A Unpublic Page')
272
- expect(helper.render_breadcrumb(page: page)).to match(/A Unpublic Page/)
273
- end
274
-
275
- context "with options[:without]" do
276
- it "should render a breadcrumb without this page" do
277
- page.update_attributes!(urlname: 'not-me', name: 'Not Me', title: 'Not Me')
278
- expect(helper.render_breadcrumb(page: page, without: page)).not_to match(/Not Me/)
279
- end
280
- end
281
-
282
- context "with options[:without] as array" do
283
- it "should render a breadcrumb without these pages." do
284
- page.update_attributes!(urlname: 'not-me', name: 'Not Me', title: 'Not Me')
285
- expect(helper.render_breadcrumb(page: page, without: [page])).not_to match(/Not Me/)
286
- end
287
- end
288
- end
289
-
290
- describe "#render_meta_data" do
291
- let(:page) do
292
- mock_model('Page',
293
- language: language,
294
- title: 'A Public Page',
295
- meta_keywords: '',
296
- meta_description: '',
297
- robot_index?: false,
298
- robot_follow?: false,
299
- contains_feed?: false,
300
- updated_at: '2011-11-29-23:00:00'
301
- )
302
- end
303
-
304
- let(:root_page) { Page.new }
305
-
306
- before { helper.instance_variable_set('@page', page) }
307
-
308
- subject { helper.render_meta_data }
309
-
310
- context "@page is not set" do
311
- before { helper.instance_variable_set('@page', nil) }
312
-
313
- it "should return nil" do
314
- expect(helper.render_meta_data).to eq(nil)
315
- end
316
- end
317
-
318
- context "when the current page's meta keywords are set" do
319
- before { allow(page).to receive_messages(meta_keywords: 'keyword1, keyword2') }
320
-
321
- it "should render them" do
322
- is_expected.to match /meta name="keywords" content="keyword1, keyword2"/
323
- end
324
- end
325
-
326
- context "when the current page's meta description is set" do
327
- before { allow(page).to receive_messages(meta_description: 'blah blah') }
328
-
329
- it "should render it" do
330
- is_expected.to match /meta name="description" content="blah blah"/
331
- end
332
- end
333
-
334
- context 'when the current page is missing its meta description' do
335
- before { allow(Language).to receive(:current_root_page).and_return(root_page) }
336
-
337
- it "should use the the one from the language root's page" do
338
- root_page.meta_description = "root page's description"
339
- is_expected.to match /meta name="description" content="root page's description"/
340
- end
341
-
342
- it "should not be set when language root's page is also missing one" do
343
- is_expected.not_to match /meta name="description"/
344
- end
345
- end
346
-
347
- context 'when the current page is missing its meta keywords' do
348
- before { allow(Language).to receive(:current_root_page).and_return(root_page) }
349
-
350
- it "should use the the one from the language root's page" do
351
- root_page.meta_keywords = "root page's keywords"
352
- is_expected.to match /meta name="keywords" content="root page's keywords"/
353
- end
354
-
355
- it "should not be set when language root's page is also missing one" do
356
- is_expected.not_to match /meta name="keywords"/
357
- end
358
- end
359
- end
360
-
361
- describe "#render_title_tag" do
362
- let(:page) { mock_model('Page', title: 'A Public Page') }
363
-
364
- before { helper.instance_variable_set('@page', page) }
365
-
366
- it "should render a title tag for current page" do
367
- expect(helper.render_title_tag).to match /<title>A Public Page<\/title>/
368
- end
369
-
370
- it "should render a title tag for current page with a prefix and a separator" do
371
- expect(helper.render_title_tag(prefix: 'Peters Petshop', separator: ' ### ')).to match /<title>Peters Petshop ### A Public Page<\/title>/
372
- end
373
- end
374
-
375
- describe "#language_links" do
376
- context "with two public languages" do
377
- # Always create second language
378
- before { klingon }
379
-
380
- context "with only one language root page" do
381
- it "should return nil" do
382
- expect(helper.language_links).to be_nil
383
- end
384
- end
385
-
386
- context "with two language root pages" do
387
- # Always create a language root page for klingon
388
- before { klingon_language_root }
389
-
390
- it "should render two language links" do
391
- expect(helper.language_links).to have_selector('a', count: 2)
392
- end
393
-
394
- it "should render language links referring to their language root page" do
395
- code = klingon_language_root.language_code
396
- urlname = klingon_language_root.urlname
397
- expect(helper.language_links).to have_selector("a.#{code}[href='/#{code}/#{urlname}']")
398
- end
399
-
400
- context "with options[:linkname]" do
401
- context "set to 'name'" do
402
- it "should render the name of the language" do
403
- expect(helper.language_links(linkname: 'name')).to have_selector("span[contains('#{klingon_language_root.language.name}')]")
404
- end
405
- end
406
-
407
- context "set to 'code'" do
408
- it "should render the code of the language" do
409
- expect(helper.language_links(linkname: 'code')).to have_selector("span[contains('#{klingon_language_root.language.code}')]")
410
- end
411
- end
412
- end
413
-
414
- context "spacer set to '\o/'" do
415
- it "should render the given string as a spacer" do
416
- expect(helper.language_links(spacer: '<span>\o/</span>')).to have_selector('span[contains("\o/")]', count: 1)
417
- end
418
- end
419
-
420
- context "with options[:reverse]" do
421
- context "set to false" do
422
- it "should render the language links in an ascending order" do
423
- expect(helper.language_links(reverse: false)).to have_selector("a.en + a.kl")
424
- end
425
- end
426
-
427
- context "set to true" do
428
- it "should render the language links in a descending order" do
429
- expect(helper.language_links(reverse: true)).to have_selector("a.kl + a.en")
430
- end
431
- end
432
- end
433
-
434
- context "with options[:show_title]" do
435
- context "set to true" do
436
- it "should render the language links with titles" do
437
- allow(Alchemy).to receive(:t).and_return("my title")
438
- expect(helper.language_links(show_title: true)).to have_selector('a[title="my title"]')
439
- end
440
- end
441
-
442
- context "set to false" do
443
- it "should render the language links without titles" do
444
- expect(helper.language_links(show_title: false)).to_not have_selector('a[title]')
445
- end
446
- end
447
- end
448
- end
449
- end
450
- end
451
-
452
- describe "#cell_empty" do
453
- let(:cell) { create(:alchemy_cell, name: 'test_cell', page: public_page) }
454
- let(:element) { create(:alchemy_element) }
455
-
456
- before { @page = public_page }
457
-
458
- context "with elements" do
459
- before do
460
- cell.elements << element
461
- cell.save!
462
- end
463
-
464
- it "should return true" do
465
- expect(helper.cell_empty?('test_cell')).to eq(false)
466
- end
467
- end
468
-
469
- context "with zero elements" do
470
- it "should return true" do
471
- expect(helper.cell_empty?('test_cell')).to eq(true)
472
- end
473
- end
474
-
475
- context "with trashed elements" do
476
- before do
477
- cell.elements << element
478
- cell.save!
479
-
480
- element.trash!
481
- element.save!
482
- end
483
-
484
- it "should return true" do
485
- expect(helper.cell_empty?('test_cell')).to eq(true)
486
- end
487
- end
488
- end
489
-
490
- describe "#picture_essence_caption" do
491
- let(:essence) { mock_model('EssencePicture', caption: 'my caption') }
492
- let(:content) { mock_model('Content', essence: essence) }
493
-
494
- it "should return the caption of the contents essence" do
495
- expect(helper.picture_essence_caption(content)).to eq "my caption"
496
- end
497
- end
498
- end
499
- end