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
@@ -3,54 +3,131 @@
|
|
3
3
|
require "test_helper"
|
4
4
|
|
5
5
|
describe "Jat::Plugins::SimpleApi::Map" do
|
6
|
-
before { Jat::Plugins.
|
6
|
+
before { Jat::Plugins.find_plugin(:simple_api) }
|
7
7
|
|
8
|
-
|
8
|
+
let(:base_class) { Class.new(Jat) { plugin :simple_api } }
|
9
|
+
let(:described_class) { a::Map }
|
9
10
|
|
10
|
-
let(:
|
11
|
-
Class.new(
|
12
|
-
plugin :simple_api
|
11
|
+
let(:a) do
|
12
|
+
ser = Class.new(base_class)
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
ser.attribute :a1
|
15
|
+
ser.attribute :a2
|
16
|
+
ser.attribute :a3, exposed: false
|
17
|
+
|
18
|
+
ser.attribute :b, serializer: b
|
19
|
+
ser.attribute :c, serializer: c
|
20
|
+
ser.attribute :d, serializer: d, exposed: true
|
21
|
+
ser
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:b) do
|
25
|
+
ser = Class.new(base_class)
|
26
|
+
ser.attribute :b1
|
27
|
+
ser.attribute :b2
|
28
|
+
ser.attribute :b3, exposed: false
|
29
|
+
ser
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:c) do
|
33
|
+
ser = Class.new(base_class)
|
34
|
+
ser.attribute :c1
|
35
|
+
ser.attribute :c2
|
36
|
+
ser.attribute :c3, exposed: false
|
37
|
+
ser
|
38
|
+
end
|
39
|
+
|
40
|
+
let(:d) do
|
41
|
+
ser = Class.new(base_class)
|
42
|
+
ser.attribute :d1
|
43
|
+
ser.attribute :d2
|
44
|
+
ser.attribute :d3, exposed: false
|
45
|
+
ser
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns all attributes when {exposed: :all} provided " do
|
49
|
+
result = described_class.call(exposed: :all)
|
50
|
+
expected_result = {
|
51
|
+
a1: {},
|
52
|
+
a2: {},
|
53
|
+
a3: {},
|
54
|
+
b: {b1: {}, b2: {}, b3: {}},
|
55
|
+
c: {c1: {}, c2: {}, c3: {}},
|
56
|
+
d: {d1: {}, d2: {}, d3: {}}
|
57
|
+
}
|
58
|
+
|
59
|
+
assert_equal expected_result, result
|
20
60
|
end
|
21
61
|
|
22
|
-
|
23
|
-
|
24
|
-
|
62
|
+
it "returns exposed attributes when {exposed: :default} provided" do
|
63
|
+
result = described_class.call(exposed: :default)
|
64
|
+
expected_result = {
|
65
|
+
a1: {},
|
66
|
+
a2: {},
|
67
|
+
d: {d1: {}, d2: {}}
|
68
|
+
}
|
69
|
+
|
70
|
+
assert_equal expected_result, result
|
71
|
+
end
|
72
|
+
|
73
|
+
it "returns exposed attributes when no :exposed param provided" do
|
74
|
+
result = described_class.call({})
|
75
|
+
expected_result = {
|
76
|
+
a1: {},
|
77
|
+
a2: {},
|
78
|
+
d: {d1: {}, d2: {}}
|
79
|
+
}
|
80
|
+
|
81
|
+
assert_equal expected_result, result
|
82
|
+
end
|
83
|
+
|
84
|
+
it "returns no attributes when `{exposed: :none}` provided" do
|
85
|
+
result = described_class.call(exposed: :none)
|
86
|
+
assert_equal({}, result)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns only manually exposed attributes when `{exposed: :none}` type provided" do
|
90
|
+
fields = "a2,a3,c(c2,c3),d(d2,d3)"
|
91
|
+
result = described_class.call(exposed: :none, fields: fields)
|
92
|
+
|
93
|
+
expected_result = {
|
94
|
+
a2: {},
|
95
|
+
a3: {},
|
96
|
+
c: {c2: {}, c3: {}},
|
97
|
+
d: {d2: {}, d3: {}}
|
98
|
+
}
|
25
99
|
|
26
|
-
|
27
|
-
it "returns map of exposed by default fields" do
|
28
|
-
assert_equal({a1: {}, a2: {}}, subject)
|
29
|
-
end
|
100
|
+
assert_equal expected_result, result
|
30
101
|
end
|
31
102
|
|
32
|
-
|
33
|
-
|
103
|
+
it "returns combined auto-exposed and manually exposed attributes when `default` type provided" do
|
104
|
+
fields = "b(b3),c"
|
105
|
+
result = described_class.call(exposed: :default, fields: fields)
|
106
|
+
expected_result = {
|
107
|
+
a1: {},
|
108
|
+
a2: {},
|
109
|
+
b: {b1: {}, b2: {}, b3: {}},
|
110
|
+
c: {c1: {}, c2: {}},
|
111
|
+
d: {d1: {}, d2: {}}
|
112
|
+
}
|
34
113
|
|
35
|
-
|
36
|
-
assert_equal({a1: {}, a2: {}, a3: {}, a4: {}}, subject)
|
37
|
-
end
|
114
|
+
assert_equal expected_result, result
|
38
115
|
end
|
39
116
|
|
40
|
-
|
41
|
-
|
117
|
+
it "raises error with informative message about recursive serialization" do
|
118
|
+
a.relationship :b, serializer: -> { b }, exposed: true
|
119
|
+
b.relationship :a, serializer: -> { a }, exposed: true
|
42
120
|
|
43
|
-
|
44
|
-
|
45
|
-
end
|
121
|
+
error = assert_raises(Jat::Error) { described_class.call({}) }
|
122
|
+
assert_includes "Recursive serialization: b -> a -> b", error.message
|
46
123
|
end
|
47
124
|
|
48
|
-
|
49
|
-
|
50
|
-
|
125
|
+
it "raises error with informative message about recursive serialization through 3 serializers" do
|
126
|
+
a.relationship :b, serializer: -> { b }, exposed: true
|
127
|
+
b.relationship :c, serializer: -> { c }, exposed: true
|
128
|
+
c.relationship :a, serializer: -> { a }, exposed: true
|
51
129
|
|
52
|
-
|
53
|
-
|
54
|
-
end
|
130
|
+
error = assert_raises(Jat::Error) { described_class.call({}) }
|
131
|
+
assert_equal "Recursive serialization: b -> c -> a -> b", error.message
|
55
132
|
end
|
56
133
|
end
|
@@ -11,12 +11,6 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
11
11
|
assert_equal({}, empty_serializer.to_h(nil))
|
12
12
|
end
|
13
13
|
|
14
|
-
it "returns correct structure with meta" do
|
15
|
-
empty_serializer = Class.new(base_class)
|
16
|
-
|
17
|
-
assert_equal({meta: {any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
|
18
|
-
end
|
19
|
-
|
20
14
|
it "returns correct structure with data" do
|
21
15
|
str_serializer = Class.new(base_class) do
|
22
16
|
attribute(:id) { |_| "STRING" }
|
@@ -48,18 +42,6 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
48
42
|
)
|
49
43
|
end
|
50
44
|
|
51
|
-
it "raises error when trying to add meta to response without root key" do
|
52
|
-
str_serializer = Class.new(base_class) do
|
53
|
-
attribute(:id) { |obj| obj }
|
54
|
-
end
|
55
|
-
|
56
|
-
error = assert_raises(Jat::Error) { str_serializer.to_h("1", meta: {foo: :bar}) }
|
57
|
-
assert_equal "Response must have a root key to add metadata", error.message
|
58
|
-
|
59
|
-
error = assert_raises(Jat::Error) { str_serializer.to_h(["1"], meta: {foo: :bar}) }
|
60
|
-
assert_equal "Response must have a root key to add metadata", error.message
|
61
|
-
end
|
62
|
-
|
63
45
|
it "returns correct structure with array data" do
|
64
46
|
str_serializer = Class.new(base_class) do
|
65
47
|
attribute(:id) { |obj| obj }
|
@@ -92,11 +74,10 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
92
74
|
)
|
93
75
|
end
|
94
76
|
|
95
|
-
it "returns correct
|
77
|
+
it "returns correct roots" do
|
96
78
|
str_serializer = Class.new(base_class) do
|
97
|
-
root(:
|
98
|
-
|
99
|
-
root_for_many(:digits)
|
79
|
+
root(one: :digit, many: :digits)
|
80
|
+
|
100
81
|
attribute(:id) { |obj| obj }
|
101
82
|
end
|
102
83
|
|
@@ -107,8 +88,6 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
107
88
|
it "returns correct structures when root is overwritten" do
|
108
89
|
str_serializer = Class.new(base_class) do
|
109
90
|
root(:root)
|
110
|
-
root_for_one(:root)
|
111
|
-
root_for_many(:root)
|
112
91
|
attribute(:id) { |obj| obj }
|
113
92
|
end
|
114
93
|
|
@@ -116,25 +95,6 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
116
95
|
assert_equal({foo: [{id: "1"}]}, str_serializer.to_h(["1"], root: :foo))
|
117
96
|
end
|
118
97
|
|
119
|
-
it "returns correct structure with data and meta" do
|
120
|
-
str_serializer = Class.new(base_class) do
|
121
|
-
root(:root)
|
122
|
-
config[:meta] = {version: "1.2.3"}
|
123
|
-
|
124
|
-
attribute(:id) { |obj| obj }
|
125
|
-
end
|
126
|
-
|
127
|
-
assert_equal(
|
128
|
-
{root: {id: "1"}, meta: {any: :thing, version: "1.2.3"}},
|
129
|
-
str_serializer.to_h("1", meta: {any: :thing})
|
130
|
-
)
|
131
|
-
|
132
|
-
assert_equal(
|
133
|
-
{root: [{id: "1"}], meta: {any: :thing, version: "1.2.3"}},
|
134
|
-
str_serializer.to_h(["1"], meta: {any: :thing})
|
135
|
-
)
|
136
|
-
end
|
137
|
-
|
138
98
|
it "returns correct structure with data multiple attributes" do
|
139
99
|
str_serializer = Class.new(base_class) do
|
140
100
|
attribute(:id) { |obj| obj }
|
@@ -293,50 +253,96 @@ describe "Jat::Plugins::SimpleApi::Response" do
|
|
293
253
|
|
294
254
|
assert_equal(
|
295
255
|
{chars: [{next: "b"}, {next: "c"}]},
|
296
|
-
str_serializer.to_h("ab",
|
256
|
+
str_serializer.to_h("ab", fields: "chars(next)")
|
297
257
|
)
|
298
258
|
end
|
299
259
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
config[:meta] = {version: "1.2.3"}
|
260
|
+
describe "adding meta" do
|
261
|
+
it "returns correct structure with only meta" do
|
262
|
+
empty_serializer = Class.new(base_class)
|
304
263
|
|
305
|
-
|
264
|
+
assert_equal({meta: {any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
|
306
265
|
end
|
307
266
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
end
|
267
|
+
it "returns correct structure with overwritten meta key" do
|
268
|
+
empty_serializer = Class.new(base_class)
|
269
|
+
empty_serializer.meta_key :metadata
|
270
|
+
empty_serializer.meta(:foo) { :bar }
|
313
271
|
|
314
|
-
|
315
|
-
|
316
|
-
root(:root)
|
317
|
-
config[:meta] = {
|
318
|
-
obj: ->(obj, _context) { obj },
|
319
|
-
context: ->(_obj, context) { context },
|
320
|
-
time: ->(_obj, _context) { Time.new(2020, 1, 1) }
|
321
|
-
}
|
272
|
+
assert_equal({metadata: {foo: :bar, any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
|
273
|
+
end
|
322
274
|
|
323
|
-
|
275
|
+
it "returns correct structure with data and meta" do
|
276
|
+
str_serializer = Class.new(base_class) do
|
277
|
+
root(:root)
|
278
|
+
meta(:version) { "1.2.3" }
|
279
|
+
|
280
|
+
attribute(:id) { |obj| obj }
|
281
|
+
end
|
282
|
+
|
283
|
+
assert_equal(
|
284
|
+
{root: {id: "1"}, meta: {any: :thing, version: "1.2.3"}},
|
285
|
+
str_serializer.to_h("1", meta: {any: :thing})
|
286
|
+
)
|
287
|
+
|
288
|
+
assert_equal(
|
289
|
+
{root: [{id: "1"}], meta: {any: :thing, version: "1.2.3"}},
|
290
|
+
str_serializer.to_h(["1"], meta: {any: :thing})
|
291
|
+
)
|
324
292
|
end
|
325
293
|
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
end
|
294
|
+
it "raises error when trying to add meta to response without root key" do
|
295
|
+
str_serializer = Class.new(base_class) do
|
296
|
+
attribute(:id) { |obj| obj }
|
297
|
+
end
|
331
298
|
|
332
|
-
|
333
|
-
|
334
|
-
root(:root)
|
335
|
-
config[:meta] = {foo: nil, bar: proc {}}
|
299
|
+
error = assert_raises(Jat::Error) { str_serializer.to_h("1", meta: {foo: :bar}) }
|
300
|
+
assert_equal "Response must have a root key to add metadata", error.message
|
336
301
|
|
337
|
-
|
302
|
+
error = assert_raises(Jat::Error) { str_serializer.to_h(["1"], meta: {foo: :bar}) }
|
303
|
+
assert_equal "Response must have a root key to add metadata", error.message
|
304
|
+
end
|
305
|
+
|
306
|
+
it "does not overwrite manually added meta" do
|
307
|
+
str_serializer = Class.new(base_class) do
|
308
|
+
root(:root)
|
309
|
+
meta(:version) { "1.2.3" }
|
310
|
+
|
311
|
+
attribute(:id) { |obj| obj }
|
312
|
+
end
|
313
|
+
|
314
|
+
assert_equal(
|
315
|
+
{root: {id: "1"}, meta: {version: "2.0.0"}},
|
316
|
+
str_serializer.to_h("1", meta: {version: "2.0.0"})
|
317
|
+
)
|
318
|
+
end
|
319
|
+
|
320
|
+
it "allows to provide lambda as meta key" do
|
321
|
+
str_serializer = Class.new(base_class) do
|
322
|
+
root(:root)
|
323
|
+
|
324
|
+
meta(:obj) { |obj| obj }
|
325
|
+
meta(:context) { |_obj, context| context }
|
326
|
+
meta(:time) { Time.new(2020, 1, 1) }
|
327
|
+
|
328
|
+
attribute(:id) { |obj| obj }
|
329
|
+
end
|
330
|
+
|
331
|
+
assert_equal(
|
332
|
+
{root: {id: "1"}, meta: {obj: "1", context: {foo: :bar}, time: Time.new(2020, 1, 1)}},
|
333
|
+
str_serializer.to_h("1", foo: :bar)
|
334
|
+
)
|
338
335
|
end
|
339
336
|
|
340
|
-
|
337
|
+
it "does not adds nil meta" do
|
338
|
+
str_serializer = Class.new(base_class) do
|
339
|
+
root(:root)
|
340
|
+
meta(:foo) {}
|
341
|
+
|
342
|
+
attribute(:id) { |obj| obj }
|
343
|
+
end
|
344
|
+
|
345
|
+
assert_equal({root: {id: "1"}}, str_serializer.to_h("1", bazz: nil))
|
346
|
+
end
|
341
347
|
end
|
342
348
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require "test_helper"
|
4
4
|
|
5
5
|
describe "Jat::Plugins::SimpleApi" do
|
6
|
-
before { @plugin = Jat::Plugins.
|
6
|
+
before { @plugin = Jat::Plugins.find_plugin(:simple_api) }
|
7
7
|
|
8
8
|
let(:jat_class) do
|
9
9
|
new_class = Class.new(Jat)
|
@@ -16,65 +16,131 @@ describe "Jat::Plugins::SimpleApi" do
|
|
16
16
|
let(:plugin) { @plugin }
|
17
17
|
|
18
18
|
describe ".after_load" do
|
19
|
-
it "loads
|
19
|
+
it "loads simple_api_activerecord plugin if activerecord option provided" do
|
20
20
|
jat_class = Class.new(Jat)
|
21
|
-
jat_class.expects(:plugin).with(:
|
21
|
+
jat_class.expects(:plugin).with(:simple_api_activerecord, activerecord: true)
|
22
22
|
|
23
|
-
|
23
|
+
plugin.load(jat_class)
|
24
|
+
plugin.after_load(jat_class, activerecord: true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "adds default `:meta` meta_key config option" do
|
28
|
+
jat_class = Class.new(Jat)
|
29
|
+
assert_nil jat_class.config[:meta_key]
|
30
|
+
|
31
|
+
plugin.load(jat_class)
|
32
|
+
plugin.after_load(jat_class)
|
33
|
+
assert_equal :meta, jat_class.config[:meta_key]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "adds config variable with name of response plugin that was loaded" do
|
37
|
+
jat_class = Class.new(Jat)
|
38
|
+
jat_class.plugin(:simple_api)
|
39
|
+
|
40
|
+
assert_equal(:simple_api, jat_class.config[:response_plugin_loaded])
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
27
44
|
describe "InstanceMethods" do
|
28
|
-
let(:jat) { jat_class.new(
|
45
|
+
let(:jat) { jat_class.new({}) }
|
29
46
|
|
30
47
|
describe "#to_h" do
|
31
48
|
it "returns response in a simple-api format" do
|
32
49
|
expected_result = {data: {id: "JAT"}}
|
33
|
-
assert_equal expected_result, jat.to_h
|
50
|
+
assert_equal expected_result, jat.to_h("JAT")
|
34
51
|
end
|
35
52
|
end
|
36
53
|
|
37
|
-
describe "#
|
38
|
-
it "returns
|
39
|
-
|
40
|
-
|
54
|
+
describe "#map" do
|
55
|
+
it "returns map for provided context" do
|
56
|
+
jat_class::Map.expects(:call).with("CONTEXT").returns "MAP"
|
57
|
+
assert_equal "MAP", jat_class.map("CONTEXT")
|
41
58
|
end
|
42
59
|
end
|
43
|
-
end
|
44
60
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
61
|
+
describe "#map_full" do
|
62
|
+
it "returns memorized map with all fields exposed" do
|
63
|
+
jat_class::Map.expects(:call).with(exposed: :all).returns "MAP"
|
64
|
+
assert_equal "MAP", jat_class.map_full
|
65
|
+
assert_same jat_class.map_full, jat_class.map_full
|
50
66
|
end
|
51
67
|
end
|
52
68
|
|
69
|
+
describe "#map_exposed" do
|
70
|
+
it "returns memorized map with exposed by default fields" do
|
71
|
+
jat_class::Map.expects(:call).with(exposed: :default).returns "MAP"
|
72
|
+
assert_equal "MAP", jat_class.map_exposed
|
73
|
+
assert_same jat_class.map_exposed, jat_class.map_exposed
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "ClassMethods" do
|
53
79
|
describe ".root" do
|
54
|
-
it "
|
55
|
-
|
80
|
+
it "sets root config values" do
|
81
|
+
jat_class.root :data
|
82
|
+
|
83
|
+
assert_equal :data, jat_class.config[:root_one]
|
84
|
+
assert_equal :data, jat_class.config[:root_many]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "sets root config values separately for one or many objects" do
|
88
|
+
jat_class.root one: "user", many: "users"
|
89
|
+
|
90
|
+
assert_equal :user, jat_class.config[:root_one]
|
91
|
+
assert_equal :users, jat_class.config[:root_many]
|
92
|
+
end
|
93
|
+
|
94
|
+
it "removes root values when `false` or `nil` provided" do
|
95
|
+
jat_class.root :data
|
96
|
+
jat_class.root false
|
97
|
+
|
98
|
+
assert_nil jat_class.config[:root_one]
|
99
|
+
assert_nil jat_class.config[:root_many]
|
100
|
+
|
101
|
+
jat_class.root :data
|
102
|
+
jat_class.root nil
|
103
|
+
|
104
|
+
assert_nil jat_class.config[:root_one]
|
105
|
+
assert_nil jat_class.config[:root_many]
|
106
|
+
end
|
107
|
+
|
108
|
+
it "removes root values when `false` or nil provided in hash" do
|
109
|
+
jat_class.root :data
|
110
|
+
jat_class.root one: nil, many: nil
|
111
|
+
assert_nil jat_class.config[:root_one]
|
112
|
+
assert_nil jat_class.config[:root_many]
|
113
|
+
|
114
|
+
jat_class.root :data
|
115
|
+
jat_class.root one: false, many: false
|
116
|
+
assert_nil jat_class.config[:root_one]
|
117
|
+
assert_nil jat_class.config[:root_many]
|
56
118
|
end
|
57
119
|
|
58
120
|
it "symbolizes root" do
|
59
|
-
jat_class.root "
|
60
|
-
assert_equal :
|
121
|
+
jat_class.root "data"
|
122
|
+
assert_equal :data, jat_class.config[:root_one]
|
123
|
+
assert_equal :data, jat_class.config[:root_many]
|
124
|
+
|
125
|
+
jat_class.root one: "user", many: "users"
|
126
|
+
assert_equal :user, jat_class.config[:root_one]
|
127
|
+
assert_equal :users, jat_class.config[:root_many]
|
61
128
|
end
|
62
129
|
end
|
63
130
|
|
64
131
|
describe ".meta_key" do
|
65
132
|
it "returns default meta_key" do
|
66
|
-
assert_equal :meta, jat_class.meta_key
|
133
|
+
assert_equal :meta, jat_class.config[:meta_key]
|
67
134
|
end
|
68
135
|
|
69
|
-
it "
|
136
|
+
it "changes meta key" do
|
70
137
|
jat_class.meta_key :metadata
|
71
|
-
assert_equal :metadata, jat_class.meta_key
|
72
|
-
assert_same jat_class.meta_key, jat_class.meta_key
|
138
|
+
assert_equal :metadata, jat_class.config[:meta_key]
|
73
139
|
end
|
74
140
|
|
75
141
|
it "symbolizes meta key" do
|
76
142
|
jat_class.meta_key "metadata"
|
77
|
-
assert_equal :metadata, jat_class.meta_key
|
143
|
+
assert_equal :metadata, jat_class.config[:meta_key]
|
78
144
|
end
|
79
145
|
end
|
80
146
|
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe "Jat::Plugins::SimpleApiActiverecord::Preloads" do
|
6
|
+
let(:base) { Class.new(Jat) { plugin :simple_api, activerecord: true } }
|
7
|
+
|
8
|
+
let(:user_serializer) { Class.new(base) }
|
9
|
+
let(:profile_serializer) { Class.new(base) }
|
10
|
+
let(:email_serializer) { Class.new(base) }
|
11
|
+
|
12
|
+
let(:jat_user) { user_serializer.new }
|
13
|
+
let(:jat_profile) { profile_serializer.new }
|
14
|
+
let(:jat_email) { email_serializer.new }
|
15
|
+
|
16
|
+
let(:described_class) { Jat::Plugins::SimpleApiActiverecord::Preloads }
|
17
|
+
|
18
|
+
def define_map(map)
|
19
|
+
user_serializer::Map.expects(:call).returns(map)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns empty hash when no attributes requested" do
|
23
|
+
define_map({})
|
24
|
+
|
25
|
+
result = described_class.call(jat_user)
|
26
|
+
assert_equal({}, result)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns empty hash when no attributes with preloads requested" do
|
30
|
+
user_serializer.attribute :name
|
31
|
+
define_map({name: {}})
|
32
|
+
|
33
|
+
result = described_class.call(jat_user)
|
34
|
+
assert_equal({}, result)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns preloads for requested attributes" do
|
38
|
+
user_serializer.attribute :name, preload: :profile
|
39
|
+
define_map({name: {}})
|
40
|
+
|
41
|
+
result = described_class.call(jat_user)
|
42
|
+
assert_equal({profile: {}}, result)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns merged preloads for requested attributes" do
|
46
|
+
user_serializer.attribute :first_name, preload: :profile
|
47
|
+
user_serializer.attribute :phone, preload: {profile: :phones}
|
48
|
+
user_serializer.attribute :email, preload: {profile: :emails}
|
49
|
+
|
50
|
+
define_map({first_name: {}, phone: {}, email: {}})
|
51
|
+
|
52
|
+
result = described_class.call(jat_user)
|
53
|
+
assert_equal({profile: {phones: {}, emails: {}}}, result)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns no preloads and no nested preloads for relationships when specified preloads is nil" do
|
57
|
+
user_serializer.relationship :profile, serializer: profile_serializer, preload: nil
|
58
|
+
profile_serializer.attribute :email, preload: :email # should not be preloaded
|
59
|
+
define_map(profile: {email: {}})
|
60
|
+
|
61
|
+
result = described_class.call(jat_user)
|
62
|
+
assert_equal({}, result)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns preloads for nested relationships joined to root when specified preloads is {}" do
|
66
|
+
user_serializer.relationship :profile, serializer: profile_serializer, preload: {}
|
67
|
+
profile_serializer.attribute :email, preload: :email # should be preloaded to root
|
68
|
+
define_map({profile: {email: {}}})
|
69
|
+
|
70
|
+
result = described_class.call(jat_user)
|
71
|
+
assert_equal({email: {}}, result)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "returns preloads for nested relationships joined to root when specified preloads is []" do
|
75
|
+
user_serializer.relationship :profile, serializer: profile_serializer, preload: []
|
76
|
+
profile_serializer.attribute :email, preload: :email # should be preloaded to root
|
77
|
+
define_map({profile: {email: {}}})
|
78
|
+
|
79
|
+
result = described_class.call(jat_user)
|
80
|
+
assert_equal({email: {}}, result)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "returns preloads for relationships" do
|
84
|
+
user_serializer.relationship :profile, serializer: profile_serializer
|
85
|
+
define_map(profile: {})
|
86
|
+
|
87
|
+
result = described_class.call(jat_user)
|
88
|
+
assert_equal({profile: {}}, result)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns nested preloads for relationships" do
|
92
|
+
user_serializer.relationship :profile, serializer: profile_serializer
|
93
|
+
profile_serializer.attribute :email, preload: %i[confirmed_email unconfirmed_email]
|
94
|
+
define_map(profile: {email: {}})
|
95
|
+
|
96
|
+
result = described_class.call(jat_user)
|
97
|
+
assert_equal({profile: {confirmed_email: {}, unconfirmed_email: {}}}, result)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "preloads nested relationships for nested relationship" do
|
101
|
+
user_serializer.relationship :profile, serializer: profile_serializer, preload: {company: :profile}
|
102
|
+
profile_serializer.attribute :email, preload: %i[confirmed_email unconfirmed_email]
|
103
|
+
define_map(profile: {email: {}})
|
104
|
+
|
105
|
+
result = described_class.call(jat_user)
|
106
|
+
assert_equal({company: {profile: {confirmed_email: {}, unconfirmed_email: {}}}}, result)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "preloads nested relationships to main (!) resource" do
|
110
|
+
user_serializer.relationship :profile, serializer: profile_serializer, preload: {company!: :profile}
|
111
|
+
profile_serializer.attribute :email, preload: %i[confirmed_email unconfirmed_email]
|
112
|
+
define_map(profile: {email: {}})
|
113
|
+
|
114
|
+
result = described_class.call(jat_user)
|
115
|
+
assert_equal({company: {profile: {}, confirmed_email: {}, unconfirmed_email: {}}}, result)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "merges preloads the same way regardless of order of preloads" do
|
119
|
+
a = Class.new(base)
|
120
|
+
a.attribute :a1, preload: {foo: {bar: {bazz1: {}, bazz: {}}}}
|
121
|
+
a.attribute :a2, preload: {foo: {bar: {bazz2: {}, bazz: {last: {}}}}}
|
122
|
+
|
123
|
+
jat_a1 = a.allocate
|
124
|
+
jat_a2 = a.allocate
|
125
|
+
|
126
|
+
jat_a1.expects(:map).returns({a1: {}, a2: {}})
|
127
|
+
jat_a2.expects(:map).returns({a2: {}, a1: {}})
|
128
|
+
|
129
|
+
result1 = described_class.call(jat_a1)
|
130
|
+
result2 = described_class.call(jat_a2)
|
131
|
+
|
132
|
+
assert_equal(result2, result1)
|
133
|
+
assert_equal({foo: {bar: {bazz: {last: {}}, bazz1: {}, bazz2: {}}}}, result1)
|
134
|
+
end
|
135
|
+
end
|