jat 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/jat/attribute.rb +36 -4
- data/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads.rb +7 -3
- data/lib/jat/plugins/_activerecord_preloads/lib/preloader.rb +7 -13
- data/lib/jat/plugins/_lower_camel_case/_lower_camel_case.rb +32 -0
- data/lib/jat/plugins/_preloads/_preloads.rb +8 -2
- data/lib/jat/plugins/cache/cache.rb +9 -5
- data/lib/jat/plugins/json_api/json_api.rb +145 -105
- data/lib/jat/plugins/json_api/lib/fields_param_parser.rb +40 -0
- data/lib/jat/plugins/json_api/lib/include_param_parser.rb +84 -0
- data/lib/jat/plugins/json_api/lib/map.rb +92 -27
- data/lib/jat/plugins/json_api/lib/params/fields/validate.rb +8 -5
- data/lib/jat/plugins/json_api/lib/response.rb +84 -196
- data/lib/jat/plugins/json_api/lib/response_piece.rb +166 -0
- data/lib/jat/plugins/json_api_activerecord/json_api_activerecord.rb +31 -0
- data/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads.rb +16 -24
- data/lib/jat/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +30 -0
- data/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache.rb +54 -0
- data/lib/jat/plugins/json_api_validate_params/json_api_validate_params.rb +57 -0
- data/lib/jat/plugins/json_api_validate_params/lib/params_error.rb +6 -0
- data/lib/jat/plugins/json_api_validate_params/lib/validate_fields_param.rb +59 -0
- data/lib/jat/plugins/json_api_validate_params/lib/validate_include_param.rb +33 -0
- data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +97 -0
- data/lib/jat/plugins/simple_api/lib/map.rb +80 -10
- data/lib/jat/plugins/simple_api/lib/response.rb +78 -89
- data/lib/jat/plugins/simple_api/lib/response_piece.rb +84 -0
- data/lib/jat/plugins/simple_api/simple_api.rb +83 -24
- data/lib/jat/plugins/simple_api_activerecord/lib/preloads.rb +55 -0
- data/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord.rb +31 -0
- data/lib/jat/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +30 -0
- data/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache.rb +48 -0
- data/lib/jat/plugins/simple_api_validate_params/lib/fields_error.rb +6 -0
- data/lib/jat/plugins/simple_api_validate_params/lib/validate_fields_param.rb +45 -0
- data/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params.rb +45 -0
- data/lib/jat/plugins/to_str/to_str.rb +10 -4
- data/lib/jat/plugins.rb +3 -16
- data/lib/jat.rb +28 -30
- data/test/lib/jat/attribute_test.rb +15 -5
- data/test/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads_test.rb +34 -15
- data/test/lib/jat/plugins/_activerecord_preloads/lib/preloader_test.rb +10 -24
- data/test/lib/jat/plugins/_camel_lower/_camel_lower_test.rb +26 -0
- data/test/lib/jat/plugins/_preloads/lib/format_user_preloads_test.rb +1 -1
- data/test/lib/jat/plugins/_preloads/lib/preloads_with_path_test.rb +1 -1
- data/test/lib/jat/plugins/cache/cache_test.rb +11 -11
- data/test/lib/jat/plugins/json_api/json_api_test.rb +63 -47
- data/test/lib/jat/plugins/json_api/lib/{params/fields_test.rb → fields_param_parser_test.rb} +7 -6
- data/test/lib/jat/plugins/json_api/lib/{params/include_test.rb → include_param_parser_test.rb} +4 -4
- data/test/lib/jat/plugins/json_api/lib/map_test.rb +150 -79
- data/test/lib/jat/plugins/json_api/lib/response_test.rb +32 -32
- data/test/lib/jat/plugins/{_json_api_activerecord/_json_api_activerecord_test.rb → json_api_activerecord/json_api_activerecord_test.rb} +14 -5
- data/test/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads_test.rb +11 -10
- data/test/lib/jat/plugins/json_api_camel_lower/json_api_camel_lower_test.rb +79 -0
- data/test/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache_test.rb +107 -0
- data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +84 -0
- data/test/lib/jat/plugins/simple_api/lib/{params/parse_test.rb → fields_param_parser_test.rb} +10 -4
- data/test/lib/jat/plugins/simple_api/lib/map_test.rb +111 -34
- data/test/lib/jat/plugins/simple_api/lib/response_test.rb +80 -74
- data/test/lib/jat/plugins/simple_api/simple_api_test.rb +91 -25
- data/test/lib/jat/plugins/simple_api_activerecord/lib/preloads_test.rb +135 -0
- data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +38 -0
- data/test/lib/jat/plugins/simple_api_camel_lower/simple_api_camel_lower_test.rb +48 -0
- data/test/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache_test.rb +95 -0
- data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +89 -0
- data/test/lib/jat/plugins/to_str/to_str_test.rb +3 -3
- data/test/lib/jat_test.rb +47 -24
- data/test/lib/plugin_test.rb +3 -3
- data/test/test_helper.rb +0 -3
- data/test/test_plugin.rb +9 -12
- metadata +60 -71
- data/CHANGELOG.md +0 -7
- data/README.md +0 -21
- data/jat.gemspec +0 -37
- data/lib/jat/plugins/_json_api_activerecord/_json_api_activerecord.rb +0 -22
- data/lib/jat/plugins/camel_lower/camel_lower.rb +0 -18
- data/lib/jat/plugins/json_api/lib/construct_traversal_map.rb +0 -91
- data/lib/jat/plugins/json_api/lib/presenters/document_links_presenter.rb +0 -48
- data/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter.rb +0 -48
- data/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter.rb +0 -48
- data/lib/jat/plugins/json_api/lib/presenters/links_presenter.rb +0 -48
- data/lib/jat/plugins/json_api/lib/presenters/meta_presenter.rb +0 -48
- data/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter.rb +0 -53
- data/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter.rb +0 -53
- data/lib/jat/plugins/json_api/lib/traversal_map.rb +0 -34
- data/lib/jat/plugins/simple_api/lib/construct_traversal_map.rb +0 -45
- data/lib/jat/plugins/simple_api/lib/params/parse.rb +0 -68
- data/lib/jat/presenter.rb +0 -51
- data/test/lib/jat/plugins/camel_lower/camel_lower_test.rb +0 -78
- data/test/lib/jat/plugins/json_api/lib/construct_traversal_map_test.rb +0 -119
- data/test/lib/jat/plugins/json_api/lib/params/fields/parse_test.rb +0 -24
- data/test/lib/jat/plugins/json_api/lib/params/fields/validate_test.rb +0 -47
- data/test/lib/jat/plugins/json_api/lib/params/include/parse_test.rb +0 -46
- data/test/lib/jat/plugins/json_api/lib/params/include/validate_test.rb +0 -51
- data/test/lib/jat/plugins/json_api/lib/presenters/document_links_presenter_test.rb +0 -69
- data/test/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter_test.rb +0 -69
- data/test/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter_test.rb +0 -69
- data/test/lib/jat/plugins/json_api/lib/presenters/links_presenter_test.rb +0 -69
- data/test/lib/jat/plugins/json_api/lib/presenters/meta_presenter_test.rb +0 -69
- data/test/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter_test.rb +0 -75
- data/test/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter_test.rb +0 -75
- data/test/lib/jat/plugins/json_api/lib/traversal_map_test.rb +0 -58
- data/test/lib/jat/plugins/simple_api/lib/construct_traversal_map_test.rb +0 -100
- data/test/lib/jat/presenter_test.rb +0 -61
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Jat
|
4
|
-
module Presenters
|
5
|
-
class MetaPresenter
|
6
|
-
module InstanceMethods
|
7
|
-
# Presented object
|
8
|
-
attr_reader :object
|
9
|
-
|
10
|
-
# Presented context
|
11
|
-
attr_reader :context
|
12
|
-
|
13
|
-
def initialize(object, context)
|
14
|
-
@object = object
|
15
|
-
@context = context
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
attr_accessor :jat_class
|
21
|
-
|
22
|
-
def inspect
|
23
|
-
"#{jat_class.inspect}::Presenters::MetaPresenter"
|
24
|
-
end
|
25
|
-
|
26
|
-
def add_method(name, block)
|
27
|
-
# Warning-free method redefinition
|
28
|
-
remove_method(name) if method_defined?(name, false)
|
29
|
-
define_method(name, &block_without_args(block))
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def block_without_args(block)
|
35
|
-
case block.parameters.count
|
36
|
-
when 0 then block
|
37
|
-
when 1 then -> { instance_exec(object, &block) }
|
38
|
-
when 2 then -> { instance_exec(object, context, &block) }
|
39
|
-
else raise Error, "Invalid block arguments count"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
extend ClassMethods
|
45
|
-
include InstanceMethods
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Jat
|
4
|
-
module Presenters
|
5
|
-
class RelationshipLinksPresenter
|
6
|
-
module InstanceMethods
|
7
|
-
# Relationship parent object
|
8
|
-
attr_reader :parent_object
|
9
|
-
|
10
|
-
# Presented relationship
|
11
|
-
attr_reader :object
|
12
|
-
|
13
|
-
# Presented context
|
14
|
-
attr_reader :context
|
15
|
-
|
16
|
-
def initialize(parent_object, object, context)
|
17
|
-
@parent_object = parent_object
|
18
|
-
@object = object
|
19
|
-
@context = context
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module ClassMethods
|
24
|
-
attr_accessor :jat_class
|
25
|
-
|
26
|
-
def inspect
|
27
|
-
"#{jat_class.inspect}::Presenters::RelationshipLinksPresenter"
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_method(name, block)
|
31
|
-
# Warning-free method redefinition
|
32
|
-
remove_method(name) if method_defined?(name, false)
|
33
|
-
define_method(name, &block_without_args(block))
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def block_without_args(block)
|
39
|
-
case block.parameters.count
|
40
|
-
when 0 then block
|
41
|
-
when 1 then -> { instance_exec(parent_object, &block) }
|
42
|
-
when 2 then -> { instance_exec(parent_object, object, &block) }
|
43
|
-
when 3 then -> { instance_exec(parent_object, object, context, &block) }
|
44
|
-
else raise Error, "Invalid block arguments count"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
extend ClassMethods
|
50
|
-
include InstanceMethods
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Jat
|
4
|
-
module Presenters
|
5
|
-
class RelationshipMetaPresenter
|
6
|
-
module InstanceMethods
|
7
|
-
# Relationship parent object
|
8
|
-
attr_reader :parent_object
|
9
|
-
|
10
|
-
# Presented relationship
|
11
|
-
attr_reader :object
|
12
|
-
|
13
|
-
# Presented context
|
14
|
-
attr_reader :context
|
15
|
-
|
16
|
-
def initialize(parent_object, object, context)
|
17
|
-
@parent_object = parent_object
|
18
|
-
@object = object
|
19
|
-
@context = context
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module ClassMethods
|
24
|
-
attr_accessor :jat_class
|
25
|
-
|
26
|
-
def inspect
|
27
|
-
"#{jat_class.inspect}::Presenters::RelationshipMetaPresenter"
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_method(name, block)
|
31
|
-
# Warning-free method redefinition
|
32
|
-
remove_method(name) if method_defined?(name, false)
|
33
|
-
define_method(name, &block_without_args(block))
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def block_without_args(block)
|
39
|
-
case block.parameters.count
|
40
|
-
when 0 then block
|
41
|
-
when 1 then -> { instance_exec(parent_object, &block) }
|
42
|
-
when 2 then -> { instance_exec(parent_object, object, &block) }
|
43
|
-
when 3 then -> { instance_exec(parent_object, object, context, &block) }
|
44
|
-
else raise Error, "Invalid block arguments count"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
extend ClassMethods
|
50
|
-
include InstanceMethods
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "./construct_traversal_map"
|
4
|
-
require_relative "./map"
|
5
|
-
|
6
|
-
class Jat
|
7
|
-
module Plugins
|
8
|
-
module JsonApi
|
9
|
-
class TraversalMap
|
10
|
-
module InstanceMethods
|
11
|
-
attr_reader :jat
|
12
|
-
|
13
|
-
def initialize(jat)
|
14
|
-
@jat = jat
|
15
|
-
end
|
16
|
-
|
17
|
-
def full
|
18
|
-
@full ||= ConstructTraversalMap.new(jat.class, :all).to_h
|
19
|
-
end
|
20
|
-
|
21
|
-
def exposed
|
22
|
-
@exposed ||= ConstructTraversalMap.new(jat.class, :exposed).to_h
|
23
|
-
end
|
24
|
-
|
25
|
-
def current
|
26
|
-
@current ||= Map.call(jat)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
include InstanceMethods
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Combines all serializer and its relations exposed fields into one hash.
|
4
|
-
class Jat
|
5
|
-
module Plugins
|
6
|
-
module SimpleApi
|
7
|
-
class ConstructTraversalMap
|
8
|
-
attr_reader :jat_class, :exposed, :manually_exposed
|
9
|
-
|
10
|
-
def initialize(jat_class, exposed, manually_exposed: nil)
|
11
|
-
@jat_class = jat_class
|
12
|
-
@exposed = exposed.to_sym
|
13
|
-
@manually_exposed = manually_exposed || {}
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_h
|
17
|
-
jat_class.attributes.each_with_object({}) do |(name, attribute), result|
|
18
|
-
next unless expose?(attribute)
|
19
|
-
|
20
|
-
result[name] =
|
21
|
-
if attribute.relation?
|
22
|
-
self.class.new(attribute.serializer.call, exposed, manually_exposed: manually_exposed[name]).to_h
|
23
|
-
else
|
24
|
-
{}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def expose?(attribute)
|
32
|
-
case exposed
|
33
|
-
when :all then true
|
34
|
-
when :none then manually_exposed?(attribute)
|
35
|
-
else attribute.exposed? || manually_exposed?(attribute)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def manually_exposed?(attribute)
|
40
|
-
manually_exposed.include?(attribute.name)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Jat
|
4
|
-
module Plugins
|
5
|
-
module SimpleApi
|
6
|
-
module Params
|
7
|
-
class Parse
|
8
|
-
module InstanceMethods
|
9
|
-
COMMA = ","
|
10
|
-
OPEN_BRACKET = "("
|
11
|
-
CLOSE_BRACKET = ")"
|
12
|
-
|
13
|
-
def initialize(fields)
|
14
|
-
@fields = fields
|
15
|
-
@map = []
|
16
|
-
@res = {}
|
17
|
-
end
|
18
|
-
|
19
|
-
# user => { user: {} }
|
20
|
-
# user(id) => { user: { id: true } }
|
21
|
-
# user(id, name) => { user: { id: true, name: true } }
|
22
|
-
# user, comments => { user: {}, comments: {} }
|
23
|
-
# user(comments(text)) => { user: {}, comments: {} }
|
24
|
-
def parse
|
25
|
-
return {} unless fields
|
26
|
-
|
27
|
-
current_attr = nil
|
28
|
-
|
29
|
-
fields.each_char do |char|
|
30
|
-
case char
|
31
|
-
when COMMA
|
32
|
-
add_attribute(current_attr)
|
33
|
-
current_attr = nil
|
34
|
-
when CLOSE_BRACKET
|
35
|
-
add_attribute(current_attr)
|
36
|
-
map.pop
|
37
|
-
current_attr = nil
|
38
|
-
when OPEN_BRACKET
|
39
|
-
add_attribute(current_attr)
|
40
|
-
map << current_attr.to_sym if current_attr
|
41
|
-
current_attr = nil
|
42
|
-
else
|
43
|
-
current_attr = current_attr ? current_attr.insert(-1, char) : char
|
44
|
-
end
|
45
|
-
end
|
46
|
-
add_attribute(current_attr)
|
47
|
-
|
48
|
-
res
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
attr_reader :fields, :map, :res
|
54
|
-
|
55
|
-
def add_attribute(current_attr)
|
56
|
-
return unless current_attr
|
57
|
-
|
58
|
-
current_resource = map.empty? ? res : res.dig(*map)
|
59
|
-
current_resource[current_attr.to_sym] = {}
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
include InstanceMethods
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
data/lib/jat/presenter.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Jat
|
4
|
-
# Core class that encapsulates attributes presentation logic
|
5
|
-
class Presenter
|
6
|
-
module InstanceMethods
|
7
|
-
# Presented object
|
8
|
-
attr_reader :object
|
9
|
-
|
10
|
-
# Presented context
|
11
|
-
attr_reader :context
|
12
|
-
|
13
|
-
def initialize(object, context)
|
14
|
-
@object = object
|
15
|
-
@context = context
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
# Returns the Jat class that this presenter class is namespaced under.
|
21
|
-
attr_accessor :jat_class
|
22
|
-
|
23
|
-
# Since Presenter is anonymously subclassed when Jat is subclassed,
|
24
|
-
# and then assigned to a constant of the Jat subclass, make inspect
|
25
|
-
# reflect the likely name for the class.
|
26
|
-
def inspect
|
27
|
-
"#{jat_class.inspect}::Presenter"
|
28
|
-
end
|
29
|
-
|
30
|
-
def add_method(name, block)
|
31
|
-
# Warning-free method redefinition
|
32
|
-
remove_method(name) if method_defined?(name, false)
|
33
|
-
define_method(name, &block_without_args(block))
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def block_without_args(block)
|
39
|
-
case block.parameters.count
|
40
|
-
when 0 then block
|
41
|
-
when 1 then -> { instance_exec(object, &block) }
|
42
|
-
when 2 then -> { instance_exec(object, context, &block) }
|
43
|
-
else raise Error, "Invalid block arguments count"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
extend ClassMethods
|
49
|
-
include InstanceMethods
|
50
|
-
end
|
51
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
describe "Jat::Plugins::CamelLower" do
|
6
|
-
let(:jat_class) do
|
7
|
-
new_class = Class.new(Jat)
|
8
|
-
new_class.plugin(:camel_lower)
|
9
|
-
new_class
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "Attribute" do
|
13
|
-
describe "#name" do
|
14
|
-
it "returns name in camel_lower case" do
|
15
|
-
attribute = jat_class.attribute(:foo)
|
16
|
-
assert :foo, attribute.name
|
17
|
-
|
18
|
-
attribute = jat_class.attribute(:foo_bar)
|
19
|
-
assert :fooBar, attribute.name
|
20
|
-
|
21
|
-
attribute = jat_class.attribute(:foo_bar_bazz)
|
22
|
-
assert :fooBarBazz, attribute.name
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "Test responses with simple_api plugin" do
|
28
|
-
before { jat_class.plugin(:simple_api) }
|
29
|
-
|
30
|
-
it "returns attributes in camelLower case" do
|
31
|
-
jat_class.attribute(:foo_bar) { 1 }
|
32
|
-
|
33
|
-
response = jat_class.to_h(true)
|
34
|
-
assert_equal({fooBar: 1}, response)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "accepts fields in camelLower format" do
|
38
|
-
jat_class.attribute(:foo_bar, exposed: false) { 1 }
|
39
|
-
|
40
|
-
response = jat_class.to_h(true, params: {fields: "fooBar"})
|
41
|
-
assert_equal({fooBar: 1}, response)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "Test responses with json_api plugin" do
|
46
|
-
before do
|
47
|
-
jat_class.plugin(:json_api)
|
48
|
-
jat_class.type :foo
|
49
|
-
jat_class.attribute(:id) { object }
|
50
|
-
end
|
51
|
-
|
52
|
-
it "returns attributes in camelLower case" do
|
53
|
-
jat_class.attribute(:foo_bar) { 1 }
|
54
|
-
|
55
|
-
assert_equal({fooBar: 1}, jat_class.to_h(true).dig(:data, :attributes))
|
56
|
-
end
|
57
|
-
|
58
|
-
it "accepts `fields` in camelLower format" do
|
59
|
-
jat_class.attribute(:foo_bar, exposed: false) { 1 }
|
60
|
-
|
61
|
-
response = jat_class.to_h(true, params: {fields: {foo: "fooBar"}})
|
62
|
-
assert_equal({fooBar: 1}, response.dig(:data, :attributes))
|
63
|
-
end
|
64
|
-
|
65
|
-
it "accepts `include` in camelLower format" do
|
66
|
-
new_serializer = Class.new(Jat)
|
67
|
-
new_serializer.plugin(:json_api)
|
68
|
-
new_serializer.type :new
|
69
|
-
new_serializer.attribute(:id) { object }
|
70
|
-
|
71
|
-
jat_class.relationship(:foo_bar, serializer: new_serializer) { 1 }
|
72
|
-
|
73
|
-
response = jat_class.to_h(true, params: {include: "fooBar"})
|
74
|
-
response_relationships = response.dig(:data, :relationships).keys
|
75
|
-
assert_includes(response_relationships, :fooBar)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
describe "Jat::Plugins::JsonApi::ConstructTraversalMap" do
|
6
|
-
before { Jat::Plugins.load_plugin(:json_api) }
|
7
|
-
|
8
|
-
let(:described_class) { Jat::Plugins::JsonApi::ConstructTraversalMap }
|
9
|
-
let(:base_class) { Class.new(Jat) { plugin :json_api } }
|
10
|
-
|
11
|
-
let(:a) do
|
12
|
-
ser = Class.new(base_class)
|
13
|
-
ser.type :a
|
14
|
-
|
15
|
-
ser.attribute :a1
|
16
|
-
ser.attribute :a2
|
17
|
-
ser.attribute :a3, exposed: false
|
18
|
-
|
19
|
-
ser.relationship :b, serializer: b
|
20
|
-
ser.relationship :c, serializer: c
|
21
|
-
ser.relationship :d, serializer: d, exposed: true
|
22
|
-
ser
|
23
|
-
end
|
24
|
-
|
25
|
-
let(:b) do
|
26
|
-
ser = Class.new(base_class)
|
27
|
-
ser.type :b
|
28
|
-
ser.attribute :b1
|
29
|
-
ser.attribute :b2
|
30
|
-
ser.attribute :b3, exposed: false
|
31
|
-
ser
|
32
|
-
end
|
33
|
-
|
34
|
-
let(:c) do
|
35
|
-
ser = Class.new(base_class)
|
36
|
-
ser.type :c
|
37
|
-
ser.attribute :c1
|
38
|
-
ser.attribute :c2
|
39
|
-
ser.attribute :c3, exposed: false
|
40
|
-
ser
|
41
|
-
end
|
42
|
-
|
43
|
-
let(:d) do
|
44
|
-
ser = Class.new(base_class)
|
45
|
-
ser.type :d
|
46
|
-
ser.attribute :d1
|
47
|
-
ser.attribute :d2
|
48
|
-
ser.attribute :d3, exposed: false
|
49
|
-
ser
|
50
|
-
end
|
51
|
-
|
52
|
-
it "returns all attributes" do
|
53
|
-
result = described_class.new(a, :all).to_h
|
54
|
-
expected_result = {
|
55
|
-
a: {serializer: a, attributes: %i[a1 a2 a3], relationships: %i[b c d]},
|
56
|
-
b: {serializer: b, attributes: %i[b1 b2 b3], relationships: []},
|
57
|
-
c: {serializer: c, attributes: %i[c1 c2 c3], relationships: []},
|
58
|
-
d: {serializer: d, attributes: %i[d1 d2 d3], relationships: []}
|
59
|
-
}
|
60
|
-
|
61
|
-
assert_equal expected_result, result
|
62
|
-
end
|
63
|
-
|
64
|
-
it "returns exposed attributes" do
|
65
|
-
result = described_class.new(a, :exposed).to_h
|
66
|
-
expected_result = {
|
67
|
-
a: {serializer: a, attributes: %i[a1 a2], relationships: %i[d]},
|
68
|
-
d: {serializer: d, attributes: %i[d1 d2], relationships: []}
|
69
|
-
}
|
70
|
-
|
71
|
-
assert_equal expected_result, result
|
72
|
-
end
|
73
|
-
|
74
|
-
it "returns only manually exposed per-type attributes or exposed by default when no manual type provided" do
|
75
|
-
exposed = {
|
76
|
-
a: %i[a2 a3 c d],
|
77
|
-
c: %i[c2 c3],
|
78
|
-
d: %i[d2 d3]
|
79
|
-
}
|
80
|
-
result = described_class.new(a, :manual, manually_exposed: exposed).to_h
|
81
|
-
expected_result = {
|
82
|
-
a: {serializer: a, attributes: %i[a2 a3], relationships: %i[c d]},
|
83
|
-
c: {serializer: c, attributes: %i[c2 c3], relationships: []},
|
84
|
-
d: {serializer: d, attributes: %i[d2 d3], relationships: []}
|
85
|
-
}
|
86
|
-
|
87
|
-
assert_equal expected_result, result
|
88
|
-
end
|
89
|
-
|
90
|
-
it "returns manually exposed per-type attributes or exposed by default when no manual type provided" do
|
91
|
-
exposed = {
|
92
|
-
a: %i[a2 a3 b c],
|
93
|
-
c: %i[c2 c3]
|
94
|
-
}
|
95
|
-
result = described_class.new(a, :manual, manually_exposed: exposed).to_h
|
96
|
-
expected_result = {
|
97
|
-
a: {serializer: a, attributes: %i[a2 a3], relationships: %i[b c]},
|
98
|
-
b: {serializer: b, attributes: %i[b1 b2], relationships: []},
|
99
|
-
c: {serializer: c, attributes: %i[c2 c3], relationships: []}
|
100
|
-
}
|
101
|
-
|
102
|
-
assert_equal expected_result, result
|
103
|
-
end
|
104
|
-
|
105
|
-
it "returns combined auto-exposed and manualy exposed attributes" do
|
106
|
-
exposed = {
|
107
|
-
a: %i[c],
|
108
|
-
c: %i[c3]
|
109
|
-
}
|
110
|
-
result = described_class.new(a, :exposed, manually_exposed: exposed).to_h
|
111
|
-
expected_result = {
|
112
|
-
a: {serializer: a, attributes: %i[a1 a2], relationships: %i[c d]},
|
113
|
-
c: {serializer: c, attributes: %i[c1 c2 c3], relationships: []},
|
114
|
-
d: {serializer: d, attributes: %i[d1 d2], relationships: []}
|
115
|
-
}
|
116
|
-
|
117
|
-
assert_equal expected_result, result
|
118
|
-
end
|
119
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
describe "Jat::Plugins::JsonApi::Params::Fields::Parse" do
|
6
|
-
before { Jat::Plugins.load_plugin(:json_api) }
|
7
|
-
|
8
|
-
let(:described_class) { Jat::Plugins::JsonApi::Params::Fields::Parse }
|
9
|
-
|
10
|
-
it "returns empty hash when param not provided" do
|
11
|
-
result = described_class.call(nil)
|
12
|
-
assert_equal({}, result)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "returns hash with parsed keys" do
|
16
|
-
result = described_class.call(a: "a1,a2", b: "b1")
|
17
|
-
assert_equal({a: %i[a1 a2], b: %i[b1]}, result)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "symbolizes types" do
|
21
|
-
result = described_class.call("a" => "a1,a2", "b" => "b1")
|
22
|
-
assert_equal({a: %i[a1 a2], b: %i[b1]}, result)
|
23
|
-
end
|
24
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
describe "Jat::Plugins::JsonApi::Params::Fields::Validate" do
|
6
|
-
before { Jat::Plugins.load_plugin(:json_api) }
|
7
|
-
|
8
|
-
let(:described_class) { Jat::Plugins::JsonApi::Params::Fields::Validate }
|
9
|
-
let(:base_class) { Class.new(Jat) { plugin :json_api } }
|
10
|
-
let(:a_serializer) { Class.new(base_class) }
|
11
|
-
let(:b_serializer) { Class.new(base_class) }
|
12
|
-
|
13
|
-
before do
|
14
|
-
ser = a_serializer
|
15
|
-
ser.type :a
|
16
|
-
ser.attribute :a1
|
17
|
-
ser.relationship :a2, serializer: b_serializer
|
18
|
-
|
19
|
-
ser = b_serializer
|
20
|
-
ser.type :b
|
21
|
-
ser.attribute :b1
|
22
|
-
ser.relationship :b2, serializer: a_serializer
|
23
|
-
end
|
24
|
-
|
25
|
-
it "does not raises when serializer has all requested keys" do
|
26
|
-
assert described_class.call(a_serializer.allocate, a: %i[a1 a2], b: %i[b1 b2])
|
27
|
-
end
|
28
|
-
|
29
|
-
it "does not raises when requested only fields for nested serializer" do
|
30
|
-
assert described_class.call(a_serializer.allocate, b: %i[b1 b2])
|
31
|
-
end
|
32
|
-
|
33
|
-
it "raises error when some type can not be in response" do
|
34
|
-
error = assert_raises(Jat::Error) { described_class.call(a_serializer.allocate, a: %i[a1 a2], foo: %i[b1 b2]) }
|
35
|
-
assert_equal "#{a_serializer} and its children have no requested type `foo`", error.message
|
36
|
-
end
|
37
|
-
|
38
|
-
it "raises error when some key is not present in main serializer" do
|
39
|
-
error = assert_raises(Jat::Error) { described_class.call(a_serializer.allocate, a: %i[b1]) }
|
40
|
-
assert_equal "#{a_serializer} has no requested attribute or relationship `b1`", error.message
|
41
|
-
end
|
42
|
-
|
43
|
-
it "raises error when some key is not present in nested serializer" do
|
44
|
-
error = assert_raises(Jat::Error) { described_class.call(a_serializer.allocate, a: %i[a1], b: %i[a1]) }
|
45
|
-
assert_equal "#{b_serializer} has no requested attribute or relationship `a1`", error.message
|
46
|
-
end
|
47
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "test_helper"
|
4
|
-
|
5
|
-
describe "Jat::Plugins::JsonApi::Params::Include::Parse" do
|
6
|
-
before { Jat::Plugins.load_plugin(:json_api) }
|
7
|
-
|
8
|
-
let(:described_class) { Jat::Plugins::JsonApi::Params::Include::Parse }
|
9
|
-
|
10
|
-
it "returns empty hash when param not provided" do
|
11
|
-
result = described_class.call(nil)
|
12
|
-
|
13
|
-
assert_equal({}, result)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "returns hash when single element" do
|
17
|
-
result = described_class.call("foo")
|
18
|
-
|
19
|
-
assert_equal({foo: {}}, result)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "returns hash when multiple elements" do
|
23
|
-
result = described_class.call("foo,bar,bazz")
|
24
|
-
|
25
|
-
assert_equal({foo: {}, bar: {}, bazz: {}}, result)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "returns hash when nested elements" do
|
29
|
-
result = described_class.call("foo.bar.bazz")
|
30
|
-
|
31
|
-
assert_equal({foo: {bar: {bazz: {}}}}, result)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "returns hash when multiple nested elements" do
|
35
|
-
result = described_class.call("foo,bar.bazz,bar.bazzz,test.test1.test2,test.test1.test3")
|
36
|
-
|
37
|
-
assert_equal(
|
38
|
-
{
|
39
|
-
foo: {},
|
40
|
-
bar: {bazz: {}, bazzz: {}},
|
41
|
-
test: {test1: {test2: {}, test3: {}}}
|
42
|
-
},
|
43
|
-
result
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|