alchemy_cms 3.1.3 → 3.2.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +2 -2
- data/.hound.yml +2 -0
- data/.rubocop.yml +1063 -0
- data/.travis.yml +14 -10
- data/Gemfile +4 -7
- data/README.md +16 -8
- data/alchemy_cms.gemspec +8 -7
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -11
- data/app/assets/javascripts/alchemy/alchemy.js +1 -1
- data/app/assets/stylesheets/alchemy/{admin.css.scss → admin.scss} +1 -0
- data/app/assets/stylesheets/alchemy/{icon-font.css.scss → icon-font.scss} +0 -0
- data/app/assets/stylesheets/alchemy/{menubar.css.scss → menubar.scss} +0 -0
- data/app/assets/stylesheets/alchemy/{print.css.scss → print.scss} +0 -0
- data/app/assets/stylesheets/alchemy/selects.scss +0 -6
- data/app/controllers/alchemy/admin/contents_controller.rb +3 -4
- data/app/controllers/alchemy/admin/pictures_controller.rb +0 -2
- data/app/controllers/alchemy/api/contents_controller.rb +1 -1
- data/app/controllers/alchemy/api/elements_controller.rb +2 -2
- data/app/controllers/alchemy/api/pages_controller.rb +1 -1
- data/app/controllers/alchemy/elements_controller.rb +0 -6
- data/app/controllers/alchemy/pages_controller.rb +17 -13
- data/app/controllers/alchemy/pictures_controller.rb +1 -0
- data/app/helpers/alchemy/admin/navigation_helper.rb +1 -1
- data/app/models/alchemy/element.rb +41 -17
- data/app/models/alchemy/page/page_naming.rb +16 -29
- data/bin/alchemy +1 -1
- data/config/routes.rb +1 -2
- data/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -17
- data/lib/alchemy/capistrano.rb +3 -4
- data/lib/alchemy/controller_actions.rb +2 -1
- data/lib/alchemy/engine.rb +1 -0
- data/lib/alchemy/errors.rb +7 -0
- data/lib/alchemy/essence.rb +4 -4
- data/lib/alchemy/permissions.rb +1 -1
- data/lib/alchemy/shell.rb +26 -11
- data/lib/alchemy/test_support/controller_requests.rb +48 -12
- data/lib/alchemy/upgrader.rb +1 -0
- data/lib/alchemy/upgrader/three_point_one.rb +0 -1
- data/lib/alchemy/upgrader/three_point_two.rb +39 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/templates/alchemy.rb +2 -2
- data/lib/tasks/alchemy/install.rake +2 -1
- data/spec/controllers/admin/attachments_controller_spec.rb +14 -14
- data/spec/controllers/admin/clipboard_controller_spec.rb +5 -5
- data/spec/controllers/admin/contents_controller_spec.rb +8 -14
- data/spec/controllers/admin/dashboard_controller_spec.rb +12 -12
- data/spec/controllers/admin/elements_controller_spec.rb +30 -31
- data/spec/controllers/admin/essence_files_controller_spec.rb +6 -6
- data/spec/controllers/admin/essence_pictures_controller_spec.rb +17 -17
- data/spec/controllers/admin/languages_controller_spec.rb +3 -3
- data/spec/controllers/admin/layoutpages_controller_spec.rb +3 -3
- data/spec/controllers/admin/pages_controller_spec.rb +48 -48
- data/spec/controllers/admin/pictures_controller_spec.rb +19 -19
- data/spec/controllers/admin/resources_controller_spec.rb +2 -2
- data/spec/controllers/admin/trash_controller_spec.rb +5 -5
- data/spec/controllers/alchemy/admin/tags_controller_spec.rb +5 -5
- data/spec/controllers/alchemy/api/contents_controller_spec.rb +46 -11
- data/spec/controllers/alchemy/api/elements_controller_spec.rb +42 -14
- data/spec/controllers/alchemy/api/pages_controller_spec.rb +26 -16
- data/spec/controllers/attachments_controller_spec.rb +7 -7
- data/spec/controllers/elements_controller_spec.rb +16 -19
- data/spec/controllers/messages_controller_spec.rb +15 -15
- data/spec/controllers/pages_controller_spec.rb +16 -25
- data/spec/controllers/pictures_controller_spec.rb +75 -49
- data/spec/dummy/Rakefile +1 -1
- data/spec/dummy/app/assets/stylesheets/application.css +5 -3
- data/spec/dummy/config/application.rb +11 -1
- data/spec/dummy/config/boot.rb +1 -1
- data/spec/dummy/config/environment.rb +1 -1
- data/spec/dummy/config/environments/development.rb +14 -2
- data/spec/dummy/config/environments/production.rb +18 -21
- data/spec/dummy/config/environments/test.rb +9 -4
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/mime_types.rb +0 -1
- data/spec/dummy/config/initializers/session_store.rb +1 -1
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +380 -0
- data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
- data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
- data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
- data/spec/dummy/db/migrate/20150122213511_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
- data/{db/migrate/20140107192720_add_missing_unique_indices_to_tags_and_taggings.rb → spec/dummy/db/migrate/20150122213512_add_missing_unique_indices.acts_as_taggable_on_engine.rb} +5 -6
- data/{db/migrate/20140701160159_add_taggings_counter_cache_to_tags.rb → spec/dummy/db/migrate/20150122213513_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb} +2 -1
- data/{db/migrate/20140701160225_add_missing_taggable_index.rb → spec/dummy/db/migrate/20150122213514_add_missing_taggable_index.acts_as_taggable_on_engine.rb} +1 -0
- data/spec/dummy/db/schema.rb +27 -31
- data/spec/dummy/public/404.html +20 -11
- data/spec/dummy/public/422.html +20 -11
- data/spec/dummy/public/500.html +19 -10
- data/spec/features/admin/page_creation_feature_spec.rb +2 -2
- data/spec/libraries/resource_spec.rb +1 -1
- data/spec/libraries/shell_spec.rb +2 -0
- data/spec/models/page_spec.rb +1 -13
- data/spec/spec_helper.rb +6 -4
- data/spec/support/rspec-activemodel-mocks_patch.rb +8 -0
- metadata +63 -56
- data/app/controllers/alchemy/contents_controller.rb +0 -18
- data/spec/controllers/contents_controller_spec.rb +0 -22
- data/spec/dummy/app/models/dummy_model.rb +0 -3
- data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -1
- data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +0 -1
- data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +0 -1
- data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +0 -1
- data/spec/dummy/db/migrate/20140107192720_add_missing_unique_indices_to_tags_and_taggings.rb +0 -1
- data/spec/dummy/db/migrate/20140701160159_add_taggings_counter_cache_to_tags.rb +0 -1
- data/spec/dummy/db/migrate/20140701160225_add_missing_taggable_index.rb +0 -1
- data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +0 -7
- data/spec/dummy/spec/javascripts +0 -1
- data/spec/models/dummy_model_spec.rb +0 -11
@@ -10,20 +10,20 @@ module Alchemy
|
|
10
10
|
describe "#index" do
|
11
11
|
it "should always paginate the records" do
|
12
12
|
expect(Picture).to receive(:find_paginated)
|
13
|
-
|
13
|
+
alchemy_get :index
|
14
14
|
end
|
15
15
|
|
16
16
|
context "when params[:filter] is set" do
|
17
17
|
it "should filter the pictures collection by the given filter string." do
|
18
18
|
expect(Picture).to receive(:filtered_by).with('recent').and_return(Picture.all)
|
19
|
-
|
19
|
+
alchemy_get :index, filter: 'recent'
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
context "when params[:tagged_with] is set" do
|
24
24
|
it "should filter the records by tags" do
|
25
25
|
expect(Picture).to receive(:tagged_with).and_return(Picture.all)
|
26
|
-
|
26
|
+
alchemy_get :index, tagged_with: "red"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -34,19 +34,19 @@ module Alchemy
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "for html requests it renders the archive_overlay partial" do
|
37
|
-
|
37
|
+
alchemy_get :index, {element_id: 1}
|
38
38
|
expect(response).to render_template(partial: '_archive_overlay')
|
39
39
|
end
|
40
40
|
|
41
41
|
it "for ajax requests it renders the archive_overlay template" do
|
42
|
-
|
42
|
+
alchemy_xhr :get, :index, {element_id: 1}
|
43
43
|
expect(response).to render_template(:archive_overlay)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
context "is not set" do
|
48
48
|
it "should render the default index view" do
|
49
|
-
|
49
|
+
alchemy_get :index
|
50
50
|
expect(response).to render_template(:index)
|
51
51
|
end
|
52
52
|
end
|
@@ -54,7 +54,7 @@ module Alchemy
|
|
54
54
|
end
|
55
55
|
|
56
56
|
describe '#new' do
|
57
|
-
subject {
|
57
|
+
subject { alchemy_get :new, params }
|
58
58
|
|
59
59
|
let(:params) { Hash.new }
|
60
60
|
|
@@ -93,7 +93,7 @@ module Alchemy
|
|
93
93
|
end
|
94
94
|
|
95
95
|
describe '#create' do
|
96
|
-
subject {
|
96
|
+
subject { alchemy_post :create, params }
|
97
97
|
|
98
98
|
let(:params) { {picture: {name: ''}} }
|
99
99
|
let(:picture) { mock_model('Picture', humanized_name: 'Cute kittens', to_jq_upload: {}) }
|
@@ -166,20 +166,20 @@ module Alchemy
|
|
166
166
|
before { expect(Picture).to receive(:where).and_return(pictures) }
|
167
167
|
|
168
168
|
it 'assigns pictures instance variable' do
|
169
|
-
|
169
|
+
alchemy_get :edit_multiple
|
170
170
|
expect(assigns(:pictures)).to eq(pictures)
|
171
171
|
end
|
172
172
|
|
173
173
|
it 'assigns tags instance variable' do
|
174
|
-
|
174
|
+
alchemy_get :edit_multiple
|
175
175
|
expect(assigns(:tags)).to include('kitten')
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
179
|
describe '#update' do
|
180
|
-
subject {
|
180
|
+
subject { alchemy_put :update, {id: 1, picture: {name: ''}} }
|
181
181
|
|
182
|
-
let(:picture) {
|
182
|
+
let(:picture) { build_stubbed(:picture, name: 'Cute kitten') }
|
183
183
|
|
184
184
|
before do
|
185
185
|
expect(Picture).to receive(:find).and_return(picture)
|
@@ -226,13 +226,13 @@ module Alchemy
|
|
226
226
|
end
|
227
227
|
|
228
228
|
it "loads and assigns pictures" do
|
229
|
-
|
229
|
+
alchemy_post :update_multiple
|
230
230
|
expect(assigns(:pictures)).to eq(pictures)
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
234
234
|
describe "#delete_multiple" do
|
235
|
-
subject {
|
235
|
+
subject { alchemy_delete :delete_multiple, picture_ids: picture_ids }
|
236
236
|
|
237
237
|
let(:deletable_picture) { mock_model('Picture', name: 'pic of the pig', deletable?: true) }
|
238
238
|
let(:not_deletable_picture) { mock_model('Picture', name: 'pic of the chick', deletable?: false) }
|
@@ -295,7 +295,7 @@ module Alchemy
|
|
295
295
|
end
|
296
296
|
|
297
297
|
describe '#destroy' do
|
298
|
-
let(:picture) {
|
298
|
+
let(:picture) { build_stubbed(:picture, name: 'Cute kitten') }
|
299
299
|
|
300
300
|
before do
|
301
301
|
expect(Picture).to receive(:find).and_return(picture)
|
@@ -303,7 +303,7 @@ module Alchemy
|
|
303
303
|
|
304
304
|
it "destroys the picture and sets and success message" do
|
305
305
|
expect(picture).to receive(:destroy)
|
306
|
-
|
306
|
+
alchemy_delete :destroy, id: picture.id
|
307
307
|
expect(assigns(:picture)).to eq(picture)
|
308
308
|
expect(flash[:notice]).not_to be_blank
|
309
309
|
end
|
@@ -314,12 +314,12 @@ module Alchemy
|
|
314
314
|
end
|
315
315
|
|
316
316
|
it "shows error notice" do
|
317
|
-
|
317
|
+
alchemy_delete :destroy, id: picture.id
|
318
318
|
expect(flash[:error]).not_to be_blank
|
319
319
|
end
|
320
320
|
|
321
321
|
it "redirects to index" do
|
322
|
-
|
322
|
+
alchemy_delete :destroy, id: picture.id
|
323
323
|
expect(response).to redirect_to admin_pictures_path
|
324
324
|
end
|
325
325
|
end
|
@@ -328,7 +328,7 @@ module Alchemy
|
|
328
328
|
describe '#flush' do
|
329
329
|
it "removes the complete pictures cache" do
|
330
330
|
expect(FileUtils).to receive(:rm_rf).with(Rails.root.join('public', '', 'pictures'))
|
331
|
-
|
331
|
+
alchemy_xhr :post, :flush
|
332
332
|
end
|
333
333
|
end
|
334
334
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
class EventsController < Alchemy::Admin::ResourcesController
|
3
|
+
class Admin::EventsController < Alchemy::Admin::ResourcesController
|
4
4
|
end
|
5
5
|
|
6
|
-
describe EventsController do
|
6
|
+
describe Admin::EventsController do
|
7
7
|
it "should include ResourcesHelper" do
|
8
8
|
expect(controller.respond_to?(:resource_window_size)).to be_truthy
|
9
9
|
end
|
@@ -14,13 +14,13 @@ module Alchemy
|
|
14
14
|
}
|
15
15
|
|
16
16
|
it "should hold trashed elements" do
|
17
|
-
|
17
|
+
alchemy_get :index, :page_id => alchemy_page.id
|
18
18
|
expect(response.body).to have_selector("#element_#{element.id}.element_editor")
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should not hold elements that are not trashed" do
|
22
22
|
element = FactoryGirl.create(:element, :page => alchemy_page, :public => false)
|
23
|
-
|
23
|
+
alchemy_get :index, :page_id => alchemy_page.id
|
24
24
|
expect(response.body).not_to have_selector("#element_#{element.id}.element_editor")
|
25
25
|
end
|
26
26
|
|
@@ -34,7 +34,7 @@ module Alchemy
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "unique elements should be draggable" do
|
37
|
-
|
37
|
+
alchemy_get :index, page_id: alchemy_page.id
|
38
38
|
expect(response.body).to have_selector("#element_#{trashed.id}.element_editor.draggable")
|
39
39
|
end
|
40
40
|
end
|
@@ -49,7 +49,7 @@ module Alchemy
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "unique elements should not be draggable" do
|
52
|
-
|
52
|
+
alchemy_get :index, page_id: page.id
|
53
53
|
expect(response.body).to have_selector("#element_#{trashed.id}.element_editor.not-draggable")
|
54
54
|
end
|
55
55
|
end
|
@@ -58,7 +58,7 @@ module Alchemy
|
|
58
58
|
describe "#clear" do
|
59
59
|
it "should destroy all containing elements" do
|
60
60
|
expect(Element.trashed).not_to be_empty
|
61
|
-
|
61
|
+
alchemy_xhr :post, :clear, page_id: alchemy_page.id
|
62
62
|
expect(Element.trashed).to be_empty
|
63
63
|
end
|
64
64
|
end
|
@@ -10,7 +10,7 @@ module Alchemy
|
|
10
10
|
render_views
|
11
11
|
|
12
12
|
it "does not create tag" do
|
13
|
-
|
13
|
+
alchemy_post :create, tag: {name: ''}
|
14
14
|
expect(response.body).to have_content("can't be blank")
|
15
15
|
end
|
16
16
|
end
|
@@ -18,7 +18,7 @@ module Alchemy
|
|
18
18
|
context 'with required params' do
|
19
19
|
it "creates tag and redirects to tags view" do
|
20
20
|
expect {
|
21
|
-
|
21
|
+
alchemy_post :create, tag: {name: 'Foo'}
|
22
22
|
}.to change { ActsAsTaggableOn::Tag.count }.by(1)
|
23
23
|
expect(response).to redirect_to admin_tags_path
|
24
24
|
end
|
@@ -32,7 +32,7 @@ module Alchemy
|
|
32
32
|
before { another_tag; tag }
|
33
33
|
|
34
34
|
it "loads alls tags but not the one editing" do
|
35
|
-
|
35
|
+
alchemy_get :edit, id: tag.id
|
36
36
|
expect(assigns(:tags)).to include(another_tag)
|
37
37
|
expect(assigns(:tags)).not_to include(tag)
|
38
38
|
end
|
@@ -42,7 +42,7 @@ module Alchemy
|
|
42
42
|
let(:tag) { ActsAsTaggableOn::Tag.create(name: 'Sputz') }
|
43
43
|
|
44
44
|
it "changes tags name" do
|
45
|
-
|
45
|
+
alchemy_put :update, id: tag.id, tag: {name: 'Foo'}
|
46
46
|
expect(response).to redirect_to(admin_tags_path)
|
47
47
|
expect(tag.reload.name).to eq('Foo')
|
48
48
|
end
|
@@ -53,7 +53,7 @@ module Alchemy
|
|
53
53
|
it "replaces tag with other tag" do
|
54
54
|
expect(Alchemy::Tag).to receive(:replace)
|
55
55
|
expect_any_instance_of(ActsAsTaggableOn::Tag).to receive(:destroy)
|
56
|
-
|
56
|
+
alchemy_put :update, id: tag.id, tag: {merge_to: another_tag.id}
|
57
57
|
expect(response).to redirect_to(admin_tags_path)
|
58
58
|
end
|
59
59
|
end
|
@@ -2,16 +2,33 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Alchemy
|
4
4
|
describe Api::ContentsController do
|
5
|
+
# We need to be sure, that the timestamps are always the same,
|
6
|
+
# while comparing json objects
|
7
|
+
before do
|
8
|
+
allow_any_instance_of(Alchemy::Content).
|
9
|
+
to receive(:created_at).and_return(Time.now)
|
10
|
+
allow_any_instance_of(Alchemy::Content).
|
11
|
+
to receive(:updated_at).and_return(Time.now)
|
12
|
+
allow_any_instance_of(Alchemy::EssenceText).
|
13
|
+
to receive(:created_at).and_return(Time.now)
|
14
|
+
allow_any_instance_of(Alchemy::EssenceText).
|
15
|
+
to receive(:updated_at).and_return(Time.now)
|
16
|
+
allow_any_instance_of(Alchemy::EssenceRichtext).
|
17
|
+
to receive(:created_at).and_return(Time.now)
|
18
|
+
allow_any_instance_of(Alchemy::EssenceRichtext).
|
19
|
+
to receive(:updated_at).and_return(Time.now)
|
20
|
+
end
|
21
|
+
|
5
22
|
describe '#index' do
|
6
23
|
let!(:page) { create(:page) }
|
7
24
|
let!(:element) { create(:element, page: page) }
|
8
25
|
let!(:content) { create(:content, element: element) }
|
9
26
|
|
10
27
|
it "returns all public contents as json objects" do
|
11
|
-
|
28
|
+
alchemy_get :index, format: :json
|
12
29
|
expect(response.status).to eq(200)
|
13
30
|
expect(response.content_type).to eq('application/json')
|
14
|
-
expect(response.body).
|
31
|
+
expect(response.body).to eq("{\"contents\":[#{ContentSerializer.new(content).to_json}]}")
|
15
32
|
end
|
16
33
|
|
17
34
|
context 'with element_id' do
|
@@ -19,11 +36,19 @@ module Alchemy
|
|
19
36
|
let!(:other_content) { create(:content, element: other_element) }
|
20
37
|
|
21
38
|
it "returns only contents from this element" do
|
22
|
-
|
39
|
+
alchemy_get :index, element_id: other_element.id, format: :json
|
23
40
|
expect(response.status).to eq(200)
|
24
41
|
expect(response.content_type).to eq('application/json')
|
25
|
-
expect(response.body).
|
26
|
-
|
42
|
+
expect(response.body).to eq("{\"contents\":[#{ContentSerializer.new(other_content).to_json}]}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with empty element_id' do
|
47
|
+
it "returns all contents" do
|
48
|
+
alchemy_get :index, element_id: element.id, format: :json
|
49
|
+
expect(response.status).to eq(200)
|
50
|
+
expect(response.content_type).to eq('application/json')
|
51
|
+
expect(response.body).to eq("{\"contents\":[#{ContentSerializer.new(content).to_json}]}")
|
27
52
|
end
|
28
53
|
end
|
29
54
|
end
|
@@ -38,19 +63,21 @@ module Alchemy
|
|
38
63
|
expect(Content).to receive(:find).and_return(content)
|
39
64
|
end
|
40
65
|
|
41
|
-
it "
|
42
|
-
|
66
|
+
it "returns content as json" do
|
67
|
+
alchemy_get :show, id: content.id, format: :json
|
43
68
|
expect(response.status).to eq(200)
|
44
69
|
expect(response.content_type).to eq('application/json')
|
70
|
+
expect(response.body).to eq(ContentSerializer.new(content).to_json)
|
45
71
|
end
|
46
72
|
|
47
73
|
context 'requesting an restricted content' do
|
48
74
|
let(:page) { create(:page, restricted: true) }
|
49
75
|
|
50
76
|
it "responds with 403" do
|
51
|
-
|
77
|
+
alchemy_get :show, id: content.id, format: :json
|
52
78
|
expect(response.content_type).to eq('application/json')
|
53
79
|
expect(response.status).to eq(403)
|
80
|
+
expect(response.body).to eq('{"error":"Not authorized"}')
|
54
81
|
end
|
55
82
|
end
|
56
83
|
end
|
@@ -61,11 +88,19 @@ module Alchemy
|
|
61
88
|
let!(:content) { create(:content, element: element) }
|
62
89
|
|
63
90
|
it 'returns the named content from element with given id.' do
|
64
|
-
|
91
|
+
alchemy_get :show, element_id: element.id, name: content.name, format: :json
|
65
92
|
expect(response.status).to eq(200)
|
66
93
|
expect(response.content_type).to eq('application/json')
|
67
|
-
expect(response.body).to
|
68
|
-
|
94
|
+
expect(response.body).to eq(ContentSerializer.new(content).to_json)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'with empty element_id or name param' do
|
99
|
+
it 'returns 404 error.' do
|
100
|
+
alchemy_get :show, element_id: '', name: '', format: :json
|
101
|
+
expect(response.status).to eq(404)
|
102
|
+
expect(response.content_type).to eq('application/json')
|
103
|
+
expect(response.body).to eq("{\"error\":\"Record not found\"}")
|
69
104
|
end
|
70
105
|
end
|
71
106
|
end
|
@@ -2,28 +2,46 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Alchemy
|
4
4
|
describe Api::ElementsController do
|
5
|
+
# We need to be sure, that the timestamps are always the same,
|
6
|
+
# while comparing json objects
|
7
|
+
before do
|
8
|
+
allow_any_instance_of(Alchemy::Element).
|
9
|
+
to receive(:created_at).and_return(Time.now)
|
10
|
+
allow_any_instance_of(Alchemy::Element).
|
11
|
+
to receive(:updated_at).and_return(Time.now)
|
12
|
+
end
|
13
|
+
|
5
14
|
describe '#index' do
|
6
15
|
let!(:page) { create(:public_page) }
|
7
16
|
let!(:element) { create(:element, page: page) }
|
8
17
|
|
9
18
|
it "returns all public elements as json objects" do
|
10
|
-
|
19
|
+
alchemy_get :index, format: :json
|
11
20
|
expect(response.status).to eq(200)
|
12
21
|
expect(response.content_type).to eq('application/json')
|
13
|
-
expect(response.body).to_not eq('{"elements
|
22
|
+
expect(response.body).to_not eq('{"elements:[]"}')
|
23
|
+
expect(response.body).to eq("{\"elements\":[#{ElementSerializer.new(element).to_json}]}")
|
14
24
|
end
|
15
25
|
|
16
26
|
context 'with page_id param' do
|
17
27
|
let!(:other_page) { create(:public_page) }
|
18
28
|
let!(:other_element) { create(:element, page: other_page) }
|
19
29
|
|
20
|
-
it "returns only elements from this
|
21
|
-
|
30
|
+
it "returns only elements from this page" do
|
31
|
+
alchemy_get :index, page_id: other_page.id, format: :json
|
32
|
+
expect(response.status).to eq(200)
|
33
|
+
expect(response.content_type).to eq('application/json')
|
34
|
+
expect(response.body).to eq("{\"elements\":[#{ElementSerializer.new(other_element).to_json}]}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with empty page_id param' do
|
39
|
+
it "returns all elements" do
|
40
|
+
alchemy_get :index, page_id: '', format: :json
|
22
41
|
expect(response.status).to eq(200)
|
23
42
|
expect(response.content_type).to eq('application/json')
|
24
|
-
expect(response.body).to_not eq('{"elements
|
25
|
-
expect(response.body).to
|
26
|
-
expect(response.body).to_not match(/page_id\"\:#{page.id}/)
|
43
|
+
expect(response.body).to_not eq('{"elements:[]"}')
|
44
|
+
expect(response.body).to eq("{\"elements\":[#{ElementSerializer.new(element).to_json}]}")
|
27
45
|
end
|
28
46
|
end
|
29
47
|
|
@@ -31,12 +49,20 @@ module Alchemy
|
|
31
49
|
let!(:other_element) { create(:element, page: page, name: 'news') }
|
32
50
|
|
33
51
|
it "returns only elements named like this." do
|
34
|
-
|
52
|
+
alchemy_get :index, named: 'news', format: :json
|
53
|
+
expect(response.status).to eq(200)
|
54
|
+
expect(response.content_type).to eq('application/json')
|
55
|
+
expect(response.body).to eq("{\"elements\":[#{ElementSerializer.new(other_element).to_json}]}")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'with empty named param' do
|
60
|
+
it "returns all elements" do
|
61
|
+
alchemy_get :index, named: '', format: :json
|
35
62
|
expect(response.status).to eq(200)
|
36
63
|
expect(response.content_type).to eq('application/json')
|
37
|
-
expect(response.body).to_not eq('{"elements
|
38
|
-
expect(response.body).to
|
39
|
-
expect(response.body).to_not match(/name\"\:\"#{element.name}\"/)
|
64
|
+
expect(response.body).to_not eq('{"elements:[]"}')
|
65
|
+
expect(response.body).to eq("{\"elements\":[#{ElementSerializer.new(element).to_json}]}")
|
40
66
|
end
|
41
67
|
end
|
42
68
|
end
|
@@ -49,19 +75,21 @@ module Alchemy
|
|
49
75
|
expect(Element).to receive(:find).and_return(element)
|
50
76
|
end
|
51
77
|
|
52
|
-
it "
|
53
|
-
|
78
|
+
it "returns element as json" do
|
79
|
+
alchemy_get :show, id: element.id, format: :json
|
54
80
|
expect(response.status).to eq(200)
|
55
81
|
expect(response.content_type).to eq('application/json')
|
82
|
+
expect(response.body).to eq(ElementSerializer.new(element).to_json)
|
56
83
|
end
|
57
84
|
|
58
85
|
context 'requesting an restricted element' do
|
59
86
|
let(:page) { build_stubbed(:page, restricted: true) }
|
60
87
|
|
61
88
|
it "responds with 403" do
|
62
|
-
|
89
|
+
alchemy_get :show, id: element.id, format: :json
|
63
90
|
expect(response.content_type).to eq('application/json')
|
64
91
|
expect(response.status).to eq(403)
|
92
|
+
expect(response.body).to eq('{"error":"Not authorized"}')
|
65
93
|
end
|
66
94
|
end
|
67
95
|
end
|