jat 0.0.3 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jat/attribute.rb +26 -5
  3. data/lib/jat/config.rb +4 -7
  4. data/lib/jat/plugins/activerecord/activerecord.rb +23 -0
  5. data/lib/jat/plugins/base/base_activerecord_preloads/base_activerecord_preloads.rb +38 -0
  6. data/lib/jat/plugins/{_activerecord_preloads → base/base_activerecord_preloads}/lib/preloader.rb +22 -16
  7. data/lib/jat/plugins/base/base_lower_camel_case/base_lower_camel_case.rb +36 -0
  8. data/lib/jat/plugins/{_preloads/_preloads.rb → base/base_preloads/base_preloads.rb} +14 -4
  9. data/lib/jat/plugins/{_preloads → base/base_preloads}/lib/format_user_preloads.rb +1 -1
  10. data/lib/jat/plugins/{_preloads → base/base_preloads}/lib/preloads_with_path.rb +1 -1
  11. data/lib/jat/plugins/cache/cache.rb +14 -6
  12. data/lib/jat/plugins/json_api/json_api.rb +150 -106
  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 +92 -27
  16. data/lib/jat/plugins/json_api/lib/params/fields/validate.rb +8 -5
  17. data/lib/jat/plugins/json_api/lib/response.rb +81 -197
  18. data/lib/jat/plugins/json_api/lib/response_piece.rb +175 -0
  19. data/lib/jat/plugins/json_api/plugins/json_api_activerecord/json_api_activerecord.rb +23 -0
  20. data/lib/jat/plugins/json_api/plugins/json_api_lower_camel_case/json_api_lower_camel_case.rb +34 -0
  21. data/lib/jat/plugins/json_api/plugins/json_api_maps_cache/json_api_maps_cache.rb +58 -0
  22. data/lib/jat/plugins/json_api/plugins/json_api_preloads/json_api_preloads.rb +38 -0
  23. data/lib/jat/plugins/{_json_api_activerecord → json_api/plugins/json_api_preloads}/lib/preloads.rb +17 -25
  24. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/json_api_validate_params.rb +61 -0
  25. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/params_error.rb +6 -0
  26. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_fields_param.rb +59 -0
  27. data/lib/jat/plugins/json_api/plugins/json_api_validate_params/lib/validate_include_param.rb +33 -0
  28. data/lib/jat/plugins/lower_camel_case/lower_camel_case.rb +23 -0
  29. data/lib/jat/plugins/maps_cache/maps_cache.rb +23 -0
  30. data/lib/jat/plugins/preloads/preloads.rb +23 -0
  31. data/lib/jat/plugins/simple_api/lib/fields_param_parser.rb +97 -0
  32. data/lib/jat/plugins/simple_api/lib/map.rb +80 -10
  33. data/lib/jat/plugins/simple_api/lib/response.rb +75 -90
  34. data/lib/jat/plugins/simple_api/lib/response_piece.rb +80 -0
  35. data/lib/jat/plugins/simple_api/plugins/simple_api_activerecord/simple_api_activerecord.rb +23 -0
  36. data/lib/jat/plugins/simple_api/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case.rb +34 -0
  37. data/lib/jat/plugins/simple_api/plugins/simple_api_maps_cache/simple_api_maps_cache.rb +50 -0
  38. data/lib/jat/plugins/simple_api/plugins/simple_api_preloads/lib/preloads.rb +55 -0
  39. data/lib/jat/plugins/simple_api/plugins/simple_api_preloads/simple_api_preloads.rb +38 -0
  40. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/lib/fields_error.rb +6 -0
  41. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/lib/validate_fields_param.rb +45 -0
  42. data/lib/jat/plugins/simple_api/plugins/simple_api_validate_params/simple_api_validate_params.rb +49 -0
  43. data/lib/jat/plugins/simple_api/simple_api.rb +87 -27
  44. data/lib/jat/plugins/to_str/to_str.rb +15 -5
  45. data/lib/jat/plugins/types/types.rb +54 -0
  46. data/lib/jat/plugins/validate_params/validate_params.rb +23 -0
  47. data/lib/jat/plugins.rb +42 -30
  48. data/lib/jat.rb +40 -35
  49. data/test/lib/jat/attribute_test.rb +22 -4
  50. data/test/lib/jat/plugins/activerecord/activerecord_test.rb +27 -0
  51. data/test/lib/jat/plugins/base_activerecord_preloads/base_activerecord_preloads_test.rb +59 -0
  52. data/test/lib/jat/plugins/{_activerecord_preloads → base_activerecord_preloads}/lib/preloader_test.rb +11 -25
  53. data/test/lib/jat/plugins/base_lower_camel_case/base_lower_camel_case_test.rb +26 -0
  54. data/test/lib/jat/plugins/{_preloads/_preloads_test.rb → base_preloads/base_preloads_test.rb} +2 -2
  55. data/test/lib/jat/plugins/{_preloads → base_preloads}/lib/format_user_preloads_test.rb +3 -3
  56. data/test/lib/jat/plugins/{_preloads → base_preloads}/lib/preloads_with_path_test.rb +2 -2
  57. data/test/lib/jat/plugins/cache/cache_test.rb +11 -11
  58. data/test/lib/jat/plugins/json_api/json_api_test.rb +57 -49
  59. data/test/lib/jat/plugins/json_api/lib/fields_param_parser_test.rb +46 -0
  60. data/test/lib/jat/plugins/json_api/lib/include_param_parser_test.rb +57 -0
  61. data/test/lib/jat/plugins/json_api/lib/map_test.rb +171 -92
  62. data/test/lib/jat/plugins/json_api/lib/response_piece_test.rb +13 -0
  63. data/test/lib/jat/plugins/json_api/lib/response_test.rb +38 -32
  64. data/test/lib/jat/plugins/json_api_activerecord/json_api_activerecord_test.rb +24 -0
  65. data/test/lib/jat/plugins/json_api_lower_camel_case/json_api_lower_camel_case_test.rb +85 -0
  66. data/test/lib/jat/plugins/json_api_maps_cache/json_api_maps_cache_test.rb +107 -0
  67. data/test/lib/jat/plugins/json_api_preloads/json_api_preloads_test.rb +51 -0
  68. data/test/lib/jat/plugins/{_json_api_activerecord → json_api_preloads}/lib/preloads_test.rb +19 -13
  69. data/test/lib/jat/plugins/json_api_validate_params/json_api_validate_params_test.rb +108 -0
  70. data/test/lib/jat/plugins/lower_camel_case/lower_camel_case_test.rb +27 -0
  71. data/test/lib/jat/plugins/maps_cache/maps_cache_test.rb +27 -0
  72. data/test/lib/jat/plugins/preloads/preloads_test.rb +27 -0
  73. data/test/lib/jat/plugins/simple_api/lib/fields_param_parser_test.rb +87 -0
  74. data/test/lib/jat/plugins/simple_api/lib/map_test.rb +118 -33
  75. data/test/lib/jat/plugins/simple_api/lib/response_piece_test.rb +13 -0
  76. data/test/lib/jat/plugins/simple_api/lib/response_test.rb +90 -76
  77. data/test/lib/jat/plugins/simple_api/simple_api_test.rb +118 -25
  78. data/test/lib/jat/plugins/simple_api_activerecord/simple_api_activerecord_test.rb +24 -0
  79. data/test/lib/jat/plugins/simple_api_lower_camel_case/simple_api_lower_camel_case_test.rb +54 -0
  80. data/test/lib/jat/plugins/simple_api_maps_cache/simple_api_maps_cache_test.rb +95 -0
  81. data/test/lib/jat/plugins/simple_api_preloads/lib/preloads_test.rb +140 -0
  82. data/test/lib/jat/plugins/simple_api_preloads/simple_api_preloads_test.rb +51 -0
  83. data/test/lib/jat/plugins/simple_api_validate_params/simple_api_validate_params_test.rb +101 -0
  84. data/test/lib/jat/plugins/to_str/to_str_test.rb +3 -3
  85. data/test/lib/jat/plugins/types/types_test.rb +84 -0
  86. data/test/lib/jat/plugins/validate_params/validate_params_test.rb +27 -0
  87. data/test/lib/jat/plugins_test.rb +88 -0
  88. data/test/lib/jat_test.rb +47 -24
  89. data/test/lib/plugin_test.rb +3 -3
  90. data/test/test_helper.rb +7 -6
  91. data/test/test_plugin.rb +9 -12
  92. metadata +107 -88
  93. data/CHANGELOG.md +0 -7
  94. data/README.md +0 -21
  95. data/jat.gemspec +0 -37
  96. data/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads.rb +0 -29
  97. data/lib/jat/plugins/_json_api_activerecord/_json_api_activerecord.rb +0 -22
  98. data/lib/jat/plugins/camel_lower/camel_lower.rb +0 -18
  99. data/lib/jat/plugins/json_api/lib/construct_traversal_map.rb +0 -91
  100. data/lib/jat/plugins/json_api/lib/presenters/document_links_presenter.rb +0 -48
  101. data/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter.rb +0 -48
  102. data/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter.rb +0 -48
  103. data/lib/jat/plugins/json_api/lib/presenters/links_presenter.rb +0 -48
  104. data/lib/jat/plugins/json_api/lib/presenters/meta_presenter.rb +0 -48
  105. data/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter.rb +0 -53
  106. data/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter.rb +0 -53
  107. data/lib/jat/plugins/json_api/lib/traversal_map.rb +0 -34
  108. data/lib/jat/plugins/simple_api/lib/construct_traversal_map.rb +0 -45
  109. data/lib/jat/plugins/simple_api/lib/params/parse.rb +0 -68
  110. data/lib/jat/presenter.rb +0 -51
  111. data/test/lib/jat/plugins/_activerecord_preloads/_activerecord_preloads_test.rb +0 -40
  112. data/test/lib/jat/plugins/_json_api_activerecord/_json_api_activerecord_test.rb +0 -29
  113. data/test/lib/jat/plugins/camel_lower/camel_lower_test.rb +0 -78
  114. data/test/lib/jat/plugins/json_api/lib/construct_traversal_map_test.rb +0 -119
  115. data/test/lib/jat/plugins/json_api/lib/params/fields/parse_test.rb +0 -24
  116. data/test/lib/jat/plugins/json_api/lib/params/fields/validate_test.rb +0 -47
  117. data/test/lib/jat/plugins/json_api/lib/params/fields_test.rb +0 -37
  118. data/test/lib/jat/plugins/json_api/lib/params/include/parse_test.rb +0 -46
  119. data/test/lib/jat/plugins/json_api/lib/params/include/validate_test.rb +0 -51
  120. data/test/lib/jat/plugins/json_api/lib/params/include_test.rb +0 -41
  121. data/test/lib/jat/plugins/json_api/lib/presenters/document_links_presenter_test.rb +0 -69
  122. data/test/lib/jat/plugins/json_api/lib/presenters/document_meta_presenter_test.rb +0 -69
  123. data/test/lib/jat/plugins/json_api/lib/presenters/jsonapi_presenter_test.rb +0 -69
  124. data/test/lib/jat/plugins/json_api/lib/presenters/links_presenter_test.rb +0 -69
  125. data/test/lib/jat/plugins/json_api/lib/presenters/meta_presenter_test.rb +0 -69
  126. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_links_presenter_test.rb +0 -75
  127. data/test/lib/jat/plugins/json_api/lib/presenters/relationship_meta_presenter_test.rb +0 -75
  128. data/test/lib/jat/plugins/json_api/lib/traversal_map_test.rb +0 -58
  129. data/test/lib/jat/plugins/simple_api/lib/construct_traversal_map_test.rb +0 -100
  130. data/test/lib/jat/plugins/simple_api/lib/params/parse_test.rb +0 -71
  131. data/test/lib/jat/presenter_test.rb +0 -61
@@ -3,54 +3,139 @@
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
20
22
  end
21
23
 
22
- let(:jat) { jat_class.new(nil, {**params, **context}) }
23
- let(:params) { {} }
24
- let(:context) { {} }
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
25
31
 
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
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
30
38
  end
31
39
 
32
- describe "when fields given" do
33
- let(:params) { {params: {fields: "a2,a3,a4"}} }
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
+ describe ".call" do
49
+ it "returns all attributes when {exposed: :all} provided " do
50
+ result = described_class.call(exposed: :all)
51
+ expected_result = {
52
+ a1: {},
53
+ a2: {},
54
+ a3: {},
55
+ b: {b1: {}, b2: {}, b3: {}},
56
+ c: {c1: {}, c2: {}, c3: {}},
57
+ d: {d1: {}, d2: {}, d3: {}}
58
+ }
34
59
 
35
- it "constructs map with default and provided fields" do
36
- assert_equal({a1: {}, a2: {}, a3: {}, a4: {}}, subject)
60
+ assert_equal expected_result, result
37
61
  end
38
- end
39
62
 
40
- describe "with `exposed: all` context" do
41
- let(:context) { {exposed: :all} }
63
+ it "returns exposed attributes when {exposed: :default} provided" do
64
+ result = described_class.call(exposed: :default)
65
+ expected_result = {
66
+ a1: {},
67
+ a2: {},
68
+ d: {d1: {}, d2: {}}
69
+ }
42
70
 
43
- it "constructs map with all fields" do
44
- assert_equal({a1: {}, a2: {}, a3: {}, a4: {}, a5: {}}, subject)
71
+ assert_equal expected_result, result
72
+ end
73
+
74
+ it "returns exposed attributes when no :exposed param provided" do
75
+ result = described_class.call({})
76
+ expected_result = {
77
+ a1: {},
78
+ a2: {},
79
+ d: {d1: {}, d2: {}}
80
+ }
81
+
82
+ assert_equal expected_result, result
83
+ end
84
+
85
+ it "returns no attributes when `{exposed: :none}` provided" do
86
+ result = described_class.call(exposed: :none)
87
+ assert_equal({}, result)
45
88
  end
46
- end
47
89
 
48
- describe "with `exposed: none` context" do
49
- let(:params) { {params: {fields: "a2,a3,a4"}} }
50
- let(:context) { {exposed: :none} }
90
+ it "returns only manually exposed attributes when `{exposed: :none}` type provided" do
91
+ fields = "a2,a3,c(c2,c3),d(d2,d3)"
92
+ result = described_class.call(exposed: :none, fields: fields)
93
+
94
+ expected_result = {
95
+ a2: {},
96
+ a3: {},
97
+ c: {c2: {}, c3: {}},
98
+ d: {d2: {}, d3: {}}
99
+ }
100
+
101
+ assert_equal expected_result, result
102
+ end
103
+
104
+ it "returns combined auto-exposed and manually exposed attributes when `default` type provided" do
105
+ fields = "b(b3),c"
106
+ result = described_class.call(exposed: :default, fields: fields)
107
+ expected_result = {
108
+ a1: {},
109
+ a2: {},
110
+ b: {b1: {}, b2: {}, b3: {}},
111
+ c: {c1: {}, c2: {}},
112
+ d: {d1: {}, d2: {}}
113
+ }
114
+
115
+ assert_equal expected_result, result
116
+ end
117
+
118
+ it "raises error with informative message about recursive serialization" do
119
+ a.relationship :b, serializer: -> { b }, exposed: true
120
+ b.relationship :a, serializer: -> { a }, exposed: true
121
+
122
+ error = assert_raises(Jat::Error) { described_class.call({}) }
123
+ assert_includes "Recursive serialization: b -> a -> b", error.message
124
+ end
125
+
126
+ it "raises error with informative message about recursive serialization through 3 serializers" do
127
+ a.relationship :b, serializer: -> { b }, exposed: true
128
+ b.relationship :c, serializer: -> { c }, exposed: true
129
+ c.relationship :a, serializer: -> { a }, exposed: true
130
+
131
+ error = assert_raises(Jat::Error) { described_class.call({}) }
132
+ assert_equal "Recursive serialization: b -> c -> a -> b", error.message
133
+ end
134
+ end
51
135
 
52
- it "constructs map with only requested fields" do
53
- assert_equal({a2: {}, a3: {}, a4: {}}, subject)
136
+ describe ".inspect" do
137
+ it "returns self name" do
138
+ assert_equal "#{a}::Map", described_class.inspect
54
139
  end
55
140
  end
56
141
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ describe "Jat::Plugins::SimpleApi::ResponsePiece" do
6
+ let(:jat_class) { Class.new(Jat) { plugin :simple_api } }
7
+
8
+ describe ".inspect" do
9
+ it "returns self name" do
10
+ assert_equal "#{jat_class}::ResponsePiece", jat_class::ResponsePiece.inspect
11
+ end
12
+ end
13
+ end
@@ -11,15 +11,9 @@ 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
- attribute(:id) { |_| "STRING" }
16
+ attribute(:id) { |obj| obj }
23
17
  end
24
18
 
25
19
  assert_equal({id: "STRING"}, str_serializer.to_h("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,32 +88,12 @@ 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
 
115
94
  assert_equal({foo: {id: "1"}}, str_serializer.to_h("1", root: :foo))
116
- assert_equal({foo: [{id: "1"}]}, str_serializer.to_h(["1"], root: :foo))
117
- end
118
-
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
- )
95
+ assert_equal({foo: {id: "1"}}, str_serializer.to_h("1", root: "foo"))
96
+ assert_equal({id: "1"}, str_serializer.to_h("1", root: nil))
136
97
  end
137
98
 
138
99
  it "returns correct structure with data multiple attributes" do
@@ -293,50 +254,103 @@ describe "Jat::Plugins::SimpleApi::Response" do
293
254
 
294
255
  assert_equal(
295
256
  {chars: [{next: "b"}, {next: "c"}]},
296
- str_serializer.to_h("ab", params: {fields: "chars(next)"})
257
+ str_serializer.to_h("ab", fields: "chars(next)")
297
258
  )
298
259
  end
299
260
 
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"}
261
+ describe "adding meta" do
262
+ it "returns correct structure with only meta" do
263
+ empty_serializer = Class.new(base_class)
304
264
 
305
- attribute(:id) { |obj| obj }
265
+ assert_equal({meta: {any: :thing}}, empty_serializer.to_h(nil, meta: {any: :thing}))
306
266
  end
307
267
 
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
268
+ it "returns correct structure with overwritten meta key" do
269
+ empty_serializer = Class.new(base_class)
270
+ empty_serializer.meta_key :metadata
271
+ empty_serializer.meta(:foo) { :bar }
313
272
 
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
- }
273
+ assert_equal({metadata: {foo: :bar}}, empty_serializer.to_h(nil))
274
+ assert_equal({new_meta: {foo: :bar}}, empty_serializer.to_h(nil, meta_key: "new_meta"))
275
+ end
322
276
 
323
- attribute(:id) { |obj| obj }
277
+ it "returns correct structure with data and meta" do
278
+ str_serializer = Class.new(base_class) do
279
+ root(:root)
280
+ meta(:version) { "1.2.3" }
281
+
282
+ attribute(:id) { |obj| obj }
283
+ end
284
+
285
+ assert_equal(
286
+ {root: {id: "1"}, meta: {any: :thing, version: "1.2.3"}},
287
+ str_serializer.to_h("1", meta: {any: :thing})
288
+ )
289
+
290
+ assert_equal(
291
+ {root: [{id: "1"}], meta: {any: :thing, version: "1.2.3"}},
292
+ str_serializer.to_h(["1"], meta: {any: :thing})
293
+ )
324
294
  end
325
295
 
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
296
+ it "raises error when trying to add meta to response without root key" do
297
+ str_serializer = Class.new(base_class) do
298
+ attribute(:id) { |obj| obj }
299
+ end
331
300
 
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 {}}
301
+ error = assert_raises(Jat::Error) { str_serializer.to_h("1", meta: {foo: :bar}) }
302
+ assert_equal "Response must have a root key to add metadata", error.message
336
303
 
337
- attribute(:id) { |obj| obj }
304
+ error = assert_raises(Jat::Error) { str_serializer.to_h(["1"], meta: {foo: :bar}) }
305
+ assert_equal "Response must have a root key to add metadata", error.message
338
306
  end
339
307
 
340
- assert_equal({root: {id: "1"}}, str_serializer.to_h("1", bazz: nil))
308
+ it "does not overwrite manually added meta" do
309
+ str_serializer = Class.new(base_class) do
310
+ root(:root)
311
+ meta(:version) { "1.2.3" }
312
+
313
+ attribute(:id) { |obj| obj }
314
+ end
315
+
316
+ assert_equal(
317
+ {root: {id: "1"}, meta: {version: "2.0.0"}},
318
+ str_serializer.to_h("1", meta: {version: "2.0.0"})
319
+ )
320
+ end
321
+
322
+ it "allows to provide lambda as meta key" do
323
+ str_serializer = Class.new(base_class) do
324
+ root(:root)
325
+
326
+ meta(:obj) { |obj| obj }
327
+ meta(:context) { |_obj, context| context }
328
+ meta(:time) { Time.new(2020, 1, 1) }
329
+
330
+ attribute(:id) { |obj| obj }
331
+ end
332
+
333
+ assert_equal(
334
+ {root: {id: "1"}, meta: {obj: "1", context: {foo: :bar}, time: Time.new(2020, 1, 1)}},
335
+ str_serializer.to_h("1", foo: :bar)
336
+ )
337
+ end
338
+
339
+ it "does not adds nil meta" do
340
+ str_serializer = Class.new(base_class) do
341
+ root(:root)
342
+ meta(:foo) {}
343
+
344
+ attribute(:id) { |obj| obj }
345
+ end
346
+
347
+ assert_equal({root: {id: "1"}}, str_serializer.to_h("1", bazz: nil))
348
+ end
349
+ end
350
+
351
+ describe ".inspect" do
352
+ it "returns self name" do
353
+ assert_equal "#{base_class}::Response", base_class::Response.inspect
354
+ end
341
355
  end
342
356
  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)
@@ -15,66 +15,159 @@ describe "Jat::Plugins::SimpleApi" do
15
15
 
16
16
  let(:plugin) { @plugin }
17
17
 
18
+ describe ".before_load" do
19
+ it "raises error if response plugin was already loaded" do
20
+ jat_class = Class.new(Jat)
21
+ jat_class.config[:response_plugin_loaded] = :foobar
22
+
23
+ err = assert_raises(Jat::Error) { jat_class.plugin(:simple_api) }
24
+ assert_equal("Response plugin `foobar` was already loaded before", err.message)
25
+ end
26
+ end
27
+
18
28
  describe ".after_load" do
19
- it "loads _json_api_activerecord plugin if activerecord option provided" do
29
+ it "adds default `:meta` meta_key config option" do
30
+ jat_class = Class.new(Jat)
31
+ assert_nil jat_class.config[:meta_key]
32
+
33
+ plugin.load(jat_class)
34
+ plugin.after_load(jat_class)
35
+ assert_equal :meta, jat_class.config[:meta_key]
36
+ end
37
+
38
+ it "adds config variable with name of response plugin that was loaded" do
20
39
  jat_class = Class.new(Jat)
21
- jat_class.expects(:plugin).with(:_json_api_activerecord, activerecord: true)
40
+ jat_class.plugin(:simple_api)
22
41
 
23
- Jat::Plugins.after_load(plugin, jat_class, activerecord: true)
42
+ assert_equal(:simple_api, jat_class.config[:response_plugin_loaded])
24
43
  end
25
44
  end
26
45
 
27
46
  describe "InstanceMethods" do
28
- let(:jat) { jat_class.new("JAT", {}) }
47
+ let(:jat) { jat_class.new({}) }
29
48
 
30
49
  describe "#to_h" do
31
50
  it "returns response in a simple-api format" do
32
51
  expected_result = {data: {id: "JAT"}}
33
- assert_equal expected_result, jat.to_h
52
+ assert_equal expected_result, jat.to_h("JAT")
34
53
  end
35
54
  end
36
55
 
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
56
+ describe "#map" do
57
+ it "returns map for provided context" do
58
+ jat_class::Map.expects(:call).with("CONTEXT").returns "MAP"
59
+ assert_equal "MAP", jat_class.new("CONTEXT").map
41
60
  end
42
61
  end
43
- end
44
62
 
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
63
+ describe "#map_full" do
64
+ it "returns memorized map with all fields exposed" do
65
+ jat_class::Map.expects(:call).with(exposed: :all).returns "MAP"
66
+ assert_equal "MAP", jat_class.map_full
67
+ assert_same jat_class.map_full, jat_class.map_full
68
+ end
69
+ end
70
+
71
+ describe "#map_exposed" do
72
+ it "returns memorized map with exposed by default fields" do
73
+ jat_class::Map.expects(:call).with(exposed: :default).returns "MAP"
74
+ assert_equal "MAP", jat_class.map_exposed
75
+ assert_same jat_class.map_exposed, jat_class.map_exposed
50
76
  end
51
77
  end
78
+ end
52
79
 
80
+ describe "ClassMethods" do
53
81
  describe ".root" do
54
- it "saves and returns current root" do
55
- assert_equal :data, jat_class.root
82
+ it "sets root config values" do
83
+ jat_class.root :data
84
+
85
+ assert_equal :data, jat_class.config[:root_one]
86
+ assert_equal :data, jat_class.config[:root_many]
87
+ end
88
+
89
+ it "sets root config values separately for one or many objects" do
90
+ jat_class.root one: "user", many: "users"
91
+
92
+ assert_equal :user, jat_class.config[:root_one]
93
+ assert_equal :users, jat_class.config[:root_many]
94
+ end
95
+
96
+ it "removes root values when `false` or `nil` provided" do
97
+ jat_class.root :data
98
+ jat_class.root false
99
+
100
+ assert_nil jat_class.config[:root_one]
101
+ assert_nil jat_class.config[:root_many]
102
+
103
+ jat_class.root :data
104
+ jat_class.root nil
105
+
106
+ assert_nil jat_class.config[:root_one]
107
+ assert_nil jat_class.config[:root_many]
108
+ end
109
+
110
+ it "removes root values when `false` or nil provided in hash" do
111
+ jat_class.root :data
112
+ jat_class.root one: nil, many: nil
113
+ assert_nil jat_class.config[:root_one]
114
+ assert_nil jat_class.config[:root_many]
115
+
116
+ jat_class.root :data
117
+ jat_class.root one: false, many: false
118
+ assert_nil jat_class.config[:root_one]
119
+ assert_nil jat_class.config[:root_many]
56
120
  end
57
121
 
58
122
  it "symbolizes root" do
59
- jat_class.root "users"
60
- assert_equal :users, jat_class.root
123
+ jat_class.root "data"
124
+ assert_equal :data, jat_class.config[:root_one]
125
+ assert_equal :data, jat_class.config[:root_many]
126
+
127
+ jat_class.root one: "user", many: "users"
128
+ assert_equal :user, jat_class.config[:root_one]
129
+ assert_equal :users, jat_class.config[:root_many]
61
130
  end
62
131
  end
63
132
 
64
133
  describe ".meta_key" do
65
134
  it "returns default meta_key" do
66
- assert_equal :meta, jat_class.meta_key
135
+ assert_equal :meta, jat_class.config[:meta_key]
67
136
  end
68
137
 
69
- it "saves and returns meta key" do
138
+ it "changes meta key" do
70
139
  jat_class.meta_key :metadata
71
- assert_equal :metadata, jat_class.meta_key
72
- assert_same jat_class.meta_key, jat_class.meta_key
140
+ assert_equal :metadata, jat_class.config[:meta_key]
73
141
  end
74
142
 
75
143
  it "symbolizes meta key" do
76
144
  jat_class.meta_key "metadata"
77
- assert_equal :metadata, jat_class.meta_key
145
+ assert_equal :metadata, jat_class.config[:meta_key]
146
+ end
147
+ end
148
+
149
+ describe ".inherited" do
150
+ it "inherits root" do
151
+ jat_class.root(:foo)
152
+ child = Class.new(jat_class)
153
+ assert_equal :foo, child.config[:root_one]
154
+ assert_equal :foo, child.config[:root_many]
155
+ end
156
+
157
+ it "inherits meta" do
158
+ jat_class.meta(:foo) { "bar" }
159
+ child = Class.new(jat_class)
160
+
161
+ assert_equal "bar", child.added_meta[:foo].value(nil, nil)
162
+ end
163
+
164
+ it "does not change parents meta when children meta changed" do
165
+ jat_class.meta(:foo) { "foo" }
166
+ child = Class.new(jat_class)
167
+ child.meta(:foo) { "bazz" }
168
+
169
+ assert_equal("foo", jat_class.added_meta[:foo].value(nil, nil))
170
+ assert_equal("bazz", child.added_meta[:foo].value(nil, nil))
78
171
  end
79
172
  end
80
173
  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?(:base_activerecord_preloads)
23
+ end
24
+ end
@@ -0,0 +1,54 @@
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 "checks simple_api plugin loaded before" do
14
+ jat_class = Class.new(Jat)
15
+ error = assert_raises(Jat::Error) { jat_class.plugin :simple_api_lower_camel_case }
16
+ assert_match(/simple_api/, error.message)
17
+ end
18
+
19
+ it "loads _lower_camel_case plugin" do
20
+ assert jat_class.plugin_used?(:base_lower_camel_case)
21
+ end
22
+
23
+ it "returns attributes in lowerCamelCase case" do
24
+ jat_class.attribute(:foo_bar) { 1 }
25
+
26
+ response = jat_class.to_h(true)
27
+ assert_equal({fooBar: 1}, response)
28
+ end
29
+
30
+ it "accepts fields in lowerCamelCase format" do
31
+ jat_class.attribute(:foo_bar, exposed: false) { 1 }
32
+
33
+ response = jat_class.to_h(true, fields: "fooBar")
34
+ assert_equal({fooBar: 1}, response)
35
+ end
36
+
37
+ it "returns meta keys in lowerCamelCase format" do
38
+ jat_class.meta(:user_agent) { "Firefox" }
39
+
40
+ response = jat_class.to_h(nil)
41
+ assert_equal({meta: {userAgent: "Firefox"}}, response)
42
+ end
43
+
44
+ it "returns context meta keys in lowerCamelCase format" do
45
+ response = jat_class.to_h(nil, meta: {user_agent: "Firefox"})
46
+ assert_equal({meta: {userAgent: "Firefox"}}, response)
47
+ end
48
+
49
+ it "joins meta in lowerCamelCase format" do
50
+ jat_class.meta(:userAgent) { "Firefox" }
51
+ response = jat_class.to_h(nil, meta: {user_agent: "Firefox 2.0"})
52
+ assert_equal({meta: {userAgent: "Firefox 2.0"}}, response)
53
+ end
54
+ end