active_model_serializers_custom 0.10.90
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 +109 -0
- data/.simplecov +110 -0
- data/.travis.yml +63 -0
- data/CHANGELOG.md +727 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/CONTRIBUTING.md +105 -0
- data/Gemfile +74 -0
- data/MIT-LICENSE +22 -0
- data/README.md +305 -0
- data/Rakefile +76 -0
- data/active_model_serializers.gemspec +64 -0
- data/appveyor.yml +28 -0
- data/bin/bench +171 -0
- data/bin/bench_regression +316 -0
- data/bin/rubocop +38 -0
- data/bin/serve_benchmark +39 -0
- data/docs/README.md +41 -0
- data/docs/STYLE.md +58 -0
- data/docs/general/adapters.md +269 -0
- data/docs/general/caching.md +58 -0
- data/docs/general/configuration_options.md +185 -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 +21 -0
- data/docs/general/rendering.md +293 -0
- data/docs/general/serializers.md +495 -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 +140 -0
- data/docs/howto/add_root_key.md +62 -0
- data/docs/howto/grape_integration.md +42 -0
- data/docs/howto/outside_controller_use.md +66 -0
- data/docs/howto/passing_arbitrary_options.md +27 -0
- data/docs/howto/serialize_poro.md +73 -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 +147 -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 +76 -0
- data/lib/active_model/serializable_resource.rb +13 -0
- data/lib/active_model/serializer.rb +418 -0
- data/lib/active_model/serializer/adapter.rb +26 -0
- data/lib/active_model/serializer/adapter/attributes.rb +17 -0
- data/lib/active_model/serializer/adapter/base.rb +20 -0
- data/lib/active_model/serializer/adapter/json.rb +17 -0
- data/lib/active_model/serializer/adapter/json_api.rb +17 -0
- data/lib/active_model/serializer/adapter/null.rb +17 -0
- data/lib/active_model/serializer/array_serializer.rb +14 -0
- data/lib/active_model/serializer/association.rb +91 -0
- data/lib/active_model/serializer/attribute.rb +27 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
- data/lib/active_model/serializer/collection_serializer.rb +90 -0
- data/lib/active_model/serializer/concerns/caching.rb +304 -0
- data/lib/active_model/serializer/error_serializer.rb +16 -0
- data/lib/active_model/serializer/errors_serializer.rb +34 -0
- data/lib/active_model/serializer/field.rb +92 -0
- data/lib/active_model/serializer/fieldset.rb +33 -0
- data/lib/active_model/serializer/has_many_reflection.rb +12 -0
- data/lib/active_model/serializer/has_one_reflection.rb +9 -0
- data/lib/active_model/serializer/lazy_association.rb +99 -0
- data/lib/active_model/serializer/link.rb +23 -0
- data/lib/active_model/serializer/lint.rb +152 -0
- data/lib/active_model/serializer/null.rb +19 -0
- data/lib/active_model/serializer/reflection.rb +212 -0
- data/lib/active_model/serializer/version.rb +7 -0
- data/lib/active_model_serializers.rb +63 -0
- data/lib/active_model_serializers/adapter.rb +100 -0
- data/lib/active_model_serializers/adapter/attributes.rb +15 -0
- data/lib/active_model_serializers/adapter/base.rb +85 -0
- data/lib/active_model_serializers/adapter/json.rb +23 -0
- data/lib/active_model_serializers/adapter/json_api.rb +535 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
- data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
- data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
- data/lib/active_model_serializers/adapter/null.rb +11 -0
- data/lib/active_model_serializers/callbacks.rb +57 -0
- data/lib/active_model_serializers/deprecate.rb +56 -0
- data/lib/active_model_serializers/deserialization.rb +17 -0
- data/lib/active_model_serializers/json_pointer.rb +16 -0
- data/lib/active_model_serializers/logging.rb +124 -0
- data/lib/active_model_serializers/lookup_chain.rb +82 -0
- data/lib/active_model_serializers/model.rb +132 -0
- data/lib/active_model_serializers/railtie.rb +52 -0
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
- data/lib/active_model_serializers/serializable_resource.rb +84 -0
- data/lib/active_model_serializers/serialization_context.rb +41 -0
- data/lib/active_model_serializers/test.rb +9 -0
- data/lib/active_model_serializers/test/schema.rb +140 -0
- data/lib/active_model_serializers/test/serializer.rb +127 -0
- data/lib/generators/rails/USAGE +6 -0
- data/lib/generators/rails/resource_override.rb +12 -0
- data/lib/generators/rails/serializer_generator.rb +38 -0
- data/lib/generators/rails/templates/serializer.rb.erb +8 -0
- data/lib/grape/active_model_serializers.rb +18 -0
- data/lib/grape/formatters/active_model_serializers.rb +34 -0
- data/lib/grape/helpers/active_model_serializers.rb +19 -0
- data/lib/tasks/rubocop.rake +55 -0
- data/test/action_controller/adapter_selector_test.rb +64 -0
- data/test/action_controller/explicit_serializer_test.rb +137 -0
- data/test/action_controller/json/include_test.rb +248 -0
- data/test/action_controller/json_api/deserialization_test.rb +114 -0
- data/test/action_controller/json_api/errors_test.rb +42 -0
- data/test/action_controller/json_api/fields_test.rb +68 -0
- data/test/action_controller/json_api/linked_test.rb +204 -0
- data/test/action_controller/json_api/pagination_test.rb +126 -0
- data/test/action_controller/json_api/transform_test.rb +191 -0
- data/test/action_controller/lookup_proc_test.rb +51 -0
- data/test/action_controller/namespace_lookup_test.rb +239 -0
- data/test/action_controller/serialization_scope_name_test.rb +237 -0
- data/test/action_controller/serialization_test.rb +480 -0
- data/test/active_model_serializers/adapter_for_test.rb +210 -0
- data/test/active_model_serializers/json_pointer_test.rb +24 -0
- data/test/active_model_serializers/logging_test.rb +79 -0
- data/test/active_model_serializers/model_test.rb +144 -0
- data/test/active_model_serializers/railtie_test_isolated.rb +70 -0
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +163 -0
- data/test/active_model_serializers/serialization_context_test_isolated.rb +73 -0
- data/test/active_model_serializers/test/schema_test.rb +133 -0
- data/test/active_model_serializers/test/serializer_test.rb +64 -0
- data/test/active_record_test.rb +11 -0
- data/test/adapter/attributes_test.rb +42 -0
- data/test/adapter/deprecation_test.rb +102 -0
- data/test/adapter/json/belongs_to_test.rb +47 -0
- data/test/adapter/json/collection_test.rb +106 -0
- data/test/adapter/json/has_many_test.rb +55 -0
- data/test/adapter/json/transform_test.rb +95 -0
- data/test/adapter/json_api/belongs_to_test.rb +157 -0
- data/test/adapter/json_api/collection_test.rb +98 -0
- data/test/adapter/json_api/errors_test.rb +78 -0
- data/test/adapter/json_api/fields_test.rb +98 -0
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
- data/test/adapter/json_api/has_many_test.rb +175 -0
- data/test/adapter/json_api/has_one_test.rb +82 -0
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +215 -0
- data/test/adapter/json_api/json_api_test.rb +35 -0
- data/test/adapter/json_api/linked_test.rb +415 -0
- data/test/adapter/json_api/links_test.rb +112 -0
- data/test/adapter/json_api/pagination_links_test.rb +208 -0
- data/test/adapter/json_api/parse_test.rb +139 -0
- data/test/adapter/json_api/relationship_test.rb +399 -0
- data/test/adapter/json_api/resource_meta_test.rb +102 -0
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +84 -0
- data/test/adapter/json_api/transform_test.rb +514 -0
- data/test/adapter/json_api/type_test.rb +195 -0
- data/test/adapter/json_test.rb +48 -0
- data/test/adapter/null_test.rb +24 -0
- data/test/adapter/polymorphic_test.rb +220 -0
- data/test/adapter_test.rb +69 -0
- data/test/array_serializer_test.rb +24 -0
- data/test/benchmark/app.rb +67 -0
- data/test/benchmark/benchmarking_support.rb +69 -0
- data/test/benchmark/bm_active_record.rb +83 -0
- data/test/benchmark/bm_adapter.rb +40 -0
- data/test/benchmark/bm_caching.rb +121 -0
- data/test/benchmark/bm_lookup_chain.rb +85 -0
- data/test/benchmark/bm_transform.rb +47 -0
- data/test/benchmark/config.ru +3 -0
- data/test/benchmark/controllers.rb +85 -0
- data/test/benchmark/fixtures.rb +221 -0
- data/test/cache_test.rb +717 -0
- data/test/collection_serializer_test.rb +129 -0
- data/test/fixtures/active_record.rb +115 -0
- data/test/fixtures/poro.rb +227 -0
- data/test/generators/scaffold_controller_generator_test.rb +26 -0
- data/test/generators/serializer_generator_test.rb +77 -0
- data/test/grape_test.rb +198 -0
- data/test/lint_test.rb +51 -0
- data/test/logger_test.rb +22 -0
- data/test/poro_test.rb +11 -0
- data/test/serializable_resource_test.rb +81 -0
- data/test/serializers/association_macros_test.rb +39 -0
- data/test/serializers/associations_test.rb +520 -0
- data/test/serializers/attribute_test.rb +155 -0
- data/test/serializers/attributes_test.rb +54 -0
- data/test/serializers/caching_configuration_test_isolated.rb +172 -0
- data/test/serializers/configuration_test.rb +34 -0
- data/test/serializers/fieldset_test.rb +16 -0
- data/test/serializers/meta_test.rb +204 -0
- data/test/serializers/options_test.rb +34 -0
- data/test/serializers/read_attribute_for_serialization_test.rb +81 -0
- data/test/serializers/reflection_test.rb +481 -0
- data/test/serializers/root_test.rb +23 -0
- data/test/serializers/serialization_test.rb +57 -0
- data/test/serializers/serializer_for_test.rb +138 -0
- data/test/serializers/serializer_for_with_namespace_test.rb +90 -0
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
- data/test/support/isolated_unit.rb +86 -0
- data/test/support/rails5_shims.rb +55 -0
- data/test/support/rails_app.rb +40 -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 +81 -0
- data/test/test_helper.rb +72 -0
- metadata +622 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module ActiveModel
|
|
6
|
+
class Serializer
|
|
7
|
+
class RootTest < ActiveSupport::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
@virtual_value = VirtualValue.new(id: 1)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_overwrite_root
|
|
13
|
+
serializer = VirtualValueSerializer.new(@virtual_value, root: 'smth')
|
|
14
|
+
assert_equal('smth', serializer.json_key)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_underscore_in_root
|
|
18
|
+
serializer = VirtualValueSerializer.new(@virtual_value)
|
|
19
|
+
assert_equal('virtual_value', serializer.json_key)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveModel
|
|
4
|
+
class Serializer
|
|
5
|
+
class SerializationTest < ActiveSupport::TestCase
|
|
6
|
+
class Blog < ActiveModelSerializers::Model
|
|
7
|
+
attributes :id, :name, :authors
|
|
8
|
+
end
|
|
9
|
+
class Author < ActiveModelSerializers::Model
|
|
10
|
+
attributes :id, :name
|
|
11
|
+
end
|
|
12
|
+
class BlogSerializer < ActiveModel::Serializer
|
|
13
|
+
attributes :id
|
|
14
|
+
attribute :name, key: :title
|
|
15
|
+
|
|
16
|
+
has_many :authors
|
|
17
|
+
end
|
|
18
|
+
class AuthorSerializer < ActiveModel::Serializer
|
|
19
|
+
attributes :id, :name
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
setup do
|
|
23
|
+
@authors = [Author.new(id: 1, name: 'Blog Author')]
|
|
24
|
+
@blog = Blog.new(id: 2, name: 'The Blog', authors: @authors)
|
|
25
|
+
@serializer_instance = BlogSerializer.new(@blog)
|
|
26
|
+
@serializable = ActiveModelSerializers::SerializableResource.new(@blog, serializer: BlogSerializer, adapter: :attributes)
|
|
27
|
+
@expected_hash = { id: 2, title: 'The Blog', authors: [{ id: 1, name: 'Blog Author' }] }
|
|
28
|
+
@expected_json = '{"id":2,"title":"The Blog","authors":[{"id":1,"name":"Blog Author"}]}'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test '#serializable_hash is the same as generated by the attributes adapter' do
|
|
32
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.serializable_hash
|
|
33
|
+
assert_equal @expected_hash, @serializer_instance.serializable_hash
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test '#as_json is the same as generated by the attributes adapter' do
|
|
37
|
+
assert_equal @serializable.as_json, @serializer_instance.as_json
|
|
38
|
+
assert_equal @expected_hash, @serializer_instance.as_json
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test '#to_json is the same as generated by the attributes adapter' do
|
|
42
|
+
assert_equal @serializable.to_json, @serializer_instance.to_json
|
|
43
|
+
assert_equal @expected_json, @serializer_instance.to_json
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test '#to_h is an alias for #serializable_hash' do
|
|
47
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.to_h
|
|
48
|
+
assert_equal @expected_hash, @serializer_instance.to_h
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
test '#to_hash is an alias for #serializable_hash' do
|
|
52
|
+
assert_equal @serializable.serializable_hash, @serializer_instance.to_hash
|
|
53
|
+
assert_equal @expected_hash, @serializer_instance.to_hash
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module ActiveModel
|
|
6
|
+
class Serializer
|
|
7
|
+
class SerializerForTest < ActiveSupport::TestCase
|
|
8
|
+
class CollectionSerializerTest < ActiveSupport::TestCase
|
|
9
|
+
def setup
|
|
10
|
+
@array = [1, 2, 3]
|
|
11
|
+
@previous_collection_serializer = ActiveModelSerializers.config.collection_serializer
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def teardown
|
|
15
|
+
ActiveModelSerializers.config.collection_serializer = @previous_collection_serializer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_serializer_for_array
|
|
19
|
+
serializer = ActiveModel::Serializer.serializer_for(@array)
|
|
20
|
+
assert_equal ActiveModelSerializers.config.collection_serializer, serializer
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_overwritten_serializer_for_array
|
|
24
|
+
new_collection_serializer = Class.new
|
|
25
|
+
ActiveModelSerializers.config.collection_serializer = new_collection_serializer
|
|
26
|
+
serializer = ActiveModel::Serializer.serializer_for(@array)
|
|
27
|
+
assert_equal new_collection_serializer, serializer
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class SerializerTest < ActiveSupport::TestCase
|
|
32
|
+
module ResourceNamespace
|
|
33
|
+
class Post < ::Model; end
|
|
34
|
+
class Comment < ::Model; end
|
|
35
|
+
|
|
36
|
+
class PostSerializer < ActiveModel::Serializer
|
|
37
|
+
class CommentSerializer < ActiveModel::Serializer
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class MyProfile < Profile
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class CustomProfile
|
|
46
|
+
def serializer_class
|
|
47
|
+
ProfileSerializer
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class Tweet < ::Model; end
|
|
52
|
+
TweetSerializer = Class.new
|
|
53
|
+
|
|
54
|
+
def setup
|
|
55
|
+
@profile = Profile.new
|
|
56
|
+
@my_profile = MyProfile.new
|
|
57
|
+
@custom_profile = CustomProfile.new
|
|
58
|
+
@model = ::Model.new
|
|
59
|
+
@tweet = Tweet.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_serializer_for_non_ams_serializer
|
|
63
|
+
serializer = ActiveModel::Serializer.serializer_for(@tweet)
|
|
64
|
+
assert_nil serializer
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_serializer_for_existing_serializer
|
|
68
|
+
serializer = ActiveModel::Serializer.serializer_for(@profile)
|
|
69
|
+
assert_equal ProfileSerializer, serializer
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_serializer_for_existing_serializer_with_lookup_disabled
|
|
73
|
+
serializer = with_serializer_lookup_disabled do
|
|
74
|
+
ActiveModel::Serializer.serializer_for(@profile)
|
|
75
|
+
end
|
|
76
|
+
assert_nil serializer
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_serializer_for_not_existing_serializer
|
|
80
|
+
serializer = ActiveModel::Serializer.serializer_for(@model)
|
|
81
|
+
assert_nil serializer
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_serializer_inherited_serializer
|
|
85
|
+
serializer = ActiveModel::Serializer.serializer_for(@my_profile)
|
|
86
|
+
assert_equal ProfileSerializer, serializer
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_serializer_inherited_serializer_with_lookup_disabled
|
|
90
|
+
serializer = with_serializer_lookup_disabled do
|
|
91
|
+
ActiveModel::Serializer.serializer_for(@my_profile)
|
|
92
|
+
end
|
|
93
|
+
assert_nil serializer
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_serializer_custom_serializer
|
|
97
|
+
serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
|
|
98
|
+
assert_equal ProfileSerializer, serializer
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_serializer_custom_serializer_with_lookup_disabled
|
|
102
|
+
serializer = with_serializer_lookup_disabled do
|
|
103
|
+
ActiveModel::Serializer.serializer_for(@custom_profile)
|
|
104
|
+
end
|
|
105
|
+
assert_equal ProfileSerializer, serializer
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_serializer_for_namespaced_resource
|
|
109
|
+
post = ResourceNamespace::Post.new
|
|
110
|
+
serializer = ActiveModel::Serializer.serializer_for(post)
|
|
111
|
+
assert_equal ResourceNamespace::PostSerializer, serializer
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_serializer_for_namespaced_resource_with_lookup_disabled
|
|
115
|
+
post = ResourceNamespace::Post.new
|
|
116
|
+
serializer = with_serializer_lookup_disabled do
|
|
117
|
+
ActiveModel::Serializer.serializer_for(post)
|
|
118
|
+
end
|
|
119
|
+
assert_nil serializer
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def test_serializer_for_nested_resource
|
|
123
|
+
comment = ResourceNamespace::Comment.new
|
|
124
|
+
serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
|
|
125
|
+
assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_serializer_for_nested_resource_with_lookup_disabled
|
|
129
|
+
comment = ResourceNamespace::Comment.new
|
|
130
|
+
serializer = with_serializer_lookup_disabled do
|
|
131
|
+
ResourceNamespace::PostSerializer.serializer_for(comment)
|
|
132
|
+
end
|
|
133
|
+
assert_nil serializer
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module ActiveModel
|
|
6
|
+
class Serializer
|
|
7
|
+
class SerializerForWithNamespaceTest < ActiveSupport::TestCase
|
|
8
|
+
class Book < ::Model
|
|
9
|
+
attributes :title, :author_name
|
|
10
|
+
associations :publisher, :pages
|
|
11
|
+
end
|
|
12
|
+
class Page < ::Model; attributes :number, :text end
|
|
13
|
+
class Publisher < ::Model; attributes :name end
|
|
14
|
+
|
|
15
|
+
module Api
|
|
16
|
+
module V3
|
|
17
|
+
class BookSerializer < ActiveModel::Serializer
|
|
18
|
+
attributes :title, :author_name
|
|
19
|
+
|
|
20
|
+
has_many :pages
|
|
21
|
+
belongs_to :publisher
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class PageSerializer < ActiveModel::Serializer
|
|
25
|
+
attributes :number, :text
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class PublisherSerializer < ActiveModel::Serializer
|
|
29
|
+
attributes :name
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class BookSerializer < ActiveModel::Serializer
|
|
35
|
+
attributes :title, :author_name
|
|
36
|
+
end
|
|
37
|
+
test 'resource without a namespace' do
|
|
38
|
+
book = Book.new(title: 'A Post', author_name: 'hello')
|
|
39
|
+
|
|
40
|
+
# TODO: this should be able to pull up this serializer without explicitly specifying the serializer
|
|
41
|
+
# currently, with no options, it still uses the Api::V3 serializer
|
|
42
|
+
result = ActiveModelSerializers::SerializableResource.new(book, serializer: BookSerializer).serializable_hash
|
|
43
|
+
|
|
44
|
+
expected = { title: 'A Post', author_name: 'hello' }
|
|
45
|
+
assert_equal expected, result
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test 'resource with namespace' do
|
|
49
|
+
book = Book.new(title: 'A Post', author_name: 'hi')
|
|
50
|
+
|
|
51
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
52
|
+
|
|
53
|
+
expected = { title: 'A Post', author_name: 'hi', pages: nil, publisher: nil }
|
|
54
|
+
assert_equal expected, result
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
test 'has_many with nested serializer under the namespace' do
|
|
58
|
+
page = Page.new(number: 1, text: 'hello')
|
|
59
|
+
book = Book.new(title: 'A Post', author_name: 'hi', pages: [page])
|
|
60
|
+
|
|
61
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
62
|
+
|
|
63
|
+
expected = {
|
|
64
|
+
title: 'A Post', author_name: 'hi',
|
|
65
|
+
publisher: nil,
|
|
66
|
+
pages: [{
|
|
67
|
+
number: 1, text: 'hello'
|
|
68
|
+
}]
|
|
69
|
+
}
|
|
70
|
+
assert_equal expected, result
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
test 'belongs_to with nested serializer under the namespace' do
|
|
74
|
+
publisher = Publisher.new(name: 'Disney')
|
|
75
|
+
book = Book.new(title: 'A Post', author_name: 'hi', publisher: publisher)
|
|
76
|
+
|
|
77
|
+
result = ActiveModelSerializers::SerializableResource.new(book, namespace: Api::V3).serializable_hash
|
|
78
|
+
|
|
79
|
+
expected = {
|
|
80
|
+
title: 'A Post', author_name: 'hi',
|
|
81
|
+
pages: nil,
|
|
82
|
+
publisher: {
|
|
83
|
+
name: 'Disney'
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
assert_equal expected, result
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# https://github.com/rails/rails/blob/v5.0.0.beta1/railties/test/isolation/abstract_unit.rb
|
|
4
|
+
|
|
5
|
+
# Usage Example:
|
|
6
|
+
#
|
|
7
|
+
# require 'support/isolated_unit'
|
|
8
|
+
#
|
|
9
|
+
# class RailtieTest < ActiveSupport::TestCase
|
|
10
|
+
# include ActiveSupport::Testing::Isolation
|
|
11
|
+
#
|
|
12
|
+
# class WithRailsDefinedOnLoad < RailtieTest
|
|
13
|
+
# setup do
|
|
14
|
+
# require 'rails'
|
|
15
|
+
# require 'active_model_serializers'
|
|
16
|
+
# make_basic_app
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# # some tests
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# class WithoutRailsDefinedOnLoad < RailtieTest
|
|
23
|
+
# setup do
|
|
24
|
+
# require 'active_model_serializers'
|
|
25
|
+
# make_basic_app
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# # some tests
|
|
29
|
+
# end
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# Note:
|
|
33
|
+
# It is important to keep this file as light as possible
|
|
34
|
+
# the goal for tests that require this is to test booting up
|
|
35
|
+
# rails from an empty state, so anything added here could
|
|
36
|
+
# hide potential failures
|
|
37
|
+
#
|
|
38
|
+
# It is also good to know what is the bare minimum to get
|
|
39
|
+
# Rails booted up.
|
|
40
|
+
require 'bundler/setup' unless defined?(Bundler)
|
|
41
|
+
require 'active_support'
|
|
42
|
+
require 'active_support/core_ext/string/access'
|
|
43
|
+
|
|
44
|
+
# These files do not require any others and are needed
|
|
45
|
+
# to run the tests
|
|
46
|
+
require 'active_support/testing/autorun'
|
|
47
|
+
require 'active_support/testing/isolation'
|
|
48
|
+
|
|
49
|
+
module TestHelpers
|
|
50
|
+
module Generation
|
|
51
|
+
module_function
|
|
52
|
+
|
|
53
|
+
# Make a very basic app, without creating the whole directory structure.
|
|
54
|
+
# Is faster and simpler than generating a Rails app in a temp directory
|
|
55
|
+
def make_basic_app
|
|
56
|
+
require 'rails'
|
|
57
|
+
require 'action_controller/railtie'
|
|
58
|
+
|
|
59
|
+
app = Class.new(Rails::Application) do
|
|
60
|
+
config.eager_load = false
|
|
61
|
+
config.session_store :cookie_store, key: '_myapp_session'
|
|
62
|
+
config.active_support.deprecation = :log
|
|
63
|
+
config.active_support.test_order = :parallel
|
|
64
|
+
ActiveSupport::TestCase.respond_to?(:test_order=) && ActiveSupport::TestCase.test_order = :parallel
|
|
65
|
+
config.root = File.dirname(__FILE__)
|
|
66
|
+
config.log_level = :info
|
|
67
|
+
# Set a fake logger to avoid creating the log directory automatically
|
|
68
|
+
fake_logger = Logger.new(nil)
|
|
69
|
+
config.logger = fake_logger
|
|
70
|
+
Rails.application.routes.default_url_options = { host: 'example.com' }
|
|
71
|
+
end
|
|
72
|
+
def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
|
|
73
|
+
app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
|
|
74
|
+
|
|
75
|
+
@app = app
|
|
76
|
+
yield @app if block_given?
|
|
77
|
+
@app.initialize!
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
module ActiveSupport
|
|
83
|
+
class TestCase
|
|
84
|
+
include TestHelpers::Generation
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rails5Shims
|
|
4
|
+
module ControllerTests
|
|
5
|
+
# https://github.com/rails/rails/blob/b217354/actionpack/lib/action_controller/test_case.rb
|
|
6
|
+
REQUEST_KWARGS = [:params, :headers, :session, :flash, :method, :body, :xhr].freeze
|
|
7
|
+
|
|
8
|
+
def get(path, *args)
|
|
9
|
+
fold_kwargs!(args)
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def post(path, *args)
|
|
14
|
+
fold_kwargs!(args)
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def patch(path, *args)
|
|
19
|
+
fold_kwargs!(args)
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def put(path, *args)
|
|
24
|
+
fold_kwargs!(args)
|
|
25
|
+
super
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Fold kwargs from test request into args
|
|
29
|
+
# Band-aid for DEPRECATION WARNING
|
|
30
|
+
def fold_kwargs!(args)
|
|
31
|
+
hash = args && args[0]
|
|
32
|
+
return unless hash.respond_to?(:key)
|
|
33
|
+
Rails5Shims::ControllerTests::REQUEST_KWARGS.each do |kwarg|
|
|
34
|
+
next unless hash.key?(kwarg)
|
|
35
|
+
value = hash.delete(kwarg)
|
|
36
|
+
if value.is_a? String
|
|
37
|
+
args.insert(0, value)
|
|
38
|
+
else
|
|
39
|
+
hash.merge! value
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Uncomment for debugging where the kwargs warnings come from
|
|
45
|
+
# def non_kwarg_request_warning
|
|
46
|
+
# super.tap do
|
|
47
|
+
# STDOUT.puts caller[2..3]
|
|
48
|
+
# end
|
|
49
|
+
# end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
if Rails::VERSION::MAJOR < 5
|
|
53
|
+
ActionController::TestCase.send :include, Rails5Shims::ControllerTests
|
|
54
|
+
ActionDispatch::IntegrationTest.send :include, Rails5Shims::ControllerTests
|
|
55
|
+
end
|