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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -6
- data/Gemfile +4 -7
- data/README.md +207 -115
- data/alchemy_cms.gemspec +10 -9
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/alchemy.js +6 -7
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +1 -43
- data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +1 -1
- data/app/assets/stylesheets/alchemy/_mixins.scss +2 -1
- data/app/assets/stylesheets/alchemy/buttons.scss +0 -5
- data/app/assets/stylesheets/alchemy/dialogs.scss +1 -0
- data/app/assets/stylesheets/alchemy/frame.scss +9 -12
- data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +11 -2
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +9 -1
- data/app/controllers/alchemy/admin/attachments_controller.rb +2 -4
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +34 -38
- data/app/controllers/alchemy/api/base_controller.rb +19 -0
- data/app/controllers/alchemy/api/contents_controller.rb +35 -0
- data/app/controllers/alchemy/api/elements_controller.rb +29 -0
- data/app/controllers/alchemy/api/pages_controller.rb +32 -0
- data/app/controllers/alchemy/contents_controller.rb +1 -0
- data/app/controllers/alchemy/elements_controller.rb +5 -2
- data/app/controllers/alchemy/pages_controller.rb +4 -1
- data/app/controllers/alchemy/pictures_controller.rb +4 -36
- data/app/helpers/alchemy/admin/essences_helper.rb +5 -2
- data/app/helpers/alchemy/essences_helper.rb +14 -1
- data/app/models/alchemy/content.rb +32 -4
- data/app/models/alchemy/element.rb +2 -16
- data/app/models/alchemy/element/presenters.rb +2 -2
- data/app/models/alchemy/essence_file.rb +5 -0
- data/app/models/alchemy/essence_picture.rb +12 -8
- data/app/models/alchemy/picture.rb +1 -74
- data/app/models/alchemy/picture/transformations.rb +249 -0
- data/app/serializers/alchemy/content_serializer.rb +3 -10
- data/app/serializers/alchemy/element_serializer.rb +6 -3
- data/app/serializers/alchemy/legacy_element_serializer.rb +17 -0
- data/app/views/alchemy/admin/dashboard/_sites.html.erb +14 -4
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +8 -5
- data/app/views/alchemy/admin/pages/edit.html.erb +9 -9
- data/app/views/alchemy/admin/pictures/info.html.erb +2 -3
- data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +8 -7
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +3 -3
- data/app/views/alchemy/essences/_essence_date_editor.html.erb +8 -2
- data/app/views/alchemy/essences/_essence_date_view.html.erb +10 -8
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +48 -53
- data/app/views/alchemy/essences/_essence_file_view.html.erb +5 -5
- data/app/views/alchemy/essences/_essence_html_editor.html.erb +5 -4
- data/app/views/alchemy/essences/_essence_link_editor.html.erb +17 -15
- data/app/views/alchemy/essences/_essence_link_view.html.erb +11 -7
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +4 -2
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +4 -2
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +5 -4
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +22 -32
- data/app/views/alchemy/essences/_essence_text_view.html.erb +7 -6
- data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +1 -1
- data/app/views/layouts/alchemy/admin.html.erb +5 -3
- data/config/initializers/inflections.rb +3 -0
- data/config/initializers/simple_form.rb +1 -1
- data/config/locales/alchemy.en.yml +0 -1
- data/config/routes.rb +14 -0
- data/lib/alchemy/capistrano.rb +71 -0
- data/lib/alchemy/engine.rb +0 -3
- data/lib/alchemy/essence.rb +1 -1
- data/lib/alchemy/permissions.rb +19 -5
- data/lib/alchemy/picture_attributes.rb +1 -1
- data/lib/alchemy/test_support/auth_helpers.rb +1 -1
- data/lib/alchemy/test_support/essence_shared_examples.rb +37 -22
- data/lib/alchemy/test_support/integration_helpers.rb +1 -1
- data/lib/alchemy/tinymce.rb +21 -4
- data/lib/alchemy/upgrader/three_point_one.rb +43 -0
- data/lib/alchemy/upgrader/three_point_zero.rb +13 -0
- data/lib/alchemy/version.rb +2 -1
- data/lib/rails/generators/alchemy/module/module_generator.rb +30 -0
- data/lib/rails/generators/alchemy/module/templates/ability.rb.tt +11 -0
- data/lib/rails/generators/alchemy/module/templates/controller.rb.tt +2 -0
- data/lib/rails/generators/alchemy/module/templates/module_config.rb.tt +15 -0
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -1
- data/lib/rails/templates/alchemy.rb +2 -2
- data/lib/tasks/alchemy/db.rake +7 -1
- data/spec/controllers/admin/attachments_controller_spec.rb +38 -38
- data/spec/controllers/admin/base_controller_spec.rb +18 -18
- data/spec/controllers/admin/clipboard_controller_spec.rb +23 -18
- data/spec/controllers/admin/contents_controller_spec.rb +33 -27
- data/spec/controllers/admin/dashboard_controller_spec.rb +14 -14
- data/spec/controllers/admin/elements_controller_spec.rb +125 -105
- data/spec/controllers/admin/essence_files_controller_spec.rb +6 -7
- data/spec/controllers/admin/essence_pictures_controller_spec.rb +52 -42
- data/spec/controllers/admin/languages_controller_spec.rb +3 -3
- data/spec/controllers/admin/pages_controller_spec.rb +81 -71
- data/spec/controllers/admin/pictures_controller_spec.rb +69 -72
- data/spec/controllers/admin/resources_controller_spec.rb +5 -5
- data/spec/controllers/admin/trash_controller_spec.rb +15 -12
- data/spec/controllers/alchemy/admin/tags_controller_spec.rb +8 -8
- data/spec/controllers/alchemy/api/contents_controller_spec.rb +73 -0
- data/spec/controllers/alchemy/api/elements_controller_spec.rb +69 -0
- data/spec/controllers/alchemy/api/pages_controller_spec.rb +86 -0
- data/spec/controllers/attachments_controller_spec.rb +8 -8
- data/spec/controllers/contents_controller_spec.rb +22 -0
- data/spec/controllers/elements_controller_spec.rb +10 -4
- data/spec/controllers/messages_controller_spec.rb +35 -34
- data/spec/controllers/pages_controller_spec.rb +37 -28
- data/spec/controllers/pictures_controller_spec.rb +90 -23
- data/spec/dummy/app/models/dummy_user.rb +0 -4
- data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_editor.html.erb +11 -0
- data/spec/dummy/config/alchemy/elements.yml +22 -1
- data/spec/dummy/config/alchemy/page_layouts.yml +4 -0
- data/spec/dummy/config/application.rb +2 -1
- data/spec/dummy/config/environments/test.rb +3 -1
- data/spec/features/admin/dashboard_spec.rb +41 -6
- data/spec/features/admin/language_tree_feature_spec.rb +3 -3
- data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
- data/spec/features/admin/link_overlay_spec.rb +7 -7
- data/spec/features/admin/locale_select_feature_spec.rb +5 -2
- data/spec/features/admin/modules_integration_spec.rb +1 -1
- data/spec/features/admin/page_creation_feature_spec.rb +3 -2
- data/spec/features/admin/page_editing_feature_spec.rb +66 -79
- data/spec/features/admin/picture_library_integration_spec.rb +8 -8
- data/spec/features/admin/resources_integration_spec.rb +21 -21
- data/spec/features/admin/tinymce_feature_spec.rb +36 -0
- data/spec/features/navigation_spec.rb +1 -1
- data/spec/features/page_feature_spec.rb +34 -34
- data/spec/features/picture_security_spec.rb +4 -4
- data/spec/features/security_spec.rb +1 -1
- data/spec/features/translation_integration_spec.rb +7 -7
- data/spec/helpers/admin/base_helper_spec.rb +51 -49
- data/spec/helpers/admin/contents_helper_spec.rb +11 -11
- data/spec/helpers/admin/elements_helper_spec.rb +20 -17
- data/spec/helpers/admin/essences_helper_spec.rb +42 -11
- data/spec/helpers/admin/navigation_helper_spec.rb +64 -54
- data/spec/helpers/admin/pages_helper_spec.rb +10 -10
- data/spec/helpers/admin/tags_helper_spec.rb +16 -16
- data/spec/helpers/base_helper_spec.rb +11 -11
- data/spec/helpers/elements_block_helper_spec.rb +24 -24
- data/spec/helpers/elements_helper_spec.rb +46 -46
- data/spec/helpers/essences_helper_spec.rb +90 -17
- data/spec/helpers/pages_helper_spec.rb +53 -53
- data/spec/helpers/picture_url_helpers_spec.rb +6 -6
- data/spec/helpers/url_helper_spec.rb +32 -32
- data/spec/libraries/config_spec.rb +9 -9
- data/spec/libraries/controller_actions_spec.rb +14 -14
- data/spec/libraries/i18n_spec.rb +6 -6
- data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +4 -4
- data/spec/libraries/modules_spec.rb +4 -4
- data/spec/libraries/mount_point_spec.rb +13 -13
- data/spec/libraries/page_layout_spec.rb +24 -24
- data/spec/libraries/permissions_spec.rb +97 -80
- data/spec/libraries/resource_spec.rb +37 -37
- data/spec/libraries/resources_helper_spec.rb +19 -19
- data/spec/libraries/shell_spec.rb +17 -17
- data/spec/libraries/template_tracker_spec.rb +14 -14
- data/spec/libraries/tinymce_spec.rb +8 -8
- data/spec/libraries/userstamp_spec.rb +2 -2
- data/spec/mailers/messages_spec.rb +4 -4
- data/spec/models/attachment_spec.rb +86 -30
- data/spec/models/cell_spec.rb +10 -10
- data/spec/models/content_spec.rb +106 -46
- data/spec/models/element_spec.rb +94 -115
- data/spec/models/essence_date_spec.rb +1 -1
- data/spec/models/essence_file_spec.rb +4 -4
- data/spec/models/essence_picture_spec.rb +56 -25
- data/spec/models/essence_richtext_spec.rb +1 -1
- data/spec/models/essence_text_spec.rb +7 -7
- data/spec/models/language_spec.rb +12 -12
- data/spec/models/legacy_page_url_spec.rb +2 -2
- data/spec/models/message_spec.rb +12 -5
- data/spec/models/page_spec.rb +259 -235
- data/spec/models/picture_spec.rb +72 -166
- data/spec/models/site_spec.rb +41 -41
- data/spec/models/tag_spec.rb +7 -7
- data/spec/routing/api_routing_spec.rb +150 -0
- data/spec/routing/routing_spec.rb +28 -28
- data/spec/spec_helper.rb +6 -5
- data/spec/support/hint_examples.rb +5 -5
- data/spec/support/transformation_examples.rb +173 -0
- data/spec/tasks/helpers_spec.rb +29 -29
- data/spec/views/essences/essence_boolean_editor_spec.rb +32 -0
- data/spec/views/essences/essence_boolean_view_spec.rb +2 -2
- data/spec/views/essences/essence_date_view_spec.rb +1 -1
- data/spec/views/essences/essence_link_view_spec.rb +11 -0
- data/spec/views/essences/essence_picture_view_spec.rb +56 -11
- data/spec/views/essences/essence_richtext_view_spec.rb +12 -0
- data/spec/views/essences/essence_text_view_spec.rb +12 -0
- data/vendor/assets/javascripts/tinymce/langs/de.js +20 -2
- data/vendor/assets/javascripts/tinymce/langs/fr.js +14 -1
- data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -4
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.min.js +11 -10
- metadata +72 -42
- data/app/views/alchemy/messages/contact_form_mail.es.text.erb +0 -12
- data/config/locales/alchemy.es.yml +0 -958
- data/config/locales/alchemy.ru.yml +0 -837
- data/config/locales/simple_form.es.yml +0 -6
- data/config/locales/simple_form.ru.yml +0 -25
- data/lib/rails/generators/alchemy/scaffold/files/alchemy.es.yml +0 -31
- data/vendor/assets/javascripts/tinymce/langs/es.js +0 -197
- data/vendor/assets/javascripts/tinymce/langs/ru.js +0 -197
|
@@ -9,129 +9,129 @@ module Alchemy
|
|
|
9
9
|
|
|
10
10
|
context "with max_images option set to emtpy string" do
|
|
11
11
|
let(:options) { {max_images: ""} }
|
|
12
|
-
it {
|
|
12
|
+
it { is_expected.to eq(nil) }
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
context "with max_images option set to '1'" do
|
|
16
16
|
let(:options) { {max_images: "1"} }
|
|
17
|
-
it {
|
|
17
|
+
it { is_expected.to eq(1) }
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
context "with maximum_amount_of_images option set to emtpy string" do
|
|
21
21
|
let(:options) { {maximum_amount_of_images: ""} }
|
|
22
|
-
it {
|
|
22
|
+
it { is_expected.to eq(nil) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
context "with maximum_amount_of_images option set to '1'" do
|
|
26
26
|
let(:options) { {maximum_amount_of_images: "1"} }
|
|
27
|
-
it {
|
|
27
|
+
it { is_expected.to eq(1) }
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
describe "#merge_params" do
|
|
32
32
|
before do
|
|
33
|
-
controller.
|
|
33
|
+
allow(controller).to receive(:params).and_return({:first => '1', :second => '2'})
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "returns a hash that contains the current params and additional params given as attributes" do
|
|
37
|
-
helper.merge_params(:third => '3', :fourth => '4').
|
|
37
|
+
expect(helper.merge_params(:third => '3', :fourth => '4')).to eq({:first => '1', :second => '2', :third => '3', :fourth => '4'})
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
describe "#merge_params_without" do
|
|
42
42
|
before do
|
|
43
|
-
controller.
|
|
43
|
+
allow(controller).to receive(:params).and_return({:first => '1', :second => '2'})
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
it "can delete a single param" do
|
|
47
|
-
helper.merge_params_without(:second).
|
|
47
|
+
expect(helper.merge_params_without(:second)).to eq({:first => '1'})
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
it "can delete several params" do
|
|
51
|
-
helper.merge_params_without([:first, :second]).
|
|
51
|
+
expect(helper.merge_params_without([:first, :second])).to eq({})
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
it "can delete a param and add new params at the same time" do
|
|
55
|
-
helper.merge_params_without([:first], {:third => '3'}).
|
|
55
|
+
expect(helper.merge_params_without([:first], {:third => '3'})).to eq({:second => '2', :third => '3'})
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
it "should not change params" do
|
|
59
59
|
helper.merge_params_without([:first])
|
|
60
|
-
controller.params.
|
|
60
|
+
expect(controller.params).to eq({:first => '1', :second => '2'})
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
describe "#merge_params_only" do
|
|
65
65
|
before do
|
|
66
|
-
controller.
|
|
66
|
+
allow(controller).to receive(:params).and_return({:first => '1', :second => '2', :third => '3'})
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
it "can keep a single param" do
|
|
70
|
-
helper.merge_params_only(:second).
|
|
70
|
+
expect(helper.merge_params_only(:second)).to eq({:second => '2'})
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it "can keep several params" do
|
|
74
|
-
helper.merge_params_only([:first, :second]).
|
|
74
|
+
expect(helper.merge_params_only([:first, :second])).to eq({:first => '1', :second => '2'})
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
it "can keep a param and add new params at the same time" do
|
|
78
|
-
helper.merge_params_only([:first], {:third => '3'}).
|
|
78
|
+
expect(helper.merge_params_only([:first], {:third => '3'})).to eq({:first => '1', :third => '3'})
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
it "should not change params" do
|
|
82
82
|
helper.merge_params_only([:first])
|
|
83
|
-
controller.params.
|
|
83
|
+
expect(controller.params).to eq({:first => '1', :second => '2', :third => '3'})
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
describe '#toolbar_button' do
|
|
88
88
|
context "with permission" do
|
|
89
|
-
before { helper.
|
|
89
|
+
before { allow(helper).to receive(:can?).and_return(true) }
|
|
90
90
|
|
|
91
91
|
it "renders a toolbar button" do
|
|
92
|
-
helper.toolbar_button(
|
|
92
|
+
expect(helper.toolbar_button(
|
|
93
93
|
url: admin_dashboard_path
|
|
94
|
-
).
|
|
94
|
+
)).to match /<div.+class="button_with_label/
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
context "without permission" do
|
|
99
|
-
before { helper.
|
|
99
|
+
before { allow(helper).to receive(:can?).and_return(false) }
|
|
100
100
|
|
|
101
101
|
it "returns empty string" do
|
|
102
|
-
helper.toolbar_button(
|
|
102
|
+
expect(helper.toolbar_button(
|
|
103
103
|
url: admin_dashboard_path
|
|
104
|
-
).
|
|
104
|
+
)).to be_empty
|
|
105
105
|
end
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
context "with disabled permission check" do
|
|
109
|
-
before { helper.
|
|
109
|
+
before { allow(helper).to receive(:can?).and_return(false) }
|
|
110
110
|
|
|
111
111
|
it "returns the button" do
|
|
112
|
-
helper.toolbar_button(
|
|
112
|
+
expect(helper.toolbar_button(
|
|
113
113
|
url: admin_dashboard_path,
|
|
114
114
|
skip_permission_check: true
|
|
115
|
-
).
|
|
115
|
+
)).to match /<div.+class="button_with_label/
|
|
116
116
|
end
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
context "with empty permission option" do
|
|
120
|
-
before { helper.
|
|
120
|
+
before { allow(helper).to receive(:can?).and_return(true) }
|
|
121
121
|
|
|
122
122
|
it "returns reads the permission from url" do
|
|
123
|
-
helper.
|
|
124
|
-
helper.toolbar_button(
|
|
123
|
+
expect(helper).to receive(:permission_array_from_url)
|
|
124
|
+
expect(helper.toolbar_button(
|
|
125
125
|
url: admin_dashboard_path,
|
|
126
126
|
if_permitted_to: ''
|
|
127
|
-
).
|
|
127
|
+
)).not_to be_empty
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
context "with overlay option set to false" do
|
|
132
132
|
before do
|
|
133
|
-
helper.
|
|
134
|
-
helper.
|
|
133
|
+
allow(helper).to receive(:can?).and_return(true)
|
|
134
|
+
expect(helper).to receive(:permission_array_from_url)
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
it "renders a normal link" do
|
|
@@ -139,16 +139,16 @@ module Alchemy
|
|
|
139
139
|
url: admin_dashboard_path,
|
|
140
140
|
overlay: false
|
|
141
141
|
)
|
|
142
|
-
button.
|
|
143
|
-
button.
|
|
142
|
+
expect(button).to match /<a.+href="#{admin_dashboard_path}"/
|
|
143
|
+
expect(button).not_to match /data-alchemy-overlay/
|
|
144
144
|
end
|
|
145
145
|
end
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
describe "#translations_for_select" do
|
|
149
149
|
it "should return an Array of Arrays with available locales" do
|
|
150
|
-
Alchemy::I18n.
|
|
151
|
-
expect(helper.translations_for_select).to
|
|
150
|
+
allow(Alchemy::I18n).to receive(:available_locales).and_return([:de, :en, :cz, :it])
|
|
151
|
+
expect(helper.translations_for_select.size).to eq(4)
|
|
152
152
|
end
|
|
153
153
|
end
|
|
154
154
|
|
|
@@ -161,14 +161,14 @@ module Alchemy
|
|
|
161
161
|
let(:clipboard_items) { [element] }
|
|
162
162
|
|
|
163
163
|
it "should include select options with the display name and preview text" do
|
|
164
|
-
element.
|
|
164
|
+
allow(element).to receive(:display_name_with_preview_text).and_return('Name with Preview text')
|
|
165
165
|
expect(helper.clipboard_select_tag_options(clipboard_items)).to have_selector('option', text: 'Name with Preview text')
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
context "when @page can have cells" do
|
|
169
|
-
before { page.
|
|
169
|
+
before { allow(page).to receive(:can_have_cells?).and_return(true) }
|
|
170
170
|
it "should group the elements in the clipboard by cell" do
|
|
171
|
-
helper.
|
|
171
|
+
expect(helper).to receive(:grouped_elements_for_select).and_return({})
|
|
172
172
|
helper.clipboard_select_tag_options(clipboard_items)
|
|
173
173
|
end
|
|
174
174
|
end
|
|
@@ -188,7 +188,7 @@ module Alchemy
|
|
|
188
188
|
subject { button_with_confirm }
|
|
189
189
|
|
|
190
190
|
it "renders a button tag with a data attribute for confirm dialog" do
|
|
191
|
-
|
|
191
|
+
is_expected.to have_selector('button[data-alchemy-confirm]')
|
|
192
192
|
end
|
|
193
193
|
end
|
|
194
194
|
|
|
@@ -196,11 +196,11 @@ module Alchemy
|
|
|
196
196
|
subject { delete_button('/admin/pages') }
|
|
197
197
|
|
|
198
198
|
it "renders a button tag" do
|
|
199
|
-
|
|
199
|
+
is_expected.to have_selector('button')
|
|
200
200
|
end
|
|
201
201
|
|
|
202
202
|
it "returns a form tag with method=delete" do
|
|
203
|
-
|
|
203
|
+
is_expected.to have_selector('form input[name="_method"][value="delete"]')
|
|
204
204
|
end
|
|
205
205
|
end
|
|
206
206
|
|
|
@@ -211,11 +211,11 @@ module Alchemy
|
|
|
211
211
|
let(:now) { Time.now }
|
|
212
212
|
|
|
213
213
|
it "renders a date field" do
|
|
214
|
-
|
|
214
|
+
is_expected.to have_selector("input[type='date']")
|
|
215
215
|
end
|
|
216
216
|
|
|
217
217
|
it "sets default date as value" do
|
|
218
|
-
|
|
218
|
+
is_expected.to have_selector("input[value='#{::I18n.l(now, format: :datepicker)}']")
|
|
219
219
|
end
|
|
220
220
|
|
|
221
221
|
context 'with date stored on object' do
|
|
@@ -223,7 +223,7 @@ module Alchemy
|
|
|
223
223
|
let(:essence) { EssenceDate.new(date: date) }
|
|
224
224
|
|
|
225
225
|
it "sets this date as value" do
|
|
226
|
-
|
|
226
|
+
is_expected.to have_selector("input[value='#{::I18n.l(date, format: :datepicker)}']")
|
|
227
227
|
end
|
|
228
228
|
end
|
|
229
229
|
end
|
|
@@ -231,21 +231,21 @@ module Alchemy
|
|
|
231
231
|
describe '#current_alchemy_user_name' do
|
|
232
232
|
subject { helper.current_alchemy_user_name }
|
|
233
233
|
|
|
234
|
-
before { helper.
|
|
234
|
+
before { expect(helper).to receive(:current_alchemy_user).and_return(user) }
|
|
235
235
|
|
|
236
236
|
context 'with a user having a `alchemy_display_name` method' do
|
|
237
237
|
let(:user) { double('User', alchemy_display_name: 'Peter Schroeder') }
|
|
238
238
|
|
|
239
239
|
it "Returns a span showing the name of the currently logged in user." do
|
|
240
|
-
|
|
241
|
-
|
|
240
|
+
is_expected.to have_content("#{Alchemy::I18n.t('Logged in as')} Peter Schroeder")
|
|
241
|
+
is_expected.to have_selector("span.current-user-name")
|
|
242
242
|
end
|
|
243
243
|
end
|
|
244
244
|
|
|
245
245
|
context 'with a user not having a `alchemy_display_name` method' do
|
|
246
246
|
let(:user) { double('User', name: 'Peter Schroeder') }
|
|
247
247
|
|
|
248
|
-
it {
|
|
248
|
+
it { is_expected.to be_nil }
|
|
249
249
|
end
|
|
250
250
|
end
|
|
251
251
|
|
|
@@ -257,7 +257,9 @@ module Alchemy
|
|
|
257
257
|
end
|
|
258
258
|
|
|
259
259
|
context 'if the expression from config is nil' do
|
|
260
|
-
before
|
|
260
|
+
before do
|
|
261
|
+
expect(Alchemy::Config).to receive(:get).and_return({link_url: nil})
|
|
262
|
+
end
|
|
261
263
|
|
|
262
264
|
it "returns the default expression" do
|
|
263
265
|
expect(subject).to_not be_nil
|
|
@@ -15,31 +15,31 @@ describe Alchemy::Admin::ContentsHelper do
|
|
|
15
15
|
subject { helper.render_content_name(content) }
|
|
16
16
|
|
|
17
17
|
it "returns the content name" do
|
|
18
|
-
|
|
18
|
+
is_expected.to eq("Intro")
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
context 'if content is nil' do
|
|
22
22
|
let(:content) { nil }
|
|
23
23
|
|
|
24
24
|
it "returns nil" do
|
|
25
|
-
|
|
25
|
+
is_expected.to be_nil
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
context 'with missing description' do
|
|
30
|
-
before { content.
|
|
30
|
+
before { expect(content).to receive(:description).and_return({}) }
|
|
31
31
|
|
|
32
32
|
it "renders a warning" do
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
is_expected.to have_selector('span.warning')
|
|
34
|
+
is_expected.to have_content('Intro')
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
context 'with validations' do
|
|
39
|
-
before { content.
|
|
39
|
+
before { expect(content).to receive(:has_validations?).and_return(true) }
|
|
40
40
|
|
|
41
41
|
it "show a validation indicator" do
|
|
42
|
-
|
|
42
|
+
is_expected.to have_selector('.validation_indicator')
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -48,8 +48,8 @@ describe Alchemy::Admin::ContentsHelper do
|
|
|
48
48
|
subject { helper.render_new_content_link(element) }
|
|
49
49
|
|
|
50
50
|
it "renders a link to add new content to element" do
|
|
51
|
-
helper.
|
|
52
|
-
|
|
51
|
+
allow(helper).to receive(:render_icon).and_return('')
|
|
52
|
+
is_expected.to match(/a.+href.*admin\/elements\/#{element.id}\/contents\/new/m)
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -57,8 +57,8 @@ describe Alchemy::Admin::ContentsHelper do
|
|
|
57
57
|
subject { helper.render_create_content_link(element, 'headline') }
|
|
58
58
|
|
|
59
59
|
it "should render a link to create a content in element" do
|
|
60
|
-
helper.
|
|
61
|
-
|
|
60
|
+
allow(helper).to receive(:render_icon).and_return('')
|
|
61
|
+
is_expected.to have_selector('a.new_content_link[data-method="post"]')
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
@@ -8,12 +8,12 @@ module Alchemy
|
|
|
8
8
|
|
|
9
9
|
context "partial rendering" do
|
|
10
10
|
it "should render an element editor partial" do
|
|
11
|
-
|
|
12
|
-
render_editor(element)
|
|
11
|
+
expect(helper).to receive(:render_element).with(element, :editor)
|
|
12
|
+
helper.render_editor(element)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
it "should render a picture gallery editor partial" do
|
|
16
|
-
render_picture_gallery_editor(element).
|
|
16
|
+
expect(render_picture_gallery_editor(element)).to match(/class=".+picture_gallery_editor"/)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
@@ -26,29 +26,32 @@ module Alchemy
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
before do
|
|
29
|
-
page.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
allow(page).to receive(:layout_description).and_return({
|
|
30
|
+
'name' => "foo",
|
|
31
|
+
'cells' => ["foo_cell"]
|
|
32
|
+
})
|
|
33
|
+
cell_descriptions = [{
|
|
34
|
+
'name' => "foo_cell",
|
|
35
|
+
'elements' => ["1", "2"]
|
|
36
|
+
}]
|
|
37
|
+
allow(Cell).to receive(:definitions).and_return(cell_descriptions)
|
|
35
38
|
helper.instance_variable_set('@page', page)
|
|
36
39
|
end
|
|
37
40
|
|
|
38
41
|
it "should return array of elements grouped by cell for select_tag helper" do
|
|
39
|
-
helper.grouped_elements_for_select(elements).
|
|
42
|
+
expect(helper.grouped_elements_for_select(elements)).to include("Foo cell" => [["1", "1#foo_cell"], ["2", "2#foo_cell"]])
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
context "with empty elements array" do
|
|
43
46
|
it "should return an empty string" do
|
|
44
|
-
helper.grouped_elements_for_select([]).
|
|
47
|
+
expect(helper.grouped_elements_for_select([])).to eq("")
|
|
45
48
|
end
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
context "with empty cell definitions" do
|
|
49
52
|
it "should return an empty string" do
|
|
50
|
-
page.
|
|
51
|
-
helper.grouped_elements_for_select(elements).
|
|
53
|
+
allow(page).to receive(:layout_description).and_return({'name' => "foo"})
|
|
54
|
+
expect(helper.grouped_elements_for_select(elements)).to eq("")
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
|
|
@@ -69,8 +72,8 @@ module Alchemy
|
|
|
69
72
|
end
|
|
70
73
|
|
|
71
74
|
it "should return a array for option tags" do
|
|
72
|
-
helper.elements_for_select(element_objects).
|
|
73
|
-
helper.elements_for_select(element_objects).
|
|
75
|
+
expect(helper.elements_for_select(element_objects)).to include(['Element 1', 'element_1'])
|
|
76
|
+
expect(helper.elements_for_select(element_objects)).to include(['Element 2', 'element_2'])
|
|
74
77
|
end
|
|
75
78
|
end
|
|
76
79
|
|
|
@@ -85,11 +88,11 @@ module Alchemy
|
|
|
85
88
|
subject { helper.elements_for_select(element_descriptions) }
|
|
86
89
|
|
|
87
90
|
it "should return a array for option tags" do
|
|
88
|
-
subject.
|
|
91
|
+
expect(subject).to include(['Headline', 'headline'])
|
|
89
92
|
end
|
|
90
93
|
|
|
91
94
|
it "should render the elements display name" do
|
|
92
|
-
Element.
|
|
95
|
+
expect(Element).to receive(:display_name_for).with('headline')
|
|
93
96
|
subject
|
|
94
97
|
end
|
|
95
98
|
end
|
|
@@ -15,7 +15,7 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
15
15
|
describe '#render_essence_editor' do
|
|
16
16
|
it "should render an essence editor" do
|
|
17
17
|
content = element.content_by_name('intro')
|
|
18
|
-
helper.render_essence_editor(content).
|
|
18
|
+
expect(helper.render_essence_editor(content)).to match(/input.+type="text".+value="hello!/)
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
@@ -25,15 +25,15 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
25
25
|
let(:content) { 'intro' }
|
|
26
26
|
|
|
27
27
|
it "renders an essence editor by given name" do
|
|
28
|
-
|
|
28
|
+
is_expected.to match(/input.+type="text".+value="hello!/)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
context 'when element is nil' do
|
|
32
32
|
let(:element) { nil }
|
|
33
33
|
|
|
34
34
|
it "displays a warning" do
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
is_expected.to have_selector(".content_editor_error")
|
|
36
|
+
is_expected.to have_content("No element given.")
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -41,7 +41,7 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
41
41
|
let(:content) { 'sputz' }
|
|
42
42
|
|
|
43
43
|
it "displays a warning" do
|
|
44
|
-
|
|
44
|
+
is_expected.to have_selector(".content_editor.missing")
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -62,13 +62,13 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
62
62
|
|
|
63
63
|
context "with no arguments given" do
|
|
64
64
|
it "should return options for select with all pages ordered by lft" do
|
|
65
|
-
helper.pages_for_select.
|
|
65
|
+
expect(helper.pages_for_select).to match(/option.*Page B.*Page A/m)
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
it "should return options for select with nested page names" do
|
|
69
69
|
page_c
|
|
70
70
|
output = helper.pages_for_select
|
|
71
|
-
output.
|
|
71
|
+
expect(output).to match(/option.*Startseite.*> Page B.*> Page C.*> Page A/m)
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
@@ -80,13 +80,13 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
80
80
|
|
|
81
81
|
it "should return options for select with only these pages" do
|
|
82
82
|
output = helper.pages_for_select(@pages)
|
|
83
|
-
output.
|
|
84
|
-
output.
|
|
83
|
+
expect(output).to match(/#{@pages.collect(&:name).join('.*')}/m)
|
|
84
|
+
expect(output).not_to match(/Page A/m)
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
it "should not nest the page names" do
|
|
88
88
|
output = helper.pages_for_select(@pages)
|
|
89
|
-
output.
|
|
89
|
+
expect(output).not_to match(/option.* /m)
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
92
|
end
|
|
@@ -99,11 +99,42 @@ describe Alchemy::Admin::EssencesHelper do
|
|
|
99
99
|
end
|
|
100
100
|
|
|
101
101
|
context 'when given content has no ingredient' do
|
|
102
|
-
before { content.
|
|
102
|
+
before { allow(content).to receive(:ingredient).and_return(nil) }
|
|
103
|
+
|
|
103
104
|
it "should return nil" do
|
|
104
105
|
expect(helper.essence_picture_thumbnail(content, {})).to eq(nil)
|
|
105
106
|
end
|
|
106
107
|
end
|
|
108
|
+
|
|
109
|
+
context 'when the picture given has a size of 140x169 and it should be cropped to 250x250' do
|
|
110
|
+
before do
|
|
111
|
+
allow(content.essence).to receive(:image_file_width).and_return(140)
|
|
112
|
+
allow(content.essence).to receive(:image_file_height).and_return(169)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'the thumbnail url should contain 77 and 93 as thumbnail width and height' do
|
|
116
|
+
expect(helper.essence_picture_thumbnail(content, {image_size: "250x250", crop: true})).to match(/77x93/)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'the thumbnail url should contain 77 and 93 as thumbnail width and height' do
|
|
120
|
+
expect(helper.essence_picture_thumbnail(content, {image_size: "250x250"})).to match(/77x93/)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'when the picture given has a size of 300x50 and it should be cropped/resized to 225x175' do
|
|
125
|
+
before do
|
|
126
|
+
allow(content.essence).to receive(:image_file_width).and_return(300)
|
|
127
|
+
allow(content.essence).to receive(:image_file_height).and_return(50)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it 'the thumbnail url should contain 111x25 as thumbnail width and height' do
|
|
131
|
+
expect(helper.essence_picture_thumbnail(content, { size: "225x175", crop: true})).to match(/111x25/)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'the thumbnail url should contain 111x19 as thumbnail width and height' do
|
|
135
|
+
expect(helper.essence_picture_thumbnail(content, { size: "225x175"})).to match(/111x19/)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
107
138
|
end
|
|
108
139
|
|
|
109
140
|
end
|