Skip to content

Commit 78f4651

Browse files
authored
Merge pull request #61 from wadetandy/master
Provide helpful feedback for invalid includes
2 parents 306d557 + fda4c94 commit 78f4651

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

lib/generators/jsonapi/templates/destroy_request_spec.rb.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ require 'rails_helper'
22

33
RSpec.describe "<%= type %>#destroy", type: :request do
44
context 'basic destroy' do
5-
let!(:<%= file_name %>) { FactoryGirl.create(:<%= file_name %>) }
5+
let!(:<%= file_name %>) { create(:<%= file_name %>) }
66

77
it 'updates the resource' do
88
expect {

lib/jsonapi_compliable/errors.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ def message
1313
end
1414
end
1515

16+
class InvalidInclude < StandardError
17+
def initialize(relationship, parent_resource)
18+
@relationship = relationship
19+
@parent_resource = parent_resource
20+
end
21+
22+
def message
23+
"The requested included relationship \"#{@relationship}\" is not supported on resource \"#{@parent_resource}\""
24+
end
25+
end
26+
1627
class StatNotFound < StandardError
1728
def initialize(attribute, calculation)
1829
@attribute = attribute

lib/jsonapi_compliable/scope.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ def sideload(results, includes)
8181

8282
includes.each_pair do |name, nested|
8383
sideload = @resource.sideload(name)
84+
85+
unless sideload
86+
raise JsonapiCompliable::Errors::InvalidInclude.new(name, @resource.type)
87+
end
88+
8489
namespace = Util::Sideload.namespace(@namespace, sideload.name)
8590
sideload.resolve(results, @query, namespace)
8691
end

spec/scope_spec.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@
3333
allow(resource).to receive(:resolve).with(objekt) { results }
3434
end
3535

36-
context 'when the requested sideload is allowed' do
36+
context 'when the requested sideload exists on the resource' do
3737
before do
38-
allow(resource).to receive(:allowed_sideloads) { { books: {} } }
3938
allow(resource).to receive(:sideload).with(:books) { sideload }
4039
end
4140

@@ -58,6 +57,18 @@
5857
end
5958
end
6059
end
60+
61+
context 'when the requested sideload does not exist' do
62+
before do
63+
allow(resource).to receive(:sideload).with(:books) { nil }
64+
end
65+
66+
it 'raises a helpful error' do
67+
expect do
68+
instance.resolve
69+
end.to raise_error(JsonapiCompliable::Errors::InvalidInclude, 'The requested included relationship "books" is not supported on resource "authors"')
70+
end
71+
end
6172
end
6273

6374
context 'when 0 results requested' do

0 commit comments

Comments
 (0)