alchemy_cms 2.6.3 → 2.7.0

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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +14 -0
  3. data/.travis.yml +1 -1
  4. data/Gemfile +7 -6
  5. data/README.md +15 -5
  6. data/alchemy_cms.gemspec +3 -2
  7. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +9 -17
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +70 -0
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +80 -0
  10. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +43 -19
  11. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +3 -1
  12. data/app/assets/javascripts/alchemy/alchemy.js +4 -2
  13. data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +14 -0
  15. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee.erb +96 -0
  16. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +22 -0
  17. data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +28 -17
  18. data/app/assets/stylesheets/alchemy/base.scss +6 -0
  19. data/app/assets/stylesheets/alchemy/elements.scss +2 -28
  20. data/app/assets/stylesheets/alchemy/errors.scss +1 -1
  21. data/app/assets/stylesheets/alchemy/menubar.css.scss +2 -0
  22. data/app/assets/stylesheets/alchemy/sitemap.scss +21 -34
  23. data/app/assets/stylesheets/alchemy/tables.scss +13 -3
  24. data/app/controllers/alchemy/admin/attachments_controller.rb +10 -5
  25. data/app/controllers/alchemy/admin/base_controller.rb +19 -0
  26. data/app/controllers/alchemy/admin/contents_controller.rb +1 -4
  27. data/app/controllers/alchemy/admin/dashboard_controller.rb +2 -1
  28. data/app/controllers/alchemy/admin/elements_controller.rb +1 -1
  29. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -1
  30. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +70 -56
  31. data/app/controllers/alchemy/admin/pages_controller.rb +37 -114
  32. data/app/controllers/alchemy/admin/pictures_controller.rb +5 -12
  33. data/app/controllers/alchemy/admin/resources_controller.rb +3 -1
  34. data/app/controllers/alchemy/admin/trash_controller.rb +1 -1
  35. data/app/controllers/alchemy/attachments_controller.rb +1 -1
  36. data/app/controllers/alchemy/base_controller.rb +3 -15
  37. data/app/controllers/alchemy/messages_controller.rb +4 -10
  38. data/app/controllers/alchemy/pages_controller.rb +6 -6
  39. data/app/controllers/alchemy/passwords_controller.rb +1 -1
  40. data/app/controllers/alchemy/user_sessions_controller.rb +1 -1
  41. data/app/helpers/alchemy/admin/base_helper.rb +49 -230
  42. data/app/helpers/alchemy/admin/contents_helper.rb +5 -1
  43. data/app/helpers/alchemy/admin/elements_helper.rb +19 -47
  44. data/app/helpers/alchemy/admin/essences_helper.rb +59 -17
  45. data/app/helpers/alchemy/admin/navigation_helper.rb +204 -0
  46. data/app/helpers/alchemy/admin/pages_helper.rb +22 -79
  47. data/app/helpers/alchemy/admin/pictures_helper.rb +1 -1
  48. data/app/helpers/alchemy/admin/tags_helper.rb +42 -0
  49. data/app/helpers/alchemy/base_helper.rb +0 -11
  50. data/app/helpers/alchemy/elements_helper.rb +48 -25
  51. data/app/helpers/alchemy/essences_helper.rb +0 -20
  52. data/app/helpers/alchemy/pages_helper.rb +18 -14
  53. data/app/helpers/alchemy/url_helper.rb +1 -0
  54. data/app/mailers/alchemy/messages.rb +4 -6
  55. data/app/models/alchemy/attachment.rb +3 -0
  56. data/app/models/alchemy/cell.rb +33 -35
  57. data/app/models/alchemy/content.rb +20 -111
  58. data/app/models/alchemy/content/factory.rb +188 -0
  59. data/app/models/alchemy/element.rb +51 -200
  60. data/app/models/alchemy/element/definitions.rb +52 -0
  61. data/app/models/alchemy/element/presenters.rb +87 -0
  62. data/app/models/alchemy/essence_date.rb +1 -1
  63. data/app/models/alchemy/essence_file.rb +6 -7
  64. data/app/models/alchemy/essence_picture.rb +19 -4
  65. data/app/models/alchemy/message.rb +18 -14
  66. data/app/models/alchemy/page.rb +120 -214
  67. data/app/models/alchemy/page/elements.rb +145 -36
  68. data/app/models/alchemy/page/natures.rb +90 -0
  69. data/app/models/alchemy/page/scopes.rb +93 -0
  70. data/app/models/alchemy/page/users.rb +25 -0
  71. data/app/models/alchemy/picture.rb +15 -0
  72. data/app/models/alchemy/site.rb +15 -1
  73. data/app/models/alchemy/site/layout.rb +38 -0
  74. data/app/models/alchemy/user.rb +13 -3
  75. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +7 -7
  76. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +8 -8
  77. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +1 -16
  78. data/app/views/alchemy/admin/attachments/destroy.js.erb +1 -4
  79. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  80. data/app/views/alchemy/admin/dashboard/index.html.erb +14 -13
  81. data/app/views/alchemy/admin/elements/_element_head.html.erb +7 -7
  82. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +10 -0
  83. data/app/views/alchemy/admin/elements/create.js.erb +44 -44
  84. data/app/views/alchemy/admin/elements/fold.js.erb +22 -26
  85. data/app/views/alchemy/admin/elements/trash.js.erb +1 -1
  86. data/app/views/alchemy/admin/elements/update.js.erb +22 -25
  87. data/app/views/alchemy/admin/essence_files/assign.js.erb +8 -3
  88. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +14 -12
  89. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +22 -39
  90. data/app/views/alchemy/admin/pages/_page.html.erb +73 -80
  91. data/app/views/alchemy/admin/pages/destroy.js.erb +2 -2
  92. data/app/views/alchemy/admin/pages/edit.html.erb +21 -18
  93. data/app/views/alchemy/admin/pages/fold.js.erb +1 -0
  94. data/app/views/alchemy/admin/pages/info.html.erb +32 -0
  95. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +11 -13
  96. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +20 -20
  97. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +8 -0
  98. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +25 -0
  99. data/app/views/alchemy/admin/partials/_upload_form.html.erb +15 -15
  100. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +39 -39
  101. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +10 -10
  102. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +1 -16
  103. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
  104. data/app/views/alchemy/base/500.html.erb +1 -1
  105. data/app/views/alchemy/base/permission_denied.js.erb +1 -1
  106. data/app/views/alchemy/base/redirect.js.erb +1 -1
  107. data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
  108. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +1 -1
  109. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  110. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  111. data/app/views/alchemy/essences/{_essence_picture_tools.html.erb → shared/_essence_picture_tools.html.erb} +5 -5
  112. data/app/views/alchemy/essences/{_linkable_essence_tools.html.erb → shared/_linkable_essence_tools.html.erb} +0 -0
  113. data/app/views/alchemy/messages/contact_form_mail.de.text.erb +12 -0
  114. data/app/views/alchemy/messages/contact_form_mail.en.text.erb +12 -0
  115. data/app/views/alchemy/notifications/reset_password_instructions.de.text.erb +1 -1
  116. data/app/views/alchemy/notifications/reset_password_instructions.en.text.erb +2 -2
  117. data/app/views/alchemy/pages/sitemap.xml.erb +3 -5
  118. data/app/views/alchemy/user_sessions/leave.html.erb +1 -1
  119. data/app/views/layouts/alchemy/admin.html.erb +4 -2
  120. data/app/views/layouts/alchemy/sitemap.xml.erb +1 -1
  121. data/bin/alchemy +7 -13
  122. data/config/alchemy/config.yml +1 -0
  123. data/config/authorization_rules.rb +2 -3
  124. data/config/initializers/dragonfly.rb +2 -0
  125. data/config/locales/alchemy.de.yml +8 -9
  126. data/config/locales/alchemy.en.yml +7 -4
  127. data/config/routes.rb +3 -0
  128. data/db/migrate/{20130214233001_alchemy_two_point_five.rb → 20130827094554_alchemy_two_point_six.rb} +29 -6
  129. data/lib/alchemy/auth/engine.rb +9 -0
  130. data/lib/alchemy/capistrano.rb +37 -12
  131. data/lib/alchemy/config.rb +48 -35
  132. data/lib/alchemy/engine.rb +35 -6
  133. data/lib/alchemy/essence.rb +25 -29
  134. data/lib/alchemy/ferret/search.rb +86 -0
  135. data/lib/alchemy/{scoped_pagination_url_helper.rb → kaminari/scoped_pagination_url_helper.rb} +0 -0
  136. data/lib/alchemy/logger.rb +3 -4
  137. data/lib/alchemy/page_layout.rb +124 -55
  138. data/lib/alchemy/resource.rb +0 -10
  139. data/lib/alchemy/resources_helper.rb +0 -5
  140. data/lib/alchemy/seeder.rb +1 -32
  141. data/lib/alchemy/shell.rb +6 -1
  142. data/lib/alchemy/tinymce.rb +41 -32
  143. data/lib/alchemy/upgrader.rb +3 -1
  144. data/lib/alchemy/upgrader/two_point_five.rb +15 -8
  145. data/lib/alchemy/upgrader/two_point_one.rb +10 -10
  146. data/lib/alchemy/upgrader/two_point_two.rb +96 -51
  147. data/lib/alchemy/version.rb +1 -1
  148. data/lib/alchemy_cms.rb +5 -46
  149. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +1 -1
  150. data/lib/rails/generators/alchemy/devise/devise_generator.rb +9 -4
  151. data/lib/rails/generators/alchemy/essence/essence_generator.rb +7 -6
  152. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  153. data/lib/rails/generators/alchemy/scaffold/files/_standard.html.erb +1 -0
  154. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +1 -0
  155. data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +23 -0
  156. data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.erb +1 -0
  157. data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.haml +1 -0
  158. data/lib/rails/generators/alchemy/site_layouts/templates/layout.html.slim +1 -0
  159. data/lib/rails/templates/alchemy.rb +2 -2
  160. data/lib/tasks/alchemy/db.rake +3 -1
  161. data/lib/tasks/alchemy/tidy.rake +82 -0
  162. data/lib/tasks/alchemy/upgrade.rake +2 -1
  163. data/spec/controllers/admin/attachments_controller_spec.rb +124 -0
  164. data/spec/controllers/admin/base_controller_spec.rb +35 -0
  165. data/spec/controllers/admin/clipboard_controller_spec.rb +1 -1
  166. data/spec/controllers/admin/contents_controller_spec.rb +17 -26
  167. data/spec/controllers/admin/dashboard_controller_spec.rb +121 -0
  168. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  169. data/spec/controllers/admin/essence_files_controller_spec.rb +67 -0
  170. data/spec/controllers/admin/essence_pictures_controller_spec.rb +161 -0
  171. data/spec/controllers/admin/languages_controller_spec.rb +1 -1
  172. data/spec/controllers/admin/layoutpages_controller_spec.rb +28 -0
  173. data/spec/controllers/admin/pages_controller_spec.rb +164 -118
  174. data/spec/controllers/admin/pictures_controller_spec.rb +89 -0
  175. data/spec/controllers/admin/trash_controller_spec.rb +21 -31
  176. data/spec/controllers/admin/users_controller_spec.rb +114 -85
  177. data/spec/controllers/attachments_controller_spec.rb +6 -2
  178. data/spec/controllers/base_controller_spec.rb +22 -0
  179. data/spec/controllers/elements_controller_spec.rb +1 -1
  180. data/spec/controllers/messages_controller_spec.rb +200 -0
  181. data/spec/controllers/pictures_controller_spec.rb +1 -1
  182. data/spec/controllers/user_sessions_controller_spec.rb +7 -6
  183. data/spec/controllers/users_controller_spec.rb +2 -2
  184. data/spec/dummy/config/alchemy/cells.yml +2 -0
  185. data/spec/dummy/config/application.rb +19 -8
  186. data/spec/dummy/db/migrate/{20130214233001_alchemy_two_point_five.rb → 20130827094554_alchemy_two_point_six.rb} +29 -6
  187. data/spec/dummy/db/schema.rb +1 -1
  188. data/spec/fast_specs.rb +15 -0
  189. data/spec/helpers/admin/base_helper_spec.rb +53 -34
  190. data/spec/helpers/admin/contents_helper_spec.rb +15 -7
  191. data/spec/helpers/admin/elements_helper_spec.rb +79 -34
  192. data/spec/helpers/admin/essences_helper_spec.rb +45 -31
  193. data/spec/helpers/admin/navigation_helper_spec.rb +204 -0
  194. data/spec/helpers/admin/pages_helper_spec.rb +25 -15
  195. data/spec/helpers/admin/tags_helper_spec.rb +62 -2
  196. data/spec/helpers/elements_helper_spec.rb +202 -138
  197. data/spec/helpers/pages_helper_spec.rb +48 -0
  198. data/spec/helpers/url_helper_spec.rb +7 -0
  199. data/spec/libraries/config_spec.rb +110 -3
  200. data/spec/libraries/essence_spec.rb +29 -9
  201. data/spec/libraries/page_layout_spec.rb +134 -0
  202. data/spec/libraries/resource_spec.rb +3 -16
  203. data/spec/libraries/resources_helper_spec.rb +4 -8
  204. data/spec/libraries/shell_spec.rb +1 -0
  205. data/spec/libraries/tinymce_spec.rb +61 -0
  206. data/spec/mailers/messages_spec.rb +23 -0
  207. data/spec/models/attachment_spec.rb +45 -0
  208. data/spec/models/cell_spec.rb +62 -9
  209. data/spec/models/content_spec.rb +110 -28
  210. data/spec/models/element_spec.rb +275 -253
  211. data/spec/models/essence_date_spec.rb +25 -0
  212. data/spec/models/essence_file_spec.rb +23 -0
  213. data/spec/models/essence_html_spec.rb +13 -0
  214. data/spec/models/essence_picture_spec.rb +16 -0
  215. data/spec/models/essence_text_spec.rb +29 -0
  216. data/spec/models/language_spec.rb +34 -0
  217. data/spec/models/message_spec.rb +43 -0
  218. data/spec/models/page_spec.rb +726 -567
  219. data/spec/models/picture_spec.rb +98 -0
  220. data/spec/models/site_spec.rb +60 -2
  221. data/spec/models/tag_spec.rb +31 -0
  222. data/spec/models/user_spec.rb +4 -4
  223. data/spec/spec_helper.rb +49 -58
  224. data/spec/support/alchemy/controller_helpers.rb +35 -0
  225. data/spec/support/alchemy/{specs_helpers.rb → integration_helpers.rb} +4 -8
  226. data/spec/{factories.rb → support/factories.rb} +11 -1
  227. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +2 -8
  228. metadata +166 -106
  229. data/Guardfile +0 -16
  230. data/app/assets/javascripts/alchemy/alchemy.dirty.js +0 -93
  231. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +0 -122
  232. data/app/models/alchemy/tree_node.rb +0 -4
  233. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -3
  234. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +0 -8
  235. data/app/views/alchemy/messages/contact_form_mail.text.erb +0 -12
  236. data/config/initializers/kaminari_config.rb +0 -9
  237. data/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +0 -21
  238. data/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +0 -11
  239. data/lib/alchemy/auth_engine.rb +0 -7
  240. data/lib/alchemy/authentication_helpers.rb +0 -9
  241. data/lib/alchemy/ferret_search.rb +0 -84
  242. data/lib/extensions/array.rb +0 -25
  243. data/lib/extensions/hash.rb +0 -34
  244. data/spec/dummy/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +0 -21
  245. data/spec/dummy/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +0 -11
  246. data/spec/models/page_layout_spec.rb +0 -60
@@ -2,23 +2,16 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  module Admin
5
-
6
5
  describe TrashController do
7
-
8
6
  render_views
9
7
 
10
- let(:alchemy_page) do
11
- FactoryGirl.create(:page, :parent_id => Page.rootpage.id)
12
- end
8
+ let(:alchemy_page) { FactoryGirl.create(:public_page) }
9
+ let(:element) { FactoryGirl.create(:element, :public => false, :page => alchemy_page) }
13
10
 
14
- let(:element) do
15
- FactoryGirl.create(:element, :public => false, :page => alchemy_page)
16
- end
17
-
18
- before do
19
- sign_in :user, FactoryGirl.create(:admin_user)
11
+ before {
12
+ sign_in(admin_user)
20
13
  element.trash
21
- end
14
+ }
22
15
 
23
16
  it "should hold trashed elements" do
24
17
  get :index, :page_id => alchemy_page.id
@@ -32,44 +25,41 @@ module Alchemy
32
25
  end
33
26
 
34
27
  context "with unique elements inside the trash" do
35
-
36
- before do
37
- Element.stub!(:all_definitions_for).and_return([
38
- {'name' => element.name, 'unique' => true}
39
- ])
40
- end
28
+ let(:trashed) { FactoryGirl.build_stubbed(:unique_element, position: nil, public: false, folded: true, page: alchemy_page) }
29
+ before { Element.stub(:trashed).and_return([trashed]) }
41
30
 
42
31
  context "and no unique elements on the page" do
32
+ before { alchemy_page.stub_chain(:elements, :not_trashed, :pluck).and_return([]) }
43
33
 
44
34
  it "unique elements should be draggable" do
45
- get :index, :page_id => alchemy_page.id
46
- response.body.should have_selector("#element_#{element.id}.element_editor.draggable")
35
+ get :index, page_id: alchemy_page.id
36
+ response.body.should have_selector("#element_#{trashed.id}.element_editor.draggable")
47
37
  end
48
-
49
38
  end
50
39
 
51
40
  context "and with an unique element on the page" do
41
+ let(:unique) { FactoryGirl.build_stubbed(:unique_element) }
42
+ let(:page) { FactoryGirl.build_stubbed(:public_page) }
43
+ before {
44
+ Page.stub(:find).and_return(page)
45
+ page.stub_chain(:elements, :not_trashed, :pluck).and_return([unique.name])
46
+ }
52
47
 
53
48
  it "unique elements should not be draggable" do
54
- FactoryGirl.create(:element, :page => alchemy_page, :public => false)
55
- get :index, :page_id => alchemy_page.id
56
- response.body.should have_selector("#element_#{element.id}.element_editor.not-draggable")
49
+ get :index, page_id: page.id
50
+ response.body.should have_selector("#element_#{trashed.id}.element_editor.not-draggable")
57
51
  end
58
-
59
52
  end
60
-
61
53
  end
62
54
 
63
- context "#clear" do
64
-
55
+ describe "#clear" do
65
56
  it "should destroy all containing elements" do
66
- post :clear, {:page_id => alchemy_page.id, :format => :js}
57
+ Element.trashed.should_not be_empty
58
+ xhr :post, :clear, page_id: alchemy_page.id
67
59
  Element.trashed.should be_empty
68
60
  end
69
-
70
61
  end
71
62
 
72
63
  end
73
-
74
64
  end
75
65
  end
@@ -1,103 +1,132 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Alchemy::Admin::UsersController do
4
- let(:admin) { FactoryGirl.create(:admin_user, email: 'admin@admin.com', login: 'admin') }
5
- before { sign_in :user, admin }
3
+ module Alchemy
4
+ describe Admin::UsersController do
6
5
 
7
- describe '#new' do
8
- render_views
6
+ let(:admin) { FactoryGirl.build_stubbed(:admin_user) }
9
7
 
10
- it "has send_credentials checkbox activated" do
11
- get :new
12
- response.body.should match /<input checked="checked" id="user_send_credentials" name="user\[send_credentials\]" type="checkbox"/
13
- end
14
- end
15
-
16
- describe '#edit' do
17
- render_views
18
-
19
- it "has send_credentials checkbox deactivated" do
20
- get :edit, id: admin.id
21
- response.body.should match /<input id="user_send_credentials" name="user\[send_credentials\]" type="checkbox"/
22
- end
23
- end
24
-
25
- describe '#create' do
26
- before { ActionMailer::Base.deliveries = [] }
27
-
28
- it "creates an user record" do
29
- post :create, user: FactoryGirl.attributes_for(:user).merge(send_credentials: true)
30
- Alchemy::User.count.should == 2
31
- end
32
-
33
- context "with send_credentials set to true" do
34
- it "should send an email notification" do
35
- post :create, user: FactoryGirl.attributes_for(:user).merge(send_credentials: true)
36
- ActionMailer::Base.deliveries.should_not be_empty
37
- end
38
- end
39
-
40
- context "with send_credentials left blank" do
41
- it "should not send an email notification" do
42
- post :create, user: FactoryGirl.attributes_for(:user)
43
- ActionMailer::Base.deliveries.should be_empty
8
+ before do
9
+ controller.stub!(:store_user_request_time)
10
+ User.stub!(:find).and_return(admin)
11
+ admin.stub!(:update_without_password).and_return(true)
12
+ admin.stub!(:update_attributes).and_return(true)
13
+ sign_in(admin)
44
14
  end
45
- end
46
- end
47
-
48
- describe '#update' do
49
- let(:user) { FactoryGirl.create(:user) }
50
-
51
- before { ActionMailer::Base.deliveries = [] }
52
15
 
53
- it "assigns user to @user" do
54
- post :update, :id => user.id, :user => {}, :format => :js
55
- assigns(:user).should eq(user)
56
- end
16
+ describe '#new' do
17
+ render_views
57
18
 
58
- context "with empty password passed" do
59
- it "should update the user" do
60
- post :update, :id => user.id, :user => {:firstname => 'Johnny', :password => '', :password_confirmation => ''}, :format => :js
61
- assigns(:user).should be_valid
19
+ it "has send_credentials checkbox activated" do
20
+ get :new
21
+ response.body.should match /<input checked="checked" id="user_send_credentials" name="user\[send_credentials\]" type="checkbox"/
22
+ end
62
23
  end
63
- end
64
24
 
65
- context "with new password passed" do
66
- it "should update the user" do
67
- post :update, :id => user.id, :user => {:firstname => 'Johnny', :password => 'newpassword', :password_confirmation => 'newpassword'}, :format => :js
68
- assigns(:user).password.should == 'newpassword'
69
- end
70
- end
25
+ describe '#edit' do
26
+ render_views
71
27
 
72
- context "with send_credentials set to true" do
73
- it "should send an email notification" do
74
- post :update, id: user.id, user: {send_credentials: true}
75
- ActionMailer::Base.deliveries.should_not be_empty
28
+ it "has send_credentials checkbox deactivated" do
29
+ get :edit, id: admin.id
30
+ response.body.should match /<input id="user_send_credentials" name="user\[send_credentials\]" type="checkbox"/
31
+ end
76
32
  end
77
- end
78
33
 
79
- context "with send_credentials left blank" do
80
- it "should not send an email notification" do
81
- post :update, :id => user.id, :user => {}
82
- ActionMailer::Base.deliveries.should be_empty
34
+ describe '#create' do
35
+ before { ActionMailer::Base.deliveries = [] }
36
+
37
+ it "creates an user record" do
38
+ post :create, user: FactoryGirl.attributes_for(:user).merge(send_credentials: '1')
39
+ Alchemy::User.count.should == 1
40
+ end
41
+
42
+ context "with send_credentials set to '1'" do
43
+ it "should send an email notification" do
44
+ post :create, user: FactoryGirl.attributes_for(:user).merge(send_credentials: '1')
45
+ ActionMailer::Base.deliveries.should_not be_empty
46
+ end
47
+ end
48
+
49
+ context "with send_credentials set to true" do
50
+ it "should not send an email notification" do
51
+ post :create, user: FactoryGirl.attributes_for(:user).merge(send_credentials: true)
52
+ ActionMailer::Base.deliveries.should be_empty
53
+ end
54
+ end
55
+
56
+ context "with send_credentials left blank" do
57
+ it "should not send an email notification" do
58
+ post :create, user: FactoryGirl.attributes_for(:user)
59
+ ActionMailer::Base.deliveries.should be_empty
60
+ end
61
+ end
83
62
  end
84
- end
85
63
 
86
- context "if user is permitted to update roles" do
87
- it "updates the user including role" do
88
- controller.stub(:permitted_to?).with(:update_roles).and_return { true }
89
- Alchemy::User.any_instance.should_receive(:update_attributes).with({'roles' => ['Administrator']})
90
- post :update, :id => user.id, :user => {:roles => ['Administrator']}, :format => :js
91
- end
92
- end
64
+ describe '#update' do
65
+ before do
66
+ ActionMailer::Base.deliveries = []
67
+ end
68
+
69
+ it "assigns user to @user" do
70
+ post :update, id: admin.id, user: {}, format: :js
71
+ assigns(:user).should eq(admin)
72
+ end
73
+
74
+ context "with empty password passed" do
75
+ it "should update the user" do
76
+ params_hash = {'firstname' => 'Johnny', 'password' => '', 'password_confirmation' => ''}
77
+ admin.should_receive(:update_without_password).with(params_hash).and_return(true)
78
+ post :update, id: admin.id, user: params_hash, format: :js
79
+ end
80
+ end
81
+
82
+ context "with new password passed" do
83
+ it "should update the user" do
84
+ params_hash = {'firstname' => 'Johnny', 'password' => 'newpassword', 'password_confirmation' => 'newpassword'}
85
+ admin.should_receive(:update_attributes).with(params_hash)
86
+ post :update, id: admin.id, user: params_hash, format: :js
87
+ end
88
+ end
89
+
90
+ context "with send_credentials set to '1'" do
91
+ let(:user) { FactoryGirl.build(:user) }
92
+ before { User.stub!(:find).and_return(user) }
93
+
94
+ it "should send an email notification" do
95
+ post :update, id: user.id, user: {send_credentials: '1'}
96
+ ActionMailer::Base.deliveries.should_not be_empty
97
+ end
98
+ end
99
+
100
+ context "with send_credentials left blank" do
101
+ it "should not send an email notification" do
102
+ post :update, id: admin.id, user: {}, format: :js
103
+ ActionMailer::Base.deliveries.should be_empty
104
+ end
105
+ end
106
+
107
+ context "if user is permitted to update roles" do
108
+ before do
109
+ controller.stub!(:permitted_to?).with(:update_roles).and_return(true)
110
+ end
111
+
112
+ it "updates the user including role" do
113
+ admin.should_receive(:update_without_password).with({'roles' => ['Administrator']})
114
+ post :update, id: admin.id, user: {roles: ['Administrator']}, format: :js
115
+ end
116
+ end
117
+
118
+ context "if the user is not permitted to update roles" do
119
+ before do
120
+ controller.stub!(:permitted_to?).with(:update_roles).and_return(false)
121
+ end
122
+
123
+ it "updates user without role" do
124
+ admin.should_receive(:update_without_password).with({})
125
+ post :update, id: admin.id, user: {'roles' => ['Administrator']}, format: :js
126
+ end
127
+ end
93
128
 
94
- context "if the user is not permitted to update roles" do
95
- it "updates user without role" do
96
- controller.stub(:permitted_to?).with(:update_roles).and_return { false }
97
- Alchemy::User.any_instance.should_receive(:update_attributes).with({})
98
- post :update, :id => user.id, :user => {'roles' => ['Administrator']}, :format => :js
99
129
  end
100
- end
101
- end
102
130
 
131
+ end
103
132
  end
@@ -24,10 +24,14 @@ module Alchemy
24
24
  response.should redirect_to(login_path)
25
25
  end
26
26
 
27
+ it "should raise ActiveRecord::RecordNotFound for requesting not existing attachments" do
28
+ expect { get :download, id: 0 }.to raise_error(ActiveRecord::RecordNotFound)
29
+ end
30
+
27
31
  context "as registered user" do
28
32
 
29
33
  before do
30
- sign_in :user, FactoryGirl.create(:registered_user)
34
+ sign_in(registered_user)
31
35
  end
32
36
 
33
37
  it "should be possible to download attachments from restricted pages" do
@@ -46,7 +50,7 @@ module Alchemy
46
50
  context "as registered user" do
47
51
 
48
52
  before do
49
- sign_in :user, FactoryGirl.create(:registered_user)
53
+ sign_in(registered_user)
50
54
  end
51
55
 
52
56
  it "should be possible to see attachments from restricted pages" do
@@ -119,6 +119,28 @@ module Alchemy
119
119
  end
120
120
 
121
121
  end
122
+
123
+ describe "#layout_for_page" do
124
+ it "should return false if params[:layout] is set to false" do
125
+ controller.stub!(:params).and_return(layout: 'false')
126
+ expect(controller.send(:layout_for_page)).to be_false
127
+ end
128
+
129
+ it "should return false if params[:layout] is set to none" do
130
+ controller.stub!(:params).and_return(layout: 'none')
131
+ expect(controller.send(:layout_for_page)).to be_false
132
+ end
133
+
134
+ it "should return the layout name set through params[:layout]" do
135
+ controller.stub!(:params).and_return(layout: 'my_layout')
136
+ expect(controller.send(:layout_for_page)).to eq('my_layout')
137
+ end
138
+
139
+ it "should return 'application' if params[:layout] is not set" do
140
+ controller.stub!(:params).and_return({})
141
+ expect(controller.send(:layout_for_page)).to eq('application')
142
+ end
143
+ end
122
144
 
123
145
  end
124
146
  end
@@ -33,7 +33,7 @@ module Alchemy
33
33
 
34
34
  context "for registered user" do
35
35
  before do
36
- sign_in :user, FactoryGirl.create(:registered_user)
36
+ sign_in(registered_user)
37
37
  end
38
38
 
39
39
  it "should render elements of restricted pages" do
@@ -0,0 +1,200 @@
1
+ require 'spec_helper'
2
+
3
+ module Alchemy
4
+ describe MessagesController do
5
+
6
+ before do
7
+ controller.instance_variable_set(:@page, page)
8
+ controller.stub!(:get_page).and_return(page)
9
+ end
10
+
11
+ describe "#index" do
12
+
13
+ let(:page) { mock_model('Page', {urlname: 'contact', page_layout: 'contact'}) }
14
+
15
+ it "should redirect to @page" do
16
+ expect(get :index).to redirect_to(show_page_path(urlname: page.urlname))
17
+ end
18
+ end
19
+
20
+ describe "#new" do
21
+
22
+ it "should render the alchemy/pages/show template" do
23
+ get :new
24
+ expect(get :new).to render_template('alchemy/pages/show')
25
+ end
26
+
27
+ it "should call #layout_for_page to render the correct layout" do
28
+ controller.should_receive(:layout_for_page)
29
+ get :new
30
+ end
31
+ end
32
+
33
+ describe "#create" do
34
+
35
+ before { controller.stub!(:params).and_return({message: {email: ''}}) }
36
+
37
+ let(:page) { mock_model('Page', get_language_root: mock_model('Page')) }
38
+ let(:element) { mock_model('Element', page: page, ingredient: '') }
39
+ let(:message) { Message.new }
40
+
41
+ it "should raise ActiveRecord::RecordNotFound if element of contactform could not be found" do
42
+ expect { get :create }.to raise_error(ActiveRecord::RecordNotFound)
43
+ end
44
+
45
+ context "if validation of message" do
46
+
47
+ before do
48
+ Element.stub!(:find_by_id).and_return(element)
49
+ Message.any_instance.stub(:contact_form_id).and_return(1)
50
+ end
51
+
52
+ context "is false" do
53
+ before { Message.any_instance.stub(:valid?).and_return(false) }
54
+
55
+ it "should render 'alchemy/pages/show' template" do
56
+ expect(get :create).to render_template('alchemy/pages/show')
57
+ end
58
+ end
59
+
60
+ context "is true" do
61
+ before do
62
+ Message.any_instance.stub(:valid?).and_return(true)
63
+ Messages.stub_chain(:contact_form_mail, :deliver).and_return(true)
64
+ end
65
+
66
+ it "Messages should call Messages#contact_form_mail to send the email" do
67
+ Messages.should_receive(:contact_form_mail)
68
+ get :create
69
+ end
70
+
71
+ describe '#mail_to' do
72
+ context "with element having mail_to ingredient" do
73
+ before {
74
+ element.stub(:ingredient).with(:mail_to).and_return('peter@schroeder.de')
75
+ message
76
+ Message.stub(:new).and_return(message)
77
+ }
78
+
79
+ it "returns the ingredient" do
80
+ Messages.should_receive(:contact_form_mail).with(message, 'peter@schroeder.de', '', '')
81
+ get :create
82
+ end
83
+ end
84
+
85
+ context "with element having no mail_to ingredient" do
86
+ before {
87
+ element.stub(:ingredient).with(:mail_to).and_return(nil)
88
+ message
89
+ Message.stub(:new).and_return(message)
90
+ }
91
+
92
+ it "returns the config value" do
93
+ Messages.should_receive(:contact_form_mail).with(message, 'your.mail@your-domain.com', '', '')
94
+ get :create
95
+ end
96
+ end
97
+ end
98
+
99
+ describe '#mail_from' do
100
+ context "with element having mail_from ingredient" do
101
+ before {
102
+ element.stub(:ingredient).with(:mail_from).and_return('peter@schroeder.de')
103
+ message
104
+ Message.stub(:new).and_return(message)
105
+ }
106
+
107
+ it "returns the ingredient" do
108
+ Messages.should_receive(:contact_form_mail).with(message, '', 'peter@schroeder.de', '')
109
+ get :create
110
+ end
111
+ end
112
+
113
+ context "with element having no mail_from ingredient" do
114
+ before {
115
+ element.stub(:ingredient).with(:mail_from).and_return(nil)
116
+ message
117
+ Message.stub(:new).and_return(message)
118
+ }
119
+
120
+ it "returns the config value" do
121
+ Messages.should_receive(:contact_form_mail).with(message, '', 'your.mail@your-domain.com', '')
122
+ get :create
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#subject' do
128
+ context "with element having subject ingredient" do
129
+ before {
130
+ element.stub(:ingredient).with(:subject).and_return('A new message')
131
+ message
132
+ Message.stub(:new).and_return(message)
133
+ }
134
+
135
+ it "returns the ingredient" do
136
+ Messages.should_receive(:contact_form_mail).with(message, '', '', 'A new message')
137
+ get :create
138
+ end
139
+ end
140
+
141
+ context "with element having no subject ingredient" do
142
+ before {
143
+ element.stub(:ingredient).with(:subject).and_return(nil)
144
+ message
145
+ Message.stub(:new).and_return(message)
146
+ }
147
+
148
+ it "returns the config value" do
149
+ Messages.should_receive(:contact_form_mail).with(message, '', '', 'A new contact form message')
150
+ get :create
151
+ end
152
+ end
153
+ end
154
+
155
+ describe "#redirect_to_success_page" do
156
+
157
+ context "if 'success_page' ingredient of element is set with urlname" do
158
+ before { element.stub!(:ingredient).with('success_page').and_return('success-page') }
159
+
160
+ it "should redirect to the given urlname" do
161
+ expect(get :create).to redirect_to(show_page_path(urlname: 'success-page'))
162
+ end
163
+ end
164
+
165
+ context "if 'success_page' ingredient of element is not set" do
166
+ before { element.stub!(:ingredient).with('success_page').and_return(nil) }
167
+
168
+ context "but mailer_config['forward_to_page'] is true and mailer_config['mail_success_page'] is set" do
169
+ before do
170
+ controller.stub!(:mailer_config).and_return({'forward_to_page' => true, 'mail_success_page' => 'mailer-config-success-page'})
171
+ Page.stub_chain(:find_by_urlname, :urlname).and_return('mailer-config-success-page')
172
+ end
173
+
174
+ it "redirect to the given success page" do
175
+ expect(get :create).to redirect_to(show_page_path(urlname: 'mailer-config-success-page'))
176
+ end
177
+ end
178
+
179
+ context "and mailer_config has no instructions for success_page" do
180
+ before do
181
+ controller.stub!(:mailer_config).and_return({})
182
+ end
183
+
184
+ it "should redirect to the language root page" do
185
+ Page.stub_chain(:language_root_for, :urlname).and_return('lang-root')
186
+ expect(get :create).to redirect_to(show_page_path(urlname: 'lang-root'))
187
+ end
188
+ end
189
+
190
+ end
191
+
192
+ end
193
+ end
194
+
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+ end