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
@@ -14,7 +14,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
14
14
|
it "returns correct structure with data" do
|
15
15
|
str_serializer = Class.new(base_class) do
|
16
16
|
type "str"
|
17
|
-
|
17
|
+
id { |_| "STRING" }
|
18
18
|
end
|
19
19
|
|
20
20
|
assert_equal({data: {type: :str, id: "STRING"}}, str_serializer.to_h("STRING"))
|
@@ -23,7 +23,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
23
23
|
it "returns correct structure with array data" do
|
24
24
|
str_serializer = Class.new(base_class) do
|
25
25
|
type "str"
|
26
|
-
|
26
|
+
id { |obj| obj }
|
27
27
|
end
|
28
28
|
|
29
29
|
assert_equal(
|
@@ -35,7 +35,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
35
35
|
it "returns correct structure with data with attributes" do
|
36
36
|
str_serializer = Class.new(base_class) do
|
37
37
|
type "str"
|
38
|
-
|
38
|
+
id { |obj| obj[0] }
|
39
39
|
attribute :length
|
40
40
|
end
|
41
41
|
|
@@ -48,12 +48,12 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
48
48
|
it "returns correct structure with has-one relationship" do
|
49
49
|
int_serializer = Class.new(base_class) do
|
50
50
|
type "int"
|
51
|
-
|
51
|
+
id { |obj| obj }
|
52
52
|
end
|
53
53
|
|
54
54
|
str_serializer = Class.new(base_class) do
|
55
55
|
type "str"
|
56
|
-
|
56
|
+
id { |obj| obj[0] }
|
57
57
|
relationship :length, serializer: int_serializer, exposed: true
|
58
58
|
end
|
59
59
|
|
@@ -76,12 +76,12 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
76
76
|
it "does not return has-one relationship when not exposed" do
|
77
77
|
int_serializer = Class.new(base_class) do
|
78
78
|
type "int"
|
79
|
-
|
79
|
+
id { |obj| obj }
|
80
80
|
end
|
81
81
|
|
82
82
|
str_serializer = Class.new(base_class) do
|
83
83
|
type "str"
|
84
|
-
|
84
|
+
id { |obj| obj[0] }
|
85
85
|
relationship :length, serializer: int_serializer # relationships are not exposed by default
|
86
86
|
end
|
87
87
|
|
@@ -91,7 +91,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
91
91
|
it "returns correct structure with empty has-one relationship" do
|
92
92
|
str_serializer = Class.new(base_class) do
|
93
93
|
type "str"
|
94
|
-
|
94
|
+
id { |obj| obj[0] }
|
95
95
|
relationship(:length, serializer: self, exposed: true) { |_obj| nil }
|
96
96
|
end
|
97
97
|
|
@@ -109,13 +109,13 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
109
109
|
it "returns correct structure with has-one relationship with attributes" do
|
110
110
|
int_serializer = Class.new(base_class) do
|
111
111
|
type "int"
|
112
|
-
|
112
|
+
id { |obj| obj }
|
113
113
|
attribute(:next) { |obj| obj + 1 }
|
114
114
|
end
|
115
115
|
|
116
116
|
str_serializer = Class.new(base_class) do
|
117
117
|
type "str"
|
118
|
-
|
118
|
+
id { |obj| obj[0] }
|
119
119
|
relationship :length, serializer: int_serializer, exposed: true
|
120
120
|
end
|
121
121
|
|
@@ -142,7 +142,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
142
142
|
|
143
143
|
str_serializer = Class.new(base_class) do
|
144
144
|
type "str"
|
145
|
-
|
145
|
+
id { |_obj| "id" }
|
146
146
|
relationship :chars, serializer: chr_serializer, many: true, exposed: true
|
147
147
|
end
|
148
148
|
|
@@ -160,12 +160,12 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
160
160
|
it "returns correct structure with has-many relationship" do
|
161
161
|
chr_serializer = Class.new(base_class) do
|
162
162
|
type "chr"
|
163
|
-
|
163
|
+
id { |obj| obj }
|
164
164
|
end
|
165
165
|
|
166
166
|
str_serializer = Class.new(base_class) do
|
167
167
|
type "str"
|
168
|
-
|
168
|
+
id { |obj| obj[0] }
|
169
169
|
relationship :chars, serializer: chr_serializer, many: true, exposed: true
|
170
170
|
end
|
171
171
|
|
@@ -188,13 +188,13 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
188
188
|
it "returns correct structure with has-many relationship with attributes" do
|
189
189
|
chr_serializer = Class.new(base_class) do
|
190
190
|
type "chr"
|
191
|
-
|
191
|
+
id { |obj| obj }
|
192
192
|
attribute :next
|
193
193
|
end
|
194
194
|
|
195
195
|
str_serializer = Class.new(base_class) do
|
196
196
|
type "str"
|
197
|
-
|
197
|
+
id { |obj| obj[0] }
|
198
198
|
relationship :chars, serializer: chr_serializer, many: true, exposed: true
|
199
199
|
end
|
200
200
|
|
@@ -218,12 +218,12 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
218
218
|
it "accepts includes param" do
|
219
219
|
chr_serializer = Class.new(base_class) do
|
220
220
|
type "chr"
|
221
|
-
|
221
|
+
id { |obj| obj }
|
222
222
|
end
|
223
223
|
|
224
224
|
str_serializer = Class.new(base_class) do
|
225
225
|
type "str"
|
226
|
-
|
226
|
+
id { |obj| obj[0] }
|
227
227
|
relationship :chars, serializer: chr_serializer, many: true, exposed: false
|
228
228
|
end
|
229
229
|
|
@@ -239,19 +239,19 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
239
239
|
{type: :chr, id: "a"}, {type: :chr, id: "b"}
|
240
240
|
]
|
241
241
|
},
|
242
|
-
str_serializer.to_h("ab",
|
242
|
+
str_serializer.to_h("ab", include: "chars")
|
243
243
|
)
|
244
244
|
end
|
245
245
|
|
246
246
|
it "accepts sparse_fieldset" do
|
247
247
|
chr_serializer = Class.new(base_class) do
|
248
248
|
type "chr"
|
249
|
-
|
249
|
+
id { |obj| obj }
|
250
250
|
end
|
251
251
|
|
252
252
|
str_serializer = Class.new(base_class) do
|
253
253
|
type "str"
|
254
|
-
|
254
|
+
id { |obj| obj[0] }
|
255
255
|
relationship :chars, serializer: chr_serializer, many: true, exposed: false
|
256
256
|
end
|
257
257
|
|
@@ -267,7 +267,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
267
267
|
{type: :chr, id: "a"}, {type: :chr, id: "b"}
|
268
268
|
]
|
269
269
|
},
|
270
|
-
str_serializer.to_h("ab",
|
270
|
+
str_serializer.to_h("ab", fields: {str: "chars"})
|
271
271
|
)
|
272
272
|
end
|
273
273
|
|
@@ -275,7 +275,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
275
275
|
let(:serializer) do
|
276
276
|
Class.new(base_class) do
|
277
277
|
type :foo
|
278
|
-
|
278
|
+
id { |obj| obj }
|
279
279
|
end
|
280
280
|
end
|
281
281
|
|
@@ -311,7 +311,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
311
311
|
let(:serializer) do
|
312
312
|
Class.new(base_class) do
|
313
313
|
type :foo
|
314
|
-
|
314
|
+
id { |obj| obj }
|
315
315
|
end
|
316
316
|
end
|
317
317
|
|
@@ -347,7 +347,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
347
347
|
let(:serializer) do
|
348
348
|
Class.new(base_class) do
|
349
349
|
type :foo
|
350
|
-
|
350
|
+
id { |obj| obj }
|
351
351
|
end
|
352
352
|
end
|
353
353
|
|
@@ -374,21 +374,21 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
374
374
|
let(:bar_serializer) do
|
375
375
|
Class.new(base_class) do
|
376
376
|
type :bar
|
377
|
-
|
377
|
+
id { |obj| obj }
|
378
378
|
end
|
379
379
|
end
|
380
380
|
|
381
381
|
let(:foo_serializer) do
|
382
382
|
Class.new(base_class) do
|
383
383
|
type :foo
|
384
|
-
|
384
|
+
id { |obj| obj }
|
385
385
|
end
|
386
386
|
end
|
387
387
|
|
388
388
|
it "adds relationship meta defined in serializer" do
|
389
389
|
foo_serializer.relationship(:bar, serializer: -> { bar_serializer }, exposed: true) { "bar" }
|
390
390
|
bar_serializer.relationship_meta(:version) { "1.2.3" }
|
391
|
-
bar_serializer.relationship_meta(:uid) { |
|
391
|
+
bar_serializer.relationship_meta(:uid) { |obj, context| [context[:parent_object], obj, context[:time]] }
|
392
392
|
bar_serializer.relationship_meta(:null) {}
|
393
393
|
|
394
394
|
response = foo_serializer.to_h("foo", time: "12:00")
|
@@ -401,7 +401,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
401
401
|
let(:serializer) do
|
402
402
|
Class.new(base_class) do
|
403
403
|
type :foo
|
404
|
-
|
404
|
+
id { |obj| obj }
|
405
405
|
end
|
406
406
|
end
|
407
407
|
|
@@ -437,7 +437,7 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
437
437
|
let(:serializer) do
|
438
438
|
Class.new(base_class) do
|
439
439
|
type :foo
|
440
|
-
|
440
|
+
id { |obj| obj }
|
441
441
|
end
|
442
442
|
end
|
443
443
|
|
@@ -464,21 +464,21 @@ describe "Jat::Plugins::JsonApi::Response" do
|
|
464
464
|
let(:bar_serializer) do
|
465
465
|
Class.new(base_class) do
|
466
466
|
type :bar
|
467
|
-
|
467
|
+
id { |obj| obj }
|
468
468
|
end
|
469
469
|
end
|
470
470
|
|
471
471
|
let(:foo_serializer) do
|
472
472
|
Class.new(base_class) do
|
473
473
|
type :foo
|
474
|
-
|
474
|
+
id { |obj| obj }
|
475
475
|
end
|
476
476
|
end
|
477
477
|
|
478
478
|
it "adds relationship link defined in serializer" do
|
479
479
|
foo_serializer.relationship(:bar, serializer: -> { bar_serializer }, exposed: true) { "bar" }
|
480
480
|
bar_serializer.relationship_link(:self) { "/self" }
|
481
|
-
bar_serializer.relationship_link(:related) { |
|
481
|
+
bar_serializer.relationship_link(:related) { |_obj, ctx| "/#{ctx[:parent_object]}/self" }
|
482
482
|
bar_serializer.relationship_link(:null) {}
|
483
483
|
|
484
484
|
response = foo_serializer.to_h("foo")
|
@@ -4,26 +4,35 @@ require "test_helper"
|
|
4
4
|
|
5
5
|
describe "Jat::Plugins::JsonApiActiverecord" do
|
6
6
|
before do
|
7
|
-
@plugin = Jat::Plugins.
|
7
|
+
@plugin = Jat::Plugins.find_plugin(:json_api_activerecord)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "checks json_api plugin loaded before" do
|
11
|
+
jat_class = Class.new(Jat)
|
12
|
+
error = assert_raises(Jat::Error) { jat_class.plugin @plugin }
|
13
|
+
assert_match(/json_api/, error.message)
|
8
14
|
end
|
9
15
|
|
10
16
|
it "loads other plugins in after_load" do
|
11
17
|
jat_class = Class.new(Jat)
|
18
|
+
jat_class.plugin :json_api
|
19
|
+
|
12
20
|
jat_class.expects(:plugin).with(:_preloads, foo: :bar)
|
13
21
|
jat_class.expects(:plugin).with(:_activerecord_preloads, foo: :bar)
|
14
22
|
|
15
|
-
|
23
|
+
@plugin.after_load(jat_class, foo: :bar)
|
16
24
|
end
|
17
25
|
|
18
|
-
describe "
|
19
|
-
it "add .
|
26
|
+
describe "InstanceMethods" do
|
27
|
+
it "add .preloads method as a delegator to #{@plugin}::Preloads" do
|
20
28
|
jat_class = Class.new(Jat)
|
29
|
+
jat_class.plugin :json_api
|
21
30
|
jat_class.plugin @plugin
|
22
31
|
jat = jat_class.allocate
|
23
32
|
|
24
33
|
@plugin::Preloads.expects(:call).with(jat).returns("RES")
|
25
34
|
|
26
|
-
assert_equal "RES",
|
35
|
+
assert_equal "RES", jat.preloads
|
27
36
|
end
|
28
37
|
end
|
29
38
|
end
|
data/test/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads_test.rb
RENAMED
@@ -16,7 +16,7 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
16
16
|
let(:described_class) { Jat::Plugins::JsonApiActiverecord::Preloads }
|
17
17
|
|
18
18
|
def define_map(map)
|
19
|
-
jat_user.
|
19
|
+
jat_user.expects(:map).returns(map)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "returns empty hash when no attributes requested" do
|
@@ -129,7 +129,7 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
129
129
|
assert_equal({company: {profile: {}, confirmed_email: {}, unconfirmed_email: {}}}, result)
|
130
130
|
end
|
131
131
|
|
132
|
-
it "
|
132
|
+
it "does not raise error if 2 serializers with recursive preloads specified" do
|
133
133
|
user_serializer.relationship :profile, serializer: profile_serializer, preload: :profile
|
134
134
|
profile_serializer.relationship :user, serializer: user_serializer, preload: :user
|
135
135
|
|
@@ -138,11 +138,11 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
138
138
|
profile: {attributes: [], relationships: %i[user]}
|
139
139
|
)
|
140
140
|
|
141
|
-
|
142
|
-
|
141
|
+
expected_result = {profile: {user: {}}}
|
142
|
+
assert_equal(expected_result, described_class.call(jat_user))
|
143
143
|
end
|
144
144
|
|
145
|
-
it "
|
145
|
+
it "does not raise error if 3 serializers with recursive preloads specified" do
|
146
146
|
user_serializer.relationship :profile, serializer: profile_serializer, preload: :profile
|
147
147
|
profile_serializer.relationship :email, serializer: email_serializer, preload: :email
|
148
148
|
email_serializer.relationship :user, serializer: user_serializer, preload: :user
|
@@ -153,8 +153,8 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
153
153
|
email: {attributes: [], relationships: %i[user]}
|
154
154
|
)
|
155
155
|
|
156
|
-
|
157
|
-
|
156
|
+
expected_result = {profile: {email: {user: {}}}}
|
157
|
+
assert_equal(expected_result, described_class.call(jat_user))
|
158
158
|
end
|
159
159
|
|
160
160
|
it "does not raises error if 2 serializers preloads same preloads" do
|
@@ -168,7 +168,8 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
168
168
|
email: {attributes: [], relationships: %i[]}
|
169
169
|
)
|
170
170
|
|
171
|
-
|
171
|
+
expected_result = {profile: {email: {}}, email: {}}
|
172
|
+
assert_equal(expected_result, described_class.call(jat_user))
|
172
173
|
end
|
173
174
|
|
174
175
|
it "merges preloads the same way regardless of order of preloads" do
|
@@ -179,8 +180,8 @@ describe "Jat::Plugins::JsonApiActiverecord::Preloads" do
|
|
179
180
|
jat_a1 = a.allocate
|
180
181
|
jat_a2 = a.allocate
|
181
182
|
|
182
|
-
jat_a1.
|
183
|
-
jat_a2.
|
183
|
+
jat_a1.expects(:map).returns(a: {attributes: %i[a1 a2], relationships: %i[]})
|
184
|
+
jat_a2.expects(:map).returns(a: {attributes: %i[a2 a1], relationships: %i[]})
|
184
185
|
|
185
186
|
result1 = described_class.call(jat_a1)
|
186
187
|
result2 = described_class.call(jat_a2)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe "Jat::Plugins::JsonApiLowerCamelCase" do
|
6
|
+
let(:jat_class) do
|
7
|
+
new_class = Class.new(Jat)
|
8
|
+
new_class.plugin(:json_api)
|
9
|
+
new_class.plugin(:json_api_lower_camel_case)
|
10
|
+
new_class
|
11
|
+
end
|
12
|
+
|
13
|
+
before do
|
14
|
+
jat_class.type :foo
|
15
|
+
jat_class.id { |object| object }
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns attributes in lowerCamelCase case" do
|
19
|
+
jat_class.attribute(:foo_bar) { 1 }
|
20
|
+
|
21
|
+
assert_equal({fooBar: 1}, jat_class.to_h(true).dig(:data, :attributes))
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts `fields` in lowerCamelCase format" do
|
25
|
+
jat_class.attribute(:foo_bar, exposed: false) { 1 }
|
26
|
+
|
27
|
+
response = jat_class.to_h(true, fields: {foo: "fooBar"})
|
28
|
+
assert_equal({fooBar: 1}, response.dig(:data, :attributes))
|
29
|
+
end
|
30
|
+
|
31
|
+
it "accepts `include` in lowerCamelCase format" do
|
32
|
+
new_serializer = Class.new(Jat)
|
33
|
+
new_serializer.plugin(:json_api)
|
34
|
+
new_serializer.type :new
|
35
|
+
new_serializer.id { |object| object }
|
36
|
+
|
37
|
+
jat_class.relationship(:foo_bar, serializer: new_serializer) { 1 }
|
38
|
+
|
39
|
+
response = jat_class.to_h(true, include: "fooBar")
|
40
|
+
response_relationships = response.dig(:data, :relationships).keys
|
41
|
+
assert_includes(response_relationships, :fooBar)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns document meta keys in lowerCamelCase format" do
|
45
|
+
jat_class.document_meta(:user_agent) { "Firefox" }
|
46
|
+
|
47
|
+
response = jat_class.to_h(nil)
|
48
|
+
assert_equal({meta: {userAgent: "Firefox"}}, response)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns document jsonapi keys in lowerCamelCase format" do
|
52
|
+
jat_class.jsonapi(:user_agent) { "Firefox" }
|
53
|
+
|
54
|
+
response = jat_class.to_h(nil)
|
55
|
+
assert_equal({jsonapi: {userAgent: "Firefox"}}, response)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns document links keys in lowerCamelCase format" do
|
59
|
+
jat_class.document_link(:user_agent) { "Firefox" }
|
60
|
+
|
61
|
+
response = jat_class.to_h(nil)
|
62
|
+
assert_equal({links: {userAgent: "Firefox"}}, response)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns context meta keys in lowerCamelCase format" do
|
66
|
+
response = jat_class.to_h(nil, meta: {user_agent: "Chrome"})
|
67
|
+
assert_equal({meta: {userAgent: "Chrome"}}, response)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "returns context jsonapi keys in lowerCamelCase format" do
|
71
|
+
response = jat_class.to_h(nil, jsonapi: {user_agent: "Chrome"})
|
72
|
+
assert_equal({jsonapi: {userAgent: "Chrome"}}, response)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns context links keys in lowerCamelCase format" do
|
76
|
+
response = jat_class.to_h(nil, links: {user_agent: "Chrome"})
|
77
|
+
assert_equal({links: {userAgent: "Chrome"}}, response)
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe "Jat::Plugins::JsonApiMapsCache" do
|
6
|
+
before do
|
7
|
+
@plugin = Jat::Plugins.find_plugin(:json_api_maps_cache)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "checks json_api plugin loaded before" do
|
11
|
+
jat_class = Class.new(Jat)
|
12
|
+
error = assert_raises(Jat::Error) { jat_class.plugin @plugin }
|
13
|
+
assert_match(/json_api/, error.message)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "adds config variable how many maps to store per serializer" do
|
17
|
+
jat_class = Class.new(Jat)
|
18
|
+
|
19
|
+
@plugin.after_load(jat_class)
|
20
|
+
assert_equal(100, jat_class.config[:cached_maps_count]) # default 100
|
21
|
+
|
22
|
+
@plugin.after_load(jat_class, cached_maps_count: 10) # change value via opts
|
23
|
+
assert_equal(10, jat_class.config[:cached_maps_count])
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "Test maps responses" do
|
27
|
+
let(:jat_class) do
|
28
|
+
Class.new(Jat) do
|
29
|
+
plugin(:json_api)
|
30
|
+
plugin(:json_api_maps_cache)
|
31
|
+
|
32
|
+
type :foo
|
33
|
+
|
34
|
+
attribute(:attr1)
|
35
|
+
attribute(:attr2)
|
36
|
+
|
37
|
+
relationship(:rel1, serializer: self)
|
38
|
+
relationship(:rel2, serializer: self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns same maps when requested with same params" do
|
43
|
+
full_map1 = jat_class::Map.call(exposed: :all)
|
44
|
+
full_map2 = jat_class::Map.call(exposed: :all)
|
45
|
+
|
46
|
+
exposed_map1 = jat_class::Map.call(exposed: :default)
|
47
|
+
exposed_map2 = jat_class::Map.call(exposed: :default)
|
48
|
+
|
49
|
+
current_map1 = jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel1"})
|
50
|
+
current_map2 = jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel1"})
|
51
|
+
|
52
|
+
assert_same(full_map1, full_map2)
|
53
|
+
assert_same(exposed_map1, exposed_map2)
|
54
|
+
assert_same(current_map1, current_map2)
|
55
|
+
|
56
|
+
# check different maps are not same
|
57
|
+
|
58
|
+
# should not match, include is not same
|
59
|
+
current_map3 = jat_class::Map.call(include: "rel1", fields: {foo: "attr1,rel1"})
|
60
|
+
# should not match, fields are not same
|
61
|
+
current_map4 = jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel2"})
|
62
|
+
|
63
|
+
assert !current_map1.equal?(current_map3)
|
64
|
+
assert !current_map1.equal?(current_map4)
|
65
|
+
assert !current_map3.equal?(current_map4)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "stores different maps keys" do
|
69
|
+
# key 1
|
70
|
+
jat_class::Map.call(exposed: :all)
|
71
|
+
jat_class::Map.call(exposed: :all)
|
72
|
+
|
73
|
+
# key 2
|
74
|
+
jat_class::Map.call(exposed: :default)
|
75
|
+
jat_class::Map.call(exposed: :default)
|
76
|
+
|
77
|
+
# key 3
|
78
|
+
jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel1"})
|
79
|
+
jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel1"})
|
80
|
+
|
81
|
+
# key 4
|
82
|
+
jat_class::Map.call(include: "rel1", fields: {foo: "attr1,rel1"})
|
83
|
+
|
84
|
+
# key 5
|
85
|
+
jat_class::Map.call(include: "rel2", fields: {foo: "attr1,rel2"})
|
86
|
+
|
87
|
+
assert_equal 5, jat_class::Map.maps_cache.keys.count
|
88
|
+
end
|
89
|
+
|
90
|
+
it "clears old results when there are too many cache keys" do
|
91
|
+
jat_class.config[:cached_maps_count] = 1
|
92
|
+
|
93
|
+
full_map1 = jat_class::Map.call(exposed: :all)
|
94
|
+
full_map2 = jat_class::Map.call(exposed: :all)
|
95
|
+
|
96
|
+
# ensure maps refer to same object
|
97
|
+
assert_same(full_map1, full_map2)
|
98
|
+
|
99
|
+
# replace single possible cache key with another `exposed` map
|
100
|
+
jat_class::Map.call(exposed: :default)
|
101
|
+
|
102
|
+
# calculate full map again, it should not match
|
103
|
+
full_map3 = jat_class::Map.call(exposed: :all)
|
104
|
+
assert !full_map1.equal?(full_map3)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
describe "Jat::Plugins::JsonApiValidateParams" do
|
6
|
+
before do
|
7
|
+
@plugin = Jat::Plugins.find_plugin(:json_api_validate_params)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "checks json_api plugin loaded before" do
|
11
|
+
jat_class = Class.new(Jat)
|
12
|
+
error = assert_raises(Jat::Error) { jat_class.plugin @plugin }
|
13
|
+
assert_match(/json_api/, error.message)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:serializer) do
|
17
|
+
jat_class = Class.new(Jat)
|
18
|
+
jat_class.plugin :json_api
|
19
|
+
jat_class.plugin @plugin
|
20
|
+
|
21
|
+
jat_class.type "foo"
|
22
|
+
jat_class.attribute :foo_bar
|
23
|
+
jat_class.relationship :foo_bazz, serializer: jat_class
|
24
|
+
jat_class
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:serializer_lower_camel_case) do
|
28
|
+
jat_class = Class.new(Jat)
|
29
|
+
jat_class.plugin :json_api
|
30
|
+
jat_class.plugin :json_api_lower_camel_case
|
31
|
+
jat_class.plugin @plugin
|
32
|
+
|
33
|
+
jat_class.type "foo"
|
34
|
+
jat_class.attribute :foo_bar
|
35
|
+
jat_class.relationship :foo_bazz, serializer: jat_class
|
36
|
+
jat_class
|
37
|
+
end
|
38
|
+
|
39
|
+
it "validates fields types" do
|
40
|
+
jat = serializer.new(fields: {bar: "any"})
|
41
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
42
|
+
|
43
|
+
expected_message = "Response does not have resources with type 'bar'. Existing types are: 'foo'"
|
44
|
+
assert_equal(expected_message, error.message)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "validates attributes" do
|
48
|
+
jat = serializer.new(fields: {foo: "foo_bar,foo_baz"})
|
49
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
50
|
+
|
51
|
+
expected_message = "No attribute 'foo_baz' in resource type 'foo'. Existing attributes are: 'foo_bar', 'foo_bazz'"
|
52
|
+
assert_equal(expected_message, error.message)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "validates attributes correctly when lower_camel_case plugin loaded" do
|
56
|
+
jat = serializer_lower_camel_case.new(fields: {foo: "fooBar,fooBaz"})
|
57
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
58
|
+
|
59
|
+
expected_message = "No attribute 'fooBaz' in resource type 'foo'. Existing attributes are: 'fooBar', 'fooBazz'"
|
60
|
+
assert_equal(expected_message, error.message)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "validates includes" do
|
64
|
+
jat = serializer.new(include: "extra")
|
65
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
66
|
+
expected_message = "Type 'foo' has no included 'extra' relationship. Existing relationships are: 'foo_bazz'"
|
67
|
+
assert_equal(expected_message, error.message)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "validates includes when parameter named as existing attribute (not relationship)" do
|
71
|
+
jat = serializer.new(include: "foo_bar")
|
72
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
73
|
+
expected_message = "Type 'foo' has no included 'foo_bar' relationship. Existing relationships are: 'foo_bazz'"
|
74
|
+
assert_equal(expected_message, error.message)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "validates includes correctly when lower_camel_case plugin loaded" do
|
78
|
+
jat = serializer_lower_camel_case.new(include: "extra")
|
79
|
+
error = assert_raises(Jat::JsonApiParamsError) { jat.validate }
|
80
|
+
|
81
|
+
expected_message = "Type 'foo' has no included 'extra' relationship. Existing relationships are: 'fooBazz'"
|
82
|
+
assert_equal(expected_message, error.message)
|
83
|
+
end
|
84
|
+
end
|
data/test/lib/jat/plugins/simple_api/lib/{params/parse_test.rb → fields_param_parser_test.rb}
RENAMED
@@ -2,13 +2,19 @@
|
|
2
2
|
|
3
3
|
require "test_helper"
|
4
4
|
|
5
|
-
describe "Jat::Plugins::SimpleApi::
|
5
|
+
describe "Jat::Plugins::SimpleApi::FieldsParamParser" do
|
6
6
|
before do
|
7
|
-
Jat::Plugins.
|
7
|
+
Jat::Plugins.find_plugin :simple_api
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:jat_class) do
|
11
|
+
ser = Class.new(Jat)
|
12
|
+
ser.plugin :simple_api
|
13
|
+
ser
|
8
14
|
end
|
9
15
|
|
10
16
|
def parse(str)
|
11
|
-
|
17
|
+
jat_class::FieldsParamParser.parse(str)
|
12
18
|
end
|
13
19
|
|
14
20
|
it "returns empty hash when nil provided" do
|
@@ -24,7 +30,7 @@ describe "Jat::Plugins::SimpleApi::Params::Parse" do
|
|
24
30
|
end
|
25
31
|
|
26
32
|
it "parses multiple fields" do
|
27
|
-
assert_equal({id: {}, name: {}}, parse("id,name"))
|
33
|
+
assert_equal({id: {}, name: {}}, parse("id, name"))
|
28
34
|
end
|
29
35
|
|
30
36
|
it "parses single resource with single field" do
|