alchemy_cms 3.0.4 → 3.1.0.beta1

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -6
  3. data/Gemfile +4 -7
  4. data/README.md +207 -115
  5. data/alchemy_cms.gemspec +10 -9
  6. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +2 -2
  7. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +2 -2
  8. data/app/assets/javascripts/alchemy/alchemy.js +6 -7
  9. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +1 -43
  10. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +1 -1
  11. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -1
  12. data/app/assets/stylesheets/alchemy/buttons.scss +0 -5
  13. data/app/assets/stylesheets/alchemy/dialogs.scss +1 -0
  14. data/app/assets/stylesheets/alchemy/frame.scss +9 -12
  15. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +11 -2
  16. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +9 -1
  17. data/app/controllers/alchemy/admin/attachments_controller.rb +2 -4
  18. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +34 -38
  19. data/app/controllers/alchemy/api/base_controller.rb +19 -0
  20. data/app/controllers/alchemy/api/contents_controller.rb +35 -0
  21. data/app/controllers/alchemy/api/elements_controller.rb +29 -0
  22. data/app/controllers/alchemy/api/pages_controller.rb +32 -0
  23. data/app/controllers/alchemy/contents_controller.rb +1 -0
  24. data/app/controllers/alchemy/elements_controller.rb +5 -2
  25. data/app/controllers/alchemy/pages_controller.rb +4 -1
  26. data/app/controllers/alchemy/pictures_controller.rb +4 -36
  27. data/app/helpers/alchemy/admin/essences_helper.rb +5 -2
  28. data/app/helpers/alchemy/essences_helper.rb +14 -1
  29. data/app/models/alchemy/content.rb +32 -4
  30. data/app/models/alchemy/element.rb +2 -16
  31. data/app/models/alchemy/element/presenters.rb +2 -2
  32. data/app/models/alchemy/essence_file.rb +5 -0
  33. data/app/models/alchemy/essence_picture.rb +12 -8
  34. data/app/models/alchemy/picture.rb +1 -74
  35. data/app/models/alchemy/picture/transformations.rb +249 -0
  36. data/app/serializers/alchemy/content_serializer.rb +3 -10
  37. data/app/serializers/alchemy/element_serializer.rb +6 -3
  38. data/app/serializers/alchemy/legacy_element_serializer.rb +17 -0
  39. data/app/views/alchemy/admin/dashboard/_sites.html.erb +14 -4
  40. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +8 -5
  41. data/app/views/alchemy/admin/pages/edit.html.erb +9 -9
  42. data/app/views/alchemy/admin/pictures/info.html.erb +2 -3
  43. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  44. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +8 -7
  45. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +3 -3
  46. data/app/views/alchemy/essences/_essence_date_editor.html.erb +8 -2
  47. data/app/views/alchemy/essences/_essence_date_view.html.erb +10 -8
  48. data/app/views/alchemy/essences/_essence_file_editor.html.erb +48 -53
  49. data/app/views/alchemy/essences/_essence_file_view.html.erb +5 -5
  50. data/app/views/alchemy/essences/_essence_html_editor.html.erb +5 -4
  51. data/app/views/alchemy/essences/_essence_link_editor.html.erb +17 -15
  52. data/app/views/alchemy/essences/_essence_link_view.html.erb +11 -7
  53. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +4 -2
  54. data/app/views/alchemy/essences/_essence_picture_view.html.erb +4 -2
  55. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +5 -4
  56. data/app/views/alchemy/essences/_essence_select_editor.html.erb +22 -32
  57. data/app/views/alchemy/essences/_essence_text_view.html.erb +7 -6
  58. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +1 -1
  59. data/app/views/layouts/alchemy/admin.html.erb +5 -3
  60. data/config/initializers/inflections.rb +3 -0
  61. data/config/initializers/simple_form.rb +1 -1
  62. data/config/locales/alchemy.en.yml +0 -1
  63. data/config/routes.rb +14 -0
  64. data/lib/alchemy/capistrano.rb +71 -0
  65. data/lib/alchemy/engine.rb +0 -3
  66. data/lib/alchemy/essence.rb +1 -1
  67. data/lib/alchemy/permissions.rb +19 -5
  68. data/lib/alchemy/picture_attributes.rb +1 -1
  69. data/lib/alchemy/test_support/auth_helpers.rb +1 -1
  70. data/lib/alchemy/test_support/essence_shared_examples.rb +37 -22
  71. data/lib/alchemy/test_support/integration_helpers.rb +1 -1
  72. data/lib/alchemy/tinymce.rb +21 -4
  73. data/lib/alchemy/upgrader/three_point_one.rb +43 -0
  74. data/lib/alchemy/upgrader/three_point_zero.rb +13 -0
  75. data/lib/alchemy/version.rb +2 -1
  76. data/lib/rails/generators/alchemy/module/module_generator.rb +30 -0
  77. data/lib/rails/generators/alchemy/module/templates/ability.rb.tt +11 -0
  78. data/lib/rails/generators/alchemy/module/templates/controller.rb.tt +2 -0
  79. data/lib/rails/generators/alchemy/module/templates/module_config.rb.tt +15 -0
  80. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -1
  81. data/lib/rails/templates/alchemy.rb +2 -2
  82. data/lib/tasks/alchemy/db.rake +7 -1
  83. data/spec/controllers/admin/attachments_controller_spec.rb +38 -38
  84. data/spec/controllers/admin/base_controller_spec.rb +18 -18
  85. data/spec/controllers/admin/clipboard_controller_spec.rb +23 -18
  86. data/spec/controllers/admin/contents_controller_spec.rb +33 -27
  87. data/spec/controllers/admin/dashboard_controller_spec.rb +14 -14
  88. data/spec/controllers/admin/elements_controller_spec.rb +125 -105
  89. data/spec/controllers/admin/essence_files_controller_spec.rb +6 -7
  90. data/spec/controllers/admin/essence_pictures_controller_spec.rb +52 -42
  91. data/spec/controllers/admin/languages_controller_spec.rb +3 -3
  92. data/spec/controllers/admin/pages_controller_spec.rb +81 -71
  93. data/spec/controllers/admin/pictures_controller_spec.rb +69 -72
  94. data/spec/controllers/admin/resources_controller_spec.rb +5 -5
  95. data/spec/controllers/admin/trash_controller_spec.rb +15 -12
  96. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +8 -8
  97. data/spec/controllers/alchemy/api/contents_controller_spec.rb +73 -0
  98. data/spec/controllers/alchemy/api/elements_controller_spec.rb +69 -0
  99. data/spec/controllers/alchemy/api/pages_controller_spec.rb +86 -0
  100. data/spec/controllers/attachments_controller_spec.rb +8 -8
  101. data/spec/controllers/contents_controller_spec.rb +22 -0
  102. data/spec/controllers/elements_controller_spec.rb +10 -4
  103. data/spec/controllers/messages_controller_spec.rb +35 -34
  104. data/spec/controllers/pages_controller_spec.rb +37 -28
  105. data/spec/controllers/pictures_controller_spec.rb +90 -23
  106. data/spec/dummy/app/models/dummy_user.rb +0 -4
  107. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_editor.html.erb +11 -0
  108. data/spec/dummy/config/alchemy/elements.yml +22 -1
  109. data/spec/dummy/config/alchemy/page_layouts.yml +4 -0
  110. data/spec/dummy/config/application.rb +2 -1
  111. data/spec/dummy/config/environments/test.rb +3 -1
  112. data/spec/features/admin/dashboard_spec.rb +41 -6
  113. data/spec/features/admin/language_tree_feature_spec.rb +3 -3
  114. data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
  115. data/spec/features/admin/link_overlay_spec.rb +7 -7
  116. data/spec/features/admin/locale_select_feature_spec.rb +5 -2
  117. data/spec/features/admin/modules_integration_spec.rb +1 -1
  118. data/spec/features/admin/page_creation_feature_spec.rb +3 -2
  119. data/spec/features/admin/page_editing_feature_spec.rb +66 -79
  120. data/spec/features/admin/picture_library_integration_spec.rb +8 -8
  121. data/spec/features/admin/resources_integration_spec.rb +21 -21
  122. data/spec/features/admin/tinymce_feature_spec.rb +36 -0
  123. data/spec/features/navigation_spec.rb +1 -1
  124. data/spec/features/page_feature_spec.rb +34 -34
  125. data/spec/features/picture_security_spec.rb +4 -4
  126. data/spec/features/security_spec.rb +1 -1
  127. data/spec/features/translation_integration_spec.rb +7 -7
  128. data/spec/helpers/admin/base_helper_spec.rb +51 -49
  129. data/spec/helpers/admin/contents_helper_spec.rb +11 -11
  130. data/spec/helpers/admin/elements_helper_spec.rb +20 -17
  131. data/spec/helpers/admin/essences_helper_spec.rb +42 -11
  132. data/spec/helpers/admin/navigation_helper_spec.rb +64 -54
  133. data/spec/helpers/admin/pages_helper_spec.rb +10 -10
  134. data/spec/helpers/admin/tags_helper_spec.rb +16 -16
  135. data/spec/helpers/base_helper_spec.rb +11 -11
  136. data/spec/helpers/elements_block_helper_spec.rb +24 -24
  137. data/spec/helpers/elements_helper_spec.rb +46 -46
  138. data/spec/helpers/essences_helper_spec.rb +90 -17
  139. data/spec/helpers/pages_helper_spec.rb +53 -53
  140. data/spec/helpers/picture_url_helpers_spec.rb +6 -6
  141. data/spec/helpers/url_helper_spec.rb +32 -32
  142. data/spec/libraries/config_spec.rb +9 -9
  143. data/spec/libraries/controller_actions_spec.rb +14 -14
  144. data/spec/libraries/i18n_spec.rb +6 -6
  145. data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +4 -4
  146. data/spec/libraries/modules_spec.rb +4 -4
  147. data/spec/libraries/mount_point_spec.rb +13 -13
  148. data/spec/libraries/page_layout_spec.rb +24 -24
  149. data/spec/libraries/permissions_spec.rb +97 -80
  150. data/spec/libraries/resource_spec.rb +37 -37
  151. data/spec/libraries/resources_helper_spec.rb +19 -19
  152. data/spec/libraries/shell_spec.rb +17 -17
  153. data/spec/libraries/template_tracker_spec.rb +14 -14
  154. data/spec/libraries/tinymce_spec.rb +8 -8
  155. data/spec/libraries/userstamp_spec.rb +2 -2
  156. data/spec/mailers/messages_spec.rb +4 -4
  157. data/spec/models/attachment_spec.rb +86 -30
  158. data/spec/models/cell_spec.rb +10 -10
  159. data/spec/models/content_spec.rb +106 -46
  160. data/spec/models/element_spec.rb +94 -115
  161. data/spec/models/essence_date_spec.rb +1 -1
  162. data/spec/models/essence_file_spec.rb +4 -4
  163. data/spec/models/essence_picture_spec.rb +56 -25
  164. data/spec/models/essence_richtext_spec.rb +1 -1
  165. data/spec/models/essence_text_spec.rb +7 -7
  166. data/spec/models/language_spec.rb +12 -12
  167. data/spec/models/legacy_page_url_spec.rb +2 -2
  168. data/spec/models/message_spec.rb +12 -5
  169. data/spec/models/page_spec.rb +259 -235
  170. data/spec/models/picture_spec.rb +72 -166
  171. data/spec/models/site_spec.rb +41 -41
  172. data/spec/models/tag_spec.rb +7 -7
  173. data/spec/routing/api_routing_spec.rb +150 -0
  174. data/spec/routing/routing_spec.rb +28 -28
  175. data/spec/spec_helper.rb +6 -5
  176. data/spec/support/hint_examples.rb +5 -5
  177. data/spec/support/transformation_examples.rb +173 -0
  178. data/spec/tasks/helpers_spec.rb +29 -29
  179. data/spec/views/essences/essence_boolean_editor_spec.rb +32 -0
  180. data/spec/views/essences/essence_boolean_view_spec.rb +2 -2
  181. data/spec/views/essences/essence_date_view_spec.rb +1 -1
  182. data/spec/views/essences/essence_link_view_spec.rb +11 -0
  183. data/spec/views/essences/essence_picture_view_spec.rb +56 -11
  184. data/spec/views/essences/essence_richtext_view_spec.rb +12 -0
  185. data/spec/views/essences/essence_text_view_spec.rb +12 -0
  186. data/vendor/assets/javascripts/tinymce/langs/de.js +20 -2
  187. data/vendor/assets/javascripts/tinymce/langs/fr.js +14 -1
  188. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -4
  189. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +1 -1
  190. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +1 -1
  191. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +1 -1
  192. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +1 -1
  193. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +1 -1
  194. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +1 -1
  195. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +1 -1
  196. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +1 -1
  197. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  198. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +1 -1
  199. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  200. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  201. data/vendor/assets/javascripts/tinymce/tinymce.min.js +11 -10
  202. metadata +72 -42
  203. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +0 -12
  204. data/config/locales/alchemy.es.yml +0 -958
  205. data/config/locales/alchemy.ru.yml +0 -837
  206. data/config/locales/simple_form.es.yml +0 -6
  207. data/config/locales/simple_form.ru.yml +0 -25
  208. data/lib/rails/generators/alchemy/scaffold/files/alchemy.es.yml +0 -31
  209. data/vendor/assets/javascripts/tinymce/langs/es.js +0 -197
  210. data/vendor/assets/javascripts/tinymce/langs/ru.js +0 -197
@@ -6,36 +6,36 @@ module Alchemy
6
6
  describe "#render_message" do
7
7
  context "if no argument is passed" do
8
8
  it "should render a div with an info icon and the given content" do
9
- helper.render_message{ content_tag(:p, "my notice") }.should match(/<div class="info message"><span class="icon info"><\/span><p>my notice/)
9
+ expect(helper.render_message{ content_tag(:p, "my notice") }).to match(/<div class="info message"><span class="icon info"><\/span><p>my notice/)
10
10
  end
11
11
  end
12
12
 
13
13
  context "if an argument is passed" do
14
14
  it "should render the passed argument as the css classname for the icon container" do
15
- helper.render_message(:error){ content_tag(:p, "my notice") }.should match(/<div class="error message"><span class="icon error">/)
15
+ expect(helper.render_message(:error){ content_tag(:p, "my notice") }).to match(/<div class="error message"><span class="icon error">/)
16
16
  end
17
17
  end
18
18
  end
19
19
 
20
20
  describe "#configuration" do
21
21
  it "should return certain configuration options" do
22
- Config.stub(:show).and_return({"some_option" => true})
23
- helper.configuration(:some_option).should == true
22
+ allow(Config).to receive(:show).and_return({"some_option" => true})
23
+ expect(helper.configuration(:some_option)).to eq(true)
24
24
  end
25
25
  end
26
26
 
27
27
  describe "#multi_language?" do
28
28
  context "if more than one published language exists" do
29
29
  it "should return true" do
30
- Alchemy::Language.stub_chain(:published, :count).and_return(2)
31
- helper.multi_language?.should == true
30
+ allow(Alchemy::Language).to receive(:published).and_return double(count: 2)
31
+ expect(helper.multi_language?).to eq(true)
32
32
  end
33
33
  end
34
34
 
35
35
  context "if less than two published languages exists" do
36
36
  it "should return false" do
37
- Alchemy::Language.stub_chain(:published, :count).and_return(1)
38
- helper.multi_language?.should == false
37
+ allow(Alchemy::Language).to receive(:published).and_return double(count: 1)
38
+ expect(helper.multi_language?).to eq(false)
39
39
  end
40
40
  end
41
41
  end
@@ -46,16 +46,16 @@ module Alchemy
46
46
  let(:page) { FactoryGirl.create(:public_page, parent_id: parent.id) }
47
47
 
48
48
  it "returns an array of all parents including self" do
49
- helper.breadcrumb(page).should == [lang_root, parent, page]
49
+ expect(helper.breadcrumb(page)).to eq([lang_root, parent, page])
50
50
  end
51
51
 
52
52
  it "does not include the root page" do
53
- helper.breadcrumb(page).should_not include(Page.root)
53
+ expect(helper.breadcrumb(page)).not_to include(Page.root)
54
54
  end
55
55
 
56
56
  context "with current page nil" do
57
57
  it "should return an empty array" do
58
- helper.breadcrumb(nil).should == []
58
+ expect(helper.breadcrumb(nil)).to eq([])
59
59
  end
60
60
  end
61
61
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  include Alchemy::ElementsHelper
4
4
 
5
5
  module Alchemy
6
- describe ElementsBlockHelper do
6
+ describe 'ElementsBlockHelper' do
7
7
  let(:page) { FactoryGirl.create(:public_page) }
8
8
  let(:element) { FactoryGirl.create(:element, page: page, tag_list: 'foo, bar') }
9
9
  let(:expected_wrapper_tag) { "div.#{element.name}##{element_dom_id(element)}" }
@@ -15,35 +15,35 @@ module Alchemy
15
15
  end
16
16
 
17
17
  it "should wrap its output in a DOM element" do
18
- element_view_for(element).
19
- should have_css expected_wrapper_tag
18
+ expect(element_view_for(element)).
19
+ to have_css expected_wrapper_tag
20
20
  end
21
21
 
22
22
  it "should change the wrapping DOM element according to parameters" do
23
- element_view_for(element, tag: 'span', class: 'some_class', id: 'some_id').
24
- should have_css 'span.some_class#some_id'
23
+ expect(element_view_for(element, tag: 'span', class: 'some_class', id: 'some_id')).
24
+ to have_css 'span.some_class#some_id'
25
25
  end
26
26
 
27
27
  it "should include the element's tags in the wrapper DOM element" do
28
- element_view_for(element).
29
- should have_css "#{expected_wrapper_tag}[data-element-tags='foo bar']"
28
+ expect(element_view_for(element)).
29
+ to have_css "#{expected_wrapper_tag}[data-element-tags='foo bar']"
30
30
  end
31
31
 
32
32
  it "should use the provided tags formatter to format tags" do
33
- element_view_for(element, tags_formatter: lambda { |tags| tags.join ", " }).
34
- should have_css "#{expected_wrapper_tag}[data-element-tags='foo, bar']"
33
+ expect(element_view_for(element, tags_formatter: lambda { |tags| tags.join ", " })).
34
+ to have_css "#{expected_wrapper_tag}[data-element-tags='foo, bar']"
35
35
  end
36
36
 
37
37
  it "should include the contents rendered by the block passed to it" do
38
- element_view_for(element) do
38
+ expect(element_view_for(element) do
39
39
  'view'
40
- end.should have_content 'view'
40
+ end).to have_content 'view'
41
41
  end
42
42
 
43
43
  context "when/if preview mode is not active" do
44
44
  subject { element_view_for(element) }
45
- it { should have_css expected_wrapper_tag }
46
- it { should_not have_css "#{expected_wrapper_tag}[data-alchemy-element]" }
45
+ it { is_expected.to have_css expected_wrapper_tag }
46
+ it { is_expected.not_to have_css "#{expected_wrapper_tag}[data-alchemy-element]" }
47
47
  end
48
48
 
49
49
  context "when/if preview mode is active" do
@@ -53,7 +53,7 @@ module Alchemy
53
53
  end
54
54
 
55
55
  subject { helper.element_view_for(element) }
56
- it { should have_css "#{expected_wrapper_tag}[data-alchemy-element='#{element.id}']" }
56
+ it { is_expected.to have_css "#{expected_wrapper_tag}[data-alchemy-element='#{element.id}']" }
57
57
  end
58
58
  end
59
59
 
@@ -64,13 +64,13 @@ module Alchemy
64
64
  end
65
65
 
66
66
  it "should not add any extra elements" do
67
- element_editor_for(element) do
67
+ expect(element_editor_for(element) do
68
68
  'view'
69
- end.should == 'view'
69
+ end).to eq('view')
70
70
  end
71
71
  end
72
72
 
73
- describe ElementsBlockHelper::ElementViewHelper do
73
+ describe 'ElementsBlockHelper::ElementViewHelper' do
74
74
  let(:scope) { double }
75
75
  subject { ElementsBlockHelper::ElementViewHelper.new(scope, element: element) }
76
76
 
@@ -80,35 +80,35 @@ module Alchemy
80
80
 
81
81
  describe '#render' do
82
82
  it 'should delegate to the render_essence_view_by_name helper' do
83
- scope.should_receive(:render_essence_view_by_name).with(element, "title", foo: 'bar')
83
+ expect(scope).to receive(:render_essence_view_by_name).with(element, "title", foo: 'bar')
84
84
  subject.render :title, foo: 'bar'
85
85
  end
86
86
  end
87
87
 
88
88
  describe '#content' do
89
89
  it "should delegate to the element's #content_by_name method" do
90
- element.should_receive(:content_by_name).with(:title)
90
+ expect(element).to receive(:content_by_name).with(:title)
91
91
  subject.content :title
92
92
  end
93
93
  end
94
94
 
95
95
  describe '#ingredient' do
96
96
  it "should delegate to the element's #ingredient method" do
97
- element.should_receive(:ingredient).with(:title)
97
+ expect(element).to receive(:ingredient).with(:title)
98
98
  subject.ingredient :title
99
99
  end
100
100
  end
101
101
 
102
102
  describe '#has?' do
103
103
  it "should delegate to the element's #has_ingredient? method" do
104
- element.should_receive(:has_ingredient?).with(:title)
104
+ expect(element).to receive(:has_ingredient?).with(:title)
105
105
  subject.has? :title
106
106
  end
107
107
  end
108
108
 
109
109
  describe '#essence' do
110
110
  it "should provide the specified content essence" do
111
- subject.should_receive(:content).with(:title).
111
+ expect(subject).to receive(:content).with(:title).
112
112
  and_return(mock_model('Content', :essence => mock_model('EssenceText')))
113
113
 
114
114
  subject.essence :title
@@ -116,7 +116,7 @@ module Alchemy
116
116
  end
117
117
  end
118
118
 
119
- describe ElementsBlockHelper::ElementEditorHelper do
119
+ describe 'ElementsBlockHelper::ElementEditorHelper' do
120
120
  let(:scope) { double }
121
121
  subject { ElementsBlockHelper::ElementEditorHelper.new(scope, element: element) }
122
122
 
@@ -126,7 +126,7 @@ module Alchemy
126
126
 
127
127
  describe '#edit' do
128
128
  it "should delegate to the render_essence_editor_by_name helper" do
129
- scope.should_receive(:render_essence_editor_by_name).with(element, "title", foo: 'bar')
129
+ expect(scope).to receive(:render_essence_editor_by_name).with(element, "title", foo: 'bar')
130
130
  subject.edit :title, foo: 'bar'
131
131
  end
132
132
  end
@@ -8,7 +8,7 @@ module Alchemy
8
8
 
9
9
  before do
10
10
  assign(:page, page)
11
- Element.any_instance.stub(store_page: true)
11
+ allow_any_instance_of(Element).to receive(:store_page).and_return(true)
12
12
  end
13
13
 
14
14
  describe '#render_element' do
@@ -17,21 +17,21 @@ module Alchemy
17
17
  context 'with nil element' do
18
18
  let(:element) { nil }
19
19
  let(:part) { :view }
20
- it { should be_nil }
20
+ it { is_expected.to be_nil }
21
21
  end
22
22
 
23
23
  context 'with view as part given' do
24
24
  let(:part) {:view}
25
25
 
26
26
  it "renders the element's view partial" do
27
- should have_selector("##{element.name}_#{element.id}")
27
+ is_expected.to have_selector("##{element.name}_#{element.id}")
28
28
  end
29
29
 
30
30
  context 'with element view partial not found' do
31
31
  let(:element) { build_stubbed(:element, name: 'not_present')}
32
32
 
33
33
  it "renders the view not found partial" do
34
- should match(/Missing view for not_present element/)
34
+ is_expected.to match(/Missing view for not_present element/)
35
35
  end
36
36
  end
37
37
  end
@@ -40,7 +40,7 @@ module Alchemy
40
40
  let(:part) {:editor}
41
41
 
42
42
  it "renders the element's editor partial" do
43
- helper.should_receive(:render_essence_editor_by_name)
43
+ expect(helper).to receive(:render_essence_editor_by_name)
44
44
  subject
45
45
  end
46
46
 
@@ -48,8 +48,8 @@ module Alchemy
48
48
  let(:element) { build_stubbed(:element, name: 'not_present')}
49
49
 
50
50
  it "renders the editor not found partial" do
51
- should have_selector('div.error')
52
- should have_content('Element editor partial not found')
51
+ is_expected.to have_selector('div.error')
52
+ is_expected.to have_content('Element editor partial not found')
53
53
  end
54
54
  end
55
55
  end
@@ -59,7 +59,7 @@ module Alchemy
59
59
  subject { helper.element_dom_id(element) }
60
60
 
61
61
  it "should render a unique dom id for element" do
62
- should == "#{element.name}_#{element.id}"
62
+ is_expected.to eq("#{element.name}_#{element.id}")
63
63
  end
64
64
  end
65
65
 
@@ -73,12 +73,12 @@ module Alchemy
73
73
  let(:options) { {} }
74
74
 
75
75
  before do
76
- page.should_receive(:find_elements).and_return(elements)
76
+ expect(page).to receive(:find_elements).and_return(elements)
77
77
  end
78
78
 
79
79
  it "should render all elements from page." do
80
- should have_selector("##{element.name}_#{element.id}")
81
- should have_selector("##{another_element.name}_#{another_element.id}")
80
+ is_expected.to have_selector("##{element.name}_#{element.id}")
81
+ is_expected.to have_selector("##{another_element.name}_#{another_element.id}")
82
82
  end
83
83
  end
84
84
 
@@ -88,12 +88,12 @@ module Alchemy
88
88
  let(:options) { {from_page: another_page} }
89
89
 
90
90
  before do
91
- another_page.should_receive(:find_elements).and_return(elements)
91
+ expect(another_page).to receive(:find_elements).and_return(elements)
92
92
  end
93
93
 
94
94
  it "should render all elements from that page." do
95
- should have_selector("##{element.name}_#{element.id}")
96
- should have_selector("##{another_element.name}_#{another_element.id}")
95
+ is_expected.to have_selector("##{element.name}_#{element.id}")
96
+ is_expected.to have_selector("##{another_element.name}_#{another_element.id}")
97
97
  end
98
98
  end
99
99
 
@@ -104,15 +104,15 @@ module Alchemy
104
104
  let(:options) { {from_page: 'news'} }
105
105
 
106
106
  before do
107
- Language.stub_chain(:current, :pages, :where).and_return(pages)
108
- another_page.should_receive(:find_elements).and_return(other_elements)
107
+ allow(Language).to receive(:current).and_return double(pages: double(where: pages))
108
+ expect(another_page).to receive(:find_elements).and_return(other_elements)
109
109
  end
110
110
 
111
111
  context 'and one page can be found by page layout' do
112
112
  let(:pages) { [another_page] }
113
113
 
114
114
  it "it renders all elements from that page." do
115
- should have_selector("##{another_element.name}_#{another_element.id}")
115
+ is_expected.to have_selector("##{another_element.name}_#{another_element.id}")
116
116
  end
117
117
  end
118
118
 
@@ -120,12 +120,12 @@ module Alchemy
120
120
  let(:pages) { [page, another_page] }
121
121
 
122
122
  before do
123
- page.should_receive(:find_elements).and_return(elements)
123
+ expect(page).to receive(:find_elements).and_return(elements)
124
124
  end
125
125
 
126
126
  it 'renders elements from these pages' do
127
- should have_selector("##{element.name}_#{element.id}")
128
- should have_selector("##{another_element.name}_#{another_element.id}")
127
+ is_expected.to have_selector("##{element.name}_#{element.id}")
128
+ is_expected.to have_selector("##{another_element.name}_#{another_element.id}")
129
129
  end
130
130
  end
131
131
  end
@@ -133,7 +133,7 @@ module Alchemy
133
133
 
134
134
  context 'if page is nil' do
135
135
  let(:options) { {from_page: nil} }
136
- it { should be_blank }
136
+ it { is_expected.to be_blank }
137
137
  end
138
138
 
139
139
  context 'with sort_by option given' do
@@ -141,12 +141,12 @@ module Alchemy
141
141
  let(:sorted_elements) { [another_element, element] }
142
142
 
143
143
  before do
144
- elements.should_receive(:sort_by).and_return(sorted_elements)
145
- page.should_receive(:find_elements).and_return(elements)
144
+ expect(elements).to receive(:sort_by).and_return(sorted_elements)
145
+ expect(page).to receive(:find_elements).and_return(elements)
146
146
  end
147
147
 
148
148
  it "renders the elements in the order of given content name" do
149
- should_not be_blank
149
+ is_expected.not_to be_blank
150
150
  end
151
151
  end
152
152
 
@@ -159,12 +159,12 @@ module Alchemy
159
159
  let(:options) { {fallback: {for: 'higgs', with: 'news', from: 'news'}} }
160
160
 
161
161
  before do
162
- Language.stub_chain(:current, :pages, :find_by).and_return(another_page)
163
- another_page.stub_chain(:elements, :named).and_return(elements)
162
+ allow(Language).to receive(:current).and_return double(pages: double(find_by: another_page))
163
+ allow(another_page).to receive(:elements).and_return double(named: elements)
164
164
  end
165
165
 
166
166
  it "renders the fallback element" do
167
- should have_selector("#news_#{another_element.id}")
167
+ is_expected.to have_selector("#news_#{another_element.id}")
168
168
  end
169
169
  end
170
170
 
@@ -172,11 +172,11 @@ module Alchemy
172
172
  let(:options) { {fallback: {for: 'higgs', with: 'news', from: another_page}} }
173
173
 
174
174
  before do
175
- another_page.stub_chain(:elements, :named).and_return(elements)
175
+ allow(another_page).to receive(:elements).and_return double(named: elements)
176
176
  end
177
177
 
178
178
  it "renders the fallback element" do
179
- should have_selector("#news_#{another_element.id}")
179
+ is_expected.to have_selector("#news_#{another_element.id}")
180
180
  end
181
181
  end
182
182
  end
@@ -185,11 +185,11 @@ module Alchemy
185
185
  let(:options) { {separator: '<hr>'} }
186
186
 
187
187
  before do
188
- page.should_receive(:find_elements).and_return(elements)
188
+ expect(page).to receive(:find_elements).and_return(elements)
189
189
  end
190
190
 
191
191
  it "joins element partials with given string" do
192
- should have_selector('hr')
192
+ is_expected.to have_selector('hr')
193
193
  end
194
194
  end
195
195
  end
@@ -201,13 +201,13 @@ module Alchemy
201
201
  before { assign(:preview_mode, true) }
202
202
 
203
203
  it "should return the data-alchemy-element HTML attribute for element" do
204
- should == {:'data-alchemy-element' => element.id}
204
+ is_expected.to eq({:'data-alchemy-element' => element.id})
205
205
  end
206
206
  end
207
207
 
208
208
  context 'not in preview_mode' do
209
209
  it "should return an empty hash" do
210
- should == {}
210
+ is_expected.to eq({})
211
211
  end
212
212
  end
213
213
  end
@@ -219,13 +219,13 @@ module Alchemy
219
219
  before { assign(:preview_mode, true) }
220
220
 
221
221
  it "should return the data-alchemy-element HTML attribute for element" do
222
- should == " data-alchemy-element=\"#{element.id}\""
222
+ is_expected.to eq(" data-alchemy-element=\"#{element.id}\"")
223
223
  end
224
224
  end
225
225
 
226
226
  context 'not in preview_mode' do
227
227
  it "should not return the data-alchemy-element HTML attribute" do
228
- should_not == " data-alchemy-element=\"#{element.id}\""
228
+ is_expected.not_to eq(" data-alchemy-element=\"#{element.id}\"")
229
229
  end
230
230
  end
231
231
  end
@@ -241,7 +241,7 @@ module Alchemy
241
241
 
242
242
  context "with no formatter lambda given" do
243
243
  it "should return tag list as HTML data attribute" do
244
- should == " data-element-tags=\"peter lustig\""
244
+ is_expected.to eq(" data-element-tags=\"peter lustig\"")
245
245
  end
246
246
  end
247
247
 
@@ -249,13 +249,13 @@ module Alchemy
249
249
  let(:options) { {formatter: ->(tags) { tags.join ", " }} }
250
250
 
251
251
  it "should return a properly formatted HTML data attribute" do
252
- should == " data-element-tags=\"peter, lustig\""
252
+ is_expected.to eq(" data-element-tags=\"peter, lustig\"")
253
253
  end
254
254
  end
255
255
  end
256
256
 
257
257
  context "element not having tags" do
258
- it { should be_blank }
258
+ it { is_expected.to be_blank }
259
259
  end
260
260
  end
261
261
 
@@ -271,13 +271,13 @@ module Alchemy
271
271
  let(:elements) { [element_1, element_2, element_3] }
272
272
 
273
273
  before do
274
- element_1.should_receive(:content_by_name).and_return(ingredient_b)
275
- element_2.should_receive(:content_by_name).and_return(ingredient_c)
276
- element_3.should_receive(:content_by_name).and_return(ingredient_a)
274
+ expect(element_1).to receive(:content_by_name).and_return(ingredient_b)
275
+ expect(element_2).to receive(:content_by_name).and_return(ingredient_c)
276
+ expect(element_3).to receive(:content_by_name).and_return(ingredient_a)
277
277
  end
278
278
 
279
279
  it "sorts the elements by content" do
280
- should eq [element_3, element_1, element_2]
280
+ is_expected.to eq [element_3, element_1, element_2]
281
281
  end
282
282
 
283
283
  context 'with element not having this content' do
@@ -285,11 +285,11 @@ module Alchemy
285
285
  let(:elements) { [element_1, element_2, element_3, element_4] }
286
286
 
287
287
  before do
288
- element_4.should_receive(:content_by_name).and_return(nil)
288
+ expect(element_4).to receive(:content_by_name).and_return(nil)
289
289
  end
290
290
 
291
291
  it "puts it at first place" do
292
- should eq [element_4, element_3, element_1, element_2]
292
+ is_expected.to eq [element_4, element_3, element_1, element_2]
293
293
  end
294
294
  end
295
295
 
@@ -298,11 +298,11 @@ module Alchemy
298
298
  let(:elements) { [element_1, element_2, element_3, element_4] }
299
299
 
300
300
  before do
301
- element_4.should_receive(:content_by_name).and_return(double(ingredient: nil))
301
+ expect(element_4).to receive(:content_by_name).and_return(double(ingredient: nil))
302
302
  end
303
303
 
304
304
  it "puts it at first place" do
305
- should eq [element_4, element_3, element_1, element_2]
305
+ is_expected.to eq [element_4, element_3, element_1, element_2]
306
306
  end
307
307
  end
308
308
  end