alchemy_cms 2.6.3 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -32,6 +32,23 @@ module Alchemy
32
32
  end
33
33
  end
34
34
 
35
+ describe '#render_site_layout' do
36
+ let(:default_site) { Alchemy::Site.default }
37
+
38
+ it "renders the partial for current site" do
39
+ helper.should_receive(:current_site).and_return(default_site)
40
+ helper.should_receive(:render).with(default_site)
41
+ helper.render_site_layout
42
+ end
43
+
44
+ context "with missing partial" do
45
+ it "returns empty string and logges warning" do
46
+ helper.should_receive(:current_site).twice.and_return(default_site)
47
+ expect(helper.render_site_layout).to eq("")
48
+ end
49
+ end
50
+ end
51
+
35
52
  describe "#render_navigation" do
36
53
  before { visible_page }
37
54
 
@@ -280,6 +297,12 @@ module Alchemy
280
297
 
281
298
  describe "#render_meta_data" do
282
299
 
300
+ context "@page is not set" do
301
+ it "should reutrn nil" do
302
+ expect(helper.render_meta_data.should).to eq(nil)
303
+ end
304
+ end
305
+
283
306
  it "should render meta keywords of current page" do
284
307
  @page = mock_model('Page', :language => language, :title => 'A Public Page', :meta_description => '', :meta_keywords => 'keyword1, keyword2', :robot_index? => false, :robot_follow? => false, :contains_feed? => false, :updated_at => '2011-11-29-23:00:00')
285
308
  helper.render_meta_data.should have_selector('meta[name="keywords"][content="keyword1, keyword2"]')
@@ -388,5 +411,30 @@ module Alchemy
388
411
 
389
412
  end
390
413
 
414
+ describe "#picture_essence_caption" do
415
+ let(:essence) { mock_model('EssencePicture', caption: 'my caption') }
416
+ let(:content) { mock_model('Content', essence: essence) }
417
+
418
+ it "should return the caption of the contents essence" do
419
+ expect(helper.picture_essence_caption(content)).to eq "my caption"
420
+ end
421
+ end
422
+
423
+ describe "#language_switches" do
424
+ it "should return a deprecation warning" do
425
+ ActiveSupport::Deprecation.should_receive(:warn)
426
+ helper.should_receive(:language_links).and_return(nil)
427
+ helper.language_switches
428
+ end
429
+ end
430
+
431
+ describe "#language_switcher" do
432
+ it "should return a deprecation warning" do
433
+ ActiveSupport::Deprecation.should_receive(:warn)
434
+ helper.should_receive(:language_links).and_return(nil)
435
+ helper.language_switcher
436
+ end
437
+ end
438
+
391
439
  end
392
440
  end
@@ -87,6 +87,13 @@ module Alchemy
87
87
 
88
88
  end
89
89
 
90
+ describe "#page_path_for" do
91
+ it "is deprecated" do
92
+ ActiveSupport::Deprecation.should_receive(:warn)
93
+ helper.page_path_for
94
+ end
95
+ end
96
+
90
97
  describe "#show_alchemy_page_url" do
91
98
 
92
99
  context "when multi_language" do
@@ -1,7 +1,114 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Alchemy::Config do
4
- it "should have an array of fields for mailer" do
5
- Alchemy::Config.get(:mailer)['fields'].should be_a(Array)
3
+ module Alchemy
4
+ describe Config do
5
+
6
+ describe ".get" do
7
+ it "should call #show" do
8
+ Config.should_receive(:show).and_return({})
9
+ Config.get(:mailer)
10
+ end
11
+
12
+ it "should return the requested part of the config" do
13
+ Config.should_receive(:show).and_return({'mailer' => {'setting' => 'true'}})
14
+ expect(Config.get(:mailer)).to eq({'setting' => 'true'})
15
+ end
16
+ end
17
+
18
+ describe '.main_app_config' do
19
+ let(:main_app_config_path) { "#{Rails.root}/config/alchemy/config.yml" }
20
+
21
+ it "should call and return .read_file with the correct config path" do
22
+ Config.should_receive(:read_file).with(main_app_config_path).once.and_return({setting: 'true'})
23
+ expect(Config.send(:main_app_config)).to eq({setting: 'true'})
24
+ end
25
+ end
26
+
27
+ describe '.env_specific_config' do
28
+ let(:env_specific_config_path) { "#{Rails.root}/config/alchemy/#{Rails.env}.config.yml" }
29
+
30
+ it "should call and return .read_file with the correct config path" do
31
+ Config.should_receive(:read_file).with(env_specific_config_path).once.and_return({setting: 'true'})
32
+ expect(Config.send(:env_specific_config)).to eq({setting: 'true'})
33
+ end
34
+ end
35
+
36
+ describe ".show" do
37
+ context "when ivar @config was not set before" do
38
+ before { Config.instance_variable_set("@config", nil) }
39
+
40
+ it "should call and return .merge_configs!" do
41
+ Config.should_receive(:merge_configs!).once.and_return({setting: 'true'})
42
+ expect(Config.show).to eq({setting: 'true'})
43
+ end
44
+ end
45
+
46
+ context "when ivar @config was already set" do
47
+ before { Config.instance_variable_set("@config", {setting: 'true'}) }
48
+ after { Config.instance_variable_set("@config", nil) }
49
+
50
+ it "should have memoized the return value of .merge_configs!" do
51
+ expect(Config.send(:show)).to eq({setting: 'true'})
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '.read_file' do
57
+ context 'when given path to yml file exists' do
58
+ before { File.stub!(:exists?).and_return(true) }
59
+
60
+ it 'should call YAML.load_file with the given config path' do
61
+ YAML.should_receive(:load_file).once.with('path/to/config.yml').and_return({})
62
+ Config.send(:read_file, 'path/to/config.yml')
63
+ end
64
+
65
+ context 'but its empty' do
66
+ before do
67
+ File.stub!(:exists?).with('empty_file.yml').and_return(true)
68
+ YAML.stub!(:load_file).and_return(false) # YAML.load_file returns false if file is empty.
69
+ end
70
+
71
+ it "should return an empty Hash" do
72
+ expect(Config.send(:read_file, 'empty_file.yml')).to eq({})
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'when given path to yml file does not exist' do
78
+ it 'should return an empty Hash' do
79
+ expect(Config.send(:read_file, 'does/not/exist.yml')).to eq({})
80
+ end
81
+ end
82
+ end
83
+
84
+ describe '.merge_configs!' do
85
+ let(:config_1) do
86
+ {setting_1: 'same', other_setting: 'something'}
87
+ end
88
+
89
+ let(:config_2) do
90
+ {setting_1: 'same', setting_2: 'anything'}
91
+ end
92
+
93
+ it "should stringify the keys" do
94
+ expect(Config.send(:merge_configs!, config_1)).to eq(config_1.stringify_keys!)
95
+ end
96
+
97
+ context 'when all passed configs are empty' do
98
+ it "should raise an error" do
99
+ expect { Config.send(:merge_configs!, {}) }.to raise_error
100
+ end
101
+ end
102
+
103
+ context 'when configs containing same keys' do
104
+ it "should merge them together" do
105
+ expect(Config.send(:merge_configs!, config_1, config_2)).to eq(
106
+ {'setting_1' => 'same', 'other_setting' => 'something', 'setting_2' => 'anything'}
107
+ )
108
+ end
109
+ end
110
+ end
111
+
6
112
  end
113
+
7
114
  end
@@ -1,18 +1,38 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "ActsAsEssence" do
3
+ module Alchemy
4
+ describe "ActsAsEssence" do
5
+ #let(:element) { FactoryGirl.create(:element, :name => 'headline', :create_contents_after_create => true) }
6
+ let(:essence) { Alchemy::EssenceText.new }
4
7
 
5
- let(:element) { FactoryGirl.create(:element, :name => 'headline', :create_contents_after_create => true) }
8
+ describe '#ingredient=' do
9
+ it 'should set the value to ingredient column' do
10
+ essence.ingredient = 'Hallo'
11
+ expect(essence.ingredient).to eq('Hallo')
12
+ end
13
+ end
14
+
15
+ describe '#open_link_in_new_window?' do
16
+
17
+ subject { essence.open_link_in_new_window? }
6
18
 
7
- describe '#ingredient=' do
19
+ context 'essence responds to link_taget' do
20
+ context 'if link_target attribute is set to "blank"' do
8
21
 
9
- it "should set the value to ingredient column" do
10
- content = element.content_by_name('headline')
11
- content.essence.ingredient = 'Hallo'
12
- content.essence.save
13
- content.essence.ingredient.should == 'Hallo'
22
+ before { essence.link_target = 'blank' }
23
+
24
+ it "should return true" do
25
+ expect(subject).to eq(true)
26
+ end
27
+ end
28
+
29
+ context 'if link_target attribute is not "blank"' do
30
+ it "should return false" do
31
+ expect(subject).to eq(false)
32
+ end
33
+ end
34
+ end
14
35
  end
15
36
 
16
37
  end
17
-
18
38
  end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ module Alchemy
4
+ describe PageLayout do
5
+
6
+ describe ".all" do
7
+ # skip memoization
8
+ before { PageLayout.instance_variable_set("@definitions", nil) }
9
+
10
+ subject { PageLayout.all }
11
+
12
+ it "should return all page_layouts" do
13
+ should be_instance_of(Array)
14
+ subject.collect { |l| l['name'] }.should include('standard')
15
+ end
16
+
17
+ context "with empty layouts file" do
18
+ before { YAML.should_receive(:load_file).and_return(false) }
19
+
20
+ it "returns empty array" do
21
+ should == []
22
+ end
23
+ end
24
+
25
+ context "with missing layouts file" do
26
+ before { File.should_receive(:exists?).and_return(false) }
27
+
28
+ it "raises error empty array" do
29
+ expect { subject }.to raise_error(LoadError)
30
+ end
31
+ end
32
+ end
33
+
34
+ describe '.add' do
35
+ it "adds a definition to all definitions" do
36
+ PageLayout.add({'name' => 'foo'})
37
+ PageLayout.all.should include({'name' => 'foo'})
38
+ end
39
+
40
+ it "adds a array of definitions to all definitions" do
41
+ PageLayout.add([{'name' => 'foo'}, {'name' => 'bar'}])
42
+ PageLayout.all.should include({'name' => 'foo'})
43
+ PageLayout.all.should include({'name' => 'bar'})
44
+ end
45
+ end
46
+
47
+ describe ".get" do
48
+ it "should return the page_layout description found by given name" do
49
+ PageLayout.stub(:all).and_return([{'name' => 'default'}, {'name' => 'contact'}])
50
+ expect(PageLayout.get('default')).to eq({'name' => 'default'})
51
+ end
52
+ end
53
+
54
+ describe '.layouts_with_own_for_select' do
55
+ it "should not hold a layout twice" do
56
+ layouts = PageLayout.layouts_with_own_for_select('standard', 1, false)
57
+ layouts = layouts.collect(&:last)
58
+ layouts.select { |l| l == "standard" }.length.should == 1
59
+ end
60
+ end
61
+
62
+ describe '.selectable_layouts' do
63
+ let(:language) { Language.get_default }
64
+ before { language }
65
+ subject { PageLayout.selectable_layouts(language.id) }
66
+
67
+ it "should not display hidden page layouts" do
68
+ subject.each { |l| l['hide'].should_not == true }
69
+ end
70
+
71
+ context "with already taken layouts" do
72
+ before {
73
+ PageLayout.stub(:all).and_return([{'unique' => true}])
74
+ Page.stub_chain(:where, :pluck).and_return([1])
75
+ }
76
+
77
+ it "should not include unique layouts" do
78
+ subject.each { |l| l['unique'].should_not == true }
79
+ end
80
+ end
81
+
82
+ context "with sites layouts present" do
83
+ let(:site) { Site.new }
84
+ let(:definitions) { [{'name' => 'default_site', 'page_layouts' => %w(intro)}] }
85
+ before { Site.stub(:layout_definitions).and_return(definitions) }
86
+
87
+ it "should only return layouts for site" do
88
+ subject.length.should == 1
89
+ subject.first['name'].should == 'intro'
90
+ end
91
+ end
92
+ end
93
+
94
+ describe ".element_names_for" do
95
+ it "should return all element names for the given pagelayout" do
96
+ PageLayout.stub(:get).with('default').and_return({'name' => 'default', 'elements' => ['element_1', 'element_2']})
97
+ expect(PageLayout.element_names_for('default')).to eq(['element_1', 'element_2'])
98
+ end
99
+
100
+ context "when given page_layout name does not exist" do
101
+ it "should return an empty array" do
102
+ expect(PageLayout.element_names_for('layout_does_not_exist!')).to eq([])
103
+ end
104
+ end
105
+
106
+ context "when page_layout description does not contain the elements key" do
107
+ it "should return an empty array" do
108
+ PageLayout.stub(:get).with('layout_without_elements_key').and_return({'name' => 'layout_without_elements_key'})
109
+ expect(PageLayout.element_names_for('layout_without_elements_key')).to eq([])
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '.human_layout_name' do
115
+ let(:layout) { {'name' => 'contact'} }
116
+ subject { PageLayout.human_layout_name(layout['name']) }
117
+
118
+ context "with no translation present" do
119
+ it "returns the name capitalized" do
120
+ should == 'Contact'
121
+ end
122
+ end
123
+
124
+ context "with translation present" do
125
+ before { I18n.should_receive(:t).and_return('Kontakt') }
126
+
127
+ it "returns the translated name" do
128
+ should == 'Kontakt'
129
+ end
130
+ end
131
+ end
132
+
133
+ end
134
+ end
@@ -1,4 +1,6 @@
1
- require 'spec_helper'
1
+ require 'rspec'
2
+ require File.dirname(__FILE__) + '/../../lib/alchemy/resource'
3
+ require File.dirname(__FILE__) + '/../../lib/alchemy/errors'
2
4
 
3
5
  class Event
4
6
  end
@@ -152,13 +154,6 @@ module Alchemy
152
154
  end
153
155
  end
154
156
 
155
- describe "#model_name" do
156
- it "is deprecated" do
157
- ActiveSupport::Deprecation.should_receive(:warn)
158
- Resource.new("admin/events").model_name
159
- end
160
- end
161
-
162
157
  describe "#namespaced_resource_name" do
163
158
 
164
159
  it "returns resource_name with namespace (namespace_event for Namespace::Event), i.e. for use in forms" do
@@ -266,14 +261,6 @@ module Alchemy
266
261
  end
267
262
  end
268
263
 
269
- describe "#namespaced_model_name" do
270
- it "is deprecated" do
271
- ActiveSupport::Deprecation.should_receive(:warn)
272
- resource = Resource.new("admin/events")
273
- resource.namespaced_model_name
274
- end
275
- end
276
-
277
264
  end
278
265
  end
279
266
  end
@@ -1,4 +1,7 @@
1
- require 'spec_helper'
1
+ require 'rspec'
2
+ require 'ostruct'
3
+ require File.dirname(__FILE__) + "/../../lib/alchemy/resource"
4
+ require File.dirname(__FILE__) + "/../../lib/alchemy/resources_helper"
2
5
 
3
6
  module Namespace
4
7
  class MyResource
@@ -135,13 +138,6 @@ describe Alchemy::ResourcesHelper do
135
138
  end
136
139
  end
137
140
 
138
- describe "#resource_model_name" do
139
- it "is deprecated" do
140
- ActiveSupport::Deprecation.should_receive(:warn)
141
- @controller.resource_model_name
142
- end
143
- end
144
-
145
141
  describe "#resource_name" do
146
142
  it "returns resource_handler.resource_name" do
147
143
  @controller.resource_name.should == "my_resource"
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'alchemy/shell'
2
3
 
3
4
  module Alchemy
4
5