active_model_serializers 0.10.0.rc2 → 0.10.0.rc3

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +82 -0
  4. data/.rubocop_todo.yml +315 -0
  5. data/.simplecov +99 -0
  6. data/.travis.yml +8 -0
  7. data/CHANGELOG.md +9 -3
  8. data/Gemfile +39 -8
  9. data/README.md +55 -31
  10. data/Rakefile +29 -2
  11. data/active_model_serializers.gemspec +37 -13
  12. data/appveyor.yml +25 -0
  13. data/docs/README.md +29 -0
  14. data/docs/general/adapters.md +110 -0
  15. data/docs/general/configuration_options.md +11 -0
  16. data/docs/general/getting_started.md +73 -0
  17. data/docs/howto/add_pagination_links.md +112 -0
  18. data/docs/howto/add_root_key.md +51 -0
  19. data/docs/howto/outside_controller_use.md +42 -0
  20. data/lib/action_controller/serialization.rb +24 -33
  21. data/lib/active_model/serializable_resource.rb +70 -0
  22. data/lib/active_model/serializer.rb +50 -131
  23. data/lib/active_model/serializer/adapter.rb +84 -21
  24. data/lib/active_model/serializer/adapter/flatten_json.rb +9 -9
  25. data/lib/active_model/serializer/adapter/fragment_cache.rb +10 -13
  26. data/lib/active_model/serializer/adapter/json.rb +25 -28
  27. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +2 -12
  28. data/lib/active_model/serializer/adapter/json_api.rb +100 -98
  29. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +4 -14
  30. data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +50 -0
  31. data/lib/active_model/serializer/adapter/null.rb +2 -8
  32. data/lib/active_model/serializer/array_serializer.rb +22 -17
  33. data/lib/active_model/serializer/association.rb +20 -0
  34. data/lib/active_model/serializer/associations.rb +97 -0
  35. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  36. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  37. data/lib/active_model/serializer/configuration.rb +1 -0
  38. data/lib/active_model/serializer/fieldset.rb +7 -7
  39. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  40. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  41. data/lib/active_model/serializer/lint.rb +129 -0
  42. data/lib/active_model/serializer/railtie.rb +7 -0
  43. data/lib/active_model/serializer/reflection.rb +74 -0
  44. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  45. data/lib/active_model/serializer/utils.rb +35 -0
  46. data/lib/active_model/serializer/version.rb +1 -1
  47. data/lib/active_model_serializers.rb +28 -14
  48. data/lib/generators/serializer/serializer_generator.rb +7 -7
  49. data/lib/generators/serializer/templates/{serializer.rb → serializer.rb.erb} +2 -2
  50. data/lib/tasks/rubocop.rake +0 -0
  51. data/test/action_controller/adapter_selector_test.rb +3 -3
  52. data/test/action_controller/explicit_serializer_test.rb +9 -9
  53. data/test/action_controller/json_api/linked_test.rb +179 -0
  54. data/test/action_controller/json_api/pagination_test.rb +116 -0
  55. data/test/action_controller/serialization_scope_name_test.rb +10 -6
  56. data/test/action_controller/serialization_test.rb +149 -112
  57. data/test/active_record_test.rb +9 -0
  58. data/test/adapter/fragment_cache_test.rb +11 -1
  59. data/test/adapter/json/belongs_to_test.rb +4 -5
  60. data/test/adapter/json/collection_test.rb +30 -21
  61. data/test/adapter/json/has_many_test.rb +20 -9
  62. data/test/adapter/json_api/belongs_to_test.rb +38 -38
  63. data/test/adapter/json_api/collection_test.rb +22 -23
  64. data/test/adapter/json_api/has_many_embed_ids_test.rb +2 -2
  65. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +4 -4
  66. data/test/adapter/json_api/has_many_test.rb +54 -19
  67. data/test/adapter/json_api/has_one_test.rb +28 -8
  68. data/test/adapter/json_api/json_api_test.rb +37 -0
  69. data/test/adapter/json_api/linked_test.rb +75 -75
  70. data/test/adapter/json_api/pagination_links_test.rb +115 -0
  71. data/test/adapter/json_api/resource_type_config_test.rb +59 -0
  72. data/test/adapter/json_test.rb +18 -5
  73. data/test/adapter_test.rb +10 -11
  74. data/test/array_serializer_test.rb +63 -5
  75. data/test/capture_warnings.rb +65 -0
  76. data/test/fixtures/active_record.rb +56 -0
  77. data/test/fixtures/poro.rb +60 -29
  78. data/test/generators/scaffold_controller_generator_test.rb +1 -2
  79. data/test/generators/serializer_generator_test.rb +17 -12
  80. data/test/lint_test.rb +37 -0
  81. data/test/logger_test.rb +18 -0
  82. data/test/poro_test.rb +9 -0
  83. data/test/serializable_resource_test.rb +27 -0
  84. data/test/serializers/adapter_for_test.rb +123 -3
  85. data/test/serializers/association_macros_test.rb +36 -0
  86. data/test/serializers/associations_test.rb +70 -47
  87. data/test/serializers/attribute_test.rb +28 -4
  88. data/test/serializers/attributes_test.rb +8 -14
  89. data/test/serializers/cache_test.rb +58 -31
  90. data/test/serializers/fieldset_test.rb +3 -4
  91. data/test/serializers/meta_test.rb +42 -28
  92. data/test/serializers/root_test.rb +21 -0
  93. data/test/serializers/serializer_for_test.rb +1 -1
  94. data/test/support/rails_app.rb +21 -0
  95. data/test/support/serialization_testing.rb +13 -0
  96. data/test/support/simplecov.rb +6 -0
  97. data/test/support/stream_capture.rb +50 -0
  98. data/test/support/test_case.rb +5 -0
  99. data/test/test_helper.rb +41 -29
  100. data/test/utils/include_args_to_hash_test.rb +79 -0
  101. metadata +123 -17
  102. data/test/action_controller/json_api_linked_test.rb +0 -179
  103. data/test/action_controller/rescue_from_test.rb +0 -32
  104. data/test/serializers/urls_test.rb +0 -26
@@ -1,3 +1,5 @@
1
+ verbose = $VERBOSE
2
+ $VERBOSE = nil
1
3
  class Model
2
4
  FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
3
5
 
@@ -5,20 +7,16 @@ class Model
5
7
  @_model_name ||= ActiveModel::Name.new(self)
6
8
  end
7
9
 
8
- def initialize(hash={})
10
+ def initialize(hash = {})
9
11
  @attributes = hash
10
12
  end
11
13
 
12
14
  def cache_key
13
- "#{self.class.name.downcase}/#{self.id}-#{self.updated_at}"
15
+ "#{self.class.name.downcase}/#{self.id}-#{self.updated_at.strftime("%Y%m%d%H%M%S%9N")}"
14
16
  end
15
17
 
16
- def cache_key_with_digest
17
- "#{cache_key}/#{FILE_DIGEST}"
18
- end
19
-
20
- def updated_at
21
- @attributes[:updated_at] ||= DateTime.now.to_time.to_i
18
+ def serializable_hash(options = nil)
19
+ @attributes
22
20
  end
23
21
 
24
22
  def read_attribute_for_serialization(name)
@@ -33,10 +31,9 @@ class Model
33
31
  @attributes[:id] || @attributes['id'] || object_id
34
32
  end
35
33
 
36
- def to_param
37
- id
38
- end
39
-
34
+ ### Helper methods, not required to be serializable
35
+ #
36
+ # Convenience for adding @attributes readers and writers
40
37
  def method_missing(meth, *args)
41
38
  if meth.to_s =~ /^(.*)=$/
42
39
  @attributes[$1.to_sym] = args[0]
@@ -46,6 +43,14 @@ class Model
46
43
  super
47
44
  end
48
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
49
54
  end
50
55
 
51
56
  class Profile < Model
@@ -54,8 +59,6 @@ end
54
59
  class ProfileSerializer < ActiveModel::Serializer
55
60
  attributes :name, :description
56
61
 
57
- urls :posts, :comments
58
-
59
62
  def arguments_passed_in?
60
63
  options[:my_options] == :accessible
61
64
  end
@@ -63,13 +66,10 @@ end
63
66
 
64
67
  class ProfilePreviewSerializer < ActiveModel::Serializer
65
68
  attributes :name
66
-
67
- urls :posts, :comments
68
69
  end
69
70
 
70
71
  Post = Class.new(Model)
71
72
  Like = Class.new(Model)
72
- Comment = Class.new(Model)
73
73
  Author = Class.new(Model)
74
74
  Bio = Class.new(Model)
75
75
  Blog = Class.new(Model)
@@ -77,21 +77,28 @@ Role = Class.new(Model)
77
77
  User = Class.new(Model)
78
78
  Location = Class.new(Model)
79
79
  Place = Class.new(Model)
80
+ Tag = Class.new(Model)
81
+ VirtualValue = Class.new(Model)
82
+ Comment = Class.new(Model) do
83
+ # Uses a custom non-time-based cache key
84
+ def cache_key
85
+ "#{self.class.name.downcase}/#{self.id}"
86
+ end
87
+ end
80
88
 
81
89
  module Spam; end
82
90
  Spam::UnrelatedLink = Class.new(Model)
83
91
 
84
92
  PostSerializer = Class.new(ActiveModel::Serializer) do
85
- cache key:'post', expires_in: 0.1, skip_digest: true
93
+ cache key: 'post', expires_in: 0.1, skip_digest: true
86
94
  attributes :id, :title, :body
87
95
 
88
96
  has_many :comments
89
97
  belongs_to :blog
90
98
  belongs_to :author
91
- url :comments
92
99
 
93
100
  def blog
94
- Blog.new(id: 999, name: "Custom blog")
101
+ Blog.new(id: 999, name: 'Custom blog')
95
102
  end
96
103
 
97
104
  def custom_options
@@ -121,11 +128,12 @@ CommentSerializer = Class.new(ActiveModel::Serializer) do
121
128
  end
122
129
 
123
130
  AuthorSerializer = Class.new(ActiveModel::Serializer) do
124
- cache key:'writer', skip_digest: true
125
- attributes :id, :name
131
+ cache key: 'writer', skip_digest: true
132
+ attribute :id
133
+ attribute :name
126
134
 
127
- has_many :posts, embed: :ids
128
- has_many :roles, embed: :ids
135
+ has_many :posts
136
+ has_many :roles
129
137
  has_one :bio
130
138
  end
131
139
 
@@ -143,7 +151,7 @@ end
143
151
  LikeSerializer = Class.new(ActiveModel::Serializer) do
144
152
  attributes :id, :time
145
153
 
146
- belongs_to :post
154
+ belongs_to :likeable
147
155
  end
148
156
 
149
157
  LocationSerializer = Class.new(ActiveModel::Serializer) do
@@ -219,12 +227,35 @@ PostPreviewSerializer = Class.new(ActiveModel::Serializer) do
219
227
  belongs_to :author, serializer: AuthorPreviewSerializer
220
228
  end
221
229
 
222
- Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
230
+ PostWithTagsSerializer = Class.new(ActiveModel::Serializer) do
231
+ attributes :id
232
+
233
+ has_many :tags
234
+ end
235
+
236
+ PostWithCustomKeysSerializer = Class.new(ActiveModel::Serializer) do
223
237
  attributes :id
238
+
239
+ has_many :comments, key: :reviews
240
+ belongs_to :author, key: :writer
241
+ has_one :blog, key: :site
224
242
  end
225
243
 
226
- RaiseErrorSerializer = Class.new(ActiveModel::Serializer) do
227
- def json_key
228
- raise StandardError, 'Intentional error for rescue_from test'
244
+ VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
245
+ attributes :id
246
+
247
+ has_many :reviews, virtual_value: [{ id: 1 }, { id: 2 }]
248
+ has_one :maker, virtual_value: { id: 1 }
249
+
250
+ def reviews
251
+ end
252
+
253
+ def maker
229
254
  end
230
255
  end
256
+
257
+ Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
258
+ cache only: [:id]
259
+ attributes :id
260
+ end
261
+ $VERBOSE = verbose
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
- # require 'active_model/serializer/railtie'
3
2
 
4
3
  class ResourceGeneratorTest < Rails::Generators::TestCase
5
4
  destination File.expand_path('../../../tmp/generators', __FILE__)
@@ -19,6 +18,6 @@ class ResourceGeneratorTest < Rails::Generators::TestCase
19
18
  def copy_routes
20
19
  config_dir = File.join(destination_root, 'config')
21
20
  FileUtils.mkdir_p(config_dir)
22
- File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw { }')
21
+ File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw {}')
23
22
  end
24
23
  end
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
  require 'generators/serializer/serializer_generator'
3
3
 
4
4
  class SerializerGeneratorTest < Rails::Generators::TestCase
5
- destination File.expand_path("../../../tmp/generators", __FILE__)
5
+ destination File.expand_path('../../../tmp/generators', __FILE__)
6
6
  setup :prepare_destination
7
7
 
8
8
  tests Rails::Generators::SerializerGenerator
@@ -10,42 +10,47 @@ class SerializerGeneratorTest < Rails::Generators::TestCase
10
10
 
11
11
  def test_generates_a_serializer
12
12
  run_generator
13
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer/
13
+ assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ActiveModel::Serializer/
14
14
  end
15
15
 
16
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/
17
+ run_generator ['admin/account']
18
+ assert_file 'app/serializers/admin/account_serializer.rb', /class Admin::AccountSerializer < ActiveModel::Serializer/
19
19
  end
20
20
 
21
21
  def test_uses_application_serializer_if_one_exists
22
22
  Object.const_set(:ApplicationSerializer, Class.new)
23
23
  run_generator
24
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer/
24
+ assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ApplicationSerializer/
25
25
  ensure
26
26
  Object.send :remove_const, :ApplicationSerializer
27
27
  end
28
28
 
29
29
  def test_uses_given_parent
30
30
  Object.const_set(:ApplicationSerializer, Class.new)
31
- run_generator ["Account", "--parent=MySerializer"]
32
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < MySerializer/
31
+ run_generator ['Account', '--parent=MySerializer']
32
+ assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < MySerializer/
33
33
  ensure
34
34
  Object.send :remove_const, :ApplicationSerializer
35
35
  end
36
36
 
37
37
  def test_generates_attributes_and_associations
38
38
  run_generator
39
- assert_file "app/serializers/account_serializer.rb" do |serializer|
39
+ assert_file 'app/serializers/account_serializer.rb' do |serializer|
40
40
  assert_match(/^ attributes :id, :name, :description$/, serializer)
41
- assert_match(/^ attribute :business$/, serializer)
41
+ assert_match(/^ has_one :business$/, serializer)
42
+ assert_match(/^end\n*\z/, serializer)
42
43
  end
43
44
  end
44
45
 
45
46
  def test_with_no_attributes_does_not_add_extra_space
46
- run_generator ["account"]
47
- assert_file "app/serializers/account_serializer.rb" do |content|
48
- assert_no_match /\n\nend/, content
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
49
54
  end
50
55
  end
51
56
  end
data/test/lint_test.rb ADDED
@@ -0,0 +1,37 @@
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
+ end
11
+
12
+ def read_attribute_for_serialization(name)
13
+ end
14
+
15
+ def as_json(options = nil)
16
+ end
17
+
18
+ def to_json(options = nil)
19
+ end
20
+
21
+ def cache_key
22
+ end
23
+
24
+ def id
25
+ end
26
+
27
+ def self.model_name
28
+ @_model_name ||= ActiveModel::Name.new(self)
29
+ end
30
+ end
31
+
32
+ def setup
33
+ @resource = CompliantResource.new
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveModelSerializers::LoggerTest < Minitest::Test
4
+ def test_logger_is_set_to_action_controller_logger_when_initializer_runs
5
+ assert_equal ActiveModelSerializers.logger, ActionController::Base.logger
6
+ end
7
+
8
+ def test_logger_can_be_set
9
+ original_logger = ActiveModelSerializers.logger
10
+ logger = Logger.new(STDOUT)
11
+
12
+ ActiveModelSerializers.logger = logger
13
+
14
+ assert_equal ActiveModelSerializers.logger, logger
15
+ ensure
16
+ ActiveModelSerializers.logger = original_logger
17
+ end
18
+ 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
@@ -1,8 +1,15 @@
1
1
  module ActiveModel
2
2
  class Serializer
3
3
  class AdapterForTest < Minitest::Test
4
+ UnknownAdapterError = ::ActiveModel::Serializer::Adapter::UnknownAdapterError
5
+
4
6
  def setup
5
7
  @previous_adapter = ActiveModel::Serializer.config.adapter
8
+ # Eager load adapters
9
+ ActiveModel::Serializer::Adapter.eager_load!
10
+ [:json_api, :flatten_json, :null, :json].each do |adapter_name|
11
+ ActiveModel::Serializer::Adapter.lookup(adapter_name)
12
+ end
6
13
  end
7
14
 
8
15
  def teardown
@@ -20,7 +27,7 @@ module ActiveModel
20
27
  adapter = ActiveModel::Serializer.adapter
21
28
  assert_equal ActiveModel::Serializer::Adapter::Null, adapter
22
29
  ensure
23
-
30
+ ActiveModel::Serializer.config.adapter = @previous_adapter
24
31
  end
25
32
 
26
33
  def test_overwrite_adapter_with_class
@@ -33,7 +40,7 @@ module ActiveModel
33
40
  def test_raises_exception_if_invalid_symbol_given
34
41
  ActiveModel::Serializer.config.adapter = :unknown
35
42
 
36
- assert_raises ArgumentError do
43
+ assert_raises UnknownAdapterError do
37
44
  ActiveModel::Serializer.adapter
38
45
  end
39
46
  end
@@ -41,10 +48,123 @@ module ActiveModel
41
48
  def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
42
49
  ActiveModel::Serializer.config.adapter = 42
43
50
 
44
- assert_raises ArgumentError do
51
+ assert_raises UnknownAdapterError do
45
52
  ActiveModel::Serializer.adapter
46
53
  end
47
54
  end
55
+
56
+ def test_adapter_class_for_known_adapter
57
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
58
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
59
+ end
60
+
61
+ def test_adapter_class_for_unknown_adapter
62
+ assert_raises UnknownAdapterError do
63
+ ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
64
+ end
65
+ end
66
+
67
+ def test_adapter_map
68
+ expected_adapter_map = {
69
+ 'json'.freeze => ActiveModel::Serializer::Adapter::Json,
70
+ 'json_api'.freeze => ActiveModel::Serializer::Adapter::JsonApi,
71
+ 'flatten_json'.freeze => ActiveModel::Serializer::Adapter::FlattenJson,
72
+ 'null'.freeze => ActiveModel::Serializer::Adapter::Null
73
+ }
74
+ assert_equal ActiveModel::Serializer::Adapter.adapter_map, expected_adapter_map
75
+ end
76
+
77
+ def test_adapters
78
+ assert_equal ActiveModel::Serializer::Adapter.adapters.sort, [
79
+ 'flatten_json'.freeze,
80
+ 'json'.freeze,
81
+ 'json_api'.freeze,
82
+ 'null'.freeze
83
+ ]
84
+ end
85
+
86
+ def test_lookup_adapter_by_string_name
87
+ assert_equal ActiveModel::Serializer::Adapter.lookup('json'.freeze), ActiveModel::Serializer::Adapter::Json
88
+ end
89
+
90
+ def test_lookup_adapter_by_symbol_name
91
+ assert_equal ActiveModel::Serializer::Adapter.lookup(:json), ActiveModel::Serializer::Adapter::Json
92
+ end
93
+
94
+ def test_lookup_adapter_by_class
95
+ klass = ActiveModel::Serializer::Adapter::Json
96
+ assert_equal ActiveModel::Serializer::Adapter.lookup(klass), klass
97
+ end
98
+
99
+ def test_lookup_adapter_from_environment_registers_adapter
100
+ ActiveModel::Serializer::Adapter.const_set(:AdapterFromEnvironment, Class.new)
101
+ klass = ::ActiveModel::Serializer::Adapter::AdapterFromEnvironment
102
+ name = 'adapter_from_environment'.freeze
103
+ assert_equal ActiveModel::Serializer::Adapter.lookup(name), klass
104
+ assert ActiveModel::Serializer::Adapter.adapters.include?(name)
105
+ ensure
106
+ ActiveModel::Serializer::Adapter.adapter_map.delete(name)
107
+ ActiveModel::Serializer::Adapter.send(:remove_const, :AdapterFromEnvironment)
108
+ end
109
+
110
+ def test_lookup_adapter_for_unknown_name
111
+ assert_raises UnknownAdapterError do
112
+ ActiveModel::Serializer::Adapter.lookup(:json_simple)
113
+ end
114
+ end
115
+
116
+ def test_adapter
117
+ assert_equal ActiveModel::Serializer.config.adapter, :flatten_json
118
+ assert_equal ActiveModel::Serializer.adapter, ActiveModel::Serializer::Adapter::FlattenJson
119
+ end
120
+
121
+ def test_register_adapter
122
+ new_adapter_name = :foo
123
+ new_adapter_klass = Class.new
124
+ ActiveModel::Serializer::Adapter.register(new_adapter_name, new_adapter_klass)
125
+ assert ActiveModel::Serializer::Adapter.adapters.include?('foo'.freeze)
126
+ assert ActiveModel::Serializer::Adapter.lookup(:foo), new_adapter_klass
127
+ ensure
128
+ ActiveModel::Serializer::Adapter.adapter_map.delete(new_adapter_name.to_s)
129
+ end
130
+
131
+ def test_inherited_adapter_hooks_register_adapter
132
+ Object.const_set(:MyAdapter, Class.new)
133
+ my_adapter = MyAdapter
134
+ ActiveModel::Serializer::Adapter.inherited(my_adapter)
135
+ assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
136
+ ensure
137
+ ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
138
+ Object.send(:remove_const, :MyAdapter)
139
+ end
140
+
141
+ def test_inherited_adapter_hooks_register_demodulized_adapter
142
+ Object.const_set(:MyNamespace, Module.new)
143
+ MyNamespace.const_set(:MyAdapter, Class.new)
144
+ my_adapter = MyNamespace::MyAdapter
145
+ ActiveModel::Serializer::Adapter.inherited(my_adapter)
146
+ assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
147
+ ensure
148
+ ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
149
+ MyNamespace.send(:remove_const, :MyAdapter)
150
+ Object.send(:remove_const, :MyNamespace)
151
+ end
152
+
153
+ def test_inherited_adapter_hooks_register_subclass_of_registered_adapter
154
+ Object.const_set(:MyAdapter, Class.new)
155
+ my_adapter = MyAdapter
156
+ Object.const_set(:MySubclassedAdapter, Class.new(MyAdapter))
157
+ my_subclassed_adapter = MySubclassedAdapter
158
+ ActiveModel::Serializer::Adapter.inherited(my_adapter)
159
+ ActiveModel::Serializer::Adapter.inherited(my_subclassed_adapter)
160
+ assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
161
+ assert_equal ActiveModel::Serializer::Adapter.lookup(:my_subclassed_adapter), my_subclassed_adapter
162
+ ensure
163
+ ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
164
+ ActiveModel::Serializer::Adapter.adapter_map.delete('my_subclassed_adapter'.freeze)
165
+ Object.send(:remove_const, :MyAdapter)
166
+ Object.send(:remove_const, :MySubclassedAdapter)
167
+ end
48
168
  end
49
169
  end
50
170
  end