agi_active_model_serializers 0.10.7
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.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE.md +29 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- data/.gitignore +35 -0
- data/.rubocop.yml +102 -0
- data/.simplecov +110 -0
- data/.travis.yml +51 -0
- data/CHANGELOG.md +612 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +105 -0
- data/Gemfile +56 -0
- data/MIT-LICENSE +22 -0
- data/README.md +307 -0
- data/Rakefile +103 -0
- data/active_model_serializers.gemspec +63 -0
- data/appveyor.yml +24 -0
- data/bin/bench +171 -0
- data/bin/bench_regression +316 -0
- data/bin/serve_benchmark +39 -0
- data/docs/README.md +41 -0
- data/docs/STYLE.md +58 -0
- data/docs/general/adapters.md +247 -0
- data/docs/general/caching.md +58 -0
- data/docs/general/configuration_options.md +169 -0
- data/docs/general/deserialization.md +100 -0
- data/docs/general/fields.md +31 -0
- data/docs/general/getting_started.md +133 -0
- data/docs/general/instrumentation.md +40 -0
- data/docs/general/key_transforms.md +40 -0
- data/docs/general/logging.md +14 -0
- data/docs/general/rendering.md +279 -0
- data/docs/general/serializers.md +461 -0
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +138 -0
- data/docs/howto/add_relationship_links.md +137 -0
- data/docs/howto/add_root_key.md +55 -0
- data/docs/howto/grape_integration.md +42 -0
- data/docs/howto/outside_controller_use.md +65 -0
- data/docs/howto/passing_arbitrary_options.md +27 -0
- data/docs/howto/serialize_poro.md +32 -0
- data/docs/howto/test.md +154 -0
- data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
- data/docs/integrations/ember-and-json-api.md +144 -0
- data/docs/integrations/grape.md +19 -0
- data/docs/jsonapi/errors.md +56 -0
- data/docs/jsonapi/schema.md +151 -0
- data/docs/jsonapi/schema/schema.json +366 -0
- data/docs/rfcs/0000-namespace.md +106 -0
- data/docs/rfcs/template.md +15 -0
- data/lib/action_controller/serialization.rb +66 -0
- data/lib/active_model/serializable_resource.rb +11 -0
- data/lib/active_model/serializer.rb +231 -0
- data/lib/active_model/serializer/adapter.rb +24 -0
- data/lib/active_model/serializer/adapter/attributes.rb +15 -0
- data/lib/active_model/serializer/adapter/base.rb +18 -0
- data/lib/active_model/serializer/adapter/json.rb +15 -0
- data/lib/active_model/serializer/adapter/json_api.rb +15 -0
- data/lib/active_model/serializer/adapter/null.rb +15 -0
- data/lib/active_model/serializer/array_serializer.rb +12 -0
- data/lib/active_model/serializer/association.rb +34 -0
- data/lib/active_model/serializer/attribute.rb +25 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
- data/lib/active_model/serializer/collection_reflection.rb +7 -0
- data/lib/active_model/serializer/collection_serializer.rb +87 -0
- data/lib/active_model/serializer/concerns/associations.rb +102 -0
- data/lib/active_model/serializer/concerns/attributes.rb +82 -0
- data/lib/active_model/serializer/concerns/caching.rb +292 -0
- data/lib/active_model/serializer/concerns/configuration.rb +59 -0
- data/lib/active_model/serializer/concerns/links.rb +35 -0
- data/lib/active_model/serializer/concerns/meta.rb +29 -0
- data/lib/active_model/serializer/concerns/type.rb +25 -0
- data/lib/active_model/serializer/error_serializer.rb +14 -0
- data/lib/active_model/serializer/errors_serializer.rb +32 -0
- data/lib/active_model/serializer/field.rb +90 -0
- data/lib/active_model/serializer/fieldset.rb +31 -0
- data/lib/active_model/serializer/has_many_reflection.rb +7 -0
- data/lib/active_model/serializer/has_one_reflection.rb +7 -0
- data/lib/active_model/serializer/lint.rb +150 -0
- data/lib/active_model/serializer/null.rb +17 -0
- data/lib/active_model/serializer/reflection.rb +163 -0
- data/lib/active_model/serializer/singular_reflection.rb +7 -0
- data/lib/active_model/serializer/version.rb +5 -0
- data/lib/active_model_serializers.rb +53 -0
- data/lib/active_model_serializers/adapter.rb +98 -0
- data/lib/active_model_serializers/adapter/attributes.rb +13 -0
- data/lib/active_model_serializers/adapter/base.rb +83 -0
- data/lib/active_model_serializers/adapter/json.rb +21 -0
- data/lib/active_model_serializers/adapter/json_api.rb +517 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
- data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
- data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
- data/lib/active_model_serializers/adapter/null.rb +9 -0
- data/lib/active_model_serializers/callbacks.rb +55 -0
- data/lib/active_model_serializers/deprecate.rb +54 -0
- data/lib/active_model_serializers/deserialization.rb +15 -0
- data/lib/active_model_serializers/json_pointer.rb +14 -0
- data/lib/active_model_serializers/logging.rb +122 -0
- data/lib/active_model_serializers/lookup_chain.rb +80 -0
- data/lib/active_model_serializers/model.rb +71 -0
- data/lib/active_model_serializers/railtie.rb +48 -0
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
- data/lib/active_model_serializers/serializable_resource.rb +82 -0
- data/lib/active_model_serializers/serialization_context.rb +39 -0
- data/lib/active_model_serializers/test.rb +7 -0
- data/lib/active_model_serializers/test/schema.rb +138 -0
- data/lib/active_model_serializers/test/serializer.rb +125 -0
- data/lib/generators/rails/USAGE +6 -0
- data/lib/generators/rails/resource_override.rb +10 -0
- data/lib/generators/rails/serializer_generator.rb +36 -0
- data/lib/generators/rails/templates/serializer.rb.erb +15 -0
- data/lib/grape/active_model_serializers.rb +16 -0
- data/lib/grape/formatters/active_model_serializers.rb +32 -0
- data/lib/grape/helpers/active_model_serializers.rb +17 -0
- data/test/action_controller/adapter_selector_test.rb +53 -0
- data/test/action_controller/explicit_serializer_test.rb +135 -0
- data/test/action_controller/json/include_test.rb +246 -0
- data/test/action_controller/json_api/deserialization_test.rb +112 -0
- data/test/action_controller/json_api/errors_test.rb +40 -0
- data/test/action_controller/json_api/fields_test.rb +66 -0
- data/test/action_controller/json_api/linked_test.rb +202 -0
- data/test/action_controller/json_api/pagination_test.rb +116 -0
- data/test/action_controller/json_api/transform_test.rb +189 -0
- data/test/action_controller/lookup_proc_test.rb +49 -0
- data/test/action_controller/namespace_lookup_test.rb +232 -0
- data/test/action_controller/serialization_scope_name_test.rb +229 -0
- data/test/action_controller/serialization_test.rb +472 -0
- data/test/active_model_serializers/adapter_for_test.rb +208 -0
- data/test/active_model_serializers/json_pointer_test.rb +22 -0
- data/test/active_model_serializers/logging_test.rb +77 -0
- data/test/active_model_serializers/model_test.rb +69 -0
- data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
- data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
- data/test/active_model_serializers/test/schema_test.rb +131 -0
- data/test/active_model_serializers/test/serializer_test.rb +62 -0
- data/test/active_record_test.rb +9 -0
- data/test/adapter/attributes_test.rb +43 -0
- data/test/adapter/deprecation_test.rb +100 -0
- data/test/adapter/json/belongs_to_test.rb +45 -0
- data/test/adapter/json/collection_test.rb +104 -0
- data/test/adapter/json/has_many_test.rb +45 -0
- data/test/adapter/json/transform_test.rb +93 -0
- data/test/adapter/json_api/belongs_to_test.rb +155 -0
- data/test/adapter/json_api/collection_test.rb +96 -0
- data/test/adapter/json_api/errors_test.rb +76 -0
- data/test/adapter/json_api/fields_test.rb +96 -0
- data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
- data/test/adapter/json_api/has_many_test.rb +165 -0
- data/test/adapter/json_api/has_one_test.rb +80 -0
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
- data/test/adapter/json_api/json_api_test.rb +33 -0
- data/test/adapter/json_api/linked_test.rb +413 -0
- data/test/adapter/json_api/links_test.rb +95 -0
- data/test/adapter/json_api/pagination_links_test.rb +193 -0
- data/test/adapter/json_api/parse_test.rb +137 -0
- data/test/adapter/json_api/relationship_test.rb +397 -0
- data/test/adapter/json_api/resource_identifier_test.rb +110 -0
- data/test/adapter/json_api/resource_meta_test.rb +100 -0
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
- data/test/adapter/json_api/transform_test.rb +512 -0
- data/test/adapter/json_api/type_test.rb +61 -0
- data/test/adapter/json_test.rb +46 -0
- data/test/adapter/null_test.rb +22 -0
- data/test/adapter/polymorphic_test.rb +171 -0
- data/test/adapter_test.rb +67 -0
- data/test/array_serializer_test.rb +22 -0
- data/test/benchmark/app.rb +65 -0
- data/test/benchmark/benchmarking_support.rb +67 -0
- data/test/benchmark/bm_active_record.rb +81 -0
- data/test/benchmark/bm_adapter.rb +38 -0
- data/test/benchmark/bm_caching.rb +119 -0
- data/test/benchmark/bm_lookup_chain.rb +83 -0
- data/test/benchmark/bm_transform.rb +45 -0
- data/test/benchmark/config.ru +3 -0
- data/test/benchmark/controllers.rb +83 -0
- data/test/benchmark/fixtures.rb +219 -0
- data/test/cache_test.rb +595 -0
- data/test/collection_serializer_test.rb +123 -0
- data/test/fixtures/active_record.rb +113 -0
- data/test/fixtures/poro.rb +232 -0
- data/test/generators/scaffold_controller_generator_test.rb +24 -0
- data/test/generators/serializer_generator_test.rb +74 -0
- data/test/grape_test.rb +178 -0
- data/test/lint_test.rb +49 -0
- data/test/logger_test.rb +20 -0
- data/test/poro_test.rb +9 -0
- data/test/serializable_resource_test.rb +79 -0
- data/test/serializers/association_macros_test.rb +37 -0
- data/test/serializers/associations_test.rb +383 -0
- data/test/serializers/attribute_test.rb +153 -0
- data/test/serializers/attributes_test.rb +52 -0
- data/test/serializers/caching_configuration_test_isolated.rb +170 -0
- data/test/serializers/configuration_test.rb +32 -0
- data/test/serializers/fieldset_test.rb +14 -0
- data/test/serializers/meta_test.rb +202 -0
- data/test/serializers/options_test.rb +32 -0
- data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
- data/test/serializers/root_test.rb +21 -0
- data/test/serializers/serialization_test.rb +55 -0
- data/test/serializers/serializer_for_test.rb +136 -0
- data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
- data/test/support/isolated_unit.rb +82 -0
- data/test/support/rails5_shims.rb +53 -0
- data/test/support/rails_app.rb +36 -0
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
- data/test/support/schemas/custom/show.json +7 -0
- data/test/support/schemas/hyper_schema.json +93 -0
- data/test/support/schemas/render_using_json_api.json +43 -0
- data/test/support/schemas/simple_json_pointers.json +10 -0
- data/test/support/serialization_testing.rb +71 -0
- data/test/test_helper.rb +58 -0
- metadata +602 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class OptionsTest < ActiveSupport::TestCase
|
|
6
|
+
class ModelWithOptions < ActiveModelSerializers::Model
|
|
7
|
+
attributes :name, :description
|
|
8
|
+
end
|
|
9
|
+
class ModelWithOptionsSerializer < ActiveModel::Serializer
|
|
10
|
+
attributes :name, :description
|
|
11
|
+
|
|
12
|
+
def arguments_passed_in?
|
|
13
|
+
instance_options[:my_options] == :accessible
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
setup do
|
|
18
|
+
@model_with_options = ModelWithOptions.new(name: 'Name 1', description: 'Description 1')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_options_are_accessible
|
|
22
|
+
model_with_options_serializer = ModelWithOptionsSerializer.new(@model_with_options, my_options: :accessible)
|
|
23
|
+
assert model_with_options_serializer.arguments_passed_in?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_no_option_is_passed_in
|
|
27
|
+
model_with_options_serializer = ModelWithOptionsSerializer.new(@model_with_options)
|
|
28
|
+
refute model_with_options_serializer.arguments_passed_in?
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class ReadAttributeForSerializationTest < ActiveSupport::TestCase
|
|
6
|
+
# https://github.com/rails-api/active_model_serializers/issues/1653
|
|
7
|
+
class Parent < ActiveModelSerializers::Model
|
|
8
|
+
attributes :id
|
|
9
|
+
end
|
|
10
|
+
class Child < Parent
|
|
11
|
+
attributes :name
|
|
12
|
+
end
|
|
13
|
+
class ParentSerializer < ActiveModel::Serializer
|
|
14
|
+
attributes :$id
|
|
15
|
+
|
|
16
|
+
define_method(:$id) do
|
|
17
|
+
object.id
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
class ChildSerializer < ParentSerializer
|
|
21
|
+
attributes :name
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_child_serializer_calls_dynamic_method_in_parent_serializer
|
|
25
|
+
parent = ParentSerializer.new(Parent.new(id: 5))
|
|
26
|
+
child = ChildSerializer.new(Child.new(id: 6, name: 'Child'))
|
|
27
|
+
assert_equal 5, parent.read_attribute_for_serialization(:$id)
|
|
28
|
+
assert_equal 6, child.read_attribute_for_serialization(:$id)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# https://github.com/rails-api/active_model_serializers/issues/1658
|
|
32
|
+
class ErrorResponse < ActiveModelSerializers::Model
|
|
33
|
+
attributes :error
|
|
34
|
+
end
|
|
35
|
+
class ApplicationSerializer < ActiveModel::Serializer
|
|
36
|
+
attributes :status
|
|
37
|
+
|
|
38
|
+
def status
|
|
39
|
+
object.try(:errors).blank? && object.try(:error).blank?
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
class ErrorResponseSerializer < ApplicationSerializer
|
|
43
|
+
attributes :error
|
|
44
|
+
end
|
|
45
|
+
class ErrorResponseWithSuperSerializer < ApplicationSerializer
|
|
46
|
+
attributes :error
|
|
47
|
+
|
|
48
|
+
def success
|
|
49
|
+
super
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_child_serializer_with_error_attribute
|
|
54
|
+
error = ErrorResponse.new(error: 'i have an error')
|
|
55
|
+
serializer = ErrorResponseSerializer.new(error)
|
|
56
|
+
serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
|
|
57
|
+
assert_equal false, serializer.read_attribute_for_serialization(:status)
|
|
58
|
+
assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_child_serializer_with_errors
|
|
62
|
+
error = ErrorResponse.new
|
|
63
|
+
error.errors.add(:invalid, 'i am not valid')
|
|
64
|
+
serializer = ErrorResponseSerializer.new(error)
|
|
65
|
+
serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
|
|
66
|
+
assert_equal false, serializer.read_attribute_for_serialization(:status)
|
|
67
|
+
assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_child_serializer_no_error_attribute_or_errors
|
|
71
|
+
error = ErrorResponse.new
|
|
72
|
+
serializer = ErrorResponseSerializer.new(error)
|
|
73
|
+
serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
|
|
74
|
+
assert_equal true, serializer.read_attribute_for_serialization(:status)
|
|
75
|
+
assert_equal true, serializer_with_super.read_attribute_for_serialization(:status)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class RootTest < ActiveSupport::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@virtual_value = VirtualValue.new(id: 1)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_overwrite_root
|
|
11
|
+
serializer = VirtualValueSerializer.new(@virtual_value, root: 'smth')
|
|
12
|
+
assert_equal('smth', serializer.json_key)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_underscore_in_root
|
|
16
|
+
serializer = VirtualValueSerializer.new(@virtual_value)
|
|
17
|
+
assert_equal('virtual_value', serializer.json_key)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module ActiveModel
|
|
2
|
+
class Serializer
|
|
3
|
+
class SerializationTest < ActiveSupport::TestCase
|
|
4
|
+
class Blog < ActiveModelSerializers::Model
|
|
5
|
+
attributes :id, :name, :authors
|
|
6
|
+
end
|
|
7
|
+
class Author < ActiveModelSerializers::Model
|
|
8
|
+
attributes :id, :name
|
|
9
|
+
end
|
|
10
|
+
class BlogSerializer < ActiveModel::Serializer
|
|
11
|
+
attributes :id
|
|
12
|
+
attribute :name, key: :title
|
|
13
|
+
|
|
14
|
+
has_many :authors
|
|
15
|
+
end
|
|
16
|
+
class AuthorSerializer < ActiveModel::Serializer
|
|
17
|
+
attributes :id, :name
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
setup do
|
|
21
|
+
@authors = [Author.new(id: 1, name: 'Blog Author')]
|
|
22
|
+
@blog = Blog.new(id: 2, name: 'The Blog', authors: @authors)
|
|
23
|
+
@serializer_instance = BlogSerializer.new(@blog)
|
|
24
|
+
@serializable = ActiveModelSerializers::SerializableResource.new(@blog, serializer: BlogSerializer, adapter: :attributes)
|
|
25
|
+
@expected_hash = { id: 2, title: 'The Blog', authors: [{ id: 1, name: 'Blog Author' }] }
|
|
26
|
+
@expected_json = '{"id":2,"title":"The Blog","authors":[{"id":1,"name":"Blog Author"}]}'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test '#serializable_hash is the same as generated by the attributes adapter' do
|
|
30
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.serializable_hash
|
|
31
|
+
assert_equal @expected_hash, @serializer_instance.serializable_hash
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
test '#as_json is the same as generated by the attributes adapter' do
|
|
35
|
+
assert_equal @serializable.as_json, @serializer_instance.as_json
|
|
36
|
+
assert_equal @expected_hash, @serializer_instance.as_json
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test '#to_json is the same as generated by the attributes adapter' do
|
|
40
|
+
assert_equal @serializable.to_json, @serializer_instance.to_json
|
|
41
|
+
assert_equal @expected_json, @serializer_instance.to_json
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test '#to_h is an alias for #serializable_hash' do
|
|
45
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.to_h
|
|
46
|
+
assert_equal @expected_hash, @serializer_instance.to_h
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
test '#to_hash is an alias for #serializable_hash' do
|
|
50
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.to_hash
|
|
51
|
+
assert_equal @expected_hash, @serializer_instance.to_hash
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class SerializerForTest < ActiveSupport::TestCase
|
|
6
|
+
class CollectionSerializerTest < ActiveSupport::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
@array = [1, 2, 3]
|
|
9
|
+
@previous_collection_serializer = ActiveModelSerializers.config.collection_serializer
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
ActiveModelSerializers.config.collection_serializer = @previous_collection_serializer
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_serializer_for_array
|
|
17
|
+
serializer = ActiveModel::Serializer.serializer_for(@array)
|
|
18
|
+
assert_equal ActiveModelSerializers.config.collection_serializer, serializer
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_overwritten_serializer_for_array
|
|
22
|
+
new_collection_serializer = Class.new
|
|
23
|
+
ActiveModelSerializers.config.collection_serializer = new_collection_serializer
|
|
24
|
+
serializer = ActiveModel::Serializer.serializer_for(@array)
|
|
25
|
+
assert_equal new_collection_serializer, serializer
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class SerializerTest < ActiveSupport::TestCase
|
|
30
|
+
module ResourceNamespace
|
|
31
|
+
class Post < ::Model; end
|
|
32
|
+
class Comment < ::Model; end
|
|
33
|
+
|
|
34
|
+
class PostSerializer < ActiveModel::Serializer
|
|
35
|
+
class CommentSerializer < ActiveModel::Serializer
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class MyProfile < Profile
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class CustomProfile
|
|
44
|
+
def serializer_class
|
|
45
|
+
ProfileSerializer
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class Tweet < ::Model; end
|
|
50
|
+
TweetSerializer = Class.new
|
|
51
|
+
|
|
52
|
+
def setup
|
|
53
|
+
@profile = Profile.new
|
|
54
|
+
@my_profile = MyProfile.new
|
|
55
|
+
@custom_profile = CustomProfile.new
|
|
56
|
+
@model = ::Model.new
|
|
57
|
+
@tweet = Tweet.new
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_serializer_for_non_ams_serializer
|
|
61
|
+
serializer = ActiveModel::Serializer.serializer_for(@tweet)
|
|
62
|
+
assert_equal nil, serializer
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_serializer_for_existing_serializer
|
|
66
|
+
serializer = ActiveModel::Serializer.serializer_for(@profile)
|
|
67
|
+
assert_equal ProfileSerializer, serializer
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_serializer_for_existing_serializer_with_lookup_disabled
|
|
71
|
+
serializer = with_serializer_lookup_disabled do
|
|
72
|
+
ActiveModel::Serializer.serializer_for(@profile)
|
|
73
|
+
end
|
|
74
|
+
assert_equal nil, serializer
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_serializer_for_not_existing_serializer
|
|
78
|
+
serializer = ActiveModel::Serializer.serializer_for(@model)
|
|
79
|
+
assert_equal nil, serializer
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_serializer_inherited_serializer
|
|
83
|
+
serializer = ActiveModel::Serializer.serializer_for(@my_profile)
|
|
84
|
+
assert_equal ProfileSerializer, serializer
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_serializer_inherited_serializer_with_lookup_disabled
|
|
88
|
+
serializer = with_serializer_lookup_disabled do
|
|
89
|
+
ActiveModel::Serializer.serializer_for(@my_profile)
|
|
90
|
+
end
|
|
91
|
+
assert_equal nil, serializer
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_serializer_custom_serializer
|
|
95
|
+
serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
|
|
96
|
+
assert_equal ProfileSerializer, serializer
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_serializer_custom_serializer_with_lookup_disabled
|
|
100
|
+
serializer = with_serializer_lookup_disabled do
|
|
101
|
+
ActiveModel::Serializer.serializer_for(@custom_profile)
|
|
102
|
+
end
|
|
103
|
+
assert_equal ProfileSerializer, serializer
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_serializer_for_namespaced_resource
|
|
107
|
+
post = ResourceNamespace::Post.new
|
|
108
|
+
serializer = ActiveModel::Serializer.serializer_for(post)
|
|
109
|
+
assert_equal ResourceNamespace::PostSerializer, serializer
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_serializer_for_namespaced_resource_with_lookup_disabled
|
|
113
|
+
post = ResourceNamespace::Post.new
|
|
114
|
+
serializer = with_serializer_lookup_disabled do
|
|
115
|
+
ActiveModel::Serializer.serializer_for(post)
|
|
116
|
+
end
|
|
117
|
+
assert_equal nil, serializer
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_serializer_for_nested_resource
|
|
121
|
+
comment = ResourceNamespace::Comment.new
|
|
122
|
+
serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
|
|
123
|
+
assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_serializer_for_nested_resource_with_lookup_disabled
|
|
127
|
+
comment = ResourceNamespace::Comment.new
|
|
128
|
+
serializer = with_serializer_lookup_disabled do
|
|
129
|
+
ResourceNamespace::PostSerializer.serializer_for(comment)
|
|
130
|
+
end
|
|
131
|
+
assert_equal nil, serializer
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class SerializerForWithNamespaceTest < ActiveSupport::TestCase
|
|
6
|
+
class Book < ::Model
|
|
7
|
+
attributes :title, :author_name
|
|
8
|
+
associations :publisher, :pages
|
|
9
|
+
end
|
|
10
|
+
class Page < ::Model; attributes :number, :text end
|
|
11
|
+
class Publisher < ::Model; attributes :name end
|
|
12
|
+
|
|
13
|
+
module Api
|
|
14
|
+
module V3
|
|
15
|
+
class BookSerializer < ActiveModel::Serializer
|
|
16
|
+
attributes :title, :author_name
|
|
17
|
+
|
|
18
|
+
has_many :pages
|
|
19
|
+
belongs_to :publisher
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class PageSerializer < ActiveModel::Serializer
|
|
23
|
+
attributes :number, :text
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class PublisherSerializer < ActiveModel::Serializer
|
|
27
|
+
attributes :name
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class BookSerializer < ActiveModel::Serializer
|
|
33
|
+
attributes :title, :author_name
|
|
34
|
+
end
|
|
35
|
+
test 'resource without a namespace' do
|
|
36
|
+
book = Book.new(title: 'A Post', author_name: 'hello')
|
|
37
|
+
|
|
38
|
+
# TODO: this should be able to pull up this serializer without explicitly specifying the serializer
|
|
39
|
+
# currently, with no options, it still uses the Api::V3 serializer
|
|
40
|
+
result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
|
|
41
|
+
|
|
42
|
+
expected = { title: 'A Post', author_name: 'hello' }
|
|
43
|
+
assert_equal expected, result
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test 'resource with namespace' do
|
|
47
|
+
book = Book.new(title: 'A Post', author_name: 'hi')
|
|
48
|
+
|
|
49
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
50
|
+
|
|
51
|
+
expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
|
|
52
|
+
assert_equal expected, result
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
test 'has_many with nested serializer under the namespace' do
|
|
56
|
+
page = Page.new(number: 1, text: 'hello')
|
|
57
|
+
book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
|
|
58
|
+
|
|
59
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
60
|
+
|
|
61
|
+
expected = {
|
|
62
|
+
title: 'A Post', author_name: 'hi',
|
|
63
|
+
publisher: nil,
|
|
64
|
+
pages: [{
|
|
65
|
+
number: 1, text: 'hello'
|
|
66
|
+
}]
|
|
67
|
+
}
|
|
68
|
+
assert_equal expected, result
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
test 'belongs_to with nested serializer under the namespace' do
|
|
72
|
+
publisher = Publisher.new(name: 'Disney')
|
|
73
|
+
book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
|
|
74
|
+
|
|
75
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
76
|
+
|
|
77
|
+
expected = {
|
|
78
|
+
title: 'A Post', author_name: 'hi',
|
|
79
|
+
pages: nil,
|
|
80
|
+
publisher: {
|
|
81
|
+
name: 'Disney'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
assert_equal expected, result
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb
|
|
2
|
+
|
|
3
|
+
# Usage Example:
|
|
4
|
+
#
|
|
5
|
+
# require 'support/isolated_unit'
|
|
6
|
+
#
|
|
7
|
+
# class RailtieTest < ActiveSupport::TestCase
|
|
8
|
+
# include ActiveSupport::Testing::Isolation
|
|
9
|
+
#
|
|
10
|
+
# class WithRailsDefinedOnLoad < RailtieTest
|
|
11
|
+
# setup do
|
|
12
|
+
# require 'rails'
|
|
13
|
+
# require 'active_model_serializers'
|
|
14
|
+
# make_basic_app
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# # some tests
|
|
18
|
+
# end
|
|
19
|
+
#
|
|
20
|
+
# class WithoutRailsDefinedOnLoad < RailtieTest
|
|
21
|
+
# setup do
|
|
22
|
+
# require 'active_model_serializers'
|
|
23
|
+
# make_basic_app
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# # some tests
|
|
27
|
+
# end
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# Note:
|
|
31
|
+
# It is important to keep this file as light as possible
|
|
32
|
+
# the goal for tests that require this is to test booting up
|
|
33
|
+
# rails from an empty state, so anything added here could
|
|
34
|
+
# hide potential failures
|
|
35
|
+
#
|
|
36
|
+
# It is also good to know what is the bare minimum to get
|
|
37
|
+
# Rails booted up.
|
|
38
|
+
require 'bundler/setup' unless defined?(Bundler)
|
|
39
|
+
require 'active_support'
|
|
40
|
+
require 'active_support/core_ext/string/access'
|
|
41
|
+
|
|
42
|
+
# These files do not require any others and are needed
|
|
43
|
+
# to run the tests
|
|
44
|
+
require 'active_support/testing/autorun'
|
|
45
|
+
require 'active_support/testing/isolation'
|
|
46
|
+
|
|
47
|
+
module TestHelpers
|
|
48
|
+
module Generation
|
|
49
|
+
module_function
|
|
50
|
+
|
|
51
|
+
# Make a very basic app, without creating the whole directory structure.
|
|
52
|
+
# Is faster and simpler than generating a Rails app in a temp directory
|
|
53
|
+
def make_basic_app
|
|
54
|
+
require 'rails'
|
|
55
|
+
require 'action_controller/railtie'
|
|
56
|
+
|
|
57
|
+
@app = Class.new(Rails::Application) do
|
|
58
|
+
config.eager_load = false
|
|
59
|
+
config.session_store :cookie_store, key: '_myapp_session'
|
|
60
|
+
config.active_support.deprecation = :log
|
|
61
|
+
config.active_support.test_order = :parallel
|
|
62
|
+
ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel
|
|
63
|
+
config.root = File.dirname(__FILE__)
|
|
64
|
+
config.log_level = :info
|
|
65
|
+
# Set a fake logger to avoid creating the log directory automatically
|
|
66
|
+
fake_logger = Logger.new(nil)
|
|
67
|
+
config.logger = fake_logger
|
|
68
|
+
Rails.application.routes.default_url_options = { host: 'example.com' }
|
|
69
|
+
end
|
|
70
|
+
@app.respond_to?(:secrets) && @app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
|
|
71
|
+
|
|
72
|
+
yield @app if block_given?
|
|
73
|
+
@app.initialize!
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
module ActiveSupport
|
|
79
|
+
class TestCase
|
|
80
|
+
include TestHelpers::Generation
|
|
81
|
+
end
|
|
82
|
+
end
|