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
|
@@ -54,23 +54,23 @@ module Alchemy
|
|
|
54
54
|
|
|
55
55
|
before :each do
|
|
56
56
|
# stubbing an ActiveRecord::ModelSchema...
|
|
57
|
-
Party.
|
|
57
|
+
allow(Party).to receive(:columns).and_return columns
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
describe "#initialize" do
|
|
61
61
|
it "sets the standard database attributes (rails defaults) to be skipped" do
|
|
62
62
|
resource = Resource.new("admin/parties")
|
|
63
|
-
resource.skipped_attributes.
|
|
63
|
+
expect(resource.skipped_attributes).to eq(%w(id updated_at created_at creator_id updater_id))
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
it "sets an instance variable that holds the controller path" do
|
|
67
67
|
resource = Resource.new("admin/parties")
|
|
68
|
-
resource.instance_variable_get(:@controller_path).
|
|
68
|
+
expect(resource.instance_variable_get(:@controller_path)).to eq("admin/parties")
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
context "when initialized with a module definition" do
|
|
72
72
|
it "sets an instance variable that holds the module definition" do
|
|
73
|
-
resource.instance_variable_get(:@module_definition).
|
|
73
|
+
expect(resource.instance_variable_get(:@module_definition)).to eq(module_definition)
|
|
74
74
|
end
|
|
75
75
|
end
|
|
76
76
|
|
|
@@ -78,14 +78,14 @@ module Alchemy
|
|
|
78
78
|
it "sets @model to custom model" do
|
|
79
79
|
CustomParty = Class.new
|
|
80
80
|
resource = Resource.new("admin/parties", nil, CustomParty)
|
|
81
|
-
resource.instance_variable_get(:@model).
|
|
81
|
+
expect(resource.instance_variable_get(:@model)).to eq(CustomParty)
|
|
82
82
|
end
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
context "when initialized without custom model" do
|
|
86
86
|
it "guesses the model by the controller_path" do
|
|
87
87
|
resource = Resource.new("admin/parties", nil, nil)
|
|
88
|
-
resource.instance_variable_get(:@model).
|
|
88
|
+
expect(resource.instance_variable_get(:@model)).to eq(Party)
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
|
|
@@ -100,7 +100,7 @@ module Alchemy
|
|
|
100
100
|
|
|
101
101
|
context ", but not an ActiveRecord association" do
|
|
102
102
|
before do
|
|
103
|
-
Party.
|
|
103
|
+
allow(Party).to receive(:respond_to?) do |arg|
|
|
104
104
|
case arg
|
|
105
105
|
when :reflect_on_all_associations
|
|
106
106
|
then false
|
|
@@ -128,84 +128,84 @@ module Alchemy
|
|
|
128
128
|
describe "#resource_array" do
|
|
129
129
|
it "splits the controller_path and returns it as array." do
|
|
130
130
|
resource = Resource.new("namespace1/namespace2/parties")
|
|
131
|
-
resource.resource_array.
|
|
131
|
+
expect(resource.resource_array).to eql(%w(namespace1 namespace2 parties))
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
it "deletes 'admin' if found hence our model isn't in the admin-namespace by convention" do
|
|
135
|
-
resource.resource_array.
|
|
135
|
+
expect(resource.resource_array).to eql(%w(parties))
|
|
136
136
|
end
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
describe "#model" do
|
|
140
140
|
it "returns the @model instance variable" do
|
|
141
|
-
resource.model.
|
|
141
|
+
expect(resource.model).to eq(resource.instance_variable_get(:@model))
|
|
142
142
|
end
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
describe "#resources_name" do
|
|
146
146
|
it "returns plural name (like parties for model Party)" do
|
|
147
|
-
resource.resources_name.
|
|
147
|
+
expect(resource.resources_name).to eq("parties")
|
|
148
148
|
end
|
|
149
149
|
end
|
|
150
150
|
|
|
151
151
|
describe "#resource_name" do
|
|
152
152
|
it "returns the resources name as singular" do
|
|
153
|
-
resource.resource_name.
|
|
153
|
+
expect(resource.resource_name).to eq("party")
|
|
154
154
|
end
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
describe "#namespaced_resource_name" do
|
|
158
158
|
it "returns resource_name with namespace (namespace_party for Namespace::Party), i.e. for use in forms" do
|
|
159
159
|
namespaced_resource = Resource.new("admin/namespace/parties")
|
|
160
|
-
namespaced_resource.namespaced_resource_name.
|
|
160
|
+
expect(namespaced_resource.namespaced_resource_name).to eq('namespace_party')
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
it "equals resource_name if resource not namespaced" do
|
|
164
164
|
namespaced_resource = Resource.new("admin/parties")
|
|
165
|
-
namespaced_resource.namespaced_resource_name.
|
|
165
|
+
expect(namespaced_resource.namespaced_resource_name).to eq('party')
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
it "doesn't include the engine's name" do
|
|
169
169
|
namespaced_resource = Resource.new("admin/party_engine/namespace/parties", module_definition)
|
|
170
|
-
namespaced_resource.namespaced_resource_name.
|
|
170
|
+
expect(namespaced_resource.namespaced_resource_name).to eq('namespace_party')
|
|
171
171
|
end
|
|
172
172
|
end
|
|
173
173
|
|
|
174
174
|
describe "#engine_name" do
|
|
175
175
|
it "should return the engine name of the module" do
|
|
176
176
|
resource = Resource.new("admin/party_engine/namespace/parties", module_definition)
|
|
177
|
-
resource.engine_name.
|
|
177
|
+
expect(resource.engine_name).to eq("party_engine")
|
|
178
178
|
end
|
|
179
179
|
end
|
|
180
180
|
|
|
181
181
|
describe "#namespace_for_scope" do
|
|
182
182
|
it "returns a scope for use in url_for based path helpers" do
|
|
183
|
-
resource.namespace_for_scope.
|
|
183
|
+
expect(resource.namespace_for_scope).to eq(%w(admin))
|
|
184
184
|
end
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
describe "#attributes" do
|
|
188
188
|
it "parses and returns the resource model's attributes from ActiveRecord::ModelSchema" do
|
|
189
|
-
resource.attributes.
|
|
189
|
+
expect(resource.attributes).to eq([
|
|
190
190
|
{:name => "name", :type => :string},
|
|
191
191
|
{:name => "hidden_value", :type => :string},
|
|
192
192
|
{:name => "description", :type => :string},
|
|
193
193
|
{:name => "starts_at", :type => :datetime},
|
|
194
194
|
{:name => "location_id", :type => :integer},
|
|
195
195
|
{:name => "organizer_id", :type => :integer},
|
|
196
|
-
]
|
|
196
|
+
])
|
|
197
197
|
end
|
|
198
198
|
|
|
199
199
|
it "skips attributes returned by skipped_alchemy_resource_attributes" do
|
|
200
200
|
# attr_accessor, hence skipped_alchemy_resource_attributes= works
|
|
201
201
|
resource.skipped_attributes = %w(hidden_value)
|
|
202
|
-
resource.attributes.
|
|
203
|
-
resource.attributes.
|
|
202
|
+
expect(resource.attributes).to include({:name => "id", :type => :integer})
|
|
203
|
+
expect(resource.attributes).not_to include({:name => "hidden_value", :type => :string})
|
|
204
204
|
end
|
|
205
205
|
|
|
206
206
|
context "when resource_relations are not defined" do
|
|
207
207
|
it "includes the attribute" do
|
|
208
|
-
resource.attributes.detect { |a| a[:name] == "location_id" }.
|
|
208
|
+
expect(resource.attributes.detect { |a| a[:name] == "location_id" }).to eq({:name => "location_id", :type => :integer})
|
|
209
209
|
end
|
|
210
210
|
end
|
|
211
211
|
end
|
|
@@ -221,8 +221,8 @@ module Alchemy
|
|
|
221
221
|
|
|
222
222
|
describe '#attributes' do
|
|
223
223
|
it "does not return the attributes returned by that method" do
|
|
224
|
-
resource.attributes.detect { |a| a[:name] == 'hidden_name' }.
|
|
225
|
-
resource.attributes.detect { |a| a[:name] == 'name' }.
|
|
224
|
+
expect(resource.attributes.detect { |a| a[:name] == 'hidden_name' }).to be_nil
|
|
225
|
+
expect(resource.attributes.detect { |a| a[:name] == 'name' }).not_to be_nil
|
|
226
226
|
end
|
|
227
227
|
end
|
|
228
228
|
|
|
@@ -248,11 +248,11 @@ module Alchemy
|
|
|
248
248
|
before { resource.skipped_attributes = [] }
|
|
249
249
|
|
|
250
250
|
it "returns all attributes of type string" do
|
|
251
|
-
|
|
251
|
+
is_expected.to eq([
|
|
252
252
|
{:name => "name", :type => :string},
|
|
253
253
|
{:name => "hidden_value", :type => :string},
|
|
254
254
|
{:name => "description", :type => :string}
|
|
255
|
-
]
|
|
255
|
+
])
|
|
256
256
|
end
|
|
257
257
|
|
|
258
258
|
context "with an array attribute" do
|
|
@@ -264,7 +264,7 @@ module Alchemy
|
|
|
264
264
|
end
|
|
265
265
|
|
|
266
266
|
it "does not include this column" do
|
|
267
|
-
|
|
267
|
+
is_expected.to eq([{name: "name", type: :string}])
|
|
268
268
|
end
|
|
269
269
|
end
|
|
270
270
|
end
|
|
@@ -285,34 +285,34 @@ module Alchemy
|
|
|
285
285
|
describe '#resource_relations' do
|
|
286
286
|
it "should contain model_association from ActiveRecord::Reflections" do
|
|
287
287
|
relation = resource.resource_relations[:location_id]
|
|
288
|
-
relation.keys.
|
|
289
|
-
relation[:model_association].class.
|
|
288
|
+
expect(relation.keys).to include(:model_association)
|
|
289
|
+
expect(relation[:model_association].class).to be(ActiveRecord::Reflection::AssociationReflection)
|
|
290
290
|
end
|
|
291
291
|
|
|
292
292
|
it "adds '_id' to relation key" do
|
|
293
|
-
resource.resource_relations[:location_id].
|
|
293
|
+
expect(resource.resource_relations[:location_id]).not_to be_nil
|
|
294
294
|
end
|
|
295
295
|
|
|
296
296
|
it "stores the relation name" do
|
|
297
297
|
relation = resource.resource_relations[:location_id]
|
|
298
|
-
relation.keys.
|
|
299
|
-
relation[:name].
|
|
298
|
+
expect(relation.keys).to include(:name)
|
|
299
|
+
expect(relation[:name]).to eq('location')
|
|
300
300
|
end
|
|
301
301
|
end
|
|
302
302
|
|
|
303
303
|
describe '#model_associations' do
|
|
304
304
|
it "skip default alchemy model associations" do
|
|
305
|
-
resource.model_associations.collect(&:name).
|
|
305
|
+
expect(resource.model_associations.collect(&:name)).not_to include(*resource.class.const_get(:DEFAULT_SKIPPED_ASSOCIATIONS).map(&:to_sym))
|
|
306
306
|
end
|
|
307
307
|
end
|
|
308
308
|
|
|
309
309
|
describe '#attributes' do
|
|
310
310
|
it "contains the attribute of the related model" do
|
|
311
|
-
resource.attributes.detect { |a| a[:name] == 'location_id' }.keys.
|
|
311
|
+
expect(resource.attributes.detect { |a| a[:name] == 'location_id' }.keys).to include(:relation)
|
|
312
312
|
end
|
|
313
313
|
|
|
314
314
|
it "contains the related model's column type as type" do
|
|
315
|
-
resource.attributes.detect { |a| a[:name] == "location_id" }[:type].
|
|
315
|
+
expect(resource.attributes.detect { |a| a[:name] == "location_id" }[:type]).to eq(:string)
|
|
316
316
|
end
|
|
317
317
|
end
|
|
318
318
|
|
|
@@ -327,13 +327,13 @@ module Alchemy
|
|
|
327
327
|
|
|
328
328
|
describe "#engine_name" do
|
|
329
329
|
it "should return the engine name of the module" do
|
|
330
|
-
resource.engine_name.
|
|
330
|
+
expect(resource.engine_name).to eq("party_engine")
|
|
331
331
|
end
|
|
332
332
|
end
|
|
333
333
|
|
|
334
334
|
describe "#in_engine?" do
|
|
335
335
|
it "should return true if the module is shipped within an engine" do
|
|
336
|
-
resource.in_engine
|
|
336
|
+
expect(resource.in_engine?).to eq(true)
|
|
337
337
|
end
|
|
338
338
|
end
|
|
339
339
|
|
|
@@ -31,7 +31,7 @@ describe Alchemy::ResourcesHelper do
|
|
|
31
31
|
let(:resource_item) { double('resource-item') }
|
|
32
32
|
|
|
33
33
|
before {
|
|
34
|
-
controller.
|
|
34
|
+
allow(controller).to receive(:main_app).and_return 'main_app_proxy'
|
|
35
35
|
controller.instance_variable_set('@my_resource', resource_item)
|
|
36
36
|
controller.instance_variable_set('@my_resources', [resource_item])
|
|
37
37
|
}
|
|
@@ -39,48 +39,48 @@ describe Alchemy::ResourcesHelper do
|
|
|
39
39
|
describe "path-helpers" do
|
|
40
40
|
describe "#resource_url_proxy" do
|
|
41
41
|
it "returns the current proxy for url-helper-methods" do
|
|
42
|
-
controller.resource_url_proxy.
|
|
42
|
+
expect(controller.resource_url_proxy).to eq('main_app_proxy')
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
context "when resource is in engine" do
|
|
46
46
|
let(:controller_for_engine) { ResourcesControllerForEngine.new }
|
|
47
|
-
before { controller_for_engine.
|
|
47
|
+
before { allow(controller_for_engine).to receive('my_engine').and_return('my_engine_proxy') }
|
|
48
48
|
|
|
49
49
|
it "returns the engine's proxy" do
|
|
50
|
-
controller_for_engine.resource_url_proxy.
|
|
50
|
+
expect(controller_for_engine.resource_url_proxy).to eq('my_engine_proxy')
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
describe "#resource_scope" do
|
|
56
56
|
it "returns an array containing a proxy and namespaces for url_for-based helper-methods" do
|
|
57
|
-
controller.resource_scope.
|
|
57
|
+
expect(controller.resource_scope).to eq(%W[main_app_proxy admin])
|
|
58
58
|
end
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
describe "#resource_path" do
|
|
62
62
|
it "invokes polymorphic-path with correct scope and object" do
|
|
63
63
|
my_resource_item = double
|
|
64
|
-
controller.
|
|
64
|
+
expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
|
|
65
65
|
controller.resource_path(my_resource_item)
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
it "uses resource_name when no object is given" do
|
|
69
|
-
controller.
|
|
69
|
+
expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
|
|
70
70
|
controller.resource_path
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
describe "#resources_path" do
|
|
75
75
|
it "invokes polymorphic-path with correct scope and resources_name" do
|
|
76
|
-
controller.
|
|
76
|
+
expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resources"], {})
|
|
77
77
|
controller.resources_path
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
describe "#new_resource_path" do
|
|
82
82
|
it "invokes new_polymorphic_path with correct scope and resource_name" do
|
|
83
|
-
controller.
|
|
83
|
+
expect(controller).to receive(:new_polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
|
|
84
84
|
controller.new_resource_path
|
|
85
85
|
end
|
|
86
86
|
end
|
|
@@ -88,7 +88,7 @@ describe Alchemy::ResourcesHelper do
|
|
|
88
88
|
describe "#edit_resource_path" do
|
|
89
89
|
it "invokes edit_polymorphic_path with correct scope and resource_name" do
|
|
90
90
|
my_resource_item = double
|
|
91
|
-
controller.
|
|
91
|
+
expect(controller).to receive(:edit_polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
|
|
92
92
|
controller.edit_resource_path(my_resource_item)
|
|
93
93
|
end
|
|
94
94
|
end
|
|
@@ -96,27 +96,27 @@ describe Alchemy::ResourcesHelper do
|
|
|
96
96
|
|
|
97
97
|
describe "#resource_instance_variable" do
|
|
98
98
|
it "returns the resource_item" do
|
|
99
|
-
controller.resource_instance_variable.
|
|
99
|
+
expect(controller.resource_instance_variable).to eq(resource_item)
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
describe "#resources_instance_variable" do
|
|
104
104
|
it "returns a collection of resource_items" do
|
|
105
|
-
controller.resources_instance_variable.
|
|
105
|
+
expect(controller.resources_instance_variable).to eq([resource_item])
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
describe "#resource_window_size" do
|
|
110
110
|
it "returns overlay size string depending on resource attributes length" do
|
|
111
|
-
controller.
|
|
112
|
-
controller.resource_window_size.
|
|
111
|
+
allow(controller).to receive(:resource_handler).and_return double(attributes: double(length: 4))
|
|
112
|
+
expect(controller.resource_window_size).to eq("420x260")
|
|
113
113
|
end
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
describe "#render_attribute" do
|
|
117
117
|
it "should return the value from resource attribute" do
|
|
118
|
-
resource_item.
|
|
119
|
-
controller.render_attribute(resource_item, {name: 'name'}).
|
|
118
|
+
allow(resource_item).to receive(:name).and_return('my-name')
|
|
119
|
+
expect(controller.render_attribute(resource_item, {name: 'name'})).to eq('my-name')
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
context "resource having a relation" do
|
|
@@ -130,15 +130,15 @@ describe Alchemy::ResourcesHelper do
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
it "should return the value from the related object attribute" do
|
|
133
|
-
resource_item.
|
|
134
|
-
controller.render_attribute(resource_item, {name: 'name', relation: relation}).
|
|
133
|
+
allow(resource_item).to receive(:name).and_return('my-name')
|
|
134
|
+
expect(controller.render_attribute(resource_item, {name: 'name', relation: relation})).to eq('Title of related object')
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
describe "#resource_name" do
|
|
140
140
|
it "returns resource_handler.resource_name" do
|
|
141
|
-
controller.resource_name.
|
|
141
|
+
expect(controller.resource_name).to eq("my_resource")
|
|
142
142
|
end
|
|
143
143
|
end
|
|
144
144
|
end
|
|
@@ -10,11 +10,11 @@ module Alchemy
|
|
|
10
10
|
|
|
11
11
|
describe Shell do
|
|
12
12
|
|
|
13
|
-
before { MyToDoList.
|
|
13
|
+
before { allow(MyToDoList).to receive(:puts) }
|
|
14
14
|
|
|
15
15
|
describe '.todo' do
|
|
16
16
|
it "should add given string as a todo by delegating to .add_todo" do
|
|
17
|
-
MyToDoList.
|
|
17
|
+
expect(MyToDoList).to receive(:add_todo).with(["", "new todo"])
|
|
18
18
|
MyToDoList.todo("new todo")
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -36,27 +36,27 @@ module Alchemy
|
|
|
36
36
|
describe '.display_todos' do
|
|
37
37
|
context 'if there are todos in the list' do
|
|
38
38
|
before do
|
|
39
|
-
MyToDoList.
|
|
39
|
+
allow(MyToDoList).to receive(:todos).and_return(['My first todo', 'My second todo'])
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
it "should log them" do
|
|
43
|
-
MyToDoList.
|
|
43
|
+
expect(MyToDoList).to receive(:log).at_least(1).times
|
|
44
44
|
MyToDoList.display_todos
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
it "should iterate through the todos with an index" do
|
|
48
|
-
MyToDoList.todos.
|
|
48
|
+
expect(MyToDoList.todos).to receive(:each_with_index)
|
|
49
49
|
MyToDoList.display_todos
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
context 'if there are todos in the list' do
|
|
54
54
|
before do
|
|
55
|
-
MyToDoList.
|
|
55
|
+
allow(MyToDoList).to receive(:todos).and_return([])
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
it "should not log anything" do
|
|
59
|
-
MyToDoList.
|
|
59
|
+
expect(MyToDoList).not_to receive(:log)
|
|
60
60
|
MyToDoList.display_todos
|
|
61
61
|
end
|
|
62
62
|
end
|
|
@@ -65,31 +65,31 @@ module Alchemy
|
|
|
65
65
|
describe '.log' do
|
|
66
66
|
context 'if the message type is "skip"' do
|
|
67
67
|
it "the output color should be yellow and cleared again" do
|
|
68
|
-
MyToDoList.
|
|
69
|
-
MyToDoList.
|
|
68
|
+
expect(MyToDoList).to receive(:color).with(:yellow)
|
|
69
|
+
expect(MyToDoList).to receive(:color).with(:clear)
|
|
70
70
|
MyToDoList.log('in yellow, please', :skip)
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
context 'if the message type is "error"' do
|
|
75
75
|
it "the output color should be yellow and cleared again" do
|
|
76
|
-
MyToDoList.
|
|
77
|
-
MyToDoList.
|
|
76
|
+
expect(MyToDoList).to receive(:color).with(:red)
|
|
77
|
+
expect(MyToDoList).to receive(:color).with(:clear)
|
|
78
78
|
MyToDoList.log('in red, please', :error)
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
context 'if the message type is "message"' do
|
|
83
83
|
it "the output color should just be cleared" do
|
|
84
|
-
MyToDoList.
|
|
84
|
+
expect(MyToDoList).to receive(:color).with(:clear)
|
|
85
85
|
MyToDoList.log('cleared, please', :message)
|
|
86
86
|
end
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
context 'if no message type is given' do
|
|
90
90
|
it "the output color should be green" do
|
|
91
|
-
MyToDoList.
|
|
92
|
-
MyToDoList.
|
|
91
|
+
expect(MyToDoList).to receive(:color).with(:green)
|
|
92
|
+
expect(MyToDoList).to receive(:color).with(:clear)
|
|
93
93
|
MyToDoList.log('in green, please')
|
|
94
94
|
end
|
|
95
95
|
end
|
|
@@ -99,18 +99,18 @@ module Alchemy
|
|
|
99
99
|
|
|
100
100
|
context 'if given name is a constant of Thor::Shell::Color' do
|
|
101
101
|
before do
|
|
102
|
-
Thor::Shell::Color.
|
|
102
|
+
allow(Thor::Shell::Color).to receive(:const_defined?).and_return(true)
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
it "should call the constant" do
|
|
106
|
-
String.
|
|
106
|
+
expect_any_instance_of(String).to receive(:constantize).and_return('')
|
|
107
107
|
MyToDoList.send(:color, :red)
|
|
108
108
|
end
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
context 'if given name is not a defined constant of Thor::Shell::Color' do
|
|
112
112
|
before do
|
|
113
|
-
Thor::Shell::Color.
|
|
113
|
+
allow(Thor::Shell::Color).to receive(:const_defined?).and_return(false)
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
it "should return en empty string" do
|