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
@@ -32,7 +32,6 @@ module Alchemy
32
32
  template "page_layouts.yml.tt", "#{Rails.root}/config/alchemy/page_layouts.yml"
33
33
  copy_file "#{current_path}/files/alchemy.en.yml", "#{Rails.root}/config/locales/alchemy.en.yml"
34
34
  copy_file "#{current_path}/files/alchemy.de.yml", "#{Rails.root}/config/locales/alchemy.de.yml"
35
- copy_file "#{current_path}/files/alchemy.es.yml", "#{Rails.root}/config/locales/alchemy.es.yml"
36
35
  copy_file "#{current_path}/files/application.html.erb", "#{Rails.root}/app/views/layouts/application.html.erb"
37
36
  copy_file "#{current_path}/files/_standard.html.erb", "#{Rails.root}/app/views/alchemy/page_layouts/_standard.html.erb"
38
37
  copy_file "#{current_path}/files/_article_view.html.erb", "#{Rails.root}/app/views/alchemy/elements/_article_view.html.erb"
@@ -1,6 +1,6 @@
1
1
  # This rails template installs Alchemy and all depending gems.
2
2
  require File.expand_path('../../../alchemy/version', __FILE__)
3
3
 
4
- gem 'alchemy_cms', github: 'magiclabs/alchemy_cms', branch: '3.0-stable'
5
- gem 'alchemy-devise', github: 'magiclabs/alchemy-devise', branch: '2.0-stable'
4
+ gem 'alchemy_cms', github: 'magiclabs/alchemy_cms', branch: 'master'
5
+ gem 'alchemy-devise', github: 'magiclabs/alchemy-devise', branch: 'master'
6
6
  gem 'capistrano', '~> 2.15.5', group: 'development'
@@ -1,10 +1,10 @@
1
+ require 'shellwords'
1
2
  require 'alchemy/seeder'
2
3
  require 'alchemy/tasks/helpers'
3
4
  include Alchemy::Tasks::Helpers
4
5
 
5
6
  namespace :alchemy do
6
7
  namespace :db do
7
-
8
8
  desc "Seeds your database with essential data for Alchemy CMS."
9
9
  task :seed => :environment do
10
10
  Alchemy::Seeder.seed!
@@ -17,5 +17,11 @@ namespace :alchemy do
17
17
  system "#{dump_cmd}#{dump_store}"
18
18
  end
19
19
 
20
+ desc "Imports the database from STDIN (Pass DUMP_FILENAME to read the dump from file)."
21
+ task :import => :environment do
22
+ dump_store = ENV['DUMP_FILENAME'] ? "cat #{ENV['DUMP_FILENAME']}" : "echo #{Shellwords.escape(STDIN.read)}"
23
+ import_cmd = database_import_command(database_config['adapter'])
24
+ system "#{dump_store} | #{import_cmd}"
25
+ end
20
26
  end
21
27
  end
@@ -10,13 +10,13 @@ module Alchemy
10
10
 
11
11
  describe "#index" do
12
12
  it "should always paginate the records" do
13
- Attachment.should_receive(:find_paginated)
13
+ expect(Attachment).to receive(:find_paginated)
14
14
  get :index
15
15
  end
16
16
 
17
17
  context "when params[:tagged_with] is set" do
18
18
  it "should filter the records by tags" do
19
- Attachment.should_receive(:tagged_with).and_return(Attachment.all)
19
+ expect(Attachment).to receive(:tagged_with).and_return(Attachment.all)
20
20
  get :index, tagged_with: "pdf"
21
21
  end
22
22
  end
@@ -26,10 +26,10 @@ module Alchemy
26
26
 
27
27
  context "is set" do
28
28
  it "it renders the archive_overlay partial" do
29
- Content.stub_chain(:select, :find_by).and_return(content)
29
+ expect(Content).to receive(:find_by).and_return(content)
30
30
  get :index, {content_id: content.id}
31
31
  expect(response).to render_template(partial: '_archive_overlay')
32
- assigns(:content).should eq(content)
32
+ expect(assigns(:content)).to eq(content)
33
33
  end
34
34
  end
35
35
 
@@ -44,7 +44,7 @@ module Alchemy
44
44
 
45
45
  describe '#show' do
46
46
  before do
47
- Attachment.stub(find: attachment)
47
+ expect(Attachment).to receive(:find).and_return(attachment)
48
48
  end
49
49
 
50
50
  it "renders the show template" do
@@ -56,18 +56,18 @@ module Alchemy
56
56
  describe "#new" do
57
57
  context "in overlay" do
58
58
  before do
59
- controller.stub(:in_overlay?).and_return(true)
60
- Content.stub(:find).and_return(mock_model('Content'))
59
+ expect(controller).to receive(:in_overlay?).and_return(true)
60
+ expect(Content).to receive(:find_by).and_return(mock_model('Content'))
61
61
  end
62
62
 
63
63
  it "should set @while_assigning to true" do
64
64
  get :new
65
- assigns(:while_assigning).should eq(true)
65
+ expect(assigns(:while_assigning)).to eq(true)
66
66
  end
67
67
 
68
68
  it "should set @swap to params[:swap]" do
69
69
  get :new, swap: 'true'
70
- assigns(:swap).should eq('true')
70
+ expect(assigns(:swap)).to eq('true')
71
71
  end
72
72
  end
73
73
  end
@@ -80,8 +80,8 @@ module Alchemy
80
80
 
81
81
  context 'with passing validations' do
82
82
  before do
83
- Attachment.should_receive(:new).and_return(attachment)
84
- attachment.should_receive(:save).and_return(true)
83
+ expect(Attachment).to receive(:new).and_return(attachment)
84
+ expect(attachment).to receive(:save).and_return(true)
85
85
  end
86
86
 
87
87
  context 'if inside of archive overlay' do
@@ -89,36 +89,36 @@ module Alchemy
89
89
  let(:content) { mock_model('Content') }
90
90
 
91
91
  before do
92
- Content.stub_chain(:select, :find_by).and_return(content)
92
+ expect(Content).to receive(:find_by).and_return(content)
93
93
  end
94
94
 
95
95
  it "assigns lots of instance variables" do
96
96
  subject
97
- assigns(:options).should eq({})
98
- assigns(:while_assigning).should be_true
99
- assigns(:content).should eq(content)
100
- assigns(:swap).should eq(nil)
97
+ expect(assigns(:options)).to eq({})
98
+ expect(assigns(:while_assigning)).to be_truthy
99
+ expect(assigns(:content)).to eq(content)
100
+ expect(assigns(:swap)).to eq(nil)
101
101
  end
102
102
  end
103
103
 
104
104
  it "renders json response with success message" do
105
105
  subject
106
- response.content_type.should eq('application/json')
107
- response.status.should eq(201)
106
+ expect(response.content_type).to eq('application/json')
107
+ expect(response.status).to eq(201)
108
108
  json = JSON.parse(response.body)
109
- json.should have_key('growl_message')
110
- json.should have_key('files')
109
+ expect(json).to have_key('growl_message')
110
+ expect(json).to have_key('files')
111
111
  end
112
112
  end
113
113
 
114
114
  context 'without passing validations' do
115
115
  it "renders json response with error message" do
116
116
  subject
117
- response.content_type.should eq('application/json')
118
- response.status.should eq(422)
117
+ expect(response.content_type).to eq('application/json')
118
+ expect(response.status).to eq(422)
119
119
  json = JSON.parse(response.body)
120
- json.should have_key('growl_message')
121
- json.should have_key('files')
120
+ expect(json).to have_key('growl_message')
121
+ expect(json).to have_key('files')
122
122
  end
123
123
  end
124
124
  end
@@ -129,27 +129,27 @@ module Alchemy
129
129
  let(:attachment) { build_stubbed(:attachment) }
130
130
 
131
131
  before do
132
- Attachment.stub(find: attachment)
132
+ expect(Attachment).to receive(:find).and_return(attachment)
133
133
  end
134
134
 
135
135
  context 'with passing validations' do
136
136
  before do
137
- attachment.should_receive(:update_attributes).and_return(true)
137
+ expect(attachment).to receive(:update_attributes).and_return(true)
138
138
  end
139
139
 
140
140
  it "redirects to index path" do
141
- should redirect_to admin_attachments_path
141
+ is_expected.to redirect_to admin_attachments_path
142
142
  end
143
143
  end
144
144
 
145
145
  context 'with failing validations' do
146
146
  before do
147
- attachment.stub(update_attributes: false)
148
- attachment.stub_chain(:errors, :empty?).and_return(false)
147
+ expect(attachment).to receive(:update_attributes).and_return(false)
148
+ expect(attachment).to receive(:errors).and_return double(empty?: false)
149
149
  end
150
150
 
151
151
  it "renders edit form" do
152
- should render_template(:edit)
152
+ is_expected.to render_template(:edit)
153
153
  end
154
154
  end
155
155
  end
@@ -158,22 +158,22 @@ module Alchemy
158
158
  let(:attachment) { build_stubbed(:attachment) }
159
159
 
160
160
  before do
161
- Attachment.stub(find: attachment)
161
+ expect(Attachment).to receive(:find).and_return(attachment)
162
162
  end
163
163
 
164
164
  it "destroys the attachment and sets and success message" do
165
- attachment.should_receive(:destroy)
165
+ expect(attachment).to receive(:destroy)
166
166
  xhr :delete, :destroy
167
- assigns(:attachment).should eq(attachment)
168
- assigns(:url).should_not be_blank
169
- flash[:notice].should_not be_blank
167
+ expect(assigns(:attachment)).to eq(attachment)
168
+ expect(assigns(:url)).not_to be_blank
169
+ expect(flash[:notice]).not_to be_blank
170
170
  end
171
171
  end
172
172
 
173
173
  describe "#download" do
174
174
  before do
175
- Attachment.stub(:find).with("#{attachment.id}").and_return(attachment)
176
- controller.stub(:render).and_return(nil)
175
+ expect(Attachment).to receive(:find).with("#{attachment.id}").and_return(attachment)
176
+ allow(controller).to receive(:render).and_return(nil)
177
177
  end
178
178
 
179
179
  it "should assign @attachment with Attachment found by id" do
@@ -182,7 +182,7 @@ module Alchemy
182
182
  end
183
183
 
184
184
  it "should send the data to the browser" do
185
- controller.should_receive(:send_data)
185
+ expect(controller).to receive(:send_data)
186
186
  get :download, id: attachment.id
187
187
  end
188
188
  end
@@ -6,7 +6,7 @@ describe Alchemy::Admin::BaseController do
6
6
  subject { controller.send(:options_from_params) }
7
7
 
8
8
  context "params[:options] is a JSON string" do
9
- before { controller.stub(:params).and_return(options: '{"hallo":"World"}') }
9
+ before { expect(controller).to receive(:params).at_least(:once).and_return(options: '{"hallo":"World"}') }
10
10
 
11
11
  it "parses the string into an object" do
12
12
  expect(subject).to be_an_instance_of(Hash)
@@ -15,7 +15,7 @@ describe Alchemy::Admin::BaseController do
15
15
  end
16
16
 
17
17
  context "params[:options] is already an object" do
18
- before { controller.stub(:params).and_return(options: {hallo: "World"}) }
18
+ before { expect(controller).to receive(:params).at_least(:once).and_return(options: {hallo: "World"}) }
19
19
 
20
20
  it "parses the string into an object" do
21
21
  expect(subject).to be_an_instance_of(Hash)
@@ -23,7 +23,7 @@ describe Alchemy::Admin::BaseController do
23
23
  end
24
24
 
25
25
  context "params[:options] is not present" do
26
- before { controller.stub(:params).and_return({}) }
26
+ before { expect(controller).to receive(:params).at_least(:once).and_return({}) }
27
27
 
28
28
  it "returns ampty object" do
29
29
  expect(subject).to be_an_instance_of(Hash)
@@ -36,22 +36,22 @@ describe Alchemy::Admin::BaseController do
36
36
  subject { controller.send(:raise_exception?) }
37
37
 
38
38
  context 'in test mode' do
39
- before { Rails.env.stub(test?: true) }
40
- it { should be_true }
41
- end
42
-
43
- context 'in page preview' do
44
- before { controller.stub(is_page_preview?: true) }
45
- it { should be_true }
39
+ before { expect(Rails.env).to receive(:test?).and_return true }
40
+ it { is_expected.to be_truthy }
46
41
  end
47
42
 
48
43
  context 'not in test mode' do
49
- before { Rails.env.stub(test?: false) }
50
- it { should be_false }
44
+ before { expect(Rails.env).to receive(:test?).and_return false }
45
+ it { is_expected.to be_falsey }
46
+
47
+ context 'and in page preview' do
48
+ before { expect(controller).to receive(:is_page_preview?).and_return true }
49
+ it { is_expected.to be_truthy }
50
+ end
51
51
 
52
52
  context 'and not in page preview' do
53
- before { controller.stub(is_page_preview?: false) }
54
- it { should be_false }
53
+ before { expect(controller).to receive(:is_page_preview?).and_return false }
54
+ it { is_expected.to be_falsey }
55
55
  end
56
56
  end
57
57
  end
@@ -59,15 +59,15 @@ describe Alchemy::Admin::BaseController do
59
59
  describe '#is_page_preview?' do
60
60
  subject { controller.send(:is_page_preview?) }
61
61
 
62
- it { should be_false }
62
+ it { is_expected.to be_falsey }
63
63
 
64
64
  context 'is pages controller and show action' do
65
65
  before do
66
- controller.stub(controller_path: 'alchemy/admin/pages')
67
- controller.stub(action_name: 'show')
66
+ expect(controller).to receive(:controller_path).and_return('alchemy/admin/pages')
67
+ expect(controller).to receive(:action_name).and_return('show')
68
68
  end
69
69
 
70
- it { should be_true }
70
+ it { is_expected.to be_truthy }
71
71
  end
72
72
  end
73
73
 
@@ -9,28 +9,33 @@ module Alchemy
9
9
  before do
10
10
  sign_in(admin_user)
11
11
  session[:alchemy_clipboard] = {}
12
- Element.stub(find: element)
13
12
  end
14
13
 
15
- describe "#insert" do
16
- it "should hold element ids" do
17
- xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
18
- session[:alchemy_clipboard]['elements'].should == [{'id' => element.id.to_s, 'action' => 'copy'}]
14
+ context 'for elements' do
15
+ before do
16
+ expect(Element).to receive(:find).and_return(element)
19
17
  end
20
18
 
21
- it "should not have the same element twice" do
22
- session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
23
- xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
24
- session[:alchemy_clipboard]['elements'].collect { |e| e['id'] }.should_not == [element.id, element.id]
19
+ describe "#insert" do
20
+ it "should hold element ids" do
21
+ xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
22
+ expect(session[:alchemy_clipboard]['elements']).to eq([{'id' => element.id.to_s, 'action' => 'copy'}])
23
+ end
24
+
25
+ it "should not have the same element twice" do
26
+ session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
27
+ xhr :post, :insert, {remarkable_type: 'elements', remarkable_id: element.id}
28
+ expect(session[:alchemy_clipboard]['elements'].collect { |e| e['id'] }).not_to eq([element.id, element.id])
29
+ end
25
30
  end
26
- end
27
31
 
28
- describe "#delete" do
29
- it "should remove element ids from clipboard" do
30
- session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
31
- session[:alchemy_clipboard]['elements'] << {'id' => another_element.id.to_s, 'action' => 'copy'}
32
- xhr :delete, :remove, {remarkable_type: 'elements', remarkable_id: another_element.id}
33
- session[:alchemy_clipboard]['elements'].should == [{'id' => element.id.to_s, 'action' => 'copy'}]
32
+ describe "#delete" do
33
+ it "should remove element ids from clipboard" do
34
+ session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s, 'action' => 'copy'}]
35
+ session[:alchemy_clipboard]['elements'] << {'id' => another_element.id.to_s, 'action' => 'copy'}
36
+ xhr :delete, :remove, {remarkable_type: 'elements', remarkable_id: another_element.id}
37
+ expect(session[:alchemy_clipboard]['elements']).to eq([{'id' => element.id.to_s, 'action' => 'copy'}])
38
+ end
34
39
  end
35
40
  end
36
41
 
@@ -39,7 +44,7 @@ module Alchemy
39
44
  it "should clear the elements clipboard" do
40
45
  session[:alchemy_clipboard]['elements'] = [{'id' => element.id.to_s}]
41
46
  xhr :delete, :clear, {remarkable_type: 'elements'}
42
- session[:alchemy_clipboard]['elements'].should be_empty
47
+ expect(session[:alchemy_clipboard]['elements']).to be_empty
43
48
  end
44
49
  end
45
50
 
@@ -47,7 +52,7 @@ module Alchemy
47
52
  it "should clear the pages clipboard" do
48
53
  session[:alchemy_clipboard]['pages'] = [{'id' => public_page.id.to_s}]
49
54
  xhr :delete, :clear, {remarkable_type: 'pages'}
50
- session[:alchemy_clipboard]['pages'].should be_empty
55
+ expect(session[:alchemy_clipboard]['pages']).to be_empty
51
56
  end
52
57
  end
53
58
  end
@@ -7,48 +7,54 @@ module Alchemy
7
7
 
8
8
  before do
9
9
  sign_in(admin_user)
10
- Element.stub(find: element)
11
10
  end
12
11
 
13
- describe '#create' do
14
- let(:element) { build_stubbed(:element, name: 'headline') }
15
-
16
- it "creates a content from name" do
17
- Content.should_receive(:create_from_scratch).and_return(content)
18
- xhr :post, :create, {content: {element_id: element.id, name: 'headline'}}
12
+ context 'with element_id parameter' do
13
+ before do
14
+ expect(Element).to receive(:find).and_return(element)
19
15
  end
20
16
 
21
- it "creates a content from essence_type" do
22
- Content.should_receive(:create_from_scratch).and_return(content)
23
- xhr :post, :create, {content: {element_id: element.id, essence_type: 'EssencePicture'}}
24
- end
25
- end
26
17
 
27
- context 'inside a picture gallery' do
28
- let(:attributes) do
29
- {content: {element_id: element.id, essence_type: 'Alchemy::EssencePicture'}, options: {grouped: 'true'}}
30
- end
18
+ describe '#create' do
19
+ let(:element) { build_stubbed(:element, name: 'headline') }
20
+
21
+ it "creates a content from name" do
22
+ expect(Content).to receive(:create_from_scratch).and_return(content)
23
+ xhr :post, :create, {content: {element_id: element.id, name: 'headline'}}
24
+ end
31
25
 
32
- it "adds it into the gallery editor" do
33
- xhr :post, :create, attributes
34
- assigns(:content_dom_id).should eq("#add_picture_#{element.id}")
26
+ it "creates a content from essence_type" do
27
+ expect(Content).to receive(:create_from_scratch).and_return(content)
28
+ xhr :post, :create, {content: {element_id: element.id, essence_type: 'EssencePicture'}}
29
+ end
35
30
  end
36
31
 
37
- context 'with picture_id given' do
38
- it "assigns the picture" do
39
- Content.any_instance.should_receive(:update_essence).with(picture_id: '1')
40
- xhr :post, :create, attributes.merge(picture_id: '1')
32
+ context 'inside a picture gallery' do
33
+ let(:attributes) do
34
+ {content: {element_id: element.id, essence_type: 'Alchemy::EssencePicture'}, options: {grouped: 'true'}}
35
+ end
36
+
37
+ it "adds it into the gallery editor" do
38
+ xhr :post, :create, attributes
39
+ expect(assigns(:content_dom_id)).to eq("#add_picture_#{element.id}")
40
+ end
41
+
42
+ context 'with picture_id given' do
43
+ it "assigns the picture" do
44
+ expect_any_instance_of(Content).to receive(:update_essence).with(picture_id: '1')
45
+ xhr :post, :create, attributes.merge(picture_id: '1')
46
+ end
41
47
  end
42
48
  end
43
49
  end
44
50
 
45
51
  describe '#update' do
46
52
  before do
47
- Content.stub(find: content)
53
+ expect(Content).to receive(:find).and_return(content)
48
54
  end
49
55
 
50
56
  it "should update a content via ajax" do
51
- content.essence.should_receive(:update).with('ingredient' => 'Peters Petshop')
57
+ expect(content.essence).to receive(:update).with('ingredient' => 'Peters Petshop')
52
58
  xhr :post, :update, {id: content.id, content: {ingredient: 'Peters Petshop'}}
53
59
  end
54
60
  end
@@ -58,8 +64,8 @@ module Alchemy
58
64
  it "should reorder the contents" do
59
65
  content_ids = element.contents.essence_texts.pluck(:id)
60
66
  xhr :post, :order, {content_ids: content_ids.reverse}
61
- response.status.should == 200
62
- element.contents.essence_texts.pluck(:id).should == content_ids.reverse
67
+ expect(response.status).to eq(200)
68
+ expect(element.contents.essence_texts.pluck(:id)).to eq(content_ids.reverse)
63
69
  end
64
70
  end
65
71
  end