active_model_serializers 0.10.0 → 0.10.13
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 +5 -5
- data/CHANGELOG.md +239 -2
- data/README.md +171 -34
- data/lib/action_controller/serialization.rb +23 -3
- data/lib/active_model/serializable_resource.rb +2 -0
- data/lib/active_model/serializer/adapter/attributes.rb +2 -0
- data/lib/active_model/serializer/adapter/base.rb +4 -0
- data/lib/active_model/serializer/adapter/json.rb +2 -0
- data/lib/active_model/serializer/adapter/json_api.rb +2 -0
- data/lib/active_model/serializer/adapter/null.rb +2 -0
- data/lib/active_model/serializer/adapter.rb +2 -0
- data/lib/active_model/serializer/array_serializer.rb +10 -5
- data/lib/active_model/serializer/association.rb +64 -10
- data/lib/active_model/serializer/attribute.rb +2 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
- data/lib/active_model/serializer/collection_serializer.rb +48 -13
- data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
- data/lib/active_model/serializer/error_serializer.rb +13 -7
- data/lib/active_model/serializer/errors_serializer.rb +27 -20
- data/lib/active_model/serializer/field.rb +2 -0
- data/lib/active_model/serializer/fieldset.rb +3 -1
- data/lib/active_model/serializer/has_many_reflection.rb +5 -3
- data/lib/active_model/serializer/has_one_reflection.rb +3 -4
- 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 +136 -130
- data/lib/active_model/serializer/null.rb +2 -0
- data/lib/active_model/serializer/reflection.rb +130 -65
- data/lib/active_model/serializer/version.rb +3 -1
- data/lib/active_model/serializer.rb +321 -86
- data/lib/active_model_serializers/adapter/attributes.rb +17 -57
- data/lib/active_model_serializers/adapter/base.rb +41 -39
- data/lib/active_model_serializers/adapter/json.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
- data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
- data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
- data/lib/active_model_serializers/adapter/json_api.rb +84 -65
- data/lib/active_model_serializers/adapter/null.rb +2 -0
- data/lib/active_model_serializers/adapter.rb +9 -1
- data/lib/active_model_serializers/callbacks.rb +2 -0
- data/lib/active_model_serializers/deprecate.rb +3 -2
- data/lib/active_model_serializers/deserialization.rb +4 -0
- data/lib/active_model_serializers/json_pointer.rb +2 -0
- data/lib/active_model_serializers/logging.rb +2 -0
- data/lib/active_model_serializers/lookup_chain.rb +82 -0
- data/lib/active_model_serializers/model/caching.rb +26 -0
- data/lib/active_model_serializers/model.rb +111 -28
- data/lib/active_model_serializers/railtie.rb +7 -1
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
- data/lib/active_model_serializers/serializable_resource.rb +10 -7
- data/lib/active_model_serializers/serialization_context.rb +12 -3
- data/lib/active_model_serializers/test/schema.rb +4 -2
- data/lib/active_model_serializers/test/serializer.rb +2 -0
- data/lib/active_model_serializers/test.rb +2 -0
- data/lib/active_model_serializers.rb +35 -10
- data/lib/generators/rails/resource_override.rb +3 -1
- data/lib/generators/rails/serializer_generator.rb +6 -4
- data/lib/grape/active_model_serializers.rb +9 -5
- data/lib/grape/formatters/active_model_serializers.rb +21 -2
- data/lib/grape/helpers/active_model_serializers.rb +3 -0
- data/lib/tasks/rubocop.rake +55 -0
- metadata +104 -296
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -104
- data/.rubocop_todo.yml +0 -167
- data/.simplecov +0 -110
- data/.travis.yml +0 -43
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -53
- data/Rakefile +0 -103
- data/active_model_serializers.gemspec +0 -66
- data/appveyor.yml +0 -24
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/serve_benchmark +0 -39
- data/docs/ARCHITECTURE.md +0 -126
- data/docs/README.md +0 -40
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -245
- data/docs/general/caching.md +0 -52
- data/docs/general/configuration_options.md +0 -100
- data/docs/general/deserialization.md +0 -100
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -14
- data/docs/general/rendering.md +0 -255
- data/docs/general/serializers.md +0 -372
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -139
- data/docs/howto/add_root_key.md +0 -51
- data/docs/howto/outside_controller_use.md +0 -58
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -32
- data/docs/howto/test.md +0 -152
- data/docs/integrations/ember-and-json-api.md +0 -112
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/lib/active_model/serializer/associations.rb +0 -100
- data/lib/active_model/serializer/attributes.rb +0 -82
- data/lib/active_model/serializer/collection_reflection.rb +0 -7
- data/lib/active_model/serializer/configuration.rb +0 -35
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/lib/active_model/serializer/links.rb +0 -35
- data/lib/active_model/serializer/meta.rb +0 -29
- data/lib/active_model/serializer/singular_reflection.rb +0 -7
- data/lib/active_model/serializer/type.rb +0 -25
- data/lib/active_model_serializers/key_transform.rb +0 -70
- data/test/action_controller/adapter_selector_test.rb +0 -53
- data/test/action_controller/explicit_serializer_test.rb +0 -134
- data/test/action_controller/json/include_test.rb +0 -167
- data/test/action_controller/json_api/deserialization_test.rb +0 -112
- data/test/action_controller/json_api/errors_test.rb +0 -41
- data/test/action_controller/json_api/linked_test.rb +0 -197
- data/test/action_controller/json_api/pagination_test.rb +0 -116
- data/test/action_controller/json_api/transform_test.rb +0 -181
- data/test/action_controller/serialization_scope_name_test.rb +0 -229
- data/test/action_controller/serialization_test.rb +0 -469
- data/test/active_model_serializers/adapter_for_test.rb +0 -208
- data/test/active_model_serializers/json_pointer_test.rb +0 -20
- data/test/active_model_serializers/key_transform_test.rb +0 -263
- data/test/active_model_serializers/logging_test.rb +0 -77
- data/test/active_model_serializers/model_test.rb +0 -9
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
- data/test/active_model_serializers/test/schema_test.rb +0 -130
- data/test/active_model_serializers/test/serializer_test.rb +0 -62
- data/test/active_record_test.rb +0 -9
- data/test/adapter/deprecation_test.rb +0 -100
- data/test/adapter/json/belongs_to_test.rb +0 -45
- data/test/adapter/json/collection_test.rb +0 -90
- data/test/adapter/json/has_many_test.rb +0 -45
- data/test/adapter/json/transform_test.rb +0 -93
- data/test/adapter/json_api/belongs_to_test.rb +0 -155
- data/test/adapter/json_api/collection_test.rb +0 -95
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -87
- data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
- data/test/adapter/json_api/has_many_test.rb +0 -144
- data/test/adapter/json_api/has_one_test.rb +0 -80
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -392
- data/test/adapter/json_api/links_test.rb +0 -93
- data/test/adapter/json_api/pagination_links_test.rb +0 -166
- data/test/adapter/json_api/parse_test.rb +0 -137
- data/test/adapter/json_api/relationship_test.rb +0 -161
- data/test/adapter/json_api/relationships_test.rb +0 -199
- data/test/adapter/json_api/resource_identifier_test.rb +0 -85
- data/test/adapter/json_api/resource_meta_test.rb +0 -100
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
- data/test/adapter/json_api/transform_test.rb +0 -502
- data/test/adapter/json_api/type_test.rb +0 -61
- data/test/adapter/json_test.rb +0 -45
- data/test/adapter/null_test.rb +0 -23
- data/test/adapter/polymorphic_test.rb +0 -171
- data/test/adapter_test.rb +0 -67
- data/test/array_serializer_test.rb +0 -22
- data/test/benchmark/app.rb +0 -65
- data/test/benchmark/benchmarking_support.rb +0 -67
- data/test/benchmark/bm_caching.rb +0 -119
- data/test/benchmark/bm_transform.rb +0 -34
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -84
- data/test/benchmark/fixtures.rb +0 -219
- data/test/cache_test.rb +0 -485
- data/test/collection_serializer_test.rb +0 -110
- data/test/fixtures/active_record.rb +0 -78
- data/test/fixtures/poro.rb +0 -282
- data/test/generators/scaffold_controller_generator_test.rb +0 -24
- data/test/generators/serializer_generator_test.rb +0 -57
- data/test/grape_test.rb +0 -82
- data/test/include_tree/from_include_args_test.rb +0 -26
- data/test/include_tree/from_string_test.rb +0 -94
- data/test/include_tree/include_args_to_hash_test.rb +0 -64
- data/test/lint_test.rb +0 -49
- data/test/logger_test.rb +0 -18
- data/test/poro_test.rb +0 -9
- data/test/serializable_resource_test.rb +0 -83
- data/test/serializers/association_macros_test.rb +0 -36
- data/test/serializers/associations_test.rb +0 -295
- data/test/serializers/attribute_test.rb +0 -151
- data/test/serializers/attributes_test.rb +0 -52
- data/test/serializers/caching_configuration_test_isolated.rb +0 -170
- data/test/serializers/configuration_test.rb +0 -32
- data/test/serializers/fieldset_test.rb +0 -14
- data/test/serializers/meta_test.rb +0 -196
- data/test/serializers/options_test.rb +0 -21
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
- data/test/serializers/root_test.rb +0 -21
- data/test/serializers/serialization_test.rb +0 -55
- data/test/serializers/serializer_for_test.rb +0 -134
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -79
- data/test/support/rails5_shims.rb +0 -47
- data/test/support/rails_app.rb +0 -45
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -53
- data/test/test_helper.rb +0 -57
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'will_paginate/array'
|
|
3
|
-
require 'kaminari'
|
|
4
|
-
require 'kaminari/hooks'
|
|
5
|
-
::Kaminari::Hooks.init
|
|
6
|
-
|
|
7
|
-
module ActiveModelSerializers
|
|
8
|
-
module Adapter
|
|
9
|
-
class JsonApi
|
|
10
|
-
class PaginationLinksTest < ActiveSupport::TestCase
|
|
11
|
-
URI = 'http://example.com'.freeze
|
|
12
|
-
|
|
13
|
-
def setup
|
|
14
|
-
ActionController::Base.cache_store.clear
|
|
15
|
-
@array = [
|
|
16
|
-
Profile.new({ id: 1, name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
|
|
17
|
-
Profile.new({ id: 2, name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }),
|
|
18
|
-
Profile.new({ id: 3, name: 'Name 3', description: 'Description 3', comments: 'Comments 3' }),
|
|
19
|
-
Profile.new({ id: 4, name: 'Name 4', description: 'Description 4', comments: 'Comments 4' }),
|
|
20
|
-
Profile.new({ id: 5, name: 'Name 5', description: 'Description 5', comments: 'Comments 5' })
|
|
21
|
-
]
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def mock_request(query_parameters = {}, original_url = URI)
|
|
25
|
-
context = Minitest::Mock.new
|
|
26
|
-
context.expect(:request_url, original_url)
|
|
27
|
-
context.expect(:query_parameters, query_parameters)
|
|
28
|
-
context.expect(:key_transform, nil)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def load_adapter(paginated_collection, mock_request = nil)
|
|
32
|
-
render_options = { adapter: :json_api }
|
|
33
|
-
render_options[:serialization_context] = mock_request if mock_request
|
|
34
|
-
serializable(paginated_collection, render_options)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def using_kaminari(page = 2)
|
|
38
|
-
Kaminari.paginate_array(@array).page(page).per(2)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def using_will_paginate(page = 2)
|
|
42
|
-
@array.paginate(page: page, per_page: 2)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def data
|
|
46
|
-
{ data: [
|
|
47
|
-
{ id: '1', type: 'profiles', attributes: { name: 'Name 1', description: 'Description 1' } },
|
|
48
|
-
{ id: '2', type: 'profiles', attributes: { name: 'Name 2', description: 'Description 2' } },
|
|
49
|
-
{ id: '3', type: 'profiles', attributes: { name: 'Name 3', description: 'Description 3' } },
|
|
50
|
-
{ id: '4', type: 'profiles', attributes: { name: 'Name 4', description: 'Description 4' } },
|
|
51
|
-
{ id: '5', type: 'profiles', attributes: { name: 'Name 5', description: 'Description 5' } }
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def links
|
|
57
|
-
{
|
|
58
|
-
links: {
|
|
59
|
-
self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
|
|
60
|
-
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
|
|
61
|
-
prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
|
|
62
|
-
next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
|
|
63
|
-
last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2"
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def last_page_links
|
|
69
|
-
{
|
|
70
|
-
links: {
|
|
71
|
-
self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2",
|
|
72
|
-
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
|
|
73
|
-
prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2"
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def expected_response_without_pagination_links
|
|
79
|
-
data
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def expected_response_with_pagination_links
|
|
83
|
-
{}.tap do |hash|
|
|
84
|
-
hash[:data] = data.values.flatten[2..3]
|
|
85
|
-
hash.merge! links
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def expected_response_with_pagination_links_and_additional_params
|
|
90
|
-
new_links = links[:links].each_with_object({}) { |(key, value), hash| hash[key] = "#{value}&test=test" }
|
|
91
|
-
{}.tap do |hash|
|
|
92
|
-
hash[:data] = data.values.flatten[2..3]
|
|
93
|
-
hash.merge! links: new_links
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def expected_response_with_last_page_pagination_links
|
|
98
|
-
{}.tap do |hash|
|
|
99
|
-
hash[:data] = [data.values.flatten.last]
|
|
100
|
-
hash.merge! last_page_links
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def expected_response_with_no_data_pagination_links
|
|
105
|
-
{}.tap do |hash|
|
|
106
|
-
hash[:data] = []
|
|
107
|
-
hash[:links] = {}
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def test_pagination_links_using_kaminari
|
|
112
|
-
adapter = load_adapter(using_kaminari, mock_request)
|
|
113
|
-
|
|
114
|
-
assert_equal expected_response_with_pagination_links, adapter.serializable_hash
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def test_pagination_links_using_will_paginate
|
|
118
|
-
adapter = load_adapter(using_will_paginate, mock_request)
|
|
119
|
-
|
|
120
|
-
assert_equal expected_response_with_pagination_links, adapter.serializable_hash
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def test_pagination_links_with_additional_params
|
|
124
|
-
adapter = load_adapter(using_will_paginate, mock_request({ test: 'test' }))
|
|
125
|
-
|
|
126
|
-
assert_equal expected_response_with_pagination_links_and_additional_params,
|
|
127
|
-
adapter.serializable_hash
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def test_pagination_links_when_zero_results_kaminari
|
|
131
|
-
@array = []
|
|
132
|
-
|
|
133
|
-
adapter = load_adapter(using_kaminari(1), mock_request)
|
|
134
|
-
|
|
135
|
-
assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def test_pagination_links_when_zero_results_will_paginate
|
|
139
|
-
@array = []
|
|
140
|
-
|
|
141
|
-
adapter = load_adapter(using_will_paginate(1), mock_request)
|
|
142
|
-
|
|
143
|
-
assert_equal expected_response_with_no_data_pagination_links, adapter.serializable_hash
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def test_last_page_pagination_links_using_kaminari
|
|
147
|
-
adapter = load_adapter(using_kaminari(3), mock_request)
|
|
148
|
-
|
|
149
|
-
assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def test_last_page_pagination_links_using_will_paginate
|
|
153
|
-
adapter = load_adapter(using_will_paginate(3), mock_request)
|
|
154
|
-
|
|
155
|
-
assert_equal expected_response_with_last_page_pagination_links, adapter.serializable_hash
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def test_not_showing_pagination_links
|
|
159
|
-
adapter = load_adapter(@array, mock_request)
|
|
160
|
-
|
|
161
|
-
assert_equal expected_response_without_pagination_links, adapter.serializable_hash
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
module ActiveModelSerializers
|
|
3
|
-
module Adapter
|
|
4
|
-
class JsonApi
|
|
5
|
-
module Deserialization
|
|
6
|
-
class ParseTest < Minitest::Test
|
|
7
|
-
def setup
|
|
8
|
-
@hash = {
|
|
9
|
-
'data' => {
|
|
10
|
-
'type' => 'photos',
|
|
11
|
-
'id' => 'zorglub',
|
|
12
|
-
'attributes' => {
|
|
13
|
-
'title' => 'Ember Hamster',
|
|
14
|
-
'src' => 'http://example.com/images/productivity.png'
|
|
15
|
-
},
|
|
16
|
-
'relationships' => {
|
|
17
|
-
'author' => {
|
|
18
|
-
'data' => nil
|
|
19
|
-
},
|
|
20
|
-
'photographer' => {
|
|
21
|
-
'data' => { 'type' => 'people', 'id' => '9' }
|
|
22
|
-
},
|
|
23
|
-
'comments' => {
|
|
24
|
-
'data' => [
|
|
25
|
-
{ 'type' => 'comments', 'id' => '1' },
|
|
26
|
-
{ 'type' => 'comments', 'id' => '2' }
|
|
27
|
-
]
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
@params = ActionController::Parameters.new(@hash)
|
|
33
|
-
@expected = {
|
|
34
|
-
id: 'zorglub',
|
|
35
|
-
title: 'Ember Hamster',
|
|
36
|
-
src: 'http://example.com/images/productivity.png',
|
|
37
|
-
author_id: nil,
|
|
38
|
-
photographer_id: '9',
|
|
39
|
-
comment_ids: %w(1 2)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@illformed_payloads = [nil,
|
|
43
|
-
{},
|
|
44
|
-
{
|
|
45
|
-
'data' => nil
|
|
46
|
-
}, {
|
|
47
|
-
'data' => { 'attributes' => [] }
|
|
48
|
-
}, {
|
|
49
|
-
'data' => { 'relationships' => [] }
|
|
50
|
-
}, {
|
|
51
|
-
'data' => {
|
|
52
|
-
'relationships' => { 'rel' => nil }
|
|
53
|
-
}
|
|
54
|
-
}, {
|
|
55
|
-
'data' => {
|
|
56
|
-
'relationships' => { 'rel' => {} }
|
|
57
|
-
}
|
|
58
|
-
}]
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def test_hash
|
|
62
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash)
|
|
63
|
-
assert_equal(@expected, parsed_hash)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def test_actioncontroller_parameters
|
|
67
|
-
assert_equal(false, @params.permitted?)
|
|
68
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@params)
|
|
69
|
-
assert_equal(@expected, parsed_hash)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def test_illformed_payloads_safe
|
|
73
|
-
@illformed_payloads.each do |p|
|
|
74
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse(p)
|
|
75
|
-
assert_equal({}, parsed_hash)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def test_illformed_payloads_unsafe
|
|
80
|
-
@illformed_payloads.each do |p|
|
|
81
|
-
assert_raises(InvalidDocument) do
|
|
82
|
-
ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(p)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def test_filter_fields_only
|
|
88
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, only: [:id, :title, :author])
|
|
89
|
-
expected = {
|
|
90
|
-
id: 'zorglub',
|
|
91
|
-
title: 'Ember Hamster',
|
|
92
|
-
author_id: nil
|
|
93
|
-
}
|
|
94
|
-
assert_equal(expected, parsed_hash)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def test_filter_fields_except
|
|
98
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, except: [:id, :title, :author])
|
|
99
|
-
expected = {
|
|
100
|
-
src: 'http://example.com/images/productivity.png',
|
|
101
|
-
photographer_id: '9',
|
|
102
|
-
comment_ids: %w(1 2)
|
|
103
|
-
}
|
|
104
|
-
assert_equal(expected, parsed_hash)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def test_keys
|
|
108
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, keys: { author: :user, title: :post_title })
|
|
109
|
-
expected = {
|
|
110
|
-
id: 'zorglub',
|
|
111
|
-
post_title: 'Ember Hamster',
|
|
112
|
-
src: 'http://example.com/images/productivity.png',
|
|
113
|
-
user_id: nil,
|
|
114
|
-
photographer_id: '9',
|
|
115
|
-
comment_ids: %w(1 2)
|
|
116
|
-
}
|
|
117
|
-
assert_equal(expected, parsed_hash)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def test_polymorphic
|
|
121
|
-
parsed_hash = ActiveModelSerializers::Adapter::JsonApi::Deserialization.parse!(@hash, polymorphic: [:photographer])
|
|
122
|
-
expected = {
|
|
123
|
-
id: 'zorglub',
|
|
124
|
-
title: 'Ember Hamster',
|
|
125
|
-
src: 'http://example.com/images/productivity.png',
|
|
126
|
-
author_id: nil,
|
|
127
|
-
photographer_id: '9',
|
|
128
|
-
photographer_type: 'people',
|
|
129
|
-
comment_ids: %w(1 2)
|
|
130
|
-
}
|
|
131
|
-
assert_equal(expected, parsed_hash)
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module ActiveModelSerializers
|
|
4
|
-
module Adapter
|
|
5
|
-
class JsonApi
|
|
6
|
-
class RelationshipTest < ActiveSupport::TestCase
|
|
7
|
-
setup do
|
|
8
|
-
@blog = Blog.new(id: 1)
|
|
9
|
-
@author = Author.new(id: 1, name: 'Steve K.', blog: @blog)
|
|
10
|
-
@serializer = BlogSerializer.new(@blog)
|
|
11
|
-
ActionController::Base.cache_store.clear
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def test_relationship_with_data
|
|
15
|
-
expected = {
|
|
16
|
-
data: {
|
|
17
|
-
id: '1',
|
|
18
|
-
type: 'blogs'
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
test_relationship(expected, options: { include_data: true })
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def test_relationship_with_nil_model
|
|
25
|
-
@serializer = BlogSerializer.new(nil)
|
|
26
|
-
expected = { data: nil }
|
|
27
|
-
test_relationship(expected, options: { include_data: true })
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def test_relationship_with_nil_serializer
|
|
31
|
-
@serializer = nil
|
|
32
|
-
expected = { data: nil }
|
|
33
|
-
test_relationship(expected, options: { include_data: true })
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def test_relationship_with_data_array
|
|
37
|
-
posts = [Post.new(id: 1), Post.new(id: 2)]
|
|
38
|
-
@serializer = ActiveModel::Serializer::CollectionSerializer.new(posts)
|
|
39
|
-
@author.posts = posts
|
|
40
|
-
@author.blog = nil
|
|
41
|
-
expected = {
|
|
42
|
-
data: [
|
|
43
|
-
{
|
|
44
|
-
id: '1',
|
|
45
|
-
type: 'posts'
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: '2',
|
|
49
|
-
type: 'posts'
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
test_relationship(expected, options: { include_data: true })
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def test_relationship_data_not_included
|
|
57
|
-
test_relationship({}, options: { include_data: false })
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def test_relationship_simple_link
|
|
61
|
-
links = { self: 'a link' }
|
|
62
|
-
test_relationship({ links: { self: 'a link' } }, links: links)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def test_relationship_many_links
|
|
66
|
-
links = {
|
|
67
|
-
self: 'a link',
|
|
68
|
-
related: 'another link'
|
|
69
|
-
}
|
|
70
|
-
expected = {
|
|
71
|
-
links: {
|
|
72
|
-
self: 'a link',
|
|
73
|
-
related: 'another link'
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
test_relationship(expected, links: links)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def test_relationship_block_link
|
|
80
|
-
links = { self: proc { object.id.to_s } }
|
|
81
|
-
expected = { links: { self: @blog.id.to_s } }
|
|
82
|
-
test_relationship(expected, links: links)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def test_relationship_block_link_with_meta
|
|
86
|
-
links = {
|
|
87
|
-
self: proc do
|
|
88
|
-
href object.id.to_s
|
|
89
|
-
meta(id: object.id)
|
|
90
|
-
end
|
|
91
|
-
}
|
|
92
|
-
expected = {
|
|
93
|
-
links: {
|
|
94
|
-
self: {
|
|
95
|
-
href: @blog.id.to_s,
|
|
96
|
-
meta: { id: @blog.id }
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
test_relationship(expected, links: links)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def test_relationship_simple_meta
|
|
104
|
-
meta = { id: '1' }
|
|
105
|
-
expected = { meta: meta }
|
|
106
|
-
test_relationship(expected, meta: meta)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def test_relationship_block_meta
|
|
110
|
-
meta = proc do
|
|
111
|
-
{ id: object.id }
|
|
112
|
-
end
|
|
113
|
-
expected = {
|
|
114
|
-
meta: {
|
|
115
|
-
id: @blog.id
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
test_relationship(expected, meta: meta)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def test_relationship_with_everything
|
|
122
|
-
links = {
|
|
123
|
-
self: 'a link',
|
|
124
|
-
related: proc do
|
|
125
|
-
href object.id.to_s
|
|
126
|
-
meta object.id
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
meta = proc do
|
|
131
|
-
{ id: object.id }
|
|
132
|
-
end
|
|
133
|
-
expected = {
|
|
134
|
-
data: {
|
|
135
|
-
id: '1',
|
|
136
|
-
type: 'blogs'
|
|
137
|
-
},
|
|
138
|
-
links: {
|
|
139
|
-
self: 'a link',
|
|
140
|
-
related: {
|
|
141
|
-
href: '1', meta: 1
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
meta: {
|
|
145
|
-
id: @blog.id
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
test_relationship(expected, meta: meta, options: { include_data: true }, links: links)
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
private
|
|
152
|
-
|
|
153
|
-
def test_relationship(expected, params = {})
|
|
154
|
-
parent_serializer = AuthorSerializer.new(@author)
|
|
155
|
-
relationship = Relationship.new(parent_serializer, @serializer, nil, params)
|
|
156
|
-
assert_equal(expected, relationship.as_json)
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
end
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module ActiveModel
|
|
4
|
-
class Serializer
|
|
5
|
-
module Adapter
|
|
6
|
-
class JsonApi
|
|
7
|
-
class RelationshipTest < ActiveSupport::TestCase
|
|
8
|
-
RelationshipAuthor = Class.new(::Model)
|
|
9
|
-
class RelationshipAuthorSerializer < ActiveModel::Serializer
|
|
10
|
-
has_one :bio do
|
|
11
|
-
link :self, '//example.com/link_author/relationships/bio'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
has_one :profile do
|
|
15
|
-
link :related do
|
|
16
|
-
"//example.com/profiles/#{object.profile.id}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
has_many :locations do
|
|
21
|
-
link :related do
|
|
22
|
-
ids = object.locations.map(&:id).join(',')
|
|
23
|
-
href "//example.com/locations/#{ids}"
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
has_many :posts do
|
|
28
|
-
link :related do
|
|
29
|
-
ids = object.posts.map(&:id).join(',')
|
|
30
|
-
href "//example.com/posts/#{ids}"
|
|
31
|
-
meta ids: ids
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
has_many :comments do
|
|
36
|
-
link :self do
|
|
37
|
-
meta ids: [1]
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
has_many :roles do |serializer|
|
|
42
|
-
meta count: object.posts.count
|
|
43
|
-
serializer.cached_roles
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
has_one :blog do
|
|
47
|
-
link :self, '//example.com/link_author/relationships/blog'
|
|
48
|
-
include_data false
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
belongs_to :reviewer do
|
|
52
|
-
meta name: 'Dan Brown'
|
|
53
|
-
include_data true
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
has_many :likes do
|
|
57
|
-
link :related do
|
|
58
|
-
ids = object.likes.map(&:id).join(',')
|
|
59
|
-
href "//example.com/likes/#{ids}"
|
|
60
|
-
meta ids: ids
|
|
61
|
-
end
|
|
62
|
-
meta liked: object.likes.any?
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def cached_roles
|
|
66
|
-
[
|
|
67
|
-
Role.new(id: 'from-serializer-method')
|
|
68
|
-
]
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def setup
|
|
73
|
-
@post = Post.new(id: 1337, comments: [], author: nil)
|
|
74
|
-
@blog = Blog.new(id: 1337, name: 'extra')
|
|
75
|
-
@bio = Bio.new(id: 1337)
|
|
76
|
-
@like = Like.new(id: 1337)
|
|
77
|
-
@role = Role.new(id: 'from-record')
|
|
78
|
-
@profile = Profile.new(id: 1337)
|
|
79
|
-
@location = Location.new(id: 1337)
|
|
80
|
-
@reviewer = Author.new(id: 1337)
|
|
81
|
-
@comment = Comment.new(id: 1337)
|
|
82
|
-
@author = RelationshipAuthor.new(
|
|
83
|
-
id: 1337,
|
|
84
|
-
posts: [@post],
|
|
85
|
-
blog: @blog,
|
|
86
|
-
reviewer: @reviewer,
|
|
87
|
-
bio: @bio,
|
|
88
|
-
likes: [@like],
|
|
89
|
-
roles: [@role],
|
|
90
|
-
locations: [@location],
|
|
91
|
-
profile: @profile,
|
|
92
|
-
comments: [@comment]
|
|
93
|
-
)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def test_relationship_simple_link
|
|
97
|
-
expected = {
|
|
98
|
-
data: {
|
|
99
|
-
id: '1337',
|
|
100
|
-
type: 'bios'
|
|
101
|
-
},
|
|
102
|
-
links: {
|
|
103
|
-
self: '//example.com/link_author/relationships/bio'
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
assert_relationship(:bio, expected)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def test_relationship_block_link
|
|
110
|
-
expected = {
|
|
111
|
-
data: { id: '1337', type: 'profiles' },
|
|
112
|
-
links: { related: '//example.com/profiles/1337' }
|
|
113
|
-
}
|
|
114
|
-
assert_relationship(:profile, expected)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def test_relationship_block_link_href
|
|
118
|
-
expected = {
|
|
119
|
-
data: [{ id: '1337', type: 'locations' }],
|
|
120
|
-
links: {
|
|
121
|
-
related: { href: '//example.com/locations/1337' }
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
assert_relationship(:locations, expected)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def test_relationship_block_link_href_and_meta
|
|
128
|
-
expected = {
|
|
129
|
-
data: [{ id: '1337', type: 'posts' }],
|
|
130
|
-
links: {
|
|
131
|
-
related: {
|
|
132
|
-
href: '//example.com/posts/1337',
|
|
133
|
-
meta: { ids: '1337' }
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
assert_relationship(:posts, expected)
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def test_relationship_block_link_meta
|
|
141
|
-
expected = {
|
|
142
|
-
data: [{ id: '1337', type: 'comments' }],
|
|
143
|
-
links: {
|
|
144
|
-
self: {
|
|
145
|
-
meta: { ids: [1] }
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
assert_relationship(:comments, expected)
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def test_relationship_meta
|
|
153
|
-
expected = {
|
|
154
|
-
data: [{ id: 'from-serializer-method', type: 'roles' }],
|
|
155
|
-
meta: { count: 1 }
|
|
156
|
-
}
|
|
157
|
-
assert_relationship(:roles, expected)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def test_relationship_not_including_data
|
|
161
|
-
expected = {
|
|
162
|
-
links: { self: '//example.com/link_author/relationships/blog' }
|
|
163
|
-
}
|
|
164
|
-
assert_relationship(:blog, expected)
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
def test_relationship_including_data_explicit
|
|
168
|
-
expected = {
|
|
169
|
-
data: { id: '1337', type: 'authors' },
|
|
170
|
-
meta: { name: 'Dan Brown' }
|
|
171
|
-
}
|
|
172
|
-
assert_relationship(:reviewer, expected)
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
def test_relationship_with_everything
|
|
176
|
-
expected = {
|
|
177
|
-
data: [{ id: '1337', type: 'likes' }],
|
|
178
|
-
links: {
|
|
179
|
-
related: {
|
|
180
|
-
href: '//example.com/likes/1337',
|
|
181
|
-
meta: { ids: '1337' }
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
meta: { liked: true }
|
|
185
|
-
}
|
|
186
|
-
assert_relationship(:likes, expected)
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
private
|
|
190
|
-
|
|
191
|
-
def assert_relationship(relationship_name, expected)
|
|
192
|
-
hash = serializable(@author, adapter: :json_api).serializable_hash
|
|
193
|
-
assert_equal(expected, hash[:data][:relationships][relationship_name])
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
end
|