cheap_ams 0.10.0.rc2

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 (97) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.travis.yml +26 -0
  4. data/CHANGELOG.md +13 -0
  5. data/CONTRIBUTING.md +31 -0
  6. data/Gemfile +35 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +348 -0
  9. data/Rakefile +12 -0
  10. data/appveyor.yml +25 -0
  11. data/cheap_ams.gemspec +49 -0
  12. data/docs/README.md +27 -0
  13. data/docs/general/adapters.md +51 -0
  14. data/docs/general/getting_started.md +73 -0
  15. data/docs/howto/add_pagination_links.md +112 -0
  16. data/docs/howto/add_root_key.md +51 -0
  17. data/lib/action_controller/serialization.rb +62 -0
  18. data/lib/active_model/serializable_resource.rb +84 -0
  19. data/lib/active_model/serializer/adapter/flatten_json.rb +19 -0
  20. data/lib/active_model/serializer/adapter/fragment_cache.rb +82 -0
  21. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +16 -0
  22. data/lib/active_model/serializer/adapter/json.rb +53 -0
  23. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +24 -0
  24. data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +58 -0
  25. data/lib/active_model/serializer/adapter/json_api.rb +183 -0
  26. data/lib/active_model/serializer/adapter/null.rb +11 -0
  27. data/lib/active_model/serializer/adapter.rb +98 -0
  28. data/lib/active_model/serializer/array_serializer.rb +35 -0
  29. data/lib/active_model/serializer/association.rb +21 -0
  30. data/lib/active_model/serializer/associations.rb +97 -0
  31. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  32. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  33. data/lib/active_model/serializer/configuration.rb +14 -0
  34. data/lib/active_model/serializer/fieldset.rb +42 -0
  35. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  36. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  37. data/lib/active_model/serializer/lint.rb +131 -0
  38. data/lib/active_model/serializer/railtie.rb +9 -0
  39. data/lib/active_model/serializer/reflection.rb +74 -0
  40. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  41. data/lib/active_model/serializer/version.rb +5 -0
  42. data/lib/active_model/serializer.rb +205 -0
  43. data/lib/active_model_serializers.rb +29 -0
  44. data/lib/generators/serializer/USAGE +6 -0
  45. data/lib/generators/serializer/resource_override.rb +12 -0
  46. data/lib/generators/serializer/serializer_generator.rb +37 -0
  47. data/lib/generators/serializer/templates/serializer.rb +8 -0
  48. data/test/action_controller/adapter_selector_test.rb +53 -0
  49. data/test/action_controller/explicit_serializer_test.rb +134 -0
  50. data/test/action_controller/json_api/linked_test.rb +180 -0
  51. data/test/action_controller/json_api/pagination_test.rb +116 -0
  52. data/test/action_controller/serialization_scope_name_test.rb +67 -0
  53. data/test/action_controller/serialization_test.rb +426 -0
  54. data/test/adapter/fragment_cache_test.rb +37 -0
  55. data/test/adapter/json/belongs_to_test.rb +47 -0
  56. data/test/adapter/json/collection_test.rb +82 -0
  57. data/test/adapter/json/has_many_test.rb +47 -0
  58. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  59. data/test/adapter/json_api/collection_test.rb +96 -0
  60. data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
  61. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  62. data/test/adapter/json_api/has_many_test.rb +145 -0
  63. data/test/adapter/json_api/has_one_test.rb +81 -0
  64. data/test/adapter/json_api/json_api_test.rb +38 -0
  65. data/test/adapter/json_api/linked_test.rb +283 -0
  66. data/test/adapter/json_api/pagination_links_test.rb +115 -0
  67. data/test/adapter/json_api/resource_type_config_test.rb +59 -0
  68. data/test/adapter/json_test.rb +47 -0
  69. data/test/adapter/null_test.rb +25 -0
  70. data/test/adapter_test.rb +52 -0
  71. data/test/array_serializer_test.rb +97 -0
  72. data/test/capture_warnings.rb +57 -0
  73. data/test/fixtures/active_record.rb +57 -0
  74. data/test/fixtures/poro.rb +266 -0
  75. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  76. data/test/generators/serializer_generator_test.rb +56 -0
  77. data/test/lint_test.rb +44 -0
  78. data/test/poro_test.rb +9 -0
  79. data/test/serializable_resource_test.rb +27 -0
  80. data/test/serializers/adapter_for_test.rb +50 -0
  81. data/test/serializers/association_macros_test.rb +36 -0
  82. data/test/serializers/associations_test.rb +150 -0
  83. data/test/serializers/attribute_test.rb +62 -0
  84. data/test/serializers/attributes_test.rb +63 -0
  85. data/test/serializers/cache_test.rb +164 -0
  86. data/test/serializers/configuration_test.rb +15 -0
  87. data/test/serializers/fieldset_test.rb +26 -0
  88. data/test/serializers/meta_test.rb +121 -0
  89. data/test/serializers/options_test.rb +21 -0
  90. data/test/serializers/root_test.rb +23 -0
  91. data/test/serializers/serializer_for_test.rb +65 -0
  92. data/test/serializers/urls_test.rb +26 -0
  93. data/test/support/rails_app.rb +21 -0
  94. data/test/support/stream_capture.rb +49 -0
  95. data/test/support/test_case.rb +5 -0
  96. data/test/test_helper.rb +41 -0
  97. metadata +287 -0
@@ -0,0 +1,57 @@
1
+ # https://raw.githubusercontent.com/metric_fu/metric_fu/master/spec/capture_warnings.rb
2
+ require "tempfile"
3
+ require "fileutils"
4
+
5
+ class CaptureWarnings
6
+ def initialize(fail_on_warnings = true)
7
+ @fail_on_warnings = fail_on_warnings
8
+ @stderr_file = Tempfile.new("app.stderr")
9
+ @app_root ||= Dir.pwd
10
+ @output_dir = File.join(app_root, "tmp")
11
+ FileUtils.mkdir_p(output_dir)
12
+ @bundle_dir = File.join(app_root, "bundle")
13
+ end
14
+
15
+ def before_tests
16
+ $stderr.reopen(stderr_file.path)
17
+ $VERBOSE = true
18
+ at_exit { $stderr.reopen(STDERR) }
19
+ end
20
+
21
+ def after_tests
22
+ stderr_file.rewind
23
+ lines = stderr_file.read.split("\n")
24
+ stderr_file.close!
25
+
26
+ $stderr.reopen(STDERR)
27
+
28
+ app_warnings, other_warnings = lines.partition { |line|
29
+ line.include?(app_root) && !line.include?(bundle_dir)
30
+ }
31
+
32
+ if app_warnings.any?
33
+ puts <<-WARNINGS
34
+ #{'-' * 30} app warnings: #{'-' * 30}
35
+
36
+ #{app_warnings.join("\n")}
37
+
38
+ #{'-' * 75}
39
+ WARNINGS
40
+ end
41
+
42
+ if other_warnings.any?
43
+ File.write(File.join(output_dir, "warnings.txt"), other_warnings.join("\n") << "\n")
44
+ puts
45
+ puts "Non-app warnings written to tmp/warnings.txt"
46
+ puts
47
+ end
48
+
49
+ # fail the build...
50
+ if fail_on_warnings && app_warnings.any?
51
+ abort "Failing build due to app warnings: #{app_warnings.inspect}"
52
+ end
53
+ end
54
+
55
+ private
56
+ attr_reader :stderr_file, :app_root, :output_dir, :bundle_dir, :fail_on_warnings
57
+ end
@@ -0,0 +1,57 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
4
+ ActiveRecord::Schema.define do
5
+ create_table :posts, force: true do |t|
6
+ t.string :title
7
+ t.text :body
8
+ t.references :author
9
+ t.timestamps null: false
10
+ end
11
+ create_table :authors, force: true do |t|
12
+ t.string :name
13
+ t.timestamps null: false
14
+ end
15
+ create_table :comments, force: true do |t|
16
+ t.text :contents
17
+ t.references :author
18
+ t.references :post
19
+ t.timestamp null: false
20
+ end
21
+ end
22
+
23
+ module ARModels
24
+ class Post < ActiveRecord::Base
25
+ has_many :comments
26
+ belongs_to :author
27
+ end
28
+
29
+ class Comment < ActiveRecord::Base
30
+ belongs_to :post
31
+ belongs_to :author
32
+ end
33
+
34
+ class Author < ActiveRecord::Base
35
+ has_many :posts
36
+ end
37
+
38
+ class PostSerializer < ActiveModel::Serializer
39
+ attributes :id, :title, :body
40
+
41
+ has_many :comments
42
+ belongs_to :author
43
+ url :comments
44
+ end
45
+
46
+ class CommentSerializer < ActiveModel::Serializer
47
+ attributes :id, :contents
48
+
49
+ belongs_to :author
50
+ end
51
+
52
+ class AuthorSerializer < ActiveModel::Serializer
53
+ attributes :id, :name
54
+
55
+ has_many :posts
56
+ end
57
+ end
@@ -0,0 +1,266 @@
1
+ verbose = $VERBOSE
2
+ $VERBOSE = nil
3
+ class Model
4
+ FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
5
+
6
+ def self.model_name
7
+ @_model_name ||= ActiveModel::Name.new(self)
8
+ end
9
+
10
+ def initialize(hash={})
11
+ @attributes = hash
12
+ end
13
+
14
+ def cache_key
15
+ "#{self.class.name.downcase}/#{self.id}-#{self.updated_at.strftime("%Y%m%d%H%M%S%9N")}"
16
+ end
17
+
18
+ def serializable_hash(options = nil)
19
+ @attributes
20
+ end
21
+
22
+ def read_attribute_for_serialization(name)
23
+ if name == :id || name == 'id'
24
+ id
25
+ else
26
+ @attributes[name]
27
+ end
28
+ end
29
+
30
+ def id
31
+ @attributes[:id] || @attributes['id'] || object_id
32
+ end
33
+
34
+ ### Helper methods, not required to be serializable
35
+ #
36
+ # Convenience for adding @attributes readers and writers
37
+ def method_missing(meth, *args)
38
+ if meth.to_s =~ /^(.*)=$/
39
+ @attributes[$1.to_sym] = args[0]
40
+ elsif @attributes.key?(meth)
41
+ @attributes[meth]
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def cache_key_with_digest
48
+ "#{cache_key}/#{FILE_DIGEST}"
49
+ end
50
+
51
+ def updated_at
52
+ @attributes[:updated_at] ||= DateTime.now.to_time
53
+ end
54
+ end
55
+
56
+ class Profile < Model
57
+ end
58
+
59
+ class ProfileSerializer < ActiveModel::Serializer
60
+ attributes :name, :description
61
+
62
+ urls :posts, :comments
63
+
64
+ def arguments_passed_in?
65
+ options[:my_options] == :accessible
66
+ end
67
+ end
68
+
69
+ class ProfilePreviewSerializer < ActiveModel::Serializer
70
+ attributes :name
71
+
72
+ urls :posts, :comments
73
+ end
74
+
75
+ Post = Class.new(Model)
76
+ Like = Class.new(Model)
77
+ Author = Class.new(Model)
78
+ Bio = Class.new(Model)
79
+ Blog = Class.new(Model)
80
+ Role = Class.new(Model)
81
+ User = Class.new(Model)
82
+ Location = Class.new(Model)
83
+ Place = Class.new(Model)
84
+ Tag = Class.new(Model)
85
+ VirtualValue = Class.new(Model)
86
+ Comment = Class.new(Model) do
87
+ # Uses a custom non-time-based cache key
88
+ def cache_key
89
+ "#{self.class.name.downcase}/#{self.id}"
90
+ end
91
+ end
92
+
93
+ module Spam; end
94
+ Spam::UnrelatedLink = Class.new(Model)
95
+
96
+ PostSerializer = Class.new(ActiveModel::Serializer) do
97
+ cache key:'post', expires_in: 0.1, skip_digest: true
98
+ attributes :id, :title, :body
99
+
100
+ has_many :comments
101
+ belongs_to :blog
102
+ belongs_to :author
103
+ url :comments
104
+
105
+ def blog
106
+ Blog.new(id: 999, name: "Custom blog")
107
+ end
108
+
109
+ def custom_options
110
+ options
111
+ end
112
+ end
113
+
114
+ SpammyPostSerializer = Class.new(ActiveModel::Serializer) do
115
+ attributes :id
116
+ has_many :related
117
+
118
+ def self.root_name
119
+ 'posts'
120
+ end
121
+ end
122
+
123
+ CommentSerializer = Class.new(ActiveModel::Serializer) do
124
+ cache expires_in: 1.day, skip_digest: true
125
+ attributes :id, :body
126
+
127
+ belongs_to :post
128
+ belongs_to :author
129
+
130
+ def custom_options
131
+ options
132
+ end
133
+ end
134
+
135
+ AuthorSerializer = Class.new(ActiveModel::Serializer) do
136
+ cache key:'writer', skip_digest: true
137
+ attribute :id
138
+ attribute :name
139
+
140
+ has_many :posts
141
+ has_many :roles
142
+ has_one :bio
143
+ end
144
+
145
+ RoleSerializer = Class.new(ActiveModel::Serializer) do
146
+ cache only: [:name], skip_digest: true
147
+ attributes :id, :name, :description, :slug
148
+
149
+ def slug
150
+ "#{name}-#{id}"
151
+ end
152
+
153
+ belongs_to :author
154
+ end
155
+
156
+ LikeSerializer = Class.new(ActiveModel::Serializer) do
157
+ attributes :id, :time
158
+
159
+ belongs_to :likeable
160
+ end
161
+
162
+ LocationSerializer = Class.new(ActiveModel::Serializer) do
163
+ cache only: [:place], skip_digest: true
164
+ attributes :id, :lat, :lng
165
+
166
+ belongs_to :place
167
+
168
+ def place
169
+ 'Nowhere'
170
+ end
171
+ end
172
+
173
+ PlaceSerializer = Class.new(ActiveModel::Serializer) do
174
+ attributes :id, :name
175
+
176
+ has_many :locations
177
+ end
178
+
179
+ BioSerializer = Class.new(ActiveModel::Serializer) do
180
+ cache except: [:content], skip_digest: true
181
+ attributes :id, :content, :rating
182
+
183
+ belongs_to :author
184
+ end
185
+
186
+ BlogSerializer = Class.new(ActiveModel::Serializer) do
187
+ cache key: 'blog'
188
+ attributes :id, :name
189
+
190
+ belongs_to :writer
191
+ has_many :articles
192
+ end
193
+
194
+ PaginatedSerializer = Class.new(ActiveModel::Serializer::ArraySerializer) do
195
+ def json_key
196
+ 'paginated'
197
+ end
198
+ end
199
+
200
+ AlternateBlogSerializer = Class.new(ActiveModel::Serializer) do
201
+ attribute :id
202
+ attribute :name, key: :title
203
+ end
204
+
205
+ CustomBlogSerializer = Class.new(ActiveModel::Serializer) do
206
+ attribute :id
207
+ attribute :special_attribute
208
+
209
+ has_many :articles
210
+ end
211
+
212
+ CommentPreviewSerializer = Class.new(ActiveModel::Serializer) do
213
+ attributes :id
214
+
215
+ belongs_to :post
216
+ end
217
+
218
+ AuthorPreviewSerializer = Class.new(ActiveModel::Serializer) do
219
+ attributes :id
220
+
221
+ has_many :posts
222
+ end
223
+
224
+ PostPreviewSerializer = Class.new(ActiveModel::Serializer) do
225
+ def self.root_name
226
+ 'posts'
227
+ end
228
+
229
+ attributes :title, :body, :id
230
+
231
+ has_many :comments, serializer: CommentPreviewSerializer
232
+ belongs_to :author, serializer: AuthorPreviewSerializer
233
+ end
234
+
235
+ PostWithTagsSerializer = Class.new(ActiveModel::Serializer) do
236
+ attributes :id
237
+
238
+ has_many :tags
239
+ end
240
+
241
+ PostWithCustomKeysSerializer = Class.new(ActiveModel::Serializer) do
242
+ attributes :id
243
+
244
+ has_many :comments, key: :reviews
245
+ belongs_to :author, key: :writer
246
+ has_one :blog, key: :site
247
+ end
248
+
249
+ VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
250
+ attributes :id
251
+
252
+ has_many :reviews, virtual_value: [{id: 1}, {id: 2}]
253
+ has_one :maker, virtual_value: {id: 1}
254
+
255
+ def reviews
256
+ end
257
+
258
+ def maker
259
+ end
260
+ end
261
+
262
+ Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
263
+ cache only: [:id]
264
+ attributes :id
265
+ end
266
+ $VERBOSE = verbose
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+ # require 'active_model/serializer/railtie'
3
+
4
+ class ResourceGeneratorTest < Rails::Generators::TestCase
5
+ destination File.expand_path('../../../tmp/generators', __FILE__)
6
+ setup :prepare_destination, :copy_routes
7
+
8
+ tests Rails::Generators::ResourceGenerator
9
+ arguments %w(account)
10
+
11
+ def test_serializer_file_is_generated
12
+ run_generator
13
+
14
+ assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ActiveModel::Serializer/
15
+ end
16
+
17
+ private
18
+
19
+ def copy_routes
20
+ config_dir = File.join(destination_root, 'config')
21
+ FileUtils.mkdir_p(config_dir)
22
+ File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw { }')
23
+ end
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+ require 'generators/serializer/serializer_generator'
3
+
4
+ class SerializerGeneratorTest < Rails::Generators::TestCase
5
+ destination File.expand_path("../../../tmp/generators", __FILE__)
6
+ setup :prepare_destination
7
+
8
+ tests Rails::Generators::SerializerGenerator
9
+ arguments %w(account name:string description:text business:references)
10
+
11
+ def test_generates_a_serializer
12
+ run_generator
13
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer/
14
+ end
15
+
16
+ def test_generates_a_namespaced_serializer
17
+ run_generator ["admin/account"]
18
+ assert_file "app/serializers/admin/account_serializer.rb", /class Admin::AccountSerializer < ActiveModel::Serializer/
19
+ end
20
+
21
+ def test_uses_application_serializer_if_one_exists
22
+ Object.const_set(:ApplicationSerializer, Class.new)
23
+ run_generator
24
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer/
25
+ ensure
26
+ Object.send :remove_const, :ApplicationSerializer
27
+ end
28
+
29
+ def test_uses_given_parent
30
+ Object.const_set(:ApplicationSerializer, Class.new)
31
+ run_generator ["Account", "--parent=MySerializer"]
32
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < MySerializer/
33
+ ensure
34
+ Object.send :remove_const, :ApplicationSerializer
35
+ end
36
+
37
+ def test_generates_attributes_and_associations
38
+ run_generator
39
+ assert_file "app/serializers/account_serializer.rb" do |serializer|
40
+ assert_match(/^ attributes :id, :name, :description$/, serializer)
41
+ assert_match(/^ has_one :business$/, serializer)
42
+ assert_match(/^end\n*\z/, serializer)
43
+ end
44
+ end
45
+
46
+ def test_with_no_attributes_does_not_add_extra_space
47
+ run_generator ["account"]
48
+ assert_file "app/serializers/account_serializer.rb" do |content|
49
+ if RUBY_PLATFORM =~ /mingw/
50
+ assert_no_match(/\r\n\r\nend/, content)
51
+ else
52
+ assert_no_match(/\n\nend/, content)
53
+ end
54
+ end
55
+ end
56
+ end
data/test/lint_test.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class LintTest < Minitest::Test
6
+ include ActiveModel::Serializer::Lint::Tests
7
+
8
+ class CompliantResource
9
+ def serializable_hash(options = nil)
10
+
11
+ end
12
+
13
+ def read_attribute_for_serialization(name)
14
+
15
+ end
16
+
17
+ def as_json(options = nil)
18
+
19
+ end
20
+
21
+ def to_json(options = nil)
22
+
23
+ end
24
+
25
+ def cache_key
26
+
27
+ end
28
+
29
+ def id
30
+
31
+ end
32
+
33
+ def self.model_name
34
+ @_model_name ||= ActiveModel::Name.new(self)
35
+ end
36
+ end
37
+
38
+ def setup
39
+ @resource = CompliantResource.new
40
+ end
41
+
42
+ end
43
+ end
44
+ end
data/test/poro_test.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class PoroTest < Minitest::Test
4
+ include ActiveModel::Serializer::Lint::Tests
5
+
6
+ def setup
7
+ @resource = Model.new
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class SerializableResourceTest < Minitest::Test
5
+ def setup
6
+ @resource = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
7
+ @serializer = ProfileSerializer.new(@resource)
8
+ @adapter = ActiveModel::Serializer::Adapter.create(@serializer)
9
+ @serializable_resource = ActiveModel::SerializableResource.new(@resource)
10
+ end
11
+
12
+ def test_serializable_resource_delegates_serializable_hash_to_the_adapter
13
+ options = nil
14
+ assert_equal @adapter.serializable_hash(options), @serializable_resource.serializable_hash(options)
15
+ end
16
+
17
+ def test_serializable_resource_delegates_to_json_to_the_adapter
18
+ options = nil
19
+ assert_equal @adapter.to_json(options), @serializable_resource.to_json(options)
20
+ end
21
+
22
+ def test_serializable_resource_delegates_as_json_to_the_adapter
23
+ options = nil
24
+ assert_equal @adapter.as_json(options), @serializable_resource.as_json(options)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ module ActiveModel
2
+ class Serializer
3
+ class AdapterForTest < Minitest::Test
4
+ def setup
5
+ @previous_adapter = ActiveModel::Serializer.config.adapter
6
+ end
7
+
8
+ def teardown
9
+ ActiveModel::Serializer.config.adapter = @previous_adapter
10
+ end
11
+
12
+ def test_returns_default_adapter
13
+ adapter = ActiveModel::Serializer.adapter
14
+ assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter
15
+ end
16
+
17
+ def test_overwrite_adapter_with_symbol
18
+ ActiveModel::Serializer.config.adapter = :null
19
+
20
+ adapter = ActiveModel::Serializer.adapter
21
+ assert_equal ActiveModel::Serializer::Adapter::Null, adapter
22
+ ensure
23
+
24
+ end
25
+
26
+ def test_overwrite_adapter_with_class
27
+ ActiveModel::Serializer.config.adapter = ActiveModel::Serializer::Adapter::Null
28
+
29
+ adapter = ActiveModel::Serializer.adapter
30
+ assert_equal ActiveModel::Serializer::Adapter::Null, adapter
31
+ end
32
+
33
+ def test_raises_exception_if_invalid_symbol_given
34
+ ActiveModel::Serializer.config.adapter = :unknown
35
+
36
+ assert_raises ArgumentError do
37
+ ActiveModel::Serializer.adapter
38
+ end
39
+ end
40
+
41
+ def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
42
+ ActiveModel::Serializer.config.adapter = 42
43
+
44
+ assert_raises ArgumentError do
45
+ ActiveModel::Serializer.adapter
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class AssociationMacrosTest < Minitest::Test
6
+ AuthorSummarySerializer = Class.new
7
+ class AssociationsTestSerializer < Serializer
8
+ belongs_to :author, serializer: AuthorSummarySerializer
9
+ has_many :comments
10
+ has_one :category
11
+ end
12
+
13
+ def before_setup
14
+ @reflections = AssociationsTestSerializer._reflections
15
+ end
16
+
17
+ def test_has_one_defines_reflection
18
+ has_one_reflection = HasOneReflection.new(:category, {})
19
+
20
+ assert_includes(@reflections, has_one_reflection)
21
+ end
22
+
23
+ def test_has_many_defines_reflection
24
+ has_many_reflection = HasManyReflection.new(:comments, {})
25
+
26
+ assert_includes(@reflections, has_many_reflection)
27
+ end
28
+
29
+ def test_belongs_to_defines_reflection
30
+ belongs_to_reflection = BelongsToReflection.new(:author, serializer: AuthorSummarySerializer)
31
+
32
+ assert_includes(@reflections, belongs_to_reflection)
33
+ end
34
+ end
35
+ end
36
+ end