Skip to content

Commit 247a7ac

Browse files
committed
Merge pull request #232 from cerebris/extend_tests
Extend tests
2 parents 465d29b + 84b80dc commit 247a7ac

6 files changed

Lines changed: 250 additions & 19 deletions

File tree

lib/jsonapi/operation.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class FindOperation < Operation
1818
def initialize(resource_klass, options = {})
1919
@filters = options[:filters]
2020
@include_directives = options[:include_directives]
21-
@sort_criteria = options[:sort_criteria]
21+
@sort_criteria = options.fetch(:sort_criteria, [])
2222
@paginator = options[:paginator]
2323
super(resource_klass, false)
2424
end
@@ -42,7 +42,7 @@ class ShowOperation < Operation
4242

4343
def initialize(resource_klass, options = {})
4444
@id = options.fetch(:id)
45-
@include_directives = options.fetch(:include_directives)
45+
@include_directives = options[:include_directives]
4646
@transactional = false
4747
super(resource_klass, options)
4848
end
@@ -113,9 +113,9 @@ def initialize(resource_klass, options = {})
113113
@source_klass = options.fetch(:source_klass)
114114
@source_id = options.fetch(:source_id)
115115
@association_type = options.fetch(:association_type)
116-
@filters = options.fetch(:filters)
117-
@sort_criteria = options.fetch(:sort_criteria)
118-
@paginator = options.fetch(:paginator)
116+
@filters = options[:filters]
117+
@sort_criteria = options[:sort_criteria]
118+
@paginator = options[:paginator]
119119
@transactional = false
120120
super(resource_klass, options)
121121
end

lib/jsonapi/resource.rb

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -332,18 +332,22 @@ def apply_filter(records, filter, value)
332332

333333
def apply_filters(records, filters)
334334
required_includes = []
335-
filters.each do |filter, value|
336-
if _associations.include?(filter)
337-
if _associations[filter].is_a?(JSONAPI::Association::HasMany)
338-
required_includes.push(filter)
339-
records = apply_filter(records, "#{filter}.#{_associations[filter].primary_key}", value)
335+
336+
if filters
337+
filters.each do |filter, value|
338+
if _associations.include?(filter)
339+
if _associations[filter].is_a?(JSONAPI::Association::HasMany)
340+
required_includes.push(filter)
341+
records = apply_filter(records, "#{filter}.#{_associations[filter].primary_key}", value)
342+
else
343+
records = apply_filter(records, "#{_associations[filter].foreign_key}", value)
344+
end
340345
else
341-
records = apply_filter(records, "#{_associations[filter].foreign_key}", value)
346+
records = apply_filter(records, filter, value)
342347
end
343-
else
344-
records = apply_filter(records, filter, value)
345348
end
346349
end
350+
347351
if required_includes.any?
348352
records.includes(required_includes)
349353
elsif records.respond_to? :to_ary
@@ -520,6 +524,8 @@ def module_path
520524
end
521525

522526
def construct_order_options(sort_params)
527+
return {} unless sort_params
528+
523529
sort_params.each_with_object({}) { |sort, order_hash|
524530
field = sort[:field] == 'id' ? _primary_key : sort[:field]
525531
order_hash[field] = sort[:direction]

lib/jsonapi/response_document.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def initialize(operation_results, options = {})
44
@operation_results = operation_results
55
@options = options
66

7-
@key_formatter = @options.fetch(:key_formatter)
7+
@key_formatter = @options.fetch(:key_formatter, JSONAPI.configuration.key_formatter)
88
end
99

1010
def contents
@@ -29,12 +29,12 @@ def status
2929
def serializer
3030
@serializer ||= JSONAPI::ResourceSerializer.new(
3131
@options.fetch(:primary_resource_klass),
32-
include: @options.fetch(:include),
33-
include_directives: @options.fetch(:include_directives),
34-
fields: @options.fetch(:fields),
35-
base_url: @options.fetch(:base_url),
32+
include: @options.fetch(:include, []),
33+
include_directives: @options[:include_directives],
34+
fields: @options[:fields],
35+
base_url: @options.fetch(:base_url, ''),
3636
key_formatter: @key_formatter,
37-
route_formatter: @options.fetch(:route_formatter)
37+
route_formatter: @options.fetch(:route_formatter, JSONAPI.configuration.route_formatter)
3838
)
3939
end
4040

test/unit/operation/operations_processor_test.rb

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,156 @@ def test_rollback_from_error
351351
assert_equal(:no_content, operation_results.results[1].code)
352352
assert_equal(404, operation_results.results[2].code)
353353
end
354+
355+
def test_show_operation
356+
op = JSONAPI::OperationsProcessor.new
357+
358+
operations = [
359+
JSONAPI::ShowOperation.new(PlanetResource, {id: '1'})
360+
]
361+
362+
request = JSONAPI::Request.new
363+
request.operations = operations
364+
365+
operation_results = op.process(request)
366+
367+
assert_kind_of(JSONAPI::OperationResults, operation_results)
368+
assert_equal(operation_results.results.size, 1)
369+
refute operation_results.has_errors?
370+
end
371+
372+
def test_show_operation_error
373+
op = JSONAPI::OperationsProcessor.new
374+
375+
operations = [
376+
JSONAPI::ShowOperation.new(PlanetResource, {id: '145'})
377+
]
378+
379+
request = JSONAPI::Request.new
380+
request.operations = operations
381+
382+
operation_results = op.process(request)
383+
384+
assert_kind_of(JSONAPI::OperationResults, operation_results)
385+
assert_equal(operation_results.results.size, 1)
386+
assert operation_results.has_errors?
387+
end
388+
389+
def test_show_association_operation
390+
op = JSONAPI::OperationsProcessor.new
391+
392+
operations = [
393+
JSONAPI::ShowAssociationOperation.new(PlanetResource, {parent_key: '1', association_type: :planet_type})
394+
]
395+
396+
request = JSONAPI::Request.new
397+
request.operations = operations
398+
399+
operation_results = op.process(request)
400+
401+
assert_kind_of(JSONAPI::OperationResults, operation_results)
402+
assert_equal(operation_results.results.size, 1)
403+
refute operation_results.has_errors?
404+
end
405+
406+
def test_show_association_operation_error
407+
op = JSONAPI::OperationsProcessor.new
408+
409+
operations = [
410+
JSONAPI::ShowAssociationOperation.new(PlanetResource, {parent_key: '145', association_type: :planet_type})
411+
]
412+
413+
request = JSONAPI::Request.new
414+
request.operations = operations
415+
416+
operation_results = op.process(request)
417+
418+
assert_kind_of(JSONAPI::OperationResults, operation_results)
419+
assert_equal(operation_results.results.size, 1)
420+
assert operation_results.has_errors?
421+
end
422+
423+
def test_show_related_resource_operation
424+
op = JSONAPI::OperationsProcessor.new
425+
426+
operations = [
427+
JSONAPI::ShowRelatedResourceOperation.new(PlanetResource,
428+
{
429+
source_klass: PlanetResource,
430+
source_id: '1',
431+
association_type: :planet_type})
432+
]
433+
434+
request = JSONAPI::Request.new
435+
request.operations = operations
436+
437+
operation_results = op.process(request)
438+
439+
assert_kind_of(JSONAPI::OperationResults, operation_results)
440+
assert_equal(operation_results.results.size, 1)
441+
refute operation_results.has_errors?
442+
end
443+
444+
def test_show_related_resource_operation_error
445+
op = JSONAPI::OperationsProcessor.new
446+
447+
operations = [
448+
JSONAPI::ShowRelatedResourceOperation.new(PlanetResource,
449+
{
450+
source_klass: PlanetResource,
451+
source_id: '145',
452+
association_type: :planet_type})
453+
]
454+
455+
request = JSONAPI::Request.new
456+
request.operations = operations
457+
458+
operation_results = op.process(request)
459+
460+
assert_kind_of(JSONAPI::OperationResults, operation_results)
461+
assert_equal(operation_results.results.size, 1)
462+
assert operation_results.has_errors?
463+
end
464+
465+
def test_show_related_resources_operation
466+
op = JSONAPI::OperationsProcessor.new
467+
468+
operations = [
469+
JSONAPI::ShowRelatedResourcesOperation.new(PlanetResource,
470+
{
471+
source_klass: PlanetResource,
472+
source_id: '1',
473+
association_type: :moons})
474+
]
475+
476+
request = JSONAPI::Request.new
477+
request.operations = operations
478+
479+
operation_results = op.process(request)
480+
481+
assert_kind_of(JSONAPI::OperationResults, operation_results)
482+
assert_equal(operation_results.results.size, 1)
483+
refute operation_results.has_errors?
484+
end
485+
486+
def test_show_related_resources_operation_error
487+
op = JSONAPI::OperationsProcessor.new
488+
489+
operations = [
490+
JSONAPI::ShowRelatedResourcesOperation.new(PlanetResource,
491+
{
492+
source_klass: PlanetResource,
493+
source_id: '145',
494+
association_type: :moons})
495+
]
496+
497+
request = JSONAPI::Request.new
498+
request.operations = operations
499+
500+
operation_results = op.process(request)
501+
502+
assert_kind_of(JSONAPI::OperationResults, operation_results)
503+
assert_equal(operation_results.results.size, 1)
504+
assert operation_results.has_errors?
505+
end
354506
end

test/unit/resource/resource_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,9 @@ def test_has_many_association_filters
144144
# define apply_filters method on post resource to not respect filters
145145
PostResource.instance_eval do
146146
def apply_filters(records, filters)
147+
# :nocov:
147148
records
149+
# :nocov:
148150
end
149151
end
150152

@@ -154,7 +156,9 @@ def apply_filters(records, filters)
154156
# reset method to original implementation
155157
PostResource.instance_eval do
156158
def apply_filters(records, filters)
159+
# :nocov:
157160
super
161+
# :nocov:
158162
end
159163
end
160164
end
@@ -167,7 +171,9 @@ def test_has_many_association_sorts
167171
# define apply_filters method on post resource to not respect filters
168172
PostResource.instance_eval do
169173
def apply_sort(records, criteria)
174+
# :nocov:
170175
records
176+
# :nocov:
171177
end
172178
end
173179

@@ -177,7 +183,9 @@ def apply_sort(records, criteria)
177183
# reset method to original implementation
178184
PostResource.instance_eval do
179185
def apply_sort(records, criteria)
186+
# :nocov:
180187
super
188+
# :nocov:
181189
end
182190
end
183191
end
@@ -190,7 +198,9 @@ def test_has_many_association_pagination
190198
# define apply_filters method on post resource to not respect filters
191199
PostResource.instance_eval do
192200
def apply_pagination(records, criteria, order_options)
201+
# :nocov:
193202
records
203+
# :nocov:
194204
end
195205
end
196206

@@ -211,7 +221,9 @@ def apply(relation, order_options)
211221
# reset method to original implementation
212222
PostResource.instance_eval do
213223
def apply_pagination(records, criteria, order_options)
224+
# :nocov:
214225
super
226+
# :nocov:
215227
end
216228
end
217229
end
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
require File.expand_path('../../../test_helper', __FILE__)
2+
require 'jsonapi-resources'
3+
require 'json'
4+
5+
class ResponseDocumentTest < ActionDispatch::IntegrationTest
6+
def setup
7+
JSONAPI.configuration.json_key_format = :dasherized_key
8+
JSONAPI.configuration.route_format = :dasherized_route
9+
end
10+
11+
def create_response_document(operation_results, resource_klass)
12+
JSONAPI::ResponseDocument.new(
13+
operation_results,
14+
{
15+
primary_resource_klass: resource_klass
16+
}
17+
)
18+
end
19+
20+
def test_response_document
21+
operations = [
22+
JSONAPI::CreateResourceOperation.new(PlanetResource, data: {attributes: {'name' => 'Earth 2.0'}}),
23+
JSONAPI::CreateResourceOperation.new(PlanetResource, data: {attributes: {'name' => 'Vulcan'}})
24+
]
25+
26+
request = JSONAPI::Request.new
27+
request.operations = operations
28+
29+
op = BasicOperationsProcessor.new()
30+
operation_results = op.process(request)
31+
32+
response_doc = create_response_document(operation_results, PlanetResource)
33+
34+
assert_equal :created, response_doc.status
35+
contents = response_doc.contents
36+
assert contents.is_a?(Hash)
37+
assert contents[:data].is_a?(Array)
38+
assert_equal 2, contents[:data].size
39+
end
40+
41+
def test_response_document_multiple_find
42+
operations = [
43+
JSONAPI::FindOperation.new(PostResource, filters: {id: '1'}),
44+
JSONAPI::FindOperation.new(PostResource, filters: {id: '2'})
45+
]
46+
47+
request = JSONAPI::Request.new
48+
request.operations = operations
49+
50+
op = ActiveRecordOperationsProcessor.new()
51+
operation_results = op.process(request)
52+
53+
response_doc = create_response_document(operation_results, PostResource)
54+
55+
assert_equal :ok, response_doc.status
56+
contents = response_doc.contents
57+
assert contents.is_a?(Hash)
58+
assert contents[:data].is_a?(Array)
59+
assert_equal 2, contents[:data].size
60+
end
61+
end

0 commit comments

Comments
 (0)