active_model_serializers 0.8.3 → 0.10.0

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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +17 -0
  5. data/.rubocop.yml +104 -0
  6. data/.rubocop_todo.yml +167 -0
  7. data/.simplecov +110 -0
  8. data/.travis.yml +39 -24
  9. data/CHANGELOG.md +465 -6
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +50 -1
  12. data/{MIT-LICENSE.txt → MIT-LICENSE} +3 -2
  13. data/README.md +102 -590
  14. data/Rakefile +93 -8
  15. data/active_model_serializers.gemspec +65 -23
  16. data/appveyor.yml +24 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/serve_benchmark +39 -0
  20. data/docs/ARCHITECTURE.md +126 -0
  21. data/docs/README.md +40 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +245 -0
  24. data/docs/general/caching.md +52 -0
  25. data/docs/general/configuration_options.md +100 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/getting_started.md +133 -0
  28. data/docs/general/instrumentation.md +40 -0
  29. data/docs/general/key_transforms.md +40 -0
  30. data/docs/general/logging.md +14 -0
  31. data/docs/general/rendering.md +255 -0
  32. data/docs/general/serializers.md +372 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +139 -0
  35. data/docs/howto/add_root_key.md +51 -0
  36. data/docs/howto/outside_controller_use.md +58 -0
  37. data/docs/howto/passing_arbitrary_options.md +27 -0
  38. data/docs/howto/serialize_poro.md +32 -0
  39. data/docs/howto/test.md +152 -0
  40. data/docs/integrations/ember-and-json-api.md +112 -0
  41. data/docs/integrations/grape.md +19 -0
  42. data/docs/jsonapi/errors.md +56 -0
  43. data/docs/jsonapi/schema/schema.json +366 -0
  44. data/docs/jsonapi/schema.md +151 -0
  45. data/docs/rfcs/0000-namespace.md +106 -0
  46. data/docs/rfcs/template.md +15 -0
  47. data/lib/action_controller/serialization.rb +31 -36
  48. data/lib/active_model/serializable_resource.rb +11 -0
  49. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  50. data/lib/active_model/serializer/adapter/base.rb +16 -0
  51. data/lib/active_model/serializer/adapter/json.rb +15 -0
  52. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  53. data/lib/active_model/serializer/adapter/null.rb +15 -0
  54. data/lib/active_model/serializer/adapter.rb +24 -0
  55. data/lib/active_model/serializer/array_serializer.rb +9 -0
  56. data/lib/active_model/serializer/association.rb +19 -0
  57. data/lib/active_model/serializer/associations.rb +87 -220
  58. data/lib/active_model/serializer/attribute.rb +25 -0
  59. data/lib/active_model/serializer/attributes.rb +82 -0
  60. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  61. data/lib/active_model/serializer/caching.rb +333 -0
  62. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_serializer.rb +64 -0
  64. data/lib/active_model/serializer/configuration.rb +35 -0
  65. data/lib/active_model/serializer/error_serializer.rb +10 -0
  66. data/lib/active_model/serializer/errors_serializer.rb +27 -0
  67. data/lib/active_model/serializer/field.rb +90 -0
  68. data/lib/active_model/serializer/fieldset.rb +31 -0
  69. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  70. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  71. data/lib/active_model/serializer/include_tree.rb +111 -0
  72. data/lib/active_model/serializer/links.rb +35 -0
  73. data/lib/active_model/serializer/lint.rb +146 -0
  74. data/lib/active_model/serializer/meta.rb +29 -0
  75. data/lib/active_model/serializer/null.rb +17 -0
  76. data/lib/active_model/serializer/reflection.rb +147 -0
  77. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  78. data/lib/active_model/serializer/type.rb +25 -0
  79. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  80. data/lib/active_model/serializer.rb +158 -481
  81. data/lib/active_model_serializers/adapter/attributes.rb +76 -0
  82. data/lib/active_model_serializers/adapter/base.rb +83 -0
  83. data/lib/active_model_serializers/adapter/json.rb +21 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +62 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +37 -0
  92. data/lib/active_model_serializers/adapter/json_api.rb +516 -0
  93. data/lib/active_model_serializers/adapter/null.rb +9 -0
  94. data/lib/active_model_serializers/adapter.rb +92 -0
  95. data/lib/active_model_serializers/callbacks.rb +55 -0
  96. data/lib/active_model_serializers/deprecate.rb +55 -0
  97. data/lib/active_model_serializers/deserialization.rb +13 -0
  98. data/lib/active_model_serializers/json_pointer.rb +14 -0
  99. data/lib/active_model_serializers/key_transform.rb +70 -0
  100. data/lib/active_model_serializers/logging.rb +122 -0
  101. data/lib/active_model_serializers/model.rb +49 -0
  102. data/lib/active_model_serializers/railtie.rb +46 -0
  103. data/lib/active_model_serializers/register_jsonapi_renderer.rb +65 -0
  104. data/lib/active_model_serializers/serializable_resource.rb +81 -0
  105. data/lib/active_model_serializers/serialization_context.rb +32 -0
  106. data/lib/active_model_serializers/test/schema.rb +138 -0
  107. data/lib/active_model_serializers/test/serializer.rb +125 -0
  108. data/lib/active_model_serializers/test.rb +7 -0
  109. data/lib/active_model_serializers.rb +32 -89
  110. data/lib/generators/rails/USAGE +6 -0
  111. data/lib/generators/rails/resource_override.rb +10 -0
  112. data/lib/generators/rails/serializer_generator.rb +36 -0
  113. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  114. data/lib/grape/active_model_serializers.rb +14 -0
  115. data/lib/grape/formatters/active_model_serializers.rb +15 -0
  116. data/lib/grape/helpers/active_model_serializers.rb +16 -0
  117. data/test/action_controller/adapter_selector_test.rb +53 -0
  118. data/test/action_controller/explicit_serializer_test.rb +134 -0
  119. data/test/action_controller/json/include_test.rb +167 -0
  120. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  121. data/test/action_controller/json_api/errors_test.rb +41 -0
  122. data/test/action_controller/json_api/linked_test.rb +197 -0
  123. data/test/action_controller/json_api/pagination_test.rb +116 -0
  124. data/test/action_controller/json_api/transform_test.rb +181 -0
  125. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  126. data/test/action_controller/serialization_test.rb +469 -0
  127. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  128. data/test/active_model_serializers/json_pointer_test.rb +20 -0
  129. data/test/active_model_serializers/key_transform_test.rb +263 -0
  130. data/test/active_model_serializers/logging_test.rb +77 -0
  131. data/test/active_model_serializers/model_test.rb +9 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +58 -0
  134. data/test/active_model_serializers/test/schema_test.rb +130 -0
  135. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  136. data/test/active_record_test.rb +9 -0
  137. data/test/adapter/deprecation_test.rb +100 -0
  138. data/test/adapter/json/belongs_to_test.rb +45 -0
  139. data/test/adapter/json/collection_test.rb +90 -0
  140. data/test/adapter/json/has_many_test.rb +45 -0
  141. data/test/adapter/json/transform_test.rb +93 -0
  142. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  143. data/test/adapter/json_api/collection_test.rb +95 -0
  144. data/test/adapter/json_api/errors_test.rb +78 -0
  145. data/test/adapter/json_api/fields_test.rb +87 -0
  146. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  147. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  148. data/test/adapter/json_api/has_many_test.rb +144 -0
  149. data/test/adapter/json_api/has_one_test.rb +80 -0
  150. data/test/adapter/json_api/json_api_test.rb +35 -0
  151. data/test/adapter/json_api/linked_test.rb +392 -0
  152. data/test/adapter/json_api/links_test.rb +93 -0
  153. data/test/adapter/json_api/pagination_links_test.rb +166 -0
  154. data/test/adapter/json_api/parse_test.rb +137 -0
  155. data/test/adapter/json_api/relationship_test.rb +161 -0
  156. data/test/adapter/json_api/relationships_test.rb +199 -0
  157. data/test/adapter/json_api/resource_identifier_test.rb +85 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  160. data/test/adapter/json_api/transform_test.rb +502 -0
  161. data/test/adapter/json_api/type_test.rb +61 -0
  162. data/test/adapter/json_test.rb +45 -0
  163. data/test/adapter/null_test.rb +23 -0
  164. data/test/adapter/polymorphic_test.rb +171 -0
  165. data/test/adapter_test.rb +67 -0
  166. data/test/array_serializer_test.rb +20 -73
  167. data/test/benchmark/app.rb +65 -0
  168. data/test/benchmark/benchmarking_support.rb +67 -0
  169. data/test/benchmark/bm_caching.rb +119 -0
  170. data/test/benchmark/bm_transform.rb +34 -0
  171. data/test/benchmark/config.ru +3 -0
  172. data/test/benchmark/controllers.rb +84 -0
  173. data/test/benchmark/fixtures.rb +219 -0
  174. data/test/cache_test.rb +485 -0
  175. data/test/collection_serializer_test.rb +110 -0
  176. data/test/fixtures/active_record.rb +78 -0
  177. data/test/fixtures/poro.rb +282 -0
  178. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  179. data/test/generators/serializer_generator_test.rb +57 -0
  180. data/test/grape_test.rb +82 -0
  181. data/test/include_tree/from_include_args_test.rb +26 -0
  182. data/test/include_tree/from_string_test.rb +94 -0
  183. data/test/include_tree/include_args_to_hash_test.rb +64 -0
  184. data/test/lint_test.rb +49 -0
  185. data/test/logger_test.rb +18 -0
  186. data/test/poro_test.rb +9 -0
  187. data/test/serializable_resource_test.rb +83 -0
  188. data/test/serializers/association_macros_test.rb +36 -0
  189. data/test/serializers/associations_test.rb +295 -0
  190. data/test/serializers/attribute_test.rb +151 -0
  191. data/test/serializers/attributes_test.rb +52 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  193. data/test/serializers/configuration_test.rb +32 -0
  194. data/test/serializers/fieldset_test.rb +14 -0
  195. data/test/serializers/meta_test.rb +196 -0
  196. data/test/serializers/options_test.rb +21 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  198. data/test/serializers/root_test.rb +21 -0
  199. data/test/serializers/serialization_test.rb +55 -0
  200. data/test/serializers/serializer_for_test.rb +134 -0
  201. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  202. data/test/support/isolated_unit.rb +79 -0
  203. data/test/support/rails5_shims.rb +47 -0
  204. data/test/support/rails_app.rb +45 -0
  205. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  207. data/test/support/schemas/custom/show.json +7 -0
  208. data/test/support/schemas/hyper_schema.json +93 -0
  209. data/test/support/schemas/render_using_json_api.json +43 -0
  210. data/test/support/schemas/simple_json_pointers.json +10 -0
  211. data/test/support/serialization_testing.rb +53 -0
  212. data/test/test_helper.rb +48 -23
  213. metadata +449 -43
  214. data/DESIGN.textile +0 -586
  215. data/Gemfile.edge +0 -9
  216. data/bench/perf.rb +0 -43
  217. data/cruft.md +0 -19
  218. data/lib/active_model/array_serializer.rb +0 -104
  219. data/lib/active_record/serializer_override.rb +0 -16
  220. data/lib/generators/resource_override.rb +0 -13
  221. data/lib/generators/serializer/USAGE +0 -9
  222. data/lib/generators/serializer/serializer_generator.rb +0 -42
  223. data/lib/generators/serializer/templates/serializer.rb +0 -19
  224. data/test/association_test.rb +0 -592
  225. data/test/caching_test.rb +0 -96
  226. data/test/generators_test.rb +0 -85
  227. data/test/no_serialization_scope_test.rb +0 -34
  228. data/test/serialization_scope_name_test.rb +0 -67
  229. data/test/serialization_test.rb +0 -392
  230. data/test/serializer_support_test.rb +0 -51
  231. data/test/serializer_test.rb +0 -1465
  232. data/test/test_fakes.rb +0 -217
@@ -0,0 +1,263 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveModelSerializers::KeyTransformTest < ActiveSupport::TestCase
4
+ def test_camel
5
+ obj = Object.new
6
+ scenarios = [
7
+ {
8
+ value: { :"some-key" => 'value' },
9
+ expected: { :SomeKey => 'value' }
10
+ },
11
+ {
12
+ value: { :someKey => 'value' },
13
+ expected: { :SomeKey => 'value' }
14
+ },
15
+ {
16
+ value: { :some_key => 'value' },
17
+ expected: { :SomeKey => 'value' }
18
+ },
19
+ {
20
+ value: { 'some-key' => 'value' },
21
+ expected: { 'SomeKey' => 'value' }
22
+ },
23
+ {
24
+ value: { 'someKey' => 'value' },
25
+ expected: { 'SomeKey' => 'value' }
26
+ },
27
+ {
28
+ value: { 'some_key' => 'value' },
29
+ expected: { 'SomeKey' => 'value' }
30
+ },
31
+ {
32
+ value: :"some-value",
33
+ expected: :SomeValue
34
+ },
35
+ {
36
+ value: :some_value,
37
+ expected: :SomeValue
38
+ },
39
+ {
40
+ value: :someValue,
41
+ expected: :SomeValue
42
+ },
43
+ {
44
+ value: 'some-value',
45
+ expected: 'SomeValue'
46
+ },
47
+ {
48
+ value: 'someValue',
49
+ expected: 'SomeValue'
50
+ },
51
+ {
52
+ value: 'some_value',
53
+ expected: 'SomeValue'
54
+ },
55
+ {
56
+ value: obj,
57
+ expected: obj
58
+ },
59
+ {
60
+ value: nil,
61
+ expected: nil
62
+ }
63
+ ]
64
+ scenarios.each do |s|
65
+ result = ActiveModelSerializers::KeyTransform.camel(s[:value])
66
+ assert_equal s[:expected], result
67
+ end
68
+ end
69
+
70
+ def test_camel_lower
71
+ obj = Object.new
72
+ scenarios = [
73
+ {
74
+ value: { :"some-key" => 'value' },
75
+ expected: { :someKey => 'value' }
76
+ },
77
+ {
78
+ value: { :SomeKey => 'value' },
79
+ expected: { :someKey => 'value' }
80
+ },
81
+ {
82
+ value: { :some_key => 'value' },
83
+ expected: { :someKey => 'value' }
84
+ },
85
+ {
86
+ value: { 'some-key' => 'value' },
87
+ expected: { 'someKey' => 'value' }
88
+ },
89
+ {
90
+ value: { 'SomeKey' => 'value' },
91
+ expected: { 'someKey' => 'value' }
92
+ },
93
+ {
94
+ value: { 'some_key' => 'value' },
95
+ expected: { 'someKey' => 'value' }
96
+ },
97
+ {
98
+ value: :"some-value",
99
+ expected: :someValue
100
+ },
101
+ {
102
+ value: :SomeValue,
103
+ expected: :someValue
104
+ },
105
+ {
106
+ value: :some_value,
107
+ expected: :someValue
108
+ },
109
+ {
110
+ value: 'some-value',
111
+ expected: 'someValue'
112
+ },
113
+ {
114
+ value: 'SomeValue',
115
+ expected: 'someValue'
116
+ },
117
+ {
118
+ value: 'some_value',
119
+ expected: 'someValue'
120
+ },
121
+ {
122
+ value: obj,
123
+ expected: obj
124
+ },
125
+ {
126
+ value: nil,
127
+ expected: nil
128
+ }
129
+ ]
130
+ scenarios.each do |s|
131
+ result = ActiveModelSerializers::KeyTransform.camel_lower(s[:value])
132
+ assert_equal s[:expected], result
133
+ end
134
+ end
135
+
136
+ def test_dash
137
+ obj = Object.new
138
+ scenarios = [
139
+ {
140
+ value: { :some_key => 'value' },
141
+ expected: { :"some-key" => 'value' }
142
+ },
143
+ {
144
+ value: { 'some_key' => 'value' },
145
+ expected: { 'some-key' => 'value' }
146
+ },
147
+ {
148
+ value: { :SomeKey => 'value' },
149
+ expected: { :"some-key" => 'value' }
150
+ },
151
+ {
152
+ value: { 'SomeKey' => 'value' },
153
+ expected: { 'some-key' => 'value' }
154
+ },
155
+ {
156
+ value: { :someKey => 'value' },
157
+ expected: { :"some-key" => 'value' }
158
+ },
159
+ {
160
+ value: { 'someKey' => 'value' },
161
+ expected: { 'some-key' => 'value' }
162
+ },
163
+ {
164
+ value: :some_value,
165
+ expected: :"some-value"
166
+ },
167
+ {
168
+ value: :SomeValue,
169
+ expected: :"some-value"
170
+ },
171
+ {
172
+ value: 'SomeValue',
173
+ expected: 'some-value'
174
+ },
175
+ {
176
+ value: :someValue,
177
+ expected: :"some-value"
178
+ },
179
+ {
180
+ value: 'someValue',
181
+ expected: 'some-value'
182
+ },
183
+ {
184
+ value: obj,
185
+ expected: obj
186
+ },
187
+ {
188
+ value: nil,
189
+ expected: nil
190
+ }
191
+ ]
192
+ scenarios.each do |s|
193
+ result = ActiveModelSerializers::KeyTransform.dash(s[:value])
194
+ assert_equal s[:expected], result
195
+ end
196
+ end
197
+
198
+ def test_underscore
199
+ obj = Object.new
200
+ scenarios = [
201
+ {
202
+ value: { :"some-key" => 'value' },
203
+ expected: { :some_key => 'value' }
204
+ },
205
+ {
206
+ value: { 'some-key' => 'value' },
207
+ expected: { 'some_key' => 'value' }
208
+ },
209
+ {
210
+ value: { :SomeKey => 'value' },
211
+ expected: { :some_key => 'value' }
212
+ },
213
+ {
214
+ value: { 'SomeKey' => 'value' },
215
+ expected: { 'some_key' => 'value' }
216
+ },
217
+ {
218
+ value: { :someKey => 'value' },
219
+ expected: { :some_key => 'value' }
220
+ },
221
+ {
222
+ value: { 'someKey' => 'value' },
223
+ expected: { 'some_key' => 'value' }
224
+ },
225
+ {
226
+ value: :"some-value",
227
+ expected: :some_value
228
+ },
229
+ {
230
+ value: :SomeValue,
231
+ expected: :some_value
232
+ },
233
+ {
234
+ value: :someValue,
235
+ expected: :some_value
236
+ },
237
+ {
238
+ value: 'some-value',
239
+ expected: 'some_value'
240
+ },
241
+ {
242
+ value: 'SomeValue',
243
+ expected: 'some_value'
244
+ },
245
+ {
246
+ value: 'someValue',
247
+ expected: 'some_value'
248
+ },
249
+ {
250
+ value: obj,
251
+ expected: obj
252
+ },
253
+ {
254
+ value: nil,
255
+ expected: nil
256
+ }
257
+ ]
258
+ scenarios.each do |s|
259
+ result = ActiveModelSerializers::KeyTransform.underscore(s[:value])
260
+ assert_equal s[:expected], result
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class LoggingTest < ActiveSupport::TestCase
6
+ class TestLogger < ActiveSupport::Logger
7
+ def initialize
8
+ @file = StringIO.new
9
+ super(@file)
10
+ end
11
+
12
+ def messages
13
+ @file.rewind
14
+ @file.read
15
+ end
16
+ end
17
+
18
+ def setup
19
+ @author = Author.new(name: 'Steve K.')
20
+ @post = Post.new(title: 'New Post', body: 'Body')
21
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
22
+ @post.comments = [@comment]
23
+ @comment.post = @post
24
+ @post.author = @author
25
+ @author.posts = [@post]
26
+ @post_serializer = PostSerializer.new(@post, custom_options: true)
27
+
28
+ @old_logger = ActiveModelSerializers.logger
29
+ @logger = ActiveSupport::TaggedLogging.new(TestLogger.new)
30
+ logger @logger
31
+ end
32
+
33
+ def teardown
34
+ logger @old_logger
35
+ end
36
+
37
+ def logger(logger)
38
+ ActiveModelSerializers.logger = logger
39
+ end
40
+
41
+ def test_uses_ams_as_tag
42
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
43
+ assert_match(/\[active_model_serializers\]/, @logger.messages)
44
+ end
45
+
46
+ def test_logs_when_call_serializable_hash
47
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
48
+ assert_match(/Rendered/, @logger.messages)
49
+ end
50
+
51
+ def test_logs_when_call_as_json
52
+ ActiveModelSerializers::SerializableResource.new(@post).as_json
53
+ assert_match(/Rendered/, @logger.messages)
54
+ end
55
+
56
+ def test_logs_when_call_to_json
57
+ ActiveModelSerializers::SerializableResource.new(@post).to_json
58
+ assert_match(/Rendered/, @logger.messages)
59
+ end
60
+
61
+ def test_logs_correct_serializer
62
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
63
+ assert_match(/PostSerializer/, @logger.messages)
64
+ end
65
+
66
+ def test_logs_correct_adapter
67
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
68
+ assert_match(/ActiveModelSerializers::Adapter::Attributes/, @logger.messages)
69
+ end
70
+
71
+ def test_logs_the_duration
72
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
73
+ assert_match(/\(\d+\.\d+ms\)/, @logger.messages)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveModelSerializers::ModelTest < ActiveSupport::TestCase
4
+ include ActiveModel::Serializer::Lint::Tests
5
+
6
+ def setup
7
+ @resource = ActiveModelSerializers::Model.new
8
+ end
9
+ end
@@ -0,0 +1,63 @@
1
+ # Execute this test in isolation
2
+ require 'support/isolated_unit'
3
+
4
+ class RailtieTest < ActiveSupport::TestCase
5
+ include ActiveSupport::Testing::Isolation
6
+
7
+ class WithRails < RailtieTest
8
+ setup do
9
+ require 'rails'
10
+ require 'active_model_serializers'
11
+ make_basic_app
12
+ end
13
+
14
+ test 'mixes ActionController::Serialization into ActionController::Base' do
15
+ assert ActionController.const_defined?(:Serialization),
16
+ "ActionController::Serialization should be defined, but isn't"
17
+ assert ::ActionController::Base.included_modules.include?(::ActionController::Serialization),
18
+ "ActionController::Serialization should be included in ActionController::Base, but isn't"
19
+ end
20
+
21
+ test 'prepares url_helpers for SerializationContext' do
22
+ assert ActiveModelSerializers::SerializationContext.url_helpers.respond_to? :url_for
23
+ assert_equal Rails.application.routes.default_url_options,
24
+ ActiveModelSerializers::SerializationContext.default_url_options
25
+ end
26
+
27
+ test 'sets the ActiveModelSerializers.logger to Rails.logger' do
28
+ refute_nil Rails.logger
29
+ refute_nil ActiveModelSerializers.logger
30
+ assert_equal Rails.logger, ActiveModelSerializers.logger
31
+ end
32
+
33
+ test 'it is configured for caching' do
34
+ assert_equal ActionController::Base.cache_store, ActiveModelSerializers.config.cache_store
35
+ assert_equal Rails.configuration.action_controller.perform_caching, ActiveModelSerializers.config.perform_caching
36
+ end
37
+ end
38
+
39
+ class WithoutRails < RailtieTest
40
+ setup do
41
+ require 'active_model_serializers'
42
+ make_basic_app
43
+ end
44
+
45
+ test 'does not mix ActionController::Serialization into ActionController::Base' do
46
+ refute ActionController.const_defined?(:Serialization),
47
+ 'ActionController::Serialization should not be defined, but is'
48
+ end
49
+
50
+ test 'has its own logger at ActiveModelSerializers.logger' do
51
+ refute_nil Rails.logger
52
+ refute_nil ActiveModelSerializers.logger
53
+ refute_equal Rails.logger, ActiveModelSerializers.logger
54
+ end
55
+
56
+ test 'it is not configured for caching' do
57
+ refute_nil ActionController::Base.cache_store
58
+ assert_nil ActiveModelSerializers.config.cache_store
59
+ refute Rails.configuration.action_controller.perform_caching
60
+ refute ActiveModelSerializers.config.perform_caching
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,58 @@
1
+ # Execute this test in isolation
2
+ require 'support/isolated_unit'
3
+ require 'minitest/mock'
4
+
5
+ class SerializationContextTest < ActiveSupport::TestCase
6
+ include ActiveSupport::Testing::Isolation
7
+
8
+ def create_request
9
+ request = Minitest::Mock.new
10
+ request.expect(:original_url, 'original_url')
11
+ request.expect(:query_parameters, 'query_parameters')
12
+ end
13
+
14
+ class WithRails < SerializationContextTest
15
+ setup do
16
+ require 'rails'
17
+ require 'active_model_serializers'
18
+ make_basic_app
19
+ @context = ActiveModelSerializers::SerializationContext.new(create_request)
20
+ end
21
+
22
+ test 'create context with request url and query parameters' do
23
+ assert_equal @context.request_url, 'original_url'
24
+ assert_equal @context.query_parameters, 'query_parameters'
25
+ end
26
+
27
+ test 'url_helpers is set up for Rails url_helpers' do
28
+ assert_equal Module, ActiveModelSerializers::SerializationContext.url_helpers.class
29
+ assert ActiveModelSerializers::SerializationContext.url_helpers.respond_to? :url_for
30
+ end
31
+
32
+ test 'default_url_options returns Rails.application.routes.default_url_options' do
33
+ assert_equal Rails.application.routes.default_url_options,
34
+ ActiveModelSerializers::SerializationContext.default_url_options
35
+ end
36
+ end
37
+
38
+ class WithoutRails < SerializationContextTest
39
+ setup do
40
+ require 'active_model_serializers/serialization_context'
41
+ @context = ActiveModelSerializers::SerializationContext.new(create_request)
42
+ end
43
+
44
+ test 'create context with request url and query parameters' do
45
+ assert_equal @context.request_url, 'original_url'
46
+ assert_equal @context.query_parameters, 'query_parameters'
47
+ end
48
+
49
+ test 'url_helpers is a module when Rails is not present' do
50
+ assert_equal Module, ActiveModelSerializers::SerializationContext.url_helpers.class
51
+ refute ActiveModelSerializers::SerializationContext.url_helpers.respond_to? :url_for
52
+ end
53
+
54
+ test 'default_url_options return a Hash' do
55
+ assert Hash, ActiveModelSerializers::SerializationContext.default_url_options.class
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,130 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Test
5
+ class SchemaTest < ActionController::TestCase
6
+ include ActiveModelSerializers::Test::Schema
7
+
8
+ class MyController < ActionController::Base
9
+ def index
10
+ render json: profile
11
+ end
12
+
13
+ def show
14
+ index
15
+ end
16
+
17
+ def name_as_a_integer
18
+ profile.name = 1
19
+ index
20
+ end
21
+
22
+ def render_using_json_api
23
+ render json: profile, adapter: :json_api
24
+ end
25
+
26
+ def invalid_json_body
27
+ render json: ''
28
+ end
29
+
30
+ private
31
+
32
+ def profile
33
+ @profile ||= Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
34
+ end
35
+ end
36
+
37
+ tests MyController
38
+
39
+ def test_that_assert_with_a_valid_schema
40
+ get :index
41
+ assert_response_schema
42
+ end
43
+
44
+ def test_that_raises_a_minitest_error_with_a_invalid_schema
45
+ message = "#/name: failed schema #/properties/name: For 'properties/name', \"Name 1\" is not an integer. and #/description: failed schema #/properties/description: For 'properties/description', \"Description 1\" is not a boolean."
46
+
47
+ get :show
48
+
49
+ error = assert_raises Minitest::Assertion do
50
+ assert_response_schema
51
+ end
52
+ assert_equal(message, error.message)
53
+ end
54
+
55
+ def test_that_raises_error_with_a_custom_message_with_a_invalid_schema
56
+ message = 'oh boy the show is broken'
57
+ exception_message = "#/name: failed schema #/properties/name: For 'properties/name', \"Name 1\" is not an integer. and #/description: failed schema #/properties/description: For 'properties/description', \"Description 1\" is not a boolean."
58
+ expected_message = "#{message}: #{exception_message}"
59
+
60
+ get :show
61
+
62
+ error = assert_raises Minitest::Assertion do
63
+ assert_response_schema(nil, message)
64
+ end
65
+ assert_equal(expected_message, error.message)
66
+ end
67
+
68
+ def test_that_assert_with_a_custom_schema
69
+ get :show
70
+ assert_response_schema('custom/show.json')
71
+ end
72
+
73
+ def test_that_assert_with_a_hyper_schema
74
+ get :show
75
+ assert_response_schema('hyper_schema.json')
76
+ end
77
+
78
+ def test_simple_json_pointers
79
+ get :show
80
+ assert_response_schema('simple_json_pointers.json')
81
+ end
82
+
83
+ def test_simple_json_pointers_that_doesnt_match
84
+ get :name_as_a_integer
85
+
86
+ assert_raises Minitest::Assertion do
87
+ assert_response_schema('simple_json_pointers.json')
88
+ end
89
+ end
90
+
91
+ def test_json_api_schema
92
+ get :render_using_json_api
93
+ assert_response_schema('render_using_json_api.json')
94
+ end
95
+
96
+ def test_that_assert_with_a_custom_schema_directory
97
+ original_schema_path = ActiveModelSerializers.config.schema_path
98
+ ActiveModelSerializers.config.schema_path = 'test/support/custom_schemas'
99
+
100
+ get :index
101
+ assert_response_schema
102
+
103
+ ActiveModelSerializers.config.schema_path = original_schema_path
104
+ end
105
+
106
+ def test_with_a_non_existent_file
107
+ message = 'No Schema file at test/support/schemas/non-existent.json'
108
+
109
+ get :show
110
+
111
+ error = assert_raises ActiveModelSerializers::Test::Schema::MissingSchema do
112
+ assert_response_schema('non-existent.json')
113
+ end
114
+ assert_equal(message, error.message)
115
+ end
116
+
117
+ def test_that_raises_with_a_invalid_json_body
118
+ message = 'A JSON text must at least contain two octets!'
119
+
120
+ get :invalid_json_body
121
+
122
+ error = assert_raises ActiveModelSerializers::Test::Schema::InvalidSchemaError do
123
+ assert_response_schema('custom/show.json')
124
+ end
125
+
126
+ assert_equal(message, error.message)
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,62 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Test
5
+ class SerializerTest < ActionController::TestCase
6
+ include ActiveModelSerializers::Test::Serializer
7
+
8
+ class MyController < ActionController::Base
9
+ def render_using_serializer
10
+ render json: Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
11
+ end
12
+
13
+ def render_some_text
14
+ render(plain: 'ok')
15
+ end
16
+ end
17
+
18
+ tests MyController
19
+
20
+ def test_supports_specifying_serializers_with_a_serializer_class
21
+ get :render_using_serializer
22
+ assert_serializer ProfileSerializer
23
+ end
24
+
25
+ def test_supports_specifying_serializers_with_a_regexp
26
+ get :render_using_serializer
27
+ assert_serializer(/\AProfile.+\Z/)
28
+ end
29
+
30
+ def test_supports_specifying_serializers_with_a_string
31
+ get :render_using_serializer
32
+ assert_serializer 'ProfileSerializer'
33
+ end
34
+
35
+ def test_supports_specifying_serializers_with_a_symbol
36
+ get :render_using_serializer
37
+ assert_serializer :profile_serializer
38
+ end
39
+
40
+ def test_supports_specifying_serializers_with_a_nil
41
+ get :render_some_text
42
+ assert_serializer nil
43
+ end
44
+
45
+ def test_raises_descriptive_error_message_when_serializer_was_not_rendered
46
+ get :render_using_serializer
47
+ e = assert_raise ActiveSupport::TestCase::Assertion do
48
+ assert_serializer 'PostSerializer'
49
+ end
50
+ assert_match 'expecting <"PostSerializer"> but rendering with <["ProfileSerializer"]>', e.message
51
+ end
52
+
53
+ def test_raises_argument_error_when_asserting_with_invalid_object
54
+ get :render_using_serializer
55
+ e = assert_raise ArgumentError do
56
+ assert_serializer Hash
57
+ end
58
+ assert_match 'assert_serializer only accepts a String, Symbol, Regexp, ActiveModel::Serializer, or nil', e.message
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveRecordTest < ActiveSupport::TestCase
4
+ include ActiveModel::Serializer::Lint::Tests
5
+
6
+ def setup
7
+ @resource = ARModels::Post.new
8
+ end
9
+ end