jat 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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