jat 0.0.1 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jat/attribute.rb +107 -0
  3. data/lib/jat/config.rb +35 -0
  4. data/lib/jat/plugins/activerecord/activerecord.rb +23 -0
  5. data/lib/jat/plugins/cache/cache.rb +47 -0
  6. data/lib/jat/plugins/common/_activerecord_preloads/_activerecord_preloads.rb +38 -0
  7. data/lib/jat/plugins/common/_activerecord_preloads/lib/preloader.rb +93 -0
  8. data/lib/jat/plugins/common/_lower_camel_case/_lower_camel_case.rb +36 -0
  9. data/lib/jat/plugins/common/_preloads/_preloads.rb +63 -0
  10. data/lib/jat/plugins/common/_preloads/lib/format_user_preloads.rb +52 -0
  11. data/lib/jat/plugins/common/_preloads/lib/preloads_with_path.rb +78 -0
  12. data/lib/jat/plugins/json_api/json_api.rb +251 -0
  13. data/lib/jat/plugins/json_api/lib/fields_param_parser.rb +40 -0
  14. data/lib/jat/plugins/json_api/lib/include_param_parser.rb +84 -0
  15. data/lib/jat/plugins/json_api/lib/map.rb +119 -0
  16. data/lib/jat/plugins/json_api/lib/params/fields/parse.rb +27 -0
  17. data/lib/jat/plugins/json_api/lib/params/fields/validate.rb +58 -0
  18. data/lib/jat/plugins/json_api/lib/params/fields.rb +23 -0
  19. data/lib/jat/plugins/json_api/lib/params/include/parse.rb +55 -0
  20. data/lib/jat/plugins/json_api/lib/params/include/validate.rb +29 -0
  21. data/lib/jat/plugins/json_api/lib/params/include.rb +49 -0
  22. data/lib/jat/plugins/json_api/lib/response.rb +123 -0
  23. data/lib/jat/plugins/json_api/lib/response_piece.rb +175 -0
  24. data/lib/jat/plugins/json_api/plugins/json_api_activerecord/json_api_activerecord.rb +23 -0
  25. data/lib/jat/plugins/json_api/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +34 -0
  26. data/lib/jat/plugins/json_api/plugins/json_api_maps_cache/json_api_maps_cache.rb +58 -0
  27. data/lib/jat/plugins/json_api/plugins/json_api_preloads/json_api_preloads.rb +38 -0
  28. data/lib/jat/plugins/json_api/plugins/json_api_preloads/lib/preloads.rb +76 -0
  29. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/json_api_validate_params.rb +61 -0
  30. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/params_error.rb +6 -0
  31. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_fields_param.rb +59 -0
  32. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_include_param.rb +33 -0
  33. data/lib/jat/plugins/lower_camel_case/lower_camel_case.rb +23 -0
  34. data/lib/jat/plugins/maps_cache/maps_cache.rb +23 -0
  35. data/lib/jat/plugins/preloads/preloads.rb +23 -0
  36. data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +97 -0
  37. data/lib/jat/plugins/simple_api/lib/map.rb +99 -0
  38. data/lib/jat/plugins/simple_api/lib/response.rb +119 -0
  39. data/lib/jat/plugins/simple_api/lib/response_piece.rb +80 -0
  40. data/lib/jat/plugins/simple_api/plugins/simple_api_activerecord/simple_api_activerecord.rb +23 -0
  41. data/lib/jat/plugins/simple_api/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +34 -0
  42. data/lib/jat/plugins/simple_api/plugins/simple_api_maps_cache/simple_api_maps_cache.rb +50 -0
  43. data/lib/jat/plugins/simple_api/plugins/simple_api_preloads/lib/preloads.rb +55 -0
  44. data/lib/jat/plugins/simple_api/plugins/simple_api_preloads/simple_api_preloads.rb +38 -0
  45. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/lib/fields_error.rb +6 -0
  46. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/lib/validate_fields_param.rb +45 -0
  47. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/simple_api_validate_params.rb +49 -0
  48. data/lib/jat/plugins/simple_api/simple_api.rb +125 -0
  49. data/lib/jat/plugins/to_str/to_str.rb +54 -0
  50. data/lib/jat/plugins/types/types.rb +54 -0
  51. data/lib/jat/plugins/validate_params/validate_params.rb +23 -0
  52. data/lib/jat/plugins.rb +39 -0
  53. data/lib/jat/utils/enum_deep_dup.rb +29 -0
  54. data/lib/jat/utils/enum_deep_freeze.rb +19 -0
  55. data/lib/jat.rb +66 -141
  56. data/test/lib/jat/attribute_test.rb +152 -0
  57. data/test/lib/jat/config_test.rb +57 -0
  58. data/test/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads_test.rb +59 -0
  59. data/test/lib/jat/plugins/_activerecord_preloads/lib/preloader_test.rb +84 -0
  60. data/test/lib/jat/plugins/_camel_lower/_camel_lower_test.rb +26 -0
  61. data/test/lib/jat/plugins/_preloads/_preloads_test.rb +68 -0
  62. data/test/lib/jat/plugins/_preloads/lib/format_user_preloads_test.rb +47 -0
  63. data/test/lib/jat/plugins/_preloads/lib/preloads_with_path_test.rb +33 -0
  64. data/test/lib/jat/plugins/cache/cache_test.rb +82 -0
  65. data/test/lib/jat/plugins/json_api/json_api_test.rb +162 -0
  66. data/test/lib/jat/plugins/json_api/lib/fields_param_parser_test.rb +38 -0
  67. data/test/lib/jat/plugins/json_api/lib/include_param_parser_test.rb +41 -0
  68. data/test/lib/jat/plugins/json_api/lib/map_test.rb +188 -0
  69. data/test/lib/jat/plugins/json_api/lib/response_test.rb +489 -0
  70. data/test/lib/jat/plugins/json_api_activerecord/json_api_activerecord_test.rb +24 -0
  71. data/test/lib/jat/plugins/json_api_camel_lower/json_api_camel_lower_test.rb +79 -0
  72. data/test/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache_test.rb +107 -0
  73. data/test/lib/jat/plugins/json_api_preloads/json_api_preloads_test.rb +37 -0
  74. data/test/lib/jat/plugins/json_api_preloads/lib/preloads_test.rb +197 -0
  75. data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +84 -0
  76. data/test/lib/jat/plugins/simple_api/lib/fields_param_parser_test.rb +77 -0
  77. data/test/lib/jat/plugins/simple_api/lib/map_test.rb +133 -0
  78. data/test/lib/jat/plugins/simple_api/lib/response_test.rb +348 -0
  79. data/test/lib/jat/plugins/simple_api/simple_api_test.rb +139 -0
  80. data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +24 -0
  81. data/test/lib/jat/plugins/simple_api_camel_lower/simple_api_camel_lower_test.rb +48 -0
  82. data/test/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache_test.rb +95 -0
  83. data/test/lib/jat/plugins/simple_api_preloads/lib/preloads_test.rb +140 -0
  84. data/test/lib/jat/plugins/simple_api_preloads/simple_api_preloads_test.rb +37 -0
  85. data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +89 -0
  86. data/test/lib/jat/plugins/to_str/to_str_test.rb +52 -0
  87. data/test/lib/jat/plugins/types/types_test.rb +79 -0
  88. data/test/lib/jat/utils/enum_deep_dup_test.rb +31 -0
  89. data/test/lib/jat/utils/enum_deep_freeze_test.rb +28 -0
  90. data/test/lib/jat_test.rb +143 -0
  91. data/test/lib/plugin_test.rb +49 -0
  92. data/test/support/activerecord.rb +24 -0
  93. data/test/test_helper.rb +13 -0
  94. data/test/test_plugin.rb +56 -0
  95. metadata +243 -11
@@ -0,0 +1,348 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApi::Response" do
6
+ let(:base_class) { Class.new(Jat) { plugin :simple_api } }
7
+
8
+ it "returns empty hash when nothing to serialize" do
9
+ empty_serializer = Class.new(base_class)
10
+
11
+ assert_equal({}, empty_serializer.to_h(nil))
12
+ end
13
+
14
+ it "returns correct structure with data" do
15
+ str_serializer = Class.new(base_class) do
16
+ attribute(:id) { |obj| obj }
17
+ end
18
+
19
+ assert_equal({id: "STRING"}, str_serializer.to_h("STRING"))
20
+ end
21
+
22
+ it "returns correct structure when parameter `many` defined manually" do
23
+ str_serializer = Class.new(base_class) do
24
+ attribute(:id) { |obj| obj[:foo] }
25
+ end
26
+
27
+ # By default hash is interpreted as `many: true` as it is Enumerable
28
+ obj = {foo: :bar}
29
+ context = {many: false}
30
+
31
+ assert_equal({id: :bar}, str_serializer.to_h(obj, context))
32
+ end
33
+
34
+ it "returns correct structure with array data" do
35
+ str_serializer = Class.new(base_class) do
36
+ attribute(:id) { |obj| obj }
37
+ end
38
+
39
+ assert_equal(
40
+ [{id: "1"}, {id: "2"}],
41
+ str_serializer.to_h(%w[1 2])
42
+ )
43
+ end
44
+
45
+ it "returns correct structure with array data" do
46
+ str_serializer = Class.new(base_class) do
47
+ attribute(:id) { |obj| obj }
48
+ end
49
+
50
+ assert_equal(
51
+ [{id: "1"}, {id: "2"}],
52
+ str_serializer.to_h(%w[1 2])
53
+ )
54
+ end
55
+
56
+ it "returns correct structure with one object with root key" do
57
+ str_serializer = Class.new(base_class) do
58
+ root(:digit)
59
+ attribute(:id) { |obj| obj }
60
+ end
61
+
62
+ assert_equal({digit: {id: "1"}}, str_serializer.to_h("1"))
63
+ end
64
+
65
+ it "returns correct structure with list with root key" do
66
+ str_serializer = Class.new(base_class) do
67
+ root(:digits)
68
+ attribute(:id) { |obj| obj }
69
+ end
70
+
71
+ assert_equal(
72
+ {digits: [{id: "1"}, {id: "2"}]},
73
+ str_serializer.to_h(%w[1 2])
74
+ )
75
+ end
76
+
77
+ it "returns correct roots" do
78
+ str_serializer = Class.new(base_class) do
79
+ root(one: :digit, many: :digits)
80
+
81
+ attribute(:id) { |obj| obj }
82
+ end
83
+
84
+ assert_equal({digit: {id: "1"}}, str_serializer.to_h("1"))
85
+ assert_equal({digits: [{id: "1"}]}, str_serializer.to_h(["1"]))
86
+ end
87
+
88
+ it "returns correct structures when root is overwritten" do
89
+ str_serializer = Class.new(base_class) do
90
+ root(:root)
91
+ attribute(:id) { |obj| obj }
92
+ end
93
+
94
+ assert_equal({foo: {id: "1"}}, str_serializer.to_h("1", root: :foo))
95
+ assert_equal({foo: [{id: "1"}]}, str_serializer.to_h(["1"], root: :foo))
96
+ end
97
+
98
+ it "returns correct structure with data multiple attributes" do
99
+ str_serializer = Class.new(base_class) do
100
+ attribute(:id) { |obj| obj }
101
+ attribute :length
102
+ end
103
+
104
+ assert_equal({id: "1", length: 1}, str_serializer.to_h("1"))
105
+ end
106
+
107
+ it "returns correct structure with has-one relationship" do
108
+ int_serializer = Class.new(base_class) do
109
+ attribute(:id) { |obj| obj }
110
+ end
111
+
112
+ str_serializer = Class.new(base_class) do
113
+ attribute(:id) { |obj| obj[0] }
114
+ attribute :length, serializer: int_serializer, exposed: true
115
+ end
116
+
117
+ assert_equal({id: "S", length: {id: 6}}, str_serializer.to_h("STRING"))
118
+ end
119
+
120
+ it "returns correct structure when children serializer defined as lambda" do
121
+ int_serializer = Class.new(base_class) do
122
+ attribute(:id) { |obj| obj }
123
+ end
124
+
125
+ str_serializer = Class.new(base_class) do
126
+ attribute(:id) { |obj| obj[0] }
127
+ attribute :length, serializer: -> { int_serializer }, exposed: true
128
+ end
129
+
130
+ assert_equal({id: "S", length: {id: 6}}, str_serializer.to_h("STRING"))
131
+ end
132
+
133
+ it "does not return has-one relationship when not exposed" do
134
+ int_serializer = Class.new(base_class) do
135
+ attribute(:id) { |obj| obj }
136
+ end
137
+
138
+ str_serializer = Class.new(base_class) do
139
+ attribute(:id) { |obj| obj[0] }
140
+ attribute :length, serializer: int_serializer, exposed: false
141
+ end
142
+
143
+ assert_equal({id: "S"}, str_serializer.to_h("STRING"))
144
+ end
145
+
146
+ it "returns nil as empty has-one relationship" do
147
+ int_serializer = Class.new(base_class)
148
+
149
+ str_serializer = Class.new(base_class) do
150
+ attribute(:id) { |obj| obj[0] }
151
+ attribute(:length, serializer: int_serializer, exposed: true) { |_obj| nil }
152
+ end
153
+
154
+ assert_equal(
155
+ {id: "S", length: nil},
156
+ str_serializer.to_h("STRING")
157
+ )
158
+ end
159
+
160
+ it "returns correct structure with has-one relationship with attributes" do
161
+ int_serializer = Class.new(base_class) do
162
+ attribute(:id) { |obj| obj }
163
+ attribute(:next) { |obj| obj + 1 }
164
+ end
165
+
166
+ str_serializer = Class.new(base_class) do
167
+ attribute(:id) { |obj| obj[0] }
168
+ attribute :length, serializer: int_serializer, exposed: true
169
+ end
170
+
171
+ assert_equal(
172
+ {id: "S", length: {id: 6, next: 7}},
173
+ str_serializer.to_h("STRING")
174
+ )
175
+ end
176
+
177
+ it "returns empty array as empty has-many relationship" do
178
+ chr_serializer = Class.new(base_class)
179
+ str_serializer = Class.new(base_class) do
180
+ attribute(:id) { |_obj| "id" }
181
+ attribute :chars, serializer: chr_serializer, many: true, exposed: true
182
+ end
183
+
184
+ assert_equal({id: "id", chars: []}, str_serializer.to_h(""))
185
+ end
186
+
187
+ it "returns correct structure with has-many relationship" do
188
+ chr_serializer = Class.new(base_class) do
189
+ attribute(:id) { |obj| obj }
190
+ end
191
+
192
+ str_serializer = Class.new(base_class) do
193
+ attribute(:id) { |obj| obj[0] }
194
+ attribute :chars, serializer: chr_serializer, many: true, exposed: true
195
+ end
196
+
197
+ assert_equal(
198
+ {id: "a", chars: [{id: "a"}, {id: "b"}]},
199
+ str_serializer.to_h("ab")
200
+ )
201
+ end
202
+
203
+ it "automatically checks if nested relationship is enumerable or single object" do
204
+ chr_serializer = Class.new(base_class) do
205
+ attribute(:id) { |obj| obj }
206
+ end
207
+
208
+ int_serializer = Class.new(base_class) do
209
+ attribute(:id) { |obj| obj }
210
+ end
211
+
212
+ str_serializer = Class.new(base_class) do
213
+ attribute(:id) { |obj| obj[0] }
214
+ attribute :chars, serializer: chr_serializer, exposed: true, many: true
215
+ attribute :length, serializer: int_serializer, exposed: true, many: false
216
+ end
217
+
218
+ assert_equal(
219
+ {id: "a", chars: [{id: "a"}, {id: "b"}], length: {id: 2}},
220
+ str_serializer.to_h("ab")
221
+ )
222
+ end
223
+
224
+ it "returns correct structure with has-many relationship with attributes" do
225
+ chr_serializer = Class.new(base_class) do
226
+ attribute(:id) { |obj| obj }
227
+ attribute :next
228
+ end
229
+
230
+ str_serializer = Class.new(base_class) do
231
+ attribute(:id) { |obj| obj[0] }
232
+ attribute :chars, serializer: chr_serializer, many: true, exposed: true
233
+ end
234
+
235
+ assert_equal(
236
+ {id: "a", chars: [{id: "a", next: "b"}, {id: "b", next: "c"}]},
237
+ str_serializer.to_h("ab")
238
+ )
239
+ end
240
+
241
+ it "accepts fields" do
242
+ # All fields are not exposed in this serializers,
243
+ # We will show only attributes provided in `fields` param
244
+ chr_serializer = Class.new(base_class) do
245
+ attribute(:id, exposed: false) { |obj| obj }
246
+ attribute :next, exposed: false
247
+ end
248
+
249
+ str_serializer = Class.new(base_class) do
250
+ attribute(:id, exposed: false) { |obj| obj }
251
+ attribute :chars, serializer: chr_serializer, many: true, exposed: false
252
+ end
253
+
254
+ assert_equal(
255
+ {chars: [{next: "b"}, {next: "c"}]},
256
+ str_serializer.to_h("ab", fields: "chars(next)")
257
+ )
258
+ end
259
+
260
+ describe "adding meta" do
261
+ it "returns correct structure with only meta" do
262
+ empty_serializer = Class.new(base_class)
263
+
264
+ assert_equal({meta: {any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
265
+ end
266
+
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 }
271
+
272
+ assert_equal({metadata: {foo: :bar, any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
273
+ end
274
+
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
+ )
292
+ end
293
+
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
298
+
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
301
+
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
+ )
335
+ end
336
+
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
347
+ end
348
+ end
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApi" do
6
+ before { @plugin = Jat::Plugins.find_plugin(:simple_api) }
7
+
8
+ let(:jat_class) do
9
+ new_class = Class.new(Jat)
10
+ new_class.plugin(plugin)
11
+ new_class.root :data
12
+ new_class.attribute :id, key: :itself
13
+ new_class
14
+ end
15
+
16
+ let(:plugin) { @plugin }
17
+
18
+ describe ".after_load" do
19
+ it "adds default `:meta` meta_key config option" do
20
+ jat_class = Class.new(Jat)
21
+ assert_nil jat_class.config[:meta_key]
22
+
23
+ plugin.load(jat_class)
24
+ plugin.after_load(jat_class)
25
+ assert_equal :meta, jat_class.config[:meta_key]
26
+ end
27
+
28
+ it "adds config variable with name of response plugin that was loaded" do
29
+ jat_class = Class.new(Jat)
30
+ jat_class.plugin(:simple_api)
31
+
32
+ assert_equal(:simple_api, jat_class.config[:response_plugin_loaded])
33
+ end
34
+ end
35
+
36
+ describe "InstanceMethods" do
37
+ let(:jat) { jat_class.new({}) }
38
+
39
+ describe "#to_h" do
40
+ it "returns response in a simple-api format" do
41
+ expected_result = {data: {id: "JAT"}}
42
+ assert_equal expected_result, jat.to_h("JAT")
43
+ end
44
+ end
45
+
46
+ describe "#map" do
47
+ it "returns map for provided context" do
48
+ jat_class::Map.expects(:call).with("CONTEXT").returns "MAP"
49
+ assert_equal "MAP", jat_class.map("CONTEXT")
50
+ end
51
+ end
52
+
53
+ describe "#map_full" do
54
+ it "returns memorized map with all fields exposed" do
55
+ jat_class::Map.expects(:call).with(exposed: :all).returns "MAP"
56
+ assert_equal "MAP", jat_class.map_full
57
+ assert_same jat_class.map_full, jat_class.map_full
58
+ end
59
+ end
60
+
61
+ describe "#map_exposed" do
62
+ it "returns memorized map with exposed by default fields" do
63
+ jat_class::Map.expects(:call).with(exposed: :default).returns "MAP"
64
+ assert_equal "MAP", jat_class.map_exposed
65
+ assert_same jat_class.map_exposed, jat_class.map_exposed
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "ClassMethods" do
71
+ describe ".root" do
72
+ it "sets root config values" do
73
+ jat_class.root :data
74
+
75
+ assert_equal :data, jat_class.config[:root_one]
76
+ assert_equal :data, jat_class.config[:root_many]
77
+ end
78
+
79
+ it "sets root config values separately for one or many objects" do
80
+ jat_class.root one: "user", many: "users"
81
+
82
+ assert_equal :user, jat_class.config[:root_one]
83
+ assert_equal :users, jat_class.config[:root_many]
84
+ end
85
+
86
+ it "removes root values when `false` or `nil` provided" do
87
+ jat_class.root :data
88
+ jat_class.root false
89
+
90
+ assert_nil jat_class.config[:root_one]
91
+ assert_nil jat_class.config[:root_many]
92
+
93
+ jat_class.root :data
94
+ jat_class.root nil
95
+
96
+ assert_nil jat_class.config[:root_one]
97
+ assert_nil jat_class.config[:root_many]
98
+ end
99
+
100
+ it "removes root values when `false` or nil provided in hash" do
101
+ jat_class.root :data
102
+ jat_class.root one: nil, many: nil
103
+ assert_nil jat_class.config[:root_one]
104
+ assert_nil jat_class.config[:root_many]
105
+
106
+ jat_class.root :data
107
+ jat_class.root one: false, many: false
108
+ assert_nil jat_class.config[:root_one]
109
+ assert_nil jat_class.config[:root_many]
110
+ end
111
+
112
+ it "symbolizes root" do
113
+ jat_class.root "data"
114
+ assert_equal :data, jat_class.config[:root_one]
115
+ assert_equal :data, jat_class.config[:root_many]
116
+
117
+ jat_class.root one: "user", many: "users"
118
+ assert_equal :user, jat_class.config[:root_one]
119
+ assert_equal :users, jat_class.config[:root_many]
120
+ end
121
+ end
122
+
123
+ describe ".meta_key" do
124
+ it "returns default meta_key" do
125
+ assert_equal :meta, jat_class.config[:meta_key]
126
+ end
127
+
128
+ it "changes meta key" do
129
+ jat_class.meta_key :metadata
130
+ assert_equal :metadata, jat_class.config[:meta_key]
131
+ end
132
+
133
+ it "symbolizes meta key" do
134
+ jat_class.meta_key "metadata"
135
+ assert_equal :metadata, jat_class.config[:meta_key]
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApiActiverecord" do
6
+ before do
7
+ @plugin = Jat::Plugins.find_plugin(:simple_api_activerecord)
8
+ end
9
+
10
+ it "checks simple_api plugin loaded before" do
11
+ jat_class = Class.new(Jat)
12
+ error = assert_raises(Jat::Error) { jat_class.plugin @plugin }
13
+ assert_match(/simple_api/, error.message)
14
+ end
15
+
16
+ it "loads other plugins" do
17
+ jat_class = Class.new(Jat)
18
+ jat_class.plugin :simple_api
19
+ jat_class.plugin :simple_api_activerecord
20
+
21
+ assert jat_class.plugin_used?(:simple_api_preloads)
22
+ assert jat_class.plugin_used?(:_activerecord_preloads)
23
+ end
24
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApiLowerCamelCase" do
6
+ let(:jat_class) do
7
+ new_class = Class.new(Jat)
8
+ new_class.plugin(:simple_api)
9
+ new_class.plugin(:simple_api_lower_camel_case)
10
+ new_class
11
+ end
12
+
13
+ it "loads _lower_camel_case plugin" do
14
+ assert jat_class.plugin_used?(:_lower_camel_case)
15
+ end
16
+
17
+ it "returns attributes in lowerCamelCase case" do
18
+ jat_class.attribute(:foo_bar) { 1 }
19
+
20
+ response = jat_class.to_h(true)
21
+ assert_equal({fooBar: 1}, response)
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: "fooBar")
28
+ assert_equal({fooBar: 1}, response)
29
+ end
30
+
31
+ it "returns meta keys in lowerCamelCase format" do
32
+ jat_class.meta(:user_agent) { "Firefox" }
33
+
34
+ response = jat_class.to_h(nil)
35
+ assert_equal({meta: {userAgent: "Firefox"}}, response)
36
+ end
37
+
38
+ it "returns context meta keys in lowerCamelCase format" do
39
+ response = jat_class.to_h(nil, meta: {user_agent: "Firefox"})
40
+ assert_equal({meta: {userAgent: "Firefox"}}, response)
41
+ end
42
+
43
+ it "joins meta in lowerCamelCase format" do
44
+ jat_class.meta(:userAgent) { "Firefox" }
45
+ response = jat_class.to_h(nil, meta: {user_agent: "Firefox 2.0"})
46
+ assert_equal({meta: {userAgent: "Firefox 2.0"}}, response)
47
+ end
48
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApiMapsCache" do
6
+ before do
7
+ @plugin = Jat::Plugins.find_plugin(:simple_api_maps_cache)
8
+ end
9
+
10
+ it "checks simple_api plugin loaded before" do
11
+ jat_class = Class.new(Jat)
12
+ error = assert_raises(Jat::Error) { jat_class.plugin @plugin }
13
+ assert_match(/simple_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(:simple_api)
30
+ plugin(:simple_api_maps_cache)
31
+
32
+ attribute(:attr1)
33
+ attribute(:attr2)
34
+ end
35
+ end
36
+
37
+ it "returns same maps when requested with same params" do
38
+ full_map1 = jat_class::Map.call(exposed: :all)
39
+ full_map2 = jat_class::Map.call(exposed: :all)
40
+
41
+ exposed_map1 = jat_class::Map.call(exposed: :default)
42
+ exposed_map2 = jat_class::Map.call(exposed: :default)
43
+
44
+ current_map1 = jat_class::Map.call(fields: "attr1")
45
+ current_map2 = jat_class::Map.call(fields: "attr1")
46
+ current_map3 = jat_class::Map.call(fields: "attr2")
47
+
48
+ assert_same(full_map1, full_map2)
49
+ assert_same(exposed_map1, exposed_map2)
50
+ assert_same(current_map1, current_map2)
51
+
52
+ # should not match, fields are not same
53
+ assert !current_map1.equal?(current_map3)
54
+ end
55
+
56
+ it "stores different maps keys" do
57
+ # key 1
58
+ jat_class::Map.call(exposed: :all)
59
+ jat_class::Map.call(exposed: :all)
60
+
61
+ # key 2
62
+ jat_class::Map.call(exposed: :default)
63
+ jat_class::Map.call(exposed: :default)
64
+
65
+ # key 3
66
+ jat_class::Map.call(fields: "attr1")
67
+ jat_class::Map.call(fields: "attr1")
68
+
69
+ # key 4
70
+ jat_class::Map.call(fields: "attr2")
71
+
72
+ # key 5
73
+ jat_class::Map.call(fields: "attr1,attr2")
74
+
75
+ assert_equal 5, jat_class::Map.maps_cache.keys.count
76
+ end
77
+
78
+ it "clears old results when there are too many cache keys" do
79
+ jat_class.config[:cached_maps_count] = 1
80
+
81
+ full_map1 = jat_class::Map.call(exposed: :all)
82
+ full_map2 = jat_class::Map.call(exposed: :all)
83
+
84
+ # ensure maps refer to same object
85
+ assert_same(full_map1, full_map2)
86
+
87
+ # replace single possible cache key with another `exposed` map
88
+ jat_class::Map.call(exposed: :default)
89
+
90
+ # calculate full map again, it should not match
91
+ full_map3 = jat_class::Map.call(exposed: :all)
92
+ assert !full_map1.equal?(full_map3)
93
+ end
94
+ end
95
+ end