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
@@ -2,24 +2,24 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  describe Content do
5
- let(:element) { FactoryGirl.create(:element, name: 'headline', :create_contents_after_create => true) }
5
+ let(:element) { create(:element, name: 'headline', :create_contents_after_create => true) }
6
6
  let(:content) { element.contents.find_by_essence_type('Alchemy::EssenceText') }
7
7
 
8
8
  it "should return the ingredient from its essence" do
9
9
  content.essence.update_attributes(:body => "Hello")
10
- content.ingredient.should == "Hello"
10
+ expect(content.ingredient).to eq("Hello")
11
11
  end
12
12
 
13
13
  describe '.normalize_essence_type' do
14
14
  context "passing namespaced essence type" do
15
15
  it "should not add alchemy namespace" do
16
- Content.normalize_essence_type('Alchemy::EssenceText').should == "Alchemy::EssenceText"
16
+ expect(Content.normalize_essence_type('Alchemy::EssenceText')).to eq("Alchemy::EssenceText")
17
17
  end
18
18
  end
19
19
 
20
20
  context "passing not namespaced essence type" do
21
21
  it "should add alchemy namespace" do
22
- Content.normalize_essence_type('EssenceText').should == "Alchemy::EssenceText"
22
+ expect(Content.normalize_essence_type('EssenceText')).to eq("Alchemy::EssenceText")
23
23
  end
24
24
  end
25
25
  end
@@ -27,13 +27,13 @@ module Alchemy
27
27
  describe '#normalized_essence_type' do
28
28
  context "without namespace in essence_type column" do
29
29
  it "should return the namespaced essence type" do
30
- Content.new(:essence_type => 'EssenceText').normalized_essence_type.should == 'Alchemy::EssenceText'
30
+ expect(Content.new(:essence_type => 'EssenceText').normalized_essence_type).to eq('Alchemy::EssenceText')
31
31
  end
32
32
  end
33
33
 
34
34
  context "with namespace in essence_type column" do
35
35
  it "should return the namespaced essence type" do
36
- Content.new(:essence_type => 'Alchemy::EssenceText').normalized_essence_type.should == 'Alchemy::EssenceText'
36
+ expect(Content.new(:essence_type => 'Alchemy::EssenceText').normalized_essence_type).to eq('Alchemy::EssenceText')
37
37
  end
38
38
  end
39
39
  end
@@ -49,15 +49,17 @@ module Alchemy
49
49
  let(:params) { {body: 'Mikes Petshop'} }
50
50
  let(:essence) { content.essence }
51
51
 
52
- before { essence.stub(content: content) }
52
+ before do
53
+ expect(essence).to receive(:content).at_least(:once).and_return content
54
+ end
53
55
 
54
56
  it "updates the attributes of related essence and return true" do
55
- should be_true
56
- content.ingredient.should == "Mikes Petshop"
57
+ is_expected.to be_truthy
58
+ expect(content.ingredient).to eq("Mikes Petshop")
57
59
  end
58
60
 
59
61
  it "updates timestamp after updating related essence" do
60
- content.should_receive(:touch)
62
+ expect(content).to receive(:touch)
61
63
  subject
62
64
  end
63
65
  end
@@ -66,14 +68,14 @@ module Alchemy
66
68
  let(:element) { create(:element, name: 'contactform', create_contents_after_create: true) }
67
69
 
68
70
  it "should add error messages if save fails and return false" do
69
- should be_false
70
- content.errors[:essence].should have(1).item
71
+ is_expected.to be_falsey
72
+ expect(content.errors[:essence].size).to eq(1)
71
73
  end
72
74
  end
73
75
 
74
76
  context 'if essence is missing' do
75
77
  before do
76
- content.stub(essence: nil)
78
+ expect(content).to receive(:essence).and_return nil
77
79
  end
78
80
 
79
81
  it "should raise error" do
@@ -90,12 +92,12 @@ module Alchemy
90
92
 
91
93
  it "should create a new record with all attributes of source except given differences" do
92
94
  copy = Content.copy(@content, {:name => 'foobar', :element_id => @element.id + 1})
93
- copy.name.should == 'foobar'
95
+ expect(copy.name).to eq('foobar')
94
96
  end
95
97
 
96
98
  it "should make a new record for essence of source" do
97
99
  copy = Content.copy(@content, {:element_id => @element.id + 1})
98
- copy.essence_id.should_not == @content.essence_id
100
+ expect(copy.essence_id).not_to eq(@content.essence_id)
99
101
  end
100
102
 
101
103
  it "should copy source essence attributes" do
@@ -108,7 +110,7 @@ module Alchemy
108
110
  let(:element) { FactoryGirl.build_stubbed(:element) }
109
111
 
110
112
  it "builds a new instance from elements.yml description" do
111
- Content.build(element, {name: 'headline'}).should be_instance_of(Content)
113
+ expect(Content.build(element, {name: 'headline'})).to be_instance_of(Content)
112
114
  end
113
115
  end
114
116
 
@@ -117,14 +119,14 @@ module Alchemy
117
119
 
118
120
  context "with blank name key" do
119
121
  it "returns a essence hash build from essence type" do
120
- Content.should_receive(:content_description_from_essence_type).with(element, 'EssenceText')
122
+ expect(Content).to receive(:content_description_from_essence_type).with(element, 'EssenceText')
121
123
  Content.content_description(element, essence_type: 'EssenceText')
122
124
  end
123
125
  end
124
126
 
125
127
  context "with name key present" do
126
128
  it "returns a essence hash from element" do
127
- Content.should_receive(:content_description_from_element).with(element, 'headline')
129
+ expect(Content).to receive(:content_description_from_element).with(element, 'headline')
128
130
  Content.content_description(element, name: 'headline')
129
131
  end
130
132
  end
@@ -135,18 +137,18 @@ module Alchemy
135
137
  let(:essence) { {name: 'headline', type: 'EssenceText'} }
136
138
 
137
139
  it "returns the description hash from element" do
138
- element.should_receive(:content_description_for).and_return(essence)
139
- Content.content_description(element, name: 'headline').should == essence
140
+ expect(element).to receive(:content_description_for).and_return(essence)
141
+ expect(Content.content_description(element, name: 'headline')).to eq(essence)
140
142
  end
141
143
 
142
144
  context "with content description not found" do
143
145
  before {
144
- element.should_receive(:content_description_for).and_return(nil)
145
- element.should_receive(:available_content_description_for).and_return(essence)
146
+ expect(element).to receive(:content_description_for).and_return(nil)
147
+ expect(element).to receive(:available_content_description_for).and_return(essence)
146
148
  }
147
149
 
148
150
  it "returns the description hash from available contents" do
149
- Content.content_description(element, name: 'headline').should == essence
151
+ expect(Content.content_description(element, name: 'headline')).to eq(essence)
150
152
  end
151
153
  end
152
154
  end
@@ -155,11 +157,11 @@ module Alchemy
155
157
  let(:element) { FactoryGirl.build_stubbed(:element) }
156
158
 
157
159
  it "returns the description hash from element" do
158
- Content.should_receive(:content_name_from_element_and_essence_type).with(element, 'EssenceText').and_return('Foo')
159
- Content.content_description_from_essence_type(element, 'EssenceText').should == {
160
+ expect(Content).to receive(:content_name_from_element_and_essence_type).with(element, 'EssenceText').and_return('Foo')
161
+ expect(Content.content_description_from_essence_type(element, 'EssenceText')).to eq({
160
162
  'type' => 'EssenceText',
161
163
  'name' => 'Foo'
162
- }
164
+ })
163
165
  end
164
166
  end
165
167
 
@@ -167,7 +169,7 @@ module Alchemy
167
169
  let(:element) { FactoryGirl.build_stubbed(:element) }
168
170
 
169
171
  it "returns a name from essence type and count of essences in element" do
170
- Content.content_name_from_element_and_essence_type(element, 'EssenceText').should == "essence_text_1"
172
+ expect(Content.content_name_from_element_and_essence_type(element, 'EssenceText')).to eq("essence_text_1")
171
173
  end
172
174
  end
173
175
 
@@ -188,24 +190,24 @@ module Alchemy
188
190
 
189
191
  context "with default value present" do
190
192
  it "should have the ingredient column filled with default value." do
191
- Content.stub(:content_description_from_element).and_return({'name' => 'headline', 'type' => 'EssenceText', 'default' => 'Welcome'})
193
+ allow(Content).to receive(:content_description_from_element).and_return({'name' => 'headline', 'type' => 'EssenceText', 'default' => 'Welcome'})
192
194
  content = Content.create_from_scratch(element, name: 'headline')
193
- content.ingredient.should == "Welcome"
195
+ expect(content.ingredient).to eq("Welcome")
194
196
  end
195
197
  end
196
198
  end
197
199
 
198
200
  describe '#ingredient=' do
199
- let (:element) { FactoryGirl.create(:element, name: 'headline') }
201
+ let(:element) { FactoryGirl.create(:element, name: 'headline') }
200
202
 
201
203
  it "should set the given value to the ingredient column of essence" do
202
204
  c = Content.create_from_scratch(element, name: 'headline')
203
205
  c.ingredient = "Welcome"
204
- c.ingredient.should == "Welcome"
206
+ expect(c.ingredient).to eq("Welcome")
205
207
  end
206
208
 
207
209
  context "no essence associated" do
208
- let (:element) { FactoryGirl.create(:element, name: 'headline') }
210
+ let(:element) { FactoryGirl.create(:element, name: 'headline') }
209
211
 
210
212
  it "should raise error" do
211
213
  c = Content.create(:element_id => element.id, name: 'headline')
@@ -216,10 +218,10 @@ module Alchemy
216
218
 
217
219
  describe "#descriptions" do
218
220
  context "without any descriptions in elements.yml file" do
219
- before { Element.stub(:descriptions).and_return([]) }
221
+ before { allow(Element).to receive(:descriptions).and_return([]) }
220
222
 
221
223
  it "should return an empty array" do
222
- Content.descriptions.should == []
224
+ expect(Content.descriptions).to eq([])
223
225
  end
224
226
  end
225
227
  end
@@ -228,14 +230,14 @@ module Alchemy
228
230
  let(:content) { build_stubbed(:content) }
229
231
 
230
232
  it "returns a dom id string" do
231
- content.dom_id.should eq("essence_text_#{content.id}")
233
+ expect(content.dom_id).to eq("essence_text_#{content.id}")
232
234
  end
233
235
 
234
236
  context "without an essence" do
235
- before { content.stub(essence: nil) }
237
+ before { expect(content).to receive(:essence).and_return nil }
236
238
 
237
239
  it "returns empty string" do
238
- content.dom_id.should eq('')
240
+ expect(content.dom_id).to eq('')
239
241
  end
240
242
  end
241
243
  end
@@ -244,15 +246,56 @@ module Alchemy
244
246
  let(:content) { build_stubbed(:content) }
245
247
 
246
248
  it "returns the essence#partial_name" do
247
- content.essence.should_receive(:partial_name)
249
+ expect(content.essence).to receive(:partial_name)
248
250
  content.essence_partial_name
249
251
  end
250
252
 
251
253
  context "without an essence" do
252
- before { content.stub(essence: nil) }
254
+ before { expect(content).to receive(:essence).and_return nil }
253
255
 
254
256
  it "returns empty string" do
255
- content.essence_partial_name.should eq('')
257
+ expect(content.essence_partial_name).to eq('')
258
+ end
259
+ end
260
+ end
261
+
262
+ describe '#preview_content?' do
263
+ let(:content) { build_stubbed(:content) }
264
+
265
+ context 'not defined as preview content' do
266
+ it "returns false" do
267
+ expect(content.preview_content?).to be false
268
+ end
269
+ end
270
+
271
+ context 'defined as preview content via take_me_for_preview' do
272
+ before do
273
+ expect(content).to receive(:description).at_least(:once).and_return({
274
+ 'take_me_for_preview' => true
275
+ })
276
+ end
277
+
278
+ it "returns true" do
279
+ ActiveSupport::Deprecation.silence do
280
+ expect(content.preview_content?).to be true
281
+ end
282
+ end
283
+
284
+ it "display deprecation warning" do
285
+ expect(ActiveSupport::Deprecation).to receive(:warn)
286
+ content.preview_content?
287
+ end
288
+ end
289
+
290
+ context 'defined as preview content via as_element_title' do
291
+ before do
292
+ expect(content).to receive(:description).at_least(:once).and_return({
293
+ 'as_element_title' => true
294
+ })
295
+ end
296
+
297
+ it "returns true" do
298
+ expect(content.preview_content?).to be true
256
299
  end
257
300
  end
258
301
  end
@@ -262,7 +305,7 @@ module Alchemy
262
305
  let(:content) { c = Content.new; c.essence = essence; c }
263
306
 
264
307
  it "should return the essences preview_text" do
265
- essence.should_receive(:preview_text).with(30)
308
+ expect(essence).to receive(:preview_text).with(30)
266
309
  content.preview_text
267
310
  end
268
311
  end
@@ -275,7 +318,7 @@ module Alchemy
275
318
  it { eq('default_tinymce') }
276
319
 
277
320
  context 'having custom tinymce config' do
278
- before { content.stub(:has_custom_tinymce_config?).and_return(true) }
321
+ before { allow(content).to receive(:has_custom_tinymce_config?).and_return(true) }
279
322
  it('returns name including element name') { eq('custom_tinymce article_text') }
280
323
  end
281
324
  end
@@ -284,12 +327,12 @@ module Alchemy
284
327
  let(:content) { Content.new(id: 1) }
285
328
 
286
329
  it "returns a name value for form fields with ingredient as default" do
287
- content.form_field_name.should == 'contents[1][ingredient]'
330
+ expect(content.form_field_name).to eq('contents[1][ingredient]')
288
331
  end
289
332
 
290
333
  context 'with a essence column given' do
291
334
  it "returns a name value for form fields for that column" do
292
- content.form_field_name(:link_title).should == 'contents[1][link_title]'
335
+ expect(content.form_field_name(:link_title)).to eq('contents[1][link_title]')
293
336
  end
294
337
  end
295
338
  end
@@ -298,12 +341,12 @@ module Alchemy
298
341
  let(:content) { Content.new(id: 1) }
299
342
 
300
343
  it "returns a id value for form fields with ingredient as default" do
301
- content.form_field_id.should == 'contents_1_ingredient'
344
+ expect(content.form_field_id).to eq('contents_1_ingredient')
302
345
  end
303
346
 
304
347
  context 'with a essence column given' do
305
348
  it "returns a id value for form fields for that column" do
306
- content.form_field_id(:link_title).should == 'contents_1_link_title'
349
+ expect(content.form_field_id(:link_title)).to eq('contents_1_link_title')
307
350
  end
308
351
  end
309
352
  end
@@ -312,5 +355,22 @@ module Alchemy
312
355
  let(:subject) { Content.new }
313
356
  end
314
357
 
358
+ describe '#settings' do
359
+ let(:element) { build_stubbed(:element, name: 'article') }
360
+ let(:content) { build_stubbed(:content, name: 'headline', element: element) }
361
+
362
+ it "returns the settings hash from description" do
363
+ expect(content.settings).to eq({deletable: true})
364
+ end
365
+
366
+ context 'if settings are not defined' do
367
+ let(:content) { build_stubbed(:content, name: 'intro', element: element) }
368
+
369
+ it "returns empty hash" do
370
+ expect(content.settings).to eq({})
371
+ end
372
+ end
373
+ end
374
+
315
375
  end
316
376
  end
@@ -13,28 +13,28 @@ module Alchemy
13
13
 
14
14
  it "should not create contents from scratch" do
15
15
  copy = Element.copy(element)
16
- copy.contents.count.should == element.contents.count
16
+ expect(copy.contents.count).to eq(element.contents.count)
17
17
  end
18
18
 
19
19
  it "should create a new record with all attributes of source except given differences" do
20
20
  copy = Element.copy(element, {:name => 'foobar'})
21
- copy.name.should == 'foobar'
21
+ expect(copy.name).to eq('foobar')
22
22
  end
23
23
 
24
24
  it "should make copies of all contents of source" do
25
25
  copy = Element.copy(element)
26
- copy.contents.pluck(:id).should_not == element.contents.pluck(:id)
26
+ expect(copy.contents.pluck(:id)).not_to eq(element.contents.pluck(:id))
27
27
  end
28
28
 
29
29
  it "the copy should include source element tags" do
30
30
  copy = Element.copy(element)
31
- copy.tag_list.should == element.tag_list
31
+ expect(copy.tag_list).to eq(element.tag_list)
32
32
  end
33
33
  end
34
34
 
35
35
  describe '.definitions' do
36
36
  context "without existing yml files" do
37
- before { File.stub(:exists?).and_return(false) }
37
+ before { allow(File).to receive(:exists?).and_return(false) }
38
38
 
39
39
  it "should raise an error" do
40
40
  expect { Element.definitions }.to raise_error(LoadError)
@@ -42,17 +42,17 @@ module Alchemy
42
42
  end
43
43
 
44
44
  context "without any definitions in elements.yml" do
45
- before { YAML.stub(:load_file).and_return(false) } # Yes, YAML.load_file returns false if an empty file exists.
45
+ before { allow(YAML).to receive(:load_file).and_return(false) } # Yes, YAML.load_file returns false if an empty file exists.
46
46
 
47
47
  it "should return an empty array" do
48
- Element.definitions.should == []
48
+ expect(Element.definitions).to eq([])
49
49
  end
50
50
  end
51
51
  end
52
52
 
53
53
  describe '.display_name_for' do
54
54
  it "should return the translation for the given name" do
55
- I18n.should_receive(:t).with('subheadline', scope: "element_names", default: 'Subheadline').and_return('Überschrift')
55
+ expect(I18n).to receive(:t).with('subheadline', scope: "element_names", default: 'Subheadline').and_return('Überschrift')
56
56
  expect(Element.display_name_for('subheadline')).to eq('Überschrift')
57
57
  end
58
58
 
@@ -66,7 +66,7 @@ module Alchemy
66
66
  FactoryGirl.create(:element, :name => 'article')
67
67
  FactoryGirl.create(:element, :name => 'article')
68
68
  excluded = FactoryGirl.create(:element, :name => 'claim')
69
- Element.excluded(['claim']).should_not include(excluded)
69
+ expect(Element.excluded(['claim'])).not_to include(excluded)
70
70
  end
71
71
  end
72
72
 
@@ -75,8 +75,8 @@ module Alchemy
75
75
  element_1 = FactoryGirl.create(:element, :name => 'article')
76
76
  element_2 = FactoryGirl.create(:element, :name => 'article')
77
77
  elements = Element.named(['article'])
78
- elements.should include(element_1)
79
- elements.should include(element_2)
78
+ expect(elements).to include(element_1)
79
+ expect(elements).to include(element_2)
80
80
  end
81
81
  end
82
82
 
@@ -85,7 +85,7 @@ module Alchemy
85
85
  Element.delete_all
86
86
  FactoryGirl.create(:element, :cell_id => 6)
87
87
  FactoryGirl.create(:element, :cell_id => nil)
88
- Element.not_in_cell.should have(1).element
88
+ expect(Element.not_in_cell.size).to eq(1)
89
89
  end
90
90
  end
91
91
 
@@ -94,8 +94,8 @@ module Alchemy
94
94
  element_1 = FactoryGirl.create(:element, :public => true)
95
95
  element_2 = FactoryGirl.create(:element, :public => true)
96
96
  elements = Element.published
97
- elements.should include(element_1)
98
- elements.should include(element_2)
97
+ expect(elements).to include(element_1)
98
+ expect(elements).to include(element_2)
99
99
  end
100
100
  end
101
101
 
@@ -126,24 +126,24 @@ module Alchemy
126
126
  let(:clipboard) { [{'id' => element_1.id.to_s}, {'id' => element_2.id.to_s}] }
127
127
 
128
128
  before do
129
- Element.stub(:all_from_clipboard).and_return([element_1, element_2])
129
+ allow(Element).to receive(:all_from_clipboard).and_return([element_1, element_2])
130
130
  end
131
131
 
132
132
  it "return all elements from clipboard that could be placed on page" do
133
133
  elements = Element.all_from_clipboard_for_page(clipboard, page)
134
- elements.should == [element_1]
135
- elements.should_not == [element_2]
134
+ expect(elements).to eq([element_1])
135
+ expect(elements).not_to eq([element_2])
136
136
  end
137
137
 
138
138
  context "page nil" do
139
139
  it "returns empty array" do
140
- Element.all_from_clipboard_for_page(clipboard, nil).should == []
140
+ expect(Element.all_from_clipboard_for_page(clipboard, nil)).to eq([])
141
141
  end
142
142
  end
143
143
 
144
144
  context "clipboard nil" do
145
145
  it "returns empty array" do
146
- Element.all_from_clipboard_for_page(nil, page).should == []
146
+ expect(Element.all_from_clipboard_for_page(nil, page)).to eq([])
147
147
  end
148
148
  end
149
149
  end
@@ -156,14 +156,14 @@ module Alchemy
156
156
 
157
157
  context "with namespaced essence type" do
158
158
  subject { element.all_contents_by_type('Alchemy::EssenceText') }
159
- it { should_not be_empty }
160
- it('should return the correct list of essences') { should == expected_contents }
159
+ it { is_expected.not_to be_empty }
160
+ it('should return the correct list of essences') { is_expected.to eq(expected_contents) }
161
161
  end
162
162
 
163
163
  context "without namespaced essence type" do
164
164
  subject { element.all_contents_by_type('EssenceText') }
165
- it { should_not be_empty }
166
- it('should return the correct list of essences') { should == expected_contents }
165
+ it { is_expected.not_to be_empty }
166
+ it('should return the correct list of essences') { is_expected.to eq(expected_contents) }
167
167
  end
168
168
  end
169
169
 
@@ -173,7 +173,7 @@ module Alchemy
173
173
 
174
174
  context "with page having cells defining the correct elements" do
175
175
  before do
176
- Cell.stub(:definitions).and_return([
176
+ allow(Cell).to receive(:definitions).and_return([
177
177
  {'name' => 'header', 'elements' => ['article', 'headline']},
178
178
  {'name' => 'footer', 'elements' => ['article', 'text']},
179
179
  {'name' => 'sidebar', 'elements' => ['teaser']}
@@ -184,13 +184,13 @@ module Alchemy
184
184
  FactoryGirl.create(:cell, name: 'header', page: page)
185
185
  FactoryGirl.create(:cell, name: 'footer', page: page)
186
186
  FactoryGirl.create(:cell, name: 'sidebar', page: page)
187
- element.available_page_cell_names(page).should include('header')
188
- element.available_page_cell_names(page).should include('footer')
187
+ expect(element.available_page_cell_names(page)).to include('header')
188
+ expect(element.available_page_cell_names(page)).to include('footer')
189
189
  end
190
190
 
191
191
  context "but without any cells" do
192
192
  it "should return the 'nil cell'" do
193
- element.available_page_cell_names(page).should == ['for_other_elements']
193
+ expect(element.available_page_cell_names(page)).to eq(['for_other_elements'])
194
194
  end
195
195
  end
196
196
 
@@ -198,7 +198,7 @@ module Alchemy
198
198
 
199
199
  context "with page having cells defining the wrong elements" do
200
200
  before do
201
- Cell.stub(:definitions).and_return([
201
+ allow(Cell).to receive(:definitions).and_return([
202
202
  {'name' => 'header', 'elements' => ['download', 'headline']},
203
203
  {'name' => 'footer', 'elements' => ['contactform', 'text']},
204
204
  {'name' => 'sidebar', 'elements' => ['teaser']}
@@ -209,7 +209,7 @@ module Alchemy
209
209
  FactoryGirl.create(:cell, name: 'header', page: page)
210
210
  FactoryGirl.create(:cell, name: 'footer', page: page)
211
211
  FactoryGirl.create(:cell, name: 'sidebar', page: page)
212
- element.available_page_cell_names(page).should == ['for_other_elements']
212
+ expect(element.available_page_cell_names(page)).to eq(['for_other_elements'])
213
213
  end
214
214
  end
215
215
  end
@@ -222,13 +222,13 @@ module Alchemy
222
222
 
223
223
  context "with namespaced essence type" do
224
224
  it "should return content by passing a essence type" do
225
- @element.content_by_type('Alchemy::EssenceText').should == @content
225
+ expect(@element.content_by_type('Alchemy::EssenceText')).to eq(@content)
226
226
  end
227
227
  end
228
228
 
229
229
  context "without namespaced essence type" do
230
230
  it "should return content by passing a essence type" do
231
- @element.content_by_type('EssenceText').should == @content
231
+ expect(@element.content_by_type('EssenceText')).to eq(@content)
232
232
  end
233
233
  end
234
234
  end
@@ -237,28 +237,17 @@ module Alchemy
237
237
  let(:element) { Element.new(name: 'article') }
238
238
 
239
239
  it "should call .display_name_for" do
240
- Element.should_receive(:display_name_for).with(element.name)
240
+ expect(Element).to receive(:display_name_for).with(element.name)
241
241
  element.display_name
242
242
  end
243
243
  end
244
244
 
245
- describe '#essence_error_messages' do
246
- let(:element) { Element.new(name: 'article') }
247
- it "should return the translation with the translated content label" do
248
- I18n.should_receive(:t).with('content_names.content', default: 'Content').and_return('Content')
249
- I18n.should_receive(:t).with('content', scope: "content_names.article", default: 'Content').and_return('Contenido')
250
- I18n.should_receive(:t).with('article.content.invalid', {:scope=>"content_validations", :default=>[:"fields.content.invalid", :"errors.invalid"], :field=>"Contenido"})
251
- element.should_receive(:essence_errors).and_return({'content' => [:invalid]})
252
- element.essence_error_messages
253
- end
254
- end
255
-
256
245
  describe '#display_name_with_preview_text' do
257
246
  let(:element) { FactoryGirl.build_stubbed(:element, name: 'Foo') }
258
247
 
259
248
  it "returns a string with display name and preview text" do
260
- element.stub(:preview_text).and_return('Fula')
261
- element.display_name_with_preview_text.should == "Foo: Fula"
249
+ allow(element).to receive(:preview_text).and_return('Fula')
250
+ expect(element.display_name_with_preview_text).to eq("Foo: Fula")
262
251
  end
263
252
  end
264
253
 
@@ -266,14 +255,14 @@ module Alchemy
266
255
  let(:element) { FactoryGirl.build_stubbed(:element) }
267
256
 
268
257
  it "returns an string from element name and id" do
269
- element.dom_id.should == "#{element.name}_#{element.id}"
258
+ expect(element.dom_id).to eq("#{element.name}_#{element.id}")
270
259
  end
271
260
  end
272
261
 
273
262
  describe '#new_from_scratch' do
274
263
  it "should initialize an element by name from scratch" do
275
264
  el = Element.new_from_scratch({:name => 'article'})
276
- el.should be_valid
265
+ expect(el).to be_valid
277
266
  end
278
267
 
279
268
  it "should raise an error if the given name is not defined in the elements.yml" do
@@ -282,17 +271,17 @@ module Alchemy
282
271
 
283
272
  it "should take the first part of an given name containing a hash (#)" do
284
273
  el = Element.new_from_scratch({:name => 'article#header'})
285
- el.name.should == "article"
274
+ expect(el.name).to eq("article")
286
275
  end
287
276
 
288
277
  it "should merge given attributes into defined ones" do
289
278
  el = Element.new_from_scratch({:name => 'article', :page_id => 1})
290
- el.page_id.should == 1
279
+ expect(el.page_id).to eq(1)
291
280
  end
292
281
 
293
282
  it "should not have forbidden attributes from definition" do
294
283
  el = Element.new_from_scratch({:name => 'article'})
295
- el.contents.should == []
284
+ expect(el.contents).to eq([])
296
285
  end
297
286
  end
298
287
 
@@ -304,29 +293,29 @@ module Alchemy
304
293
 
305
294
  context "without a content marked as preview" do
306
295
  let(:contents) { [content, content_2] }
307
- before { element.stub(:contents).and_return(contents) }
296
+ before { allow(element).to receive(:contents).and_return(contents) }
308
297
 
309
298
  it "returns the preview text of first content found" do
310
- content.should_receive(:preview_text).with(30)
299
+ expect(content).to receive(:preview_text).with(30)
311
300
  element.preview_text
312
301
  end
313
302
  end
314
303
 
315
304
  context "with a content marked as preview" do
316
305
  let(:contents) { [content, preview_content] }
317
- before { element.stub(:contents).and_return(contents) }
306
+ before { allow(element).to receive(:contents).and_return(contents) }
318
307
 
319
308
  it "should return the preview_text of this content" do
320
- preview_content.should_receive(:preview_text).with(30)
309
+ expect(preview_content).to receive(:preview_text).with(30)
321
310
  element.preview_text
322
311
  end
323
312
  end
324
313
 
325
314
  context "without any contents present" do
326
- before { element.stub(:contents).and_return([]) }
315
+ before { allow(element).to receive(:contents).and_return([]) }
327
316
 
328
317
  it "should return nil" do
329
- element.preview_text.should be_nil
318
+ expect(element.preview_text).to be_nil
330
319
  end
331
320
  end
332
321
  end
@@ -342,24 +331,24 @@ module Alchemy
342
331
 
343
332
  describe '#prev' do
344
333
  it "should return previous element on same page" do
345
- @element3.prev.should == @element2
334
+ expect(@element3.prev).to eq(@element2)
346
335
  end
347
336
 
348
337
  context "with name as parameter" do
349
338
  it "should return previous of this kind" do
350
- @element3.prev('headline').should == @element1
339
+ expect(@element3.prev('headline')).to eq(@element1)
351
340
  end
352
341
  end
353
342
  end
354
343
 
355
344
  describe '#next' do
356
345
  it "should return next element on same page" do
357
- @element2.next.should == @element3
346
+ expect(@element2.next).to eq(@element3)
358
347
  end
359
348
 
360
349
  context "with name as parameter" do
361
350
  it "should return next of this kind" do
362
- @element1.next('text').should == @element3
351
+ expect(@element1.next('text')).to eq(@element3)
363
352
  end
364
353
  end
365
354
  end
@@ -369,30 +358,30 @@ module Alchemy
369
358
  let(:element) { FactoryGirl.create(:element, :name => 'news', :create_contents_after_create => true) }
370
359
 
371
360
  it "should return an ingredient by name" do
372
- element.ingredient('news_headline').should == EssenceText.first.ingredient
361
+ expect(element.ingredient('news_headline')).to eq(EssenceText.first.ingredient)
373
362
  end
374
363
 
375
364
  it "should return the content for rss title" do
376
- element.content_for_rss_title.should == element.contents.find_by_name('news_headline')
365
+ expect(element.content_for_rss_title).to eq(element.contents.find_by_name('news_headline'))
377
366
  end
378
367
 
379
368
  it "should return the content for rss descdefinitionription" do
380
- element.content_for_rss_description.should == element.contents.find_by_name('body')
369
+ expect(element.content_for_rss_description).to eq(element.contents.find_by_name('body'))
381
370
  end
382
371
 
383
372
  context 'if no content is defined as rss title' do
384
- before { element.stub(content_descriptions: []) }
373
+ before { expect(element).to receive(:content_descriptions).and_return([]) }
385
374
 
386
375
  it "should return nil" do
387
- element.content_for_rss_title.should be_nil
376
+ expect(element.content_for_rss_title).to be_nil
388
377
  end
389
378
  end
390
379
 
391
380
  context 'if no content is defined as rss description' do
392
- before { element.stub(content_descriptions: []) }
381
+ before { expect(element).to receive(:content_descriptions).and_return([]) }
393
382
 
394
383
  it "should return nil" do
395
- element.content_for_rss_description.should be_nil
384
+ expect(element.content_for_rss_description).to be_nil
396
385
  end
397
386
  end
398
387
  end
@@ -404,11 +393,11 @@ module Alchemy
404
393
  let(:element) { build_stubbed(:element, page: page) }
405
394
  let(:content) { double(:content, id: 1) }
406
395
 
407
- before { element.stub(:contents).and_return([content]) }
396
+ before { allow(element).to receive(:contents).and_return([content]) }
408
397
 
409
398
  context "with attributes hash is nil" do
410
399
  let(:params) { nil }
411
- it { should be_true }
400
+ it { is_expected.to be_truthy }
412
401
  end
413
402
 
414
403
  context "with valid attributes hash" do
@@ -416,17 +405,17 @@ module Alchemy
416
405
 
417
406
  context 'with passing validations' do
418
407
  before do
419
- content.should_receive(:update_essence).with({body: 'Title'}).and_return(true)
408
+ expect(content).to receive(:update_essence).with({body: 'Title'}).and_return(true)
420
409
  end
421
410
 
422
- it { should be_true }
411
+ it { is_expected.to be_truthy }
423
412
  end
424
413
 
425
414
  context 'with failing validations' do
426
415
  it "adds error and returns false" do
427
- content.should_receive(:update_essence).with({body: 'Title'}).and_return(false)
428
- should be_false
429
- element.errors.should_not be_empty
416
+ expect(content).to receive(:update_essence).with({body: 'Title'}).and_return(false)
417
+ is_expected.to be_falsey
418
+ expect(element.errors).not_to be_empty
430
419
  end
431
420
  end
432
421
  end
@@ -438,7 +427,7 @@ module Alchemy
438
427
  let(:now) { Time.now }
439
428
 
440
429
  before do
441
- Time.stub(now: now)
430
+ allow(Time).to receive(:now).and_return(now)
442
431
  end
443
432
 
444
433
  context 'with touchable pages' do
@@ -446,19 +435,19 @@ module Alchemy
446
435
  let(:pages) { [page] }
447
436
 
448
437
  before do
449
- Alchemy.user_class.stub(:stamper).and_return(locker.id)
438
+ expect(Alchemy.user_class).to receive(:stamper).at_least(:once).and_return(locker.id)
450
439
  end
451
440
 
452
441
  it "updates page timestamps" do
453
- element.should_receive(:touchable_pages).and_return(pages)
454
- pages.should_receive(:update_all).with({updated_at: now, updater_id: locker.id})
442
+ expect(element).to receive(:touchable_pages).and_return(pages)
443
+ expect(pages).to receive(:update_all).with({updated_at: now, updater_id: locker.id})
455
444
  element.save
456
445
  end
457
446
 
458
447
  it "updates page userstamps" do
459
448
  element.save
460
449
  page.reload
461
- page.updater_id.should eq(locker.id)
450
+ expect(page.updater_id).to eq(locker.id)
462
451
  end
463
452
  end
464
453
 
@@ -466,11 +455,11 @@ module Alchemy
466
455
  let(:cell) { mock_model('Cell') }
467
456
 
468
457
  before do
469
- element.stub(cell: cell)
458
+ expect(element).to receive(:cell).at_least(:once).and_return(cell)
470
459
  end
471
460
 
472
461
  it "updates timestamp of cell" do
473
- element.cell.should_receive(:touch)
462
+ expect(element.cell).to receive(:touch)
474
463
  element.save
475
464
  end
476
465
  end
@@ -487,22 +476,30 @@ module Alchemy
487
476
 
488
477
  context "definition has 'taggable' key with true value" do
489
478
  it "should return true" do
490
- element.stub(:definition).and_return({'name' => 'article', 'taggable' => true})
491
- element.taggable?.should be_true
479
+ expect(element).to receive(:definition).and_return({
480
+ 'name' => 'article',
481
+ 'taggable' => true
482
+ })
483
+ expect(element.taggable?).to be_truthy
492
484
  end
493
485
  end
494
486
 
495
487
  context "definition has 'taggable' key with foo value" do
496
488
  it "should return false" do
497
- element.stub(:definition).and_return({'name' => 'article', 'taggable' => 'foo'})
498
- element.taggable?.should be_false
489
+ expect(element).to receive(:definition).and_return({
490
+ 'name' => 'article',
491
+ 'taggable' => 'foo'
492
+ })
493
+ expect(element.taggable?).to be_falsey
499
494
  end
500
495
  end
501
496
 
502
497
  context "definition has no 'taggable' key" do
503
498
  it "should return false" do
504
- element.stub(:definition).and_return({'name' => 'article'})
505
- element.taggable?.should be_false
499
+ expect(element).to receive(:definition).and_return({
500
+ 'name' => 'article'
501
+ })
502
+ expect(element.taggable?).to be_falsey
506
503
  end
507
504
  end
508
505
  end
@@ -512,18 +509,23 @@ module Alchemy
512
509
  let(:trashed_element) { element.trash! ; element }
513
510
  subject { trashed_element }
514
511
 
515
- it { should_not be_public }
516
- it { should be_folded }
517
- its(:position) { should be_nil }
512
+ it { is_expected.not_to be_public }
513
+ it { is_expected.to be_folded }
514
+
515
+ describe '#position' do
516
+ subject { super().position }
517
+ it { is_expected.to be_nil }
518
+ end
518
519
  specify { expect { element.trash! }.to_not change(element, :page_id) }
519
520
  specify { expect { element.trash! }.to_not change(element, :cell_id) }
520
521
 
521
522
  context "with already one trashed element on the same page" do
522
523
  let(:element_2) { FactoryGirl.create(:element, page_id: 1) }
523
- before {
524
+
525
+ before do
524
526
  trashed_element
525
527
  element_2
526
- }
528
+ end
527
529
 
528
530
  it "it should be possible to trash another" do
529
531
  element_2.trash!
@@ -538,29 +540,6 @@ module Alchemy
538
540
  end
539
541
  end
540
542
 
541
- describe '#cache_key' do
542
- let(:page) { stub_model(Page, published_at: Time.now - 1.week) }
543
- let(:element) { stub_model(Element, page: page, updated_at: Time.now) }
544
-
545
- subject { element.cache_key }
546
-
547
- before do
548
- expect(Page).to receive(:current_preview).and_return(preview)
549
- end
550
-
551
- context "when current page rendered in preview mode" do
552
- let(:preview) { page }
553
-
554
- it { is_expected.to eq("alchemy/elements/#{element.id}-#{element.updated_at}") }
555
- end
556
-
557
- context "when current page not in preview mode" do
558
- let(:preview) { nil }
559
-
560
- it { is_expected.to eq("alchemy/elements/#{element.id}-#{page.published_at}") }
561
- end
562
- end
563
-
564
543
  it_behaves_like "having a hint" do
565
544
  let(:subject) { Element.new }
566
545
  end