Skip to content

Commit 7ab09c3

Browse files
Dishwasharichmolj
authored andcommitted
Test required filters through sideload work (#89)
Discovered that sideloaded filters have a string key whereas regular filters have a symbolized key. Changed query#parse_filter to make this consistent and added required filter test for sideloaded resources.
1 parent 7b086b8 commit 7ab09c3

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

lib/jsonapi_compliable/query.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ def parse_filter(hash)
209209
key = key.to_sym
210210

211211
if association?(key)
212-
hash[key][:filter].merge!(value)
212+
k, v = Hash(value).to_a.first
213+
hash[key][:filter][k.to_sym] = v
213214
else
214215
hash[resource.type][:filter][key] = value
215216
end

spec/sideloading_spec.rb

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,4 +278,53 @@ def json
278278
expect(author[:books][0].instance_variable_get(:@the_genre)).to eq(genre)
279279
end
280280
end
281+
282+
283+
context 'when sideload has required filter' do
284+
before do
285+
a = author
286+
book_resource.class_eval do
287+
allow_filter :required, required: true do |scope, value|
288+
scope.where(author_id: a.id)
289+
end
290+
end
291+
end
292+
293+
context 'and no required filters are provided' do
294+
before do
295+
params[:include] = 'books'
296+
end
297+
298+
it 'raises an error' do
299+
expect {
300+
scope.resolve
301+
}.to raise_error(JsonapiCompliable::Errors::RequiredFilter, 'The required filter "required" was not provided')
302+
end
303+
304+
end
305+
306+
context 'and sideloaded filter is provided with symbolized keys' do
307+
before do
308+
params[:include] = 'books'
309+
params[:filter] = { books: {required: true} }
310+
end
311+
312+
it 'should return results' do
313+
author = scope.resolve.first
314+
expect(author[:books]).to eq([book1, book2])
315+
end
316+
end
317+
318+
context 'and sideloaded filter is provided with stringified keys' do
319+
before do
320+
params[:include] = 'books'
321+
params[:filter] = { 'books' => {'required' => true} }
322+
end
323+
324+
it 'should return results' do
325+
author = scope.resolve.first
326+
expect(author[:books]).to eq([book1, book2])
327+
end
328+
end
329+
end
281330
end

0 commit comments

Comments
 (0)