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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +2 -2
  3. data/.hound.yml +2 -0
  4. data/.rubocop.yml +1063 -0
  5. data/.travis.yml +14 -10
  6. data/Gemfile +4 -7
  7. data/README.md +16 -8
  8. data/alchemy_cms.gemspec +8 -7
  9. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -11
  10. data/app/assets/javascripts/alchemy/alchemy.js +1 -1
  11. data/app/assets/stylesheets/alchemy/{admin.css.scss → admin.scss} +1 -0
  12. data/app/assets/stylesheets/alchemy/{icon-font.css.scss → icon-font.scss} +0 -0
  13. data/app/assets/stylesheets/alchemy/{menubar.css.scss → menubar.scss} +0 -0
  14. data/app/assets/stylesheets/alchemy/{print.css.scss → print.scss} +0 -0
  15. data/app/assets/stylesheets/alchemy/selects.scss +0 -6
  16. data/app/controllers/alchemy/admin/contents_controller.rb +3 -4
  17. data/app/controllers/alchemy/admin/pictures_controller.rb +0 -2
  18. data/app/controllers/alchemy/api/contents_controller.rb +1 -1
  19. data/app/controllers/alchemy/api/elements_controller.rb +2 -2
  20. data/app/controllers/alchemy/api/pages_controller.rb +1 -1
  21. data/app/controllers/alchemy/elements_controller.rb +0 -6
  22. data/app/controllers/alchemy/pages_controller.rb +17 -13
  23. data/app/controllers/alchemy/pictures_controller.rb +1 -0
  24. data/app/helpers/alchemy/admin/navigation_helper.rb +1 -1
  25. data/app/models/alchemy/element.rb +41 -17
  26. data/app/models/alchemy/page/page_naming.rb +16 -29
  27. data/bin/alchemy +1 -1
  28. data/config/routes.rb +1 -2
  29. data/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -17
  30. data/lib/alchemy/capistrano.rb +3 -4
  31. data/lib/alchemy/controller_actions.rb +2 -1
  32. data/lib/alchemy/engine.rb +1 -0
  33. data/lib/alchemy/errors.rb +7 -0
  34. data/lib/alchemy/essence.rb +4 -4
  35. data/lib/alchemy/permissions.rb +1 -1
  36. data/lib/alchemy/shell.rb +26 -11
  37. data/lib/alchemy/test_support/controller_requests.rb +48 -12
  38. data/lib/alchemy/upgrader.rb +1 -0
  39. data/lib/alchemy/upgrader/three_point_one.rb +0 -1
  40. data/lib/alchemy/upgrader/three_point_two.rb +39 -0
  41. data/lib/alchemy/version.rb +1 -1
  42. data/lib/rails/templates/alchemy.rb +2 -2
  43. data/lib/tasks/alchemy/install.rake +2 -1
  44. data/spec/controllers/admin/attachments_controller_spec.rb +14 -14
  45. data/spec/controllers/admin/clipboard_controller_spec.rb +5 -5
  46. data/spec/controllers/admin/contents_controller_spec.rb +8 -14
  47. data/spec/controllers/admin/dashboard_controller_spec.rb +12 -12
  48. data/spec/controllers/admin/elements_controller_spec.rb +30 -31
  49. data/spec/controllers/admin/essence_files_controller_spec.rb +6 -6
  50. data/spec/controllers/admin/essence_pictures_controller_spec.rb +17 -17
  51. data/spec/controllers/admin/languages_controller_spec.rb +3 -3
  52. data/spec/controllers/admin/layoutpages_controller_spec.rb +3 -3
  53. data/spec/controllers/admin/pages_controller_spec.rb +48 -48
  54. data/spec/controllers/admin/pictures_controller_spec.rb +19 -19
  55. data/spec/controllers/admin/resources_controller_spec.rb +2 -2
  56. data/spec/controllers/admin/trash_controller_spec.rb +5 -5
  57. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +5 -5
  58. data/spec/controllers/alchemy/api/contents_controller_spec.rb +46 -11
  59. data/spec/controllers/alchemy/api/elements_controller_spec.rb +42 -14
  60. data/spec/controllers/alchemy/api/pages_controller_spec.rb +26 -16
  61. data/spec/controllers/attachments_controller_spec.rb +7 -7
  62. data/spec/controllers/elements_controller_spec.rb +16 -19
  63. data/spec/controllers/messages_controller_spec.rb +15 -15
  64. data/spec/controllers/pages_controller_spec.rb +16 -25
  65. data/spec/controllers/pictures_controller_spec.rb +75 -49
  66. data/spec/dummy/Rakefile +1 -1
  67. data/spec/dummy/app/assets/stylesheets/application.css +5 -3
  68. data/spec/dummy/config/application.rb +11 -1
  69. data/spec/dummy/config/boot.rb +1 -1
  70. data/spec/dummy/config/environment.rb +1 -1
  71. data/spec/dummy/config/environments/development.rb +14 -2
  72. data/spec/dummy/config/environments/production.rb +18 -21
  73. data/spec/dummy/config/environments/test.rb +9 -4
  74. data/spec/dummy/config/initializers/assets.rb +11 -0
  75. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  76. data/spec/dummy/config/initializers/mime_types.rb +0 -1
  77. data/spec/dummy/config/initializers/session_store.rb +1 -1
  78. data/spec/dummy/config/secrets.yml +22 -0
  79. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +380 -0
  80. data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
  81. data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
  82. data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
  83. data/spec/dummy/db/migrate/20150122213511_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
  84. 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
  85. 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
  86. 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
  87. data/spec/dummy/db/schema.rb +27 -31
  88. data/spec/dummy/public/404.html +20 -11
  89. data/spec/dummy/public/422.html +20 -11
  90. data/spec/dummy/public/500.html +19 -10
  91. data/spec/features/admin/page_creation_feature_spec.rb +2 -2
  92. data/spec/libraries/resource_spec.rb +1 -1
  93. data/spec/libraries/shell_spec.rb +2 -0
  94. data/spec/models/page_spec.rb +1 -13
  95. data/spec/spec_helper.rb +6 -4
  96. data/spec/support/rspec-activemodel-mocks_patch.rb +8 -0
  97. metadata +63 -56
  98. data/app/controllers/alchemy/contents_controller.rb +0 -18
  99. data/spec/controllers/contents_controller_spec.rb +0 -22
  100. data/spec/dummy/app/models/dummy_model.rb +0 -3
  101. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -1
  102. data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +0 -1
  103. data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +0 -1
  104. data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +0 -1
  105. data/spec/dummy/db/migrate/20140107192720_add_missing_unique_indices_to_tags_and_taggings.rb +0 -1
  106. data/spec/dummy/db/migrate/20140701160159_add_taggings_counter_cache_to_tags.rb +0 -1
  107. data/spec/dummy/db/migrate/20140701160225_add_missing_taggable_index.rb +0 -1
  108. data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +0 -7
  109. data/spec/dummy/spec/javascripts +0 -1
  110. 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
- get :index
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
- get :index, filter: 'recent'
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
- get :index, tagged_with: "red"
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
- get :index, {element_id: 1}
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
- xhr :get, :index, {element_id: 1}
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
- get :index
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 { get :new, params }
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 { post :create, params }
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
- get :edit_multiple
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
- get :edit_multiple
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 { put :update, picture: {name: ''} }
180
+ subject { alchemy_put :update, {id: 1, picture: {name: ''}} }
181
181
 
182
- let(:picture) { mock_model('Picture', name: 'Cute kitten') }
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
- post :update_multiple
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 { delete :delete_multiple, picture_ids: picture_ids }
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) { mock_model('Picture', name: 'Cute kitten') }
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
- delete :destroy
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
- delete :destroy
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
- delete :destroy
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
- xhr :post, :flush
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
- get :index, :page_id => alchemy_page.id
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
- get :index, :page_id => alchemy_page.id
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
- get :index, page_id: alchemy_page.id
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
- get :index, page_id: page.id
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
- xhr :post, :clear, page_id: alchemy_page.id
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
- post :create, tag: {name: ''}
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
- post :create, tag: {name: 'Foo'}
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
- get :edit, id: tag.id
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
- put :update, id: tag.id, tag: {name: 'Foo'}
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
- put :update, id: tag.id, tag: {merge_to: another_tag.id}
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
- get :index, format: :json
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).to_not eq('{"contents":[]}')
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
- get :index, element_id: element.id, format: :json
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).to_not eq('{"contents":[]}')
26
- expect(response.body).to_not match(/element_id\"\:#{other_element.id}/)
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 "responds to json" do
42
- get :show, id: content.id, format: :json
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
- get :show, id: content.id, format: :json
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
- get :show, element_id: element.id, name: content.name, format: :json
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 match(/element_id\"\:#{element.id}/)
68
- expect(response.body).to match(/name\"\:\"#{content.name}\"/)
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
- get :index, format: :json
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 element" do
21
- get :index, page_id: other_page.id, format: :json
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 match(/page_id\"\:#{other_page.id}/)
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
- get :index, named: 'news', format: :json
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 match(/name\"\:\"#{other_element.name}\"/)
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 "responds to json" do
53
- get :show, id: element.id, format: :json
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
- get :show, id: element.id, format: :json
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