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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jat/attribute.rb +36 -4
  3. data/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads.rb +7 -3
  4. data/lib/jat/plugins/_activerecord_preloads/lib/preloader.rb +7 -13
  5. data/lib/jat/plugins/_lower_camel_case/_lower_camel_case.rb +32 -0
  6. data/lib/jat/plugins/_preloads/_preloads.rb +8 -2
  7. data/lib/jat/plugins/cache/cache.rb +9 -5
  8. data/lib/jat/plugins/json_api/json_api.rb +145 -105
  9. data/lib/jat/plugins/json_api/lib/fields_param_parser.rb +40 -0
  10. data/lib/jat/plugins/json_api/lib/include_param_parser.rb +84 -0
  11. data/lib/jat/plugins/json_api/lib/map.rb +92 -27
  12. data/lib/jat/plugins/json_api/lib/params/fields/validate.rb +8 -5
  13. data/lib/jat/plugins/json_api/lib/response.rb +84 -196
  14. data/lib/jat/plugins/json_api/lib/response_piece.rb +166 -0
  15. data/lib/jat/plugins/json_api_activerecord/json_api_activerecord.rb +31 -0
  16. data/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads.rb +16 -24
  17. data/lib/jat/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +30 -0
  18. data/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache.rb +54 -0
  19. data/lib/jat/plugins/json_api_validate_params/json_api_validate_params.rb +57 -0
  20. data/lib/jat/plugins/json_api_validate_params/lib/params_error.rb +6 -0
  21. data/lib/jat/plugins/json_api_validate_params/lib/validate_fields_param.rb +59 -0
  22. data/lib/jat/plugins/json_api_validate_params/lib/validate_include_param.rb +33 -0
  23. data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +97 -0
  24. data/lib/jat/plugins/simple_api/lib/map.rb +80 -10
  25. data/lib/jat/plugins/simple_api/lib/response.rb +78 -89
  26. data/lib/jat/plugins/simple_api/lib/response_piece.rb +84 -0
  27. data/lib/jat/plugins/simple_api/simple_api.rb +83 -24
  28. data/lib/jat/plugins/simple_api_activerecord/lib/preloads.rb +55 -0
  29. data/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord.rb +31 -0
  30. data/lib/jat/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +30 -0
  31. data/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache.rb +48 -0
  32. data/lib/jat/plugins/simple_api_validate_params/lib/fields_error.rb +6 -0
  33. data/lib/jat/plugins/simple_api_validate_params/lib/validate_fields_param.rb +45 -0
  34. data/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params.rb +45 -0
  35. data/lib/jat/plugins/to_str/to_str.rb +10 -4
  36. data/lib/jat/plugins.rb +3 -16
  37. data/lib/jat.rb +28 -30
  38. data/test/lib/jat/attribute_test.rb +15 -5
  39. data/test/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads_test.rb +34 -15
  40. data/test/lib/jat/plugins/_activerecord_preloads/lib/preloader_test.rb +10 -24
  41. data/test/lib/jat/plugins/_camel_lower/_camel_lower_test.rb +26 -0
  42. data/test/lib/jat/plugins/_preloads/lib/format_user_preloads_test.rb +1 -1
  43. data/test/lib/jat/plugins/_preloads/lib/preloads_with_path_test.rb +1 -1
  44. data/test/lib/jat/plugins/cache/cache_test.rb +11 -11
  45. data/test/lib/jat/plugins/json_api/json_api_test.rb +63 -47
  46. data/test/lib/jat/plugins/json_api/lib/{params/fields_test.rb → fields_param_parser_test.rb} +7 -6
  47. data/test/lib/jat/plugins/json_api/lib/{params/include_test.rb → include_param_parser_test.rb} +4 -4
  48. data/test/lib/jat/plugins/json_api/lib/map_test.rb +150 -79
  49. data/test/lib/jat/plugins/json_api/lib/response_test.rb +32 -32
  50. data/test/lib/jat/plugins/{_json_api_activerecord/_json_api_activerecord_test.rb → json_api_activerecord/json_api_activerecord_test.rb} +14 -5
  51. data/test/lib/jat/plugins/{_json_api_activerecord → json_api_activerecord}/lib/preloads_test.rb +11 -10
  52. data/test/lib/jat/plugins/json_api_camel_lower/json_api_camel_lower_test.rb +79 -0
  53. data/test/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache_test.rb +107 -0
  54. data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +84 -0
  55. data/test/lib/jat/plugins/simple_api/lib/{params/parse_test.rb → fields_param_parser_test.rb} +10 -4
  56. data/test/lib/jat/plugins/simple_api/lib/map_test.rb +111 -34
  57. data/test/lib/jat/plugins/simple_api/lib/response_test.rb +80 -74
  58. data/test/lib/jat/plugins/simple_api/simple_api_test.rb +91 -25
  59. data/test/lib/jat/plugins/simple_api_activerecord/lib/preloads_test.rb +135 -0
  60. data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +38 -0
  61. data/test/lib/jat/plugins/simple_api_camel_lower/simple_api_camel_lower_test.rb +48 -0
  62. data/test/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache_test.rb +95 -0
  63. data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +89 -0
  64. data/test/lib/jat/plugins/to_str/to_str_test.rb +3 -3
  65. data/test/lib/jat_test.rb +47 -24
  66. data/test/lib/plugin_test.rb +3 -3
  67. data/test/test_helper.rb +0 -3
  68. data/test/test_plugin.rb +9 -12
  69. metadata +60 -71
  70. data/CHANGELOG.md +0 -7
  71. data/README.md +0 -21
  72. data/jat.gemspec +0 -37
  73. data/lib/jat/plugins/_json_api_activerecord/_json_api_activerecord.rb +0 -22
  74. data/lib/jat/plugins/camel_lower/camel_lower.rb +0 -18
  75. data/lib/jat/plugins/json_api/lib/construct_traversal_map.rb +0 -91
  76. data/lib/jat/plugins/json_api/lib/presenters/document_links_presenter.rb +0 -48
  77. data/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter.rb +0 -48
  78. data/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter.rb +0 -48
  79. data/lib/jat/plugins/json_api/lib/presenters/links_presenter.rb +0 -48
  80. data/lib/jat/plugins/json_api/lib/presenters/meta_presenter.rb +0 -48
  81. data/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter.rb +0 -53
  82. data/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter.rb +0 -53
  83. data/lib/jat/plugins/json_api/lib/traversal_map.rb +0 -34
  84. data/lib/jat/plugins/simple_api/lib/construct_traversal_map.rb +0 -45
  85. data/lib/jat/plugins/simple_api/lib/params/parse.rb +0 -68
  86. data/lib/jat/presenter.rb +0 -51
  87. data/test/lib/jat/plugins/camel_lower/camel_lower_test.rb +0 -78
  88. data/test/lib/jat/plugins/json_api/lib/construct_traversal_map_test.rb +0 -119
  89. data/test/lib/jat/plugins/json_api/lib/params/fields/parse_test.rb +0 -24
  90. data/test/lib/jat/plugins/json_api/lib/params/fields/validate_test.rb +0 -47
  91. data/test/lib/jat/plugins/json_api/lib/params/include/parse_test.rb +0 -46
  92. data/test/lib/jat/plugins/json_api/lib/params/include/validate_test.rb +0 -51
  93. data/test/lib/jat/plugins/json_api/lib/presenters/document_links_presenter_test.rb +0 -69
  94. data/test/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter_test.rb +0 -69
  95. data/test/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter_test.rb +0 -69
  96. data/test/lib/jat/plugins/json_api/lib/presenters/links_presenter_test.rb +0 -69
  97. data/test/lib/jat/plugins/json_api/lib/presenters/meta_presenter_test.rb +0 -69
  98. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter_test.rb +0 -75
  99. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter_test.rb +0 -75
  100. data/test/lib/jat/plugins/json_api/lib/traversal_map_test.rb +0 -58
  101. data/test/lib/jat/plugins/simple_api/lib/construct_traversal_map_test.rb +0 -100
  102. 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.load_plugin(:simple_api) }
6
+ before { Jat::Plugins.find_plugin(:simple_api) }
7
7
 
8
- subject { Jat::Plugins::SimpleApi::Map.call(jat) }
8
+ let(:base_class) { Class.new(Jat) { plugin :simple_api } }
9
+ let(:described_class) { a::Map }
9
10
 
10
- let(:jat_class) do
11
- Class.new(Jat) do
12
- plugin :simple_api
11
+ let(:a) do
12
+ ser = Class.new(base_class)
13
13
 
14
- attribute :a1
15
- attribute :a2
16
- attribute :a3, exposed: false
17
- attribute :a4, exposed: false
18
- attribute :a5, exposed: false
19
- end
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
- let(:jat) { jat_class.new(nil, {**params, **context}) }
23
- let(:params) { {} }
24
- let(:context) { {} }
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
- describe "when no params given" do
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
- describe "when fields given" do
33
- let(:params) { {params: {fields: "a2,a3,a4"}} }
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
- it "constructs map with default and provided fields" do
36
- assert_equal({a1: {}, a2: {}, a3: {}, a4: {}}, subject)
37
- end
114
+ assert_equal expected_result, result
38
115
  end
39
116
 
40
- describe "with `exposed: all` context" do
41
- let(:context) { {exposed: :all} }
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
- it "constructs map with all fields" do
44
- assert_equal({a1: {}, a2: {}, a3: {}, a4: {}, a5: {}}, subject)
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
- describe "with `exposed: none` context" do
49
- let(:params) { {params: {fields: "a2,a3,a4"}} }
50
- let(:context) { {exposed: :none} }
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
- it "constructs map with only requested fields" do
53
- assert_equal({a2: {}, a3: {}, a4: {}}, subject)
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 structures root_for_one and root_for_many keys" do
77
+ it "returns correct roots" do
96
78
  str_serializer = Class.new(base_class) do
97
- root(:not_used)
98
- root_for_one(:digit)
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", params: {fields: "chars(next)"})
256
+ str_serializer.to_h("ab", fields: "chars(next)")
297
257
  )
298
258
  end
299
259
 
300
- it "does not overwrite manually added meta" do
301
- str_serializer = Class.new(base_class) do
302
- root(:root)
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
- attribute(:id) { |obj| obj }
264
+ assert_equal({meta: {any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
306
265
  end
307
266
 
308
- assert_equal(
309
- {root: {id: "1"}, meta: {version: "2.0.0"}},
310
- str_serializer.to_h("1", meta: {version: "2.0.0"})
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
- it "allows to provide lambda as meta key" do
315
- str_serializer = Class.new(base_class) do
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
- attribute(:id) { |obj| obj }
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
- assert_equal(
327
- {root: {id: "1"}, meta: {obj: "1", context: {foo: :bar}, time: Time.new(2020, 1, 1)}},
328
- str_serializer.to_h("1", foo: :bar)
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
- it "does not adds nil meta" do
333
- str_serializer = Class.new(base_class) do
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
- attribute(:id) { |obj| obj }
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
- assert_equal({root: {id: "1"}}, str_serializer.to_h("1", bazz: nil))
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.load_plugin(:simple_api) }
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 _json_api_activerecord plugin if activerecord option provided" do
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(:_json_api_activerecord, activerecord: true)
21
+ jat_class.expects(:plugin).with(:simple_api_activerecord, activerecord: true)
22
22
 
23
- Jat::Plugins.after_load(plugin, jat_class, activerecord: true)
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("JAT", {}) }
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 "#traversal_map" do
38
- it "returns memorized traversal_map hash" do
39
- assert_equal jat.traversal_map.class, Hash
40
- assert_same jat.traversal_map, jat.traversal_map
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
- describe "ClassMethods" do
46
- describe ".inherited" do
47
- it "inherits root" do
48
- child = Class.new(jat_class)
49
- assert_equal :data, child.root
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 "saves and returns current root" do
55
- assert_equal :data, jat_class.root
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 "users"
60
- assert_equal :users, jat_class.root
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 "saves and returns meta key" do
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