alchemy_cms 3.2.0.beta → 3.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +661 -863
- data/README.md +5 -63
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +11 -10
- data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +6 -0
- data/app/assets/stylesheets/alchemy/_extends.scss +0 -6
- data/app/assets/stylesheets/alchemy/_mixins.scss +6 -0
- data/app/assets/stylesheets/alchemy/buttons.scss +1 -1
- data/app/assets/stylesheets/alchemy/elements.scss +1 -1
- data/app/assets/stylesheets/alchemy/menubar.scss +1 -1
- data/app/assets/stylesheets/alchemy/selects.scss +5 -1
- data/app/assets/stylesheets/alchemy/upload.scss +1 -1
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
- data/app/controllers/alchemy/base_controller.rb +4 -57
- data/app/controllers/alchemy/messages_controller.rb +2 -2
- data/app/controllers/alchemy/pages_controller.rb +22 -31
- data/app/controllers/alchemy/pictures_controller.rb +2 -2
- data/app/helpers/alchemy/admin/base_helper.rb +7 -0
- data/app/helpers/alchemy/admin/elements_helper.rb +31 -15
- data/app/helpers/alchemy/admin/pages_helper.rb +17 -0
- data/app/helpers/alchemy/base_helper.rb +0 -28
- data/app/helpers/alchemy/pages_helper.rb +18 -12
- data/app/helpers/alchemy/url_helper.rb +2 -2
- data/app/models/alchemy/cell.rb +1 -1
- data/app/models/alchemy/content/factory.rb +12 -6
- data/app/models/alchemy/element.rb +3 -3
- data/app/models/alchemy/element/definitions.rb +1 -1
- data/app/models/alchemy/element_to_page.rb +7 -0
- data/app/models/alchemy/language.rb +1 -1
- data/app/models/alchemy/page.rb +8 -1
- data/app/models/alchemy/page/page_cells.rb +2 -2
- data/app/models/alchemy/page/page_elements.rb +23 -5
- data/app/models/alchemy/page/page_natures.rb +3 -3
- data/app/models/alchemy/page/page_scopes.rb +1 -1
- data/app/models/alchemy/picture.rb +1 -1
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
- data/app/views/alchemy/breadcrumb/_page.html.erb +3 -2
- data/app/views/alchemy/breadcrumb/_separator.html.erb +1 -0
- data/app/views/alchemy/breadcrumb/_wrapper.html.erb +13 -0
- data/app/views/alchemy/language_links/_language.html.erb +1 -1
- data/app/views/alchemy/navigation/_link.html.erb +1 -1
- data/app/views/alchemy/pages/show.rss.builder +5 -7
- data/app/views/layouts/alchemy/admin.html.erb +5 -0
- data/config/routes.rb +13 -10
- data/lib/alchemy/configuration_methods.rb +29 -0
- data/lib/alchemy/controller_actions.rb +12 -4
- data/lib/alchemy/engine.rb +3 -0
- data/lib/alchemy/errors.rb +1 -1
- data/lib/alchemy/essence.rb +14 -12
- data/lib/alchemy/on_page_layout.rb +58 -0
- data/lib/alchemy/page_layout.rb +1 -1
- data/lib/alchemy/permissions.rb +21 -16
- data/lib/alchemy/routing_constraints.rb +49 -0
- data/lib/alchemy/seeder.rb +4 -2
- data/lib/alchemy/ssl_protection.rb +30 -0
- data/lib/alchemy/test_support/essence_shared_examples.rb +118 -25
- data/lib/alchemy/test_support/factories.rb +5 -8
- data/lib/alchemy/test_support/integration_helpers.rb +16 -10
- data/lib/alchemy/upgrader/three_point_two.rb +34 -4
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_editor.html.erb +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_view.html.erb +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/_standard.html.erb +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.de.yml +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.elements.css.scss +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.en.yml +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.es.yml +0 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/files/application.html.erb +0 -0
- data/lib/rails/generators/alchemy/install/install_generator.rb +69 -0
- data/lib/rails/generators/alchemy/{scaffold/files/elements.yml → install/templates/elements.yml.tt} +2 -0
- data/lib/rails/generators/alchemy/{scaffold → install}/templates/page_layouts.yml.tt +2 -0
- data/lib/rails/generators/alchemy/views/views_generator.rb +41 -0
- data/lib/rails/templates/alchemy.rb +2 -2
- data/lib/tasks/alchemy/db.rake +0 -5
- data/lib/tasks/alchemy/install.rake +10 -5
- data/lib/tasks/alchemy/tidy.rake +2 -0
- data/spec/controllers/admin/attachments_controller_spec.rb +1 -1
- data/spec/controllers/admin/clipboard_controller_spec.rb +1 -1
- data/spec/controllers/admin/contents_controller_spec.rb +1 -1
- data/spec/controllers/admin/dashboard_controller_spec.rb +2 -2
- data/spec/controllers/admin/elements_controller_spec.rb +1 -1
- data/spec/controllers/admin/essence_files_controller_spec.rb +1 -1
- data/spec/controllers/admin/essence_pictures_controller_spec.rb +1 -1
- data/spec/controllers/admin/languages_controller_spec.rb +1 -1
- data/spec/controllers/admin/layoutpages_controller_spec.rb +1 -1
- data/spec/controllers/admin/pages_controller_spec.rb +4 -4
- data/spec/controllers/admin/pictures_controller_spec.rb +1 -1
- data/spec/controllers/admin/resources_controller_spec.rb +1 -1
- data/spec/controllers/admin/trash_controller_spec.rb +1 -1
- data/spec/controllers/alchemy/admin/tags_controller_spec.rb +1 -1
- data/spec/controllers/attachments_controller_spec.rb +1 -1
- data/spec/controllers/base_controller_spec.rb +22 -0
- data/spec/controllers/elements_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +15 -16
- data/spec/controllers/pictures_controller_spec.rb +212 -162
- data/spec/dummy/app/controllers/login_controller.rb +5 -0
- data/spec/dummy/app/models/dummy_model.rb +3 -0
- data/spec/dummy/config/alchemy/cells.yml +4 -1
- data/spec/dummy/config/alchemy/elements.yml +8 -0
- data/spec/dummy/config/alchemy/page_layouts.yml +5 -1
- data/spec/dummy/config/routes.rb +1 -2
- data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +7 -0
- data/spec/dummy/db/schema.rb +30 -26
- data/spec/features/admin/dashboard_spec.rb +11 -9
- data/spec/features/admin/language_tree_feature_spec.rb +5 -6
- data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
- data/spec/features/admin/link_overlay_spec.rb +1 -1
- data/spec/features/admin/locale_select_feature_spec.rb +1 -1
- data/spec/features/admin/modules_integration_spec.rb +1 -1
- data/spec/features/admin/navigation_feature_spec.rb +1 -1
- data/spec/features/admin/page_creation_feature_spec.rb +1 -1
- data/spec/features/admin/page_editing_feature_spec.rb +3 -3
- data/spec/features/admin/picture_library_integration_spec.rb +1 -1
- data/spec/features/admin/resources_integration_spec.rb +1 -1
- data/spec/features/admin/site_select_feature_spec.rb +32 -0
- data/spec/features/admin/tinymce_feature_spec.rb +1 -3
- data/spec/features/page_feature_spec.rb +36 -27
- data/spec/features/security_spec.rb +1 -1
- data/spec/features/translation_integration_spec.rb +3 -3
- data/spec/helpers/admin/elements_helper_spec.rb +103 -26
- data/spec/helpers/admin/pages_helper_spec.rb +32 -1
- data/spec/helpers/base_helper_spec.rb +0 -45
- data/spec/helpers/pages_helper_spec.rb +18 -17
- data/spec/helpers/url_helper_spec.rb +8 -5
- data/spec/libraries/controller_actions_spec.rb +2 -2
- data/spec/libraries/on_page_layout_spec.rb +112 -0
- data/spec/libraries/page_layout_spec.rb +5 -1
- data/spec/libraries/permissions_spec.rb +13 -15
- data/spec/models/cell_spec.rb +4 -0
- data/spec/models/content_spec.rb +6 -0
- data/spec/models/dummy_model_spec.rb +11 -0
- data/spec/models/element_spec.rb +6 -1
- data/spec/models/element_to_page_spec.rb +14 -0
- data/spec/models/page_spec.rb +111 -19
- data/spec/routing/routing_spec.rb +120 -101
- data/spec/spec_helper.rb +3 -3
- metadata +36 -21
- data/app/views/alchemy/breadcrumb/_spacer.html.erb +0 -1
- data/lib/alchemy/capistrano.rb +0 -230
- data/lib/alchemy/test_support/auth_helpers.rb +0 -35
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +0 -90
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +0 -113
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -63
- data/spec/dummy/app/controllers/errors_controller.rb +0 -5
@@ -4,7 +4,7 @@ describe "Resources" do
|
|
4
4
|
let(:event) { FactoryGirl.create(:event) }
|
5
5
|
let(:second_event) { FactoryGirl.create(:event, :name => 'My second Event', :entrance_fee => 12.32) }
|
6
6
|
|
7
|
-
before {
|
7
|
+
before { authorize_user(:as_admin) }
|
8
8
|
|
9
9
|
describe "index view" do
|
10
10
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Site select' do
|
4
|
+
|
5
|
+
before do
|
6
|
+
authorize_user(:as_admin)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "does not display the site change" do
|
10
|
+
visit admin_dashboard_path
|
11
|
+
expect(page).not_to have_select('change_site')
|
12
|
+
end
|
13
|
+
|
14
|
+
context "multiple sites" do
|
15
|
+
let!(:a_site) { FactoryGirl.create(:site) }
|
16
|
+
|
17
|
+
it "contains all sites in a selectbox" do
|
18
|
+
visit admin_dashboard_path
|
19
|
+
expect(page).to have_select('change_site', options: [Alchemy::Site.default.name, a_site.name], selected: Alchemy::Site.default.name)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when requesting non-default site' do
|
23
|
+
it "provides the correct site" do
|
24
|
+
visit admin_pages_path(site_id: a_site.id)
|
25
|
+
expect(page).to have_select('change_site', selected: a_site.name)
|
26
|
+
|
27
|
+
visit admin_dashboard_path
|
28
|
+
expect(page).to have_select('change_site', selected: a_site.name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'TinyMCE Editor' do
|
4
|
-
let(:user) { DummyUser.new }
|
5
4
|
|
6
5
|
before do
|
7
|
-
|
8
|
-
authorize_as_admin(user)
|
6
|
+
authorize_user(:as_admin)
|
9
7
|
end
|
10
8
|
|
11
9
|
it 'base path should be set to tinymce asset folder' do
|
@@ -3,14 +3,14 @@ require 'spec_helper'
|
|
3
3
|
module Alchemy
|
4
4
|
describe 'Page' do
|
5
5
|
let(:default_language) { Language.default }
|
6
|
-
let(:default_language_root) {
|
7
|
-
let(:public_page_1) {
|
8
|
-
let(:public_child) {
|
6
|
+
let(:default_language_root) { create(:language_root_page, :language => default_language, :name => 'Home') }
|
7
|
+
let(:public_page_1) { create(:public_page, :visible => true, :name => 'Page 1') }
|
8
|
+
let(:public_child) { create(:public_page, :name => 'Public Child', :parent_id => public_page_1.id) }
|
9
9
|
|
10
10
|
before { default_language_root }
|
11
11
|
|
12
12
|
it "should include all its elements and contents" do
|
13
|
-
p =
|
13
|
+
p = create(:public_page, :do_not_autogenerate => false)
|
14
14
|
article = p.elements.find_by_name('article')
|
15
15
|
article.content_by_name('intro').essence.update_attributes(:body => 'Welcome to Peters Petshop', :public => true)
|
16
16
|
visit "/#{p.urlname}"
|
@@ -19,8 +19,8 @@ module Alchemy
|
|
19
19
|
|
20
20
|
it "should show the navigation with all visible pages" do
|
21
21
|
pages = [
|
22
|
-
|
23
|
-
|
22
|
+
create(:public_page, :visible => true, :name => 'Page 1'),
|
23
|
+
create(:public_page, :visible => true, :name => 'Page 2')
|
24
24
|
]
|
25
25
|
visit '/'
|
26
26
|
within('div#navigation ul') { expect(page).to have_selector('li a[href="/page-1"], li a[href="/page-2"]') }
|
@@ -33,7 +33,7 @@ module Alchemy
|
|
33
33
|
allow_any_instance_of(PagesController).to receive(:multi_language?).and_return(true)
|
34
34
|
end
|
35
35
|
|
36
|
-
let(:second_page) {
|
36
|
+
let(:second_page) { create(:public_page, name: 'Second Page') }
|
37
37
|
let(:legacy_url) { LegacyPageUrl.create(urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69', page: second_page) }
|
38
38
|
|
39
39
|
it "should redirect legacy url with unknown format & query string" do
|
@@ -100,16 +100,18 @@ module Alchemy
|
|
100
100
|
before { allow(Alchemy.user_class).to receive(:admins).and_return([1, 2]) }
|
101
101
|
|
102
102
|
it "should render 404 if urlname and lang parameter do not belong to same page" do
|
103
|
-
|
104
|
-
|
105
|
-
|
103
|
+
create(:klingonian)
|
104
|
+
expect {
|
105
|
+
visit "/kl/#{public_page_1.urlname}"
|
106
|
+
}.to raise_error(ActionController::RoutingError)
|
106
107
|
end
|
107
108
|
|
108
109
|
it "should render 404 if requested language does not exist" do
|
109
110
|
public_page_1
|
110
111
|
LegacyPageUrl.delete_all
|
111
|
-
|
112
|
-
|
112
|
+
expect {
|
113
|
+
visit "/fo/#{public_page_1.urlname}"
|
114
|
+
}.to raise_error(ActionController::RoutingError)
|
113
115
|
end
|
114
116
|
end
|
115
117
|
end
|
@@ -120,7 +122,7 @@ module Alchemy
|
|
120
122
|
allow(Config).to receive(:get) { |arg| arg == :url_nesting ? false : Config.parameter(arg) }
|
121
123
|
end
|
122
124
|
|
123
|
-
let(:second_page) {
|
125
|
+
let(:second_page) { create(:public_page, name: 'Second Page') }
|
124
126
|
let(:legacy_url) { LegacyPageUrl.create(urlname: 'index.php?option=com_content&view=article&id=48&Itemid=69', page: second_page) }
|
125
127
|
|
126
128
|
it "should redirect legacy url with unknown format & query string" do
|
@@ -158,7 +160,7 @@ module Alchemy
|
|
158
160
|
end
|
159
161
|
|
160
162
|
it "should keep additional params" do
|
161
|
-
visit "/
|
163
|
+
visit "/en/#{public_page_1.urlname}?query=Peter"
|
162
164
|
expect(page.current_url).to match(/\?query=Peter/)
|
163
165
|
end
|
164
166
|
end
|
@@ -166,12 +168,14 @@ module Alchemy
|
|
166
168
|
|
167
169
|
describe "Handling of non-existing pages" do
|
168
170
|
before do
|
169
|
-
|
170
|
-
|
171
|
+
# We need a admin user or the signup page will show up
|
172
|
+
allow(Alchemy.user_class).to receive(:admins).and_return([1, 2])
|
171
173
|
end
|
172
174
|
|
173
175
|
it "should render public/404.html" do
|
174
|
-
expect
|
176
|
+
expect {
|
177
|
+
visit "/non-existing-page"
|
178
|
+
}.to raise_error(ActionController::RoutingError)
|
175
179
|
end
|
176
180
|
end
|
177
181
|
|
@@ -191,7 +195,7 @@ module Alchemy
|
|
191
195
|
|
192
196
|
context "rendering for members" do
|
193
197
|
it "is prohibited" do
|
194
|
-
|
198
|
+
authorize_user(build(:alchemy_dummy_user))
|
195
199
|
visit "/#{public_page_1.urlname}"
|
196
200
|
within('body') { expect(page).not_to have_selector('#alchemy_menubar') }
|
197
201
|
end
|
@@ -199,7 +203,7 @@ module Alchemy
|
|
199
203
|
|
200
204
|
context "rendering for authors" do
|
201
205
|
it "is allowed" do
|
202
|
-
|
206
|
+
authorize_user(:as_author)
|
203
207
|
visit "/#{public_page_1.urlname}"
|
204
208
|
within('body') { expect(page).to have_selector('#alchemy_menubar') }
|
205
209
|
end
|
@@ -207,7 +211,7 @@ module Alchemy
|
|
207
211
|
|
208
212
|
context "rendering for editors" do
|
209
213
|
it "is allowed" do
|
210
|
-
|
214
|
+
authorize_user(:as_editor)
|
211
215
|
visit "/#{public_page_1.urlname}"
|
212
216
|
within('body') { expect(page).to have_selector('#alchemy_menubar') }
|
213
217
|
end
|
@@ -215,7 +219,7 @@ module Alchemy
|
|
215
219
|
|
216
220
|
context "rendering for admins" do
|
217
221
|
it "is allowed" do
|
218
|
-
|
222
|
+
authorize_user(:as_admin)
|
219
223
|
visit "/#{public_page_1.urlname}"
|
220
224
|
within('body') { expect(page).to have_selector('#alchemy_menubar') }
|
221
225
|
end
|
@@ -223,20 +227,26 @@ module Alchemy
|
|
223
227
|
|
224
228
|
context "contains" do
|
225
229
|
before do
|
226
|
-
|
230
|
+
authorize_user(:as_admin)
|
227
231
|
visit "/#{public_page_1.urlname}"
|
228
232
|
end
|
229
233
|
|
230
234
|
it "a link to the admin area" do
|
231
|
-
within('#alchemy_menubar')
|
235
|
+
within('#alchemy_menubar') do
|
236
|
+
expect(page).to have_selector("li a[href='#{alchemy.admin_dashboard_path}']")
|
237
|
+
end
|
232
238
|
end
|
233
239
|
|
234
240
|
it "a link to edit the current page" do
|
235
|
-
within('#alchemy_menubar')
|
241
|
+
within('#alchemy_menubar') do
|
242
|
+
expect(page).to have_selector("li a[href='#{alchemy.edit_admin_page_path(public_page_1)}']")
|
243
|
+
end
|
236
244
|
end
|
237
245
|
|
238
246
|
it "a form and button to logout of alchemy" do
|
239
|
-
within('#alchemy_menubar')
|
247
|
+
within('#alchemy_menubar') do
|
248
|
+
expect(page).to have_selector("li form[action='#{Alchemy.logout_path}'], li button[type='submit']")
|
249
|
+
end
|
240
250
|
end
|
241
251
|
end
|
242
252
|
end
|
@@ -265,7 +275,7 @@ module Alchemy
|
|
265
275
|
end
|
266
276
|
|
267
277
|
context 'as a member user' do
|
268
|
-
before {
|
278
|
+
before { authorize_user(create(:alchemy_dummy_user)) }
|
269
279
|
|
270
280
|
it "I am able to visit the page" do
|
271
281
|
visit restricted_page.urlname
|
@@ -273,6 +283,5 @@ module Alchemy
|
|
273
283
|
end
|
274
284
|
end
|
275
285
|
end
|
276
|
-
|
277
286
|
end
|
278
287
|
end
|
@@ -13,7 +13,7 @@ describe "Security." do
|
|
13
13
|
allow_any_instance_of(Alchemy::BaseController)
|
14
14
|
.to receive(:ssl_required?)
|
15
15
|
.and_return(true)
|
16
|
-
|
16
|
+
authorize_user(:as_admin)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "redirects every request to https." do
|
@@ -2,9 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Translation integration" do
|
4
4
|
context "in admin backend" do
|
5
|
-
let(:dummy_user) { mock_model(
|
5
|
+
let(:dummy_user) { mock_model(Alchemy.user_class, alchemy_roles: %w(admin), language: 'de') }
|
6
6
|
|
7
|
-
before {
|
7
|
+
before { authorize_user(dummy_user) }
|
8
8
|
|
9
9
|
it "should be possible to set the locale of the admin backend via params" do
|
10
10
|
visit admin_dashboard_path(locale: 'nl')
|
@@ -38,7 +38,7 @@ describe "Translation integration" do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
context "if user has no preferred locale" do
|
41
|
-
let(:dummy_user) { mock_model(
|
41
|
+
let(:dummy_user) { mock_model(Alchemy.user_class, alchemy_roles: %w(admin), language: nil) }
|
42
42
|
|
43
43
|
it "should use the browsers language setting" do
|
44
44
|
page.driver.header 'ACCEPT-LANGUAGE', 'es-ES'
|
@@ -2,7 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Alchemy
|
4
4
|
describe Admin::ElementsHelper do
|
5
|
-
|
6
5
|
let(:page) { build_stubbed(:public_page) }
|
7
6
|
let(:element) { build_stubbed(:element, page: page) }
|
8
7
|
|
@@ -18,46 +17,124 @@ module Alchemy
|
|
18
17
|
end
|
19
18
|
|
20
19
|
describe "#grouped_elements_for_select" do
|
21
|
-
let(:elements)
|
20
|
+
let(:elements) do
|
22
21
|
[
|
23
22
|
mock_model('Element', name: '1', display_name: '1'),
|
24
23
|
mock_model('Element', name: '2', display_name: '2')
|
25
24
|
]
|
26
|
-
|
25
|
+
end
|
26
|
+
let(:element_definitions) { [{"name" => "1"}, {"name" => "2"}] }
|
27
|
+
let(:cell_definitions) { [] }
|
28
|
+
let(:page_definition) { {} }
|
27
29
|
|
28
30
|
before do
|
29
|
-
allow(page).to receive(:
|
30
|
-
|
31
|
-
|
32
|
-
})
|
33
|
-
cell_descriptions = [{
|
34
|
-
'name' => "foo_cell",
|
35
|
-
'elements' => ["1", "2"]
|
36
|
-
}]
|
37
|
-
allow(Cell).to receive(:definitions).and_return(cell_descriptions)
|
31
|
+
allow(page).to receive(:definition).and_return(page_definition)
|
32
|
+
allow(Cell).to receive(:definitions).and_return(cell_definitions)
|
33
|
+
allow(Element).to receive(:definitions).and_return(element_definitions)
|
38
34
|
helper.instance_variable_set('@page', page)
|
39
35
|
end
|
40
36
|
|
41
|
-
|
42
|
-
|
37
|
+
context "with empty elements array given" do
|
38
|
+
it "return an empty array" do
|
39
|
+
expect(helper.grouped_elements_for_select([])).to eq([])
|
40
|
+
end
|
43
41
|
end
|
44
42
|
|
45
|
-
context "with
|
46
|
-
|
47
|
-
|
43
|
+
context "with an element collection given" do
|
44
|
+
let(:page_definition) do
|
45
|
+
{'name' => "foo", 'cells' => ["foo_cell"], 'elements' => []}
|
48
46
|
end
|
49
|
-
end
|
50
47
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
let(:cell_definitions) do
|
49
|
+
[{'name' => "foo_cell", 'elements' => ["1", "2"]}]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns an array of elements grouped by cell for select_tag helper" do
|
53
|
+
expect(helper.grouped_elements_for_select(elements)).to eq("Foo cell" => [["1", "1#foo_cell"], ["2", "2#foo_cell"]])
|
54
|
+
end
|
55
|
+
|
56
|
+
context "without cells key in page definition" do
|
57
|
+
let(:page_definition) do
|
58
|
+
{'name' => "foo", "elements" => ["1", "2"]}
|
59
|
+
end
|
60
|
+
|
61
|
+
it "returns an empty array" do
|
62
|
+
expect(helper.grouped_elements_for_select(elements)).to eq([])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with empty cells in page definition" do
|
67
|
+
let(:page_definition) do
|
68
|
+
{"name" => "foo", "cells" => [], "elements" => ["1", "2"]}
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns an empty array" do
|
72
|
+
expect(helper.grouped_elements_for_select(elements)).to eq([])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "with a cell containing no elements" do
|
77
|
+
let(:cell_definitions) do
|
78
|
+
[{"name" => "empty_cell", "elements" => []}]
|
79
|
+
end
|
80
|
+
|
81
|
+
let(:page_definition) do
|
82
|
+
{"name" => "foo", "cells" => ["empty_cell"], "elements" => ["1", "2"]}
|
83
|
+
end
|
84
|
+
|
85
|
+
it "does not include that cell" do
|
86
|
+
expect(helper.grouped_elements_for_select(elements)).to eq("Main content" => [["1", "1"], ["2", "2"]])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "with an element in a cell only" do
|
91
|
+
let(:elements) do
|
92
|
+
[mock_model('Element', name: 'in_cell', display_name: 'In Cell')]
|
93
|
+
end
|
94
|
+
|
95
|
+
let(:page_definition) do
|
96
|
+
{'name' => "foo", 'cells' => ["foo_cell"], 'elements' => []}
|
97
|
+
end
|
98
|
+
|
99
|
+
let(:cell_definitions) do
|
100
|
+
[{'name' => "foo_cell", 'elements' => ["in_cell"]}]
|
101
|
+
end
|
102
|
+
|
103
|
+
it "returns an option for the element in the cell only" do
|
104
|
+
expect(helper.grouped_elements_for_select(elements)).to include("Foo cell" => [["In cell", "in_cell#foo_cell"]])
|
105
|
+
end
|
55
106
|
end
|
56
|
-
end
|
57
107
|
|
58
|
-
|
59
|
-
|
60
|
-
|
108
|
+
context "with the same element in both cell and page" do
|
109
|
+
let(:element_definitions) do
|
110
|
+
[{"name" => "in_cell_and_page"}]
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:elements) do
|
114
|
+
[mock_model('Element', name: 'in_cell_and_page', display_name: 'In Cell and Page')]
|
115
|
+
end
|
116
|
+
|
117
|
+
let(:page_definition) do
|
118
|
+
{
|
119
|
+
'name' => "foo",
|
120
|
+
'cells' => ["foo_cell"],
|
121
|
+
'elements' => ["in_cell_and_page"]
|
122
|
+
}
|
123
|
+
end
|
124
|
+
|
125
|
+
let(:cell_definitions) do
|
126
|
+
[{
|
127
|
+
'name' => "foo_cell",
|
128
|
+
'elements' => ["in_cell_and_page"]
|
129
|
+
}]
|
130
|
+
end
|
131
|
+
|
132
|
+
it "returns two options of same element, one for the cell and one for the page" do
|
133
|
+
expect(helper.grouped_elements_for_select(elements)).to eq({
|
134
|
+
"Main content" => [["In cell and page", "in_cell_and_page"]],
|
135
|
+
"Foo cell" => [["In cell and page", "in_cell_and_page#foo_cell"]]
|
136
|
+
})
|
137
|
+
end
|
61
138
|
end
|
62
139
|
end
|
63
140
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Alchemy::Admin::PagesHelper do
|
4
4
|
|
5
5
|
describe '#sitemap_folder_link' do
|
6
|
-
let(:user) {
|
6
|
+
let(:user) { build(:alchemy_dummy_user, :as_admin) }
|
7
7
|
|
8
8
|
before { allow(helper).to receive(:current_alchemy_user).and_return(user) }
|
9
9
|
|
@@ -61,4 +61,35 @@ describe Alchemy::Admin::PagesHelper do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
describe '#page_layout_label' do
|
65
|
+
let(:page) { build(:page) }
|
66
|
+
|
67
|
+
subject { helper.page_layout_label(page) }
|
68
|
+
|
69
|
+
context 'when page is not yet persisted' do
|
70
|
+
it 'displays text only' do
|
71
|
+
is_expected.to eq(Alchemy::I18n.t(:page_type))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when page is persited' do
|
76
|
+
before { page.save! }
|
77
|
+
|
78
|
+
context 'with page layout existing' do
|
79
|
+
it 'displays text only' do
|
80
|
+
is_expected.to eq(Alchemy::I18n.t(:page_type))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'with page layout description missing' do
|
85
|
+
before do
|
86
|
+
expect(page).to receive(:layout_description).and_return([])
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'displays icon with warning' do
|
90
|
+
is_expected.to match /warning icon/
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
64
95
|
end
|