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,49 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActionController
|
|
4
|
+
module Serialization
|
|
5
|
+
class LookupProcTest < ActionController::TestCase
|
|
6
|
+
module Api
|
|
7
|
+
module V3
|
|
8
|
+
class PostCustomSerializer < ActiveModel::Serializer
|
|
9
|
+
attributes :title, :body
|
|
10
|
+
|
|
11
|
+
belongs_to :author
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class AuthorCustomSerializer < ActiveModel::Serializer
|
|
15
|
+
attributes :name
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class LookupProcTestController < ActionController::Base
|
|
19
|
+
def implicit_namespaced_serializer
|
|
20
|
+
author = Author.new(name: 'Bob')
|
|
21
|
+
post = Post.new(title: 'New Post', body: 'Body', author: author)
|
|
22
|
+
|
|
23
|
+
render json: post
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
tests Api::V3::LookupProcTestController
|
|
30
|
+
|
|
31
|
+
test 'implicitly uses namespaced serializer' do
|
|
32
|
+
controller_namespace = lambda do |resource_class, _parent_serializer_class, namespace|
|
|
33
|
+
"#{namespace}::#{resource_class}CustomSerializer" if namespace
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
with_prepended_lookup(controller_namespace) do
|
|
37
|
+
get :implicit_namespaced_serializer
|
|
38
|
+
|
|
39
|
+
assert_serializer Api::V3::PostCustomSerializer
|
|
40
|
+
|
|
41
|
+
expected = { 'title' => 'New Post', 'body' => 'Body', 'author' => { 'name' => 'Bob' } }
|
|
42
|
+
actual = JSON.parse(@response.body)
|
|
43
|
+
|
|
44
|
+
assert_equal expected, actual
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ActionController
|
|
4
|
+
module Serialization
|
|
5
|
+
class NamespaceLookupTest < ActionController::TestCase
|
|
6
|
+
class Book < ::Model
|
|
7
|
+
attributes :title, :body
|
|
8
|
+
associations :writer, :chapters
|
|
9
|
+
end
|
|
10
|
+
class Chapter < ::Model
|
|
11
|
+
attributes :title
|
|
12
|
+
end
|
|
13
|
+
class Writer < ::Model
|
|
14
|
+
attributes :name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Api
|
|
18
|
+
module V2
|
|
19
|
+
class BookSerializer < ActiveModel::Serializer
|
|
20
|
+
attributes :title
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module VHeader
|
|
25
|
+
class BookSerializer < ActiveModel::Serializer
|
|
26
|
+
attributes :title, :body
|
|
27
|
+
|
|
28
|
+
def body
|
|
29
|
+
'header'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module V3
|
|
35
|
+
class BookSerializer < ActiveModel::Serializer
|
|
36
|
+
attributes :title, :body
|
|
37
|
+
|
|
38
|
+
belongs_to :writer
|
|
39
|
+
has_many :chapters
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class ChapterSerializer < ActiveModel::Serializer
|
|
43
|
+
attribute :title do
|
|
44
|
+
"Chapter - #{object.title}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class WriterSerializer < ActiveModel::Serializer
|
|
49
|
+
attributes :name
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class LookupTestController < ActionController::Base
|
|
53
|
+
before_action only: [:namespace_set_in_before_filter] do
|
|
54
|
+
self.namespace_for_serializer = Api::V2
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def implicit_namespaced_serializer
|
|
58
|
+
writer = Writer.new(name: 'Bob')
|
|
59
|
+
book = Book.new(title: 'New Post', body: 'Body', writer: writer, chapters: [])
|
|
60
|
+
|
|
61
|
+
render json: book
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def implicit_namespaced_collection_serializer
|
|
65
|
+
chapter1 = Chapter.new(title: 'Oh')
|
|
66
|
+
chapter2 = Chapter.new(title: 'Oh my')
|
|
67
|
+
|
|
68
|
+
render json: [chapter1, chapter2]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def implicit_has_many_namespaced_serializer
|
|
72
|
+
chapter1 = Chapter.new(title: 'Odd World')
|
|
73
|
+
chapter2 = Chapter.new(title: 'New World')
|
|
74
|
+
book = Book.new(title: 'New Post', body: 'Body', chapters: [chapter1, chapter2])
|
|
75
|
+
|
|
76
|
+
render json: book
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def explicit_namespace_as_module
|
|
80
|
+
book = Book.new(title: 'New Post', body: 'Body')
|
|
81
|
+
|
|
82
|
+
render json: book, namespace: Api::V2
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def explicit_namespace_as_string
|
|
86
|
+
book = Book.new(title: 'New Post', body: 'Body')
|
|
87
|
+
|
|
88
|
+
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
|
89
|
+
# the looku things we mean ::Api::V2
|
|
90
|
+
render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def explicit_namespace_as_symbol
|
|
94
|
+
book = Book.new(title: 'New Post', body: 'Body')
|
|
95
|
+
|
|
96
|
+
# because this is a string, ruby can't auto-lookup the constant, so otherwise
|
|
97
|
+
# the looku things we mean ::Api::V2
|
|
98
|
+
render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def invalid_namespace
|
|
102
|
+
book = Book.new(id: 'invalid_namespace_book_id', title: 'New Post', body: 'Body')
|
|
103
|
+
|
|
104
|
+
render json: book, namespace: :api_v2
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def namespace_set_in_before_filter
|
|
108
|
+
book = Book.new(title: 'New Post', body: 'Body')
|
|
109
|
+
render json: book
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def namespace_set_by_request_headers
|
|
113
|
+
book = Book.new(title: 'New Post', body: 'Body')
|
|
114
|
+
version_from_header = request.headers['X-API_VERSION']
|
|
115
|
+
namespace = "ActionController::Serialization::NamespaceLookupTest::#{version_from_header}"
|
|
116
|
+
|
|
117
|
+
render json: book, namespace: namespace
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
tests Api::V3::LookupTestController
|
|
124
|
+
|
|
125
|
+
setup do
|
|
126
|
+
@test_namespace = self.class.parent
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
test 'uses request headers to determine the namespace' do
|
|
130
|
+
request.env['X-API_VERSION'] = 'Api::VHeader'
|
|
131
|
+
get :namespace_set_by_request_headers
|
|
132
|
+
|
|
133
|
+
assert_serializer Api::VHeader::BookSerializer
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
test 'implicitly uses namespaced serializer' do
|
|
137
|
+
get :implicit_namespaced_serializer
|
|
138
|
+
|
|
139
|
+
assert_serializer Api::V3::BookSerializer
|
|
140
|
+
|
|
141
|
+
expected = { 'title' => 'New Post', 'body' => 'Body', 'writer' => { 'name' => 'Bob' }, 'chapters' => [] }
|
|
142
|
+
actual = JSON.parse(@response.body)
|
|
143
|
+
|
|
144
|
+
assert_equal expected, actual
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
test 'implicitly uses namespaced serializer for collection' do
|
|
148
|
+
get :implicit_namespaced_collection_serializer
|
|
149
|
+
|
|
150
|
+
assert_serializer 'ActiveModel::Serializer::CollectionSerializer'
|
|
151
|
+
|
|
152
|
+
expected = [{ 'title' => 'Chapter - Oh' }, { 'title' => 'Chapter - Oh my' }]
|
|
153
|
+
actual = JSON.parse(@response.body)
|
|
154
|
+
|
|
155
|
+
assert_equal expected, actual
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
test 'implicitly uses namespaced serializer for has_many' do
|
|
159
|
+
get :implicit_has_many_namespaced_serializer
|
|
160
|
+
|
|
161
|
+
assert_serializer Api::V3::BookSerializer
|
|
162
|
+
|
|
163
|
+
expected = {
|
|
164
|
+
'title' => 'New Post',
|
|
165
|
+
'body' => 'Body', 'writer' => nil,
|
|
166
|
+
'chapters' => [
|
|
167
|
+
{ 'title' => 'Chapter - Odd World' },
|
|
168
|
+
{ 'title' => 'Chapter - New World' }
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
actual = JSON.parse(@response.body)
|
|
172
|
+
|
|
173
|
+
assert_equal expected, actual
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
test 'explicit namespace as module' do
|
|
177
|
+
get :explicit_namespace_as_module
|
|
178
|
+
|
|
179
|
+
assert_serializer Api::V2::BookSerializer
|
|
180
|
+
|
|
181
|
+
expected = { 'title' => 'New Post' }
|
|
182
|
+
actual = JSON.parse(@response.body)
|
|
183
|
+
|
|
184
|
+
assert_equal expected, actual
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
test 'explicit namespace as string' do
|
|
188
|
+
get :explicit_namespace_as_string
|
|
189
|
+
|
|
190
|
+
assert_serializer Api::V2::BookSerializer
|
|
191
|
+
|
|
192
|
+
expected = { 'title' => 'New Post' }
|
|
193
|
+
actual = JSON.parse(@response.body)
|
|
194
|
+
|
|
195
|
+
assert_equal expected, actual
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
test 'explicit namespace as symbol' do
|
|
199
|
+
get :explicit_namespace_as_symbol
|
|
200
|
+
|
|
201
|
+
assert_serializer Api::V2::BookSerializer
|
|
202
|
+
|
|
203
|
+
expected = { 'title' => 'New Post' }
|
|
204
|
+
actual = JSON.parse(@response.body)
|
|
205
|
+
|
|
206
|
+
assert_equal expected, actual
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
test 'invalid namespace' do
|
|
210
|
+
get :invalid_namespace
|
|
211
|
+
|
|
212
|
+
assert_serializer ActiveModel::Serializer::Null
|
|
213
|
+
|
|
214
|
+
expected = { 'id' => 'invalid_namespace_book_id', 'title' => 'New Post', 'body' => 'Body' }
|
|
215
|
+
actual = JSON.parse(@response.body)
|
|
216
|
+
|
|
217
|
+
assert_equal expected, actual
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
test 'namespace set in before filter' do
|
|
221
|
+
get :namespace_set_in_before_filter
|
|
222
|
+
|
|
223
|
+
assert_serializer Api::V2::BookSerializer
|
|
224
|
+
|
|
225
|
+
expected = { 'title' => 'New Post' }
|
|
226
|
+
actual = JSON.parse(@response.body)
|
|
227
|
+
|
|
228
|
+
assert_equal expected, actual
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module SerializationScopeTesting
|
|
4
|
+
class User < ActiveModelSerializers::Model
|
|
5
|
+
attributes :id, :name, :admin
|
|
6
|
+
def admin?
|
|
7
|
+
admin
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class Comment < ActiveModelSerializers::Model
|
|
11
|
+
attributes :id, :body
|
|
12
|
+
end
|
|
13
|
+
class Post < ActiveModelSerializers::Model
|
|
14
|
+
attributes :id, :title, :body, :comments
|
|
15
|
+
end
|
|
16
|
+
class PostSerializer < ActiveModel::Serializer
|
|
17
|
+
attributes :id, :title, :body, :comments
|
|
18
|
+
|
|
19
|
+
def body
|
|
20
|
+
"The 'scope' is the 'current_user': #{scope == current_user}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def comments
|
|
24
|
+
if current_user.admin?
|
|
25
|
+
[Comment.new(id: 1, body: 'Admin')]
|
|
26
|
+
else
|
|
27
|
+
[Comment.new(id: 2, body: 'Scoped')]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def json_key
|
|
32
|
+
'post'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
class PostTestController < ActionController::Base
|
|
36
|
+
attr_accessor :current_user
|
|
37
|
+
def render_post_by_non_admin
|
|
38
|
+
self.current_user = User.new(id: 3, name: 'Pete', admin: false)
|
|
39
|
+
render json: new_post, serializer: serializer, adapter: :json
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def render_post_by_admin
|
|
43
|
+
self.current_user = User.new(id: 3, name: 'Pete', admin: true)
|
|
44
|
+
render json: new_post, serializer: serializer, adapter: :json
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def new_post
|
|
50
|
+
Post.new(id: 4, title: 'Title')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def serializer
|
|
54
|
+
PostSerializer
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
class PostViewContextSerializer < PostSerializer
|
|
58
|
+
def body
|
|
59
|
+
"The 'scope' is the 'view_context': #{scope == view_context}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def comments
|
|
63
|
+
if view_context.controller.current_user.admin?
|
|
64
|
+
[Comment.new(id: 1, body: 'Admin')]
|
|
65
|
+
else
|
|
66
|
+
[Comment.new(id: 2, body: 'Scoped')]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
class DefaultScopeTest < ActionController::TestCase
|
|
71
|
+
tests PostTestController
|
|
72
|
+
|
|
73
|
+
def test_default_serialization_scope
|
|
74
|
+
assert_equal :current_user, @controller._serialization_scope
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_default_serialization_scope_object
|
|
78
|
+
assert_equal @controller.current_user, @controller.serialization_scope
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_default_scope_non_admin
|
|
82
|
+
get :render_post_by_non_admin
|
|
83
|
+
expected_json = {
|
|
84
|
+
post: {
|
|
85
|
+
id: 4,
|
|
86
|
+
title: 'Title',
|
|
87
|
+
body: "The 'scope' is the 'current_user': true",
|
|
88
|
+
comments: [
|
|
89
|
+
{ id: 2, body: 'Scoped' }
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
}.to_json
|
|
93
|
+
assert_equal expected_json, @response.body
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_default_scope_admin
|
|
97
|
+
get :render_post_by_admin
|
|
98
|
+
expected_json = {
|
|
99
|
+
post: {
|
|
100
|
+
id: 4,
|
|
101
|
+
title: 'Title',
|
|
102
|
+
body: "The 'scope' is the 'current_user': true",
|
|
103
|
+
comments: [
|
|
104
|
+
{ id: 1, body: 'Admin' }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
}.to_json
|
|
108
|
+
assert_equal expected_json, @response.body
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
class SerializationScopeTest < ActionController::TestCase
|
|
112
|
+
class PostViewContextTestController < PostTestController
|
|
113
|
+
serialization_scope :view_context
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def serializer
|
|
118
|
+
PostViewContextSerializer
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
tests PostViewContextTestController
|
|
122
|
+
|
|
123
|
+
def test_defined_serialization_scope
|
|
124
|
+
assert_equal :view_context, @controller._serialization_scope
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_defined_serialization_scope_object
|
|
128
|
+
assert_equal @controller.view_context.class, @controller.serialization_scope.class
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_serialization_scope_non_admin
|
|
132
|
+
get :render_post_by_non_admin
|
|
133
|
+
expected_json = {
|
|
134
|
+
post: {
|
|
135
|
+
id: 4,
|
|
136
|
+
title: 'Title',
|
|
137
|
+
body: "The 'scope' is the 'view_context': true",
|
|
138
|
+
comments: [
|
|
139
|
+
{ id: 2, body: 'Scoped' }
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
}.to_json
|
|
143
|
+
assert_equal expected_json, @response.body
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def test_serialization_scope_admin
|
|
147
|
+
get :render_post_by_admin
|
|
148
|
+
expected_json = {
|
|
149
|
+
post: {
|
|
150
|
+
id: 4,
|
|
151
|
+
title: 'Title',
|
|
152
|
+
body: "The 'scope' is the 'view_context': true",
|
|
153
|
+
comments: [
|
|
154
|
+
{ id: 1, body: 'Admin' }
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
}.to_json
|
|
158
|
+
assert_equal expected_json, @response.body
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
class NilSerializationScopeTest < ActionController::TestCase
|
|
162
|
+
class PostViewContextTestController < ActionController::Base
|
|
163
|
+
serialization_scope nil
|
|
164
|
+
|
|
165
|
+
attr_accessor :current_user
|
|
166
|
+
|
|
167
|
+
def render_post_with_no_scope
|
|
168
|
+
self.current_user = User.new(id: 3, name: 'Pete', admin: false)
|
|
169
|
+
render json: new_post, serializer: PostSerializer, adapter: :json
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def render_post_with_passed_in_scope
|
|
173
|
+
self.current_user = User.new(id: 3, name: 'Pete', admin: false)
|
|
174
|
+
render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def render_post_with_passed_in_scope_without_scope_name
|
|
178
|
+
self.current_user = User.new(id: 3, name: 'Pete', admin: false)
|
|
179
|
+
render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
def new_post
|
|
185
|
+
Post.new(id: 4, title: 'Title')
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
tests PostViewContextTestController
|
|
189
|
+
|
|
190
|
+
def test_nil_serialization_scope
|
|
191
|
+
assert_nil @controller._serialization_scope
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_nil_serialization_scope_object
|
|
195
|
+
assert_nil @controller.serialization_scope
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def test_nil_scope
|
|
199
|
+
exception_matcher = /current_user/
|
|
200
|
+
exception = assert_raises(NameError) do
|
|
201
|
+
get :render_post_with_no_scope
|
|
202
|
+
end
|
|
203
|
+
assert_match exception_matcher, exception.message
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def test_serialization_scope_is_and_nil_scope_passed_in_current_user
|
|
207
|
+
get :render_post_with_passed_in_scope
|
|
208
|
+
expected_json = {
|
|
209
|
+
post: {
|
|
210
|
+
id: 4,
|
|
211
|
+
title: 'Title',
|
|
212
|
+
body: "The 'scope' is the 'current_user': true",
|
|
213
|
+
comments: [
|
|
214
|
+
{ id: 2, body: 'Scoped' }
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
}.to_json
|
|
218
|
+
assert_equal expected_json, @response.body
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
|
|
222
|
+
exception_matcher = /current_user/
|
|
223
|
+
exception = assert_raises(NameError) do
|
|
224
|
+
get :render_post_with_passed_in_scope_without_scope_name
|
|
225
|
+
end
|
|
226
|
+
assert_match exception_matcher, exception.message
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|