Skip to content

Commit 1ef7c7d

Browse files
committed
Add reflection tests
1 parent f76ea3d commit 1ef7c7d

File tree

1 file changed

+218
-0
lines changed

1 file changed

+218
-0
lines changed

test/serializers/reflection_test.rb

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
require 'test_helper'
2+
module ActiveModel
3+
class Serializer
4+
class ReflectionTest < ActiveSupport::TestCase
5+
class Blog < ActiveModelSerializers::Model
6+
attributes :id
7+
end
8+
class BlogSerializer < ActiveModel::Serializer
9+
type 'blog'
10+
attributes :id
11+
end
12+
13+
setup do
14+
@expected_meta = { id: 1 }
15+
@expected_links = { self: 'no_uri_validation' }
16+
@empty_links = {}
17+
model_attributes = { blog: Blog.new(@expected_meta) }
18+
@model = Class.new(ActiveModelSerializers::Model) do
19+
attributes(*model_attributes.keys)
20+
21+
def self.name
22+
'TestModel'
23+
end
24+
end.new(model_attributes)
25+
@instance_options = {}
26+
end
27+
28+
def test_reflection_block_with_link_mutates_the_reflection_links
29+
serializer_class = Class.new(ActiveModel::Serializer) do
30+
has_one :blog do
31+
link :self, 'no_uri_validation'
32+
end
33+
end
34+
serializer_instance = serializer_class.new(@model, @instance_options)
35+
36+
# Get Reflection
37+
reflection = serializer_class._reflections.fetch(:blog)
38+
assert_equal @empty_links, reflection.instance_variable_get(:@_links)
39+
40+
# Build Association
41+
association = reflection.build_association(serializer_instance, @instance_options)
42+
assert_equal @expected_links, association.links
43+
assert_equal @expected_links, reflection.instance_variable_get(:@_links)
44+
end
45+
46+
def test_reflection_block_with_link_block_mutates_the_reflection_links
47+
serializer_class = Class.new(ActiveModel::Serializer) do
48+
has_one :blog do
49+
link :self do
50+
'no_uri_validation'
51+
end
52+
end
53+
end
54+
serializer_instance = serializer_class.new(@model, @instance_options)
55+
56+
# Get Reflection
57+
reflection = serializer_class._reflections.fetch(:blog)
58+
assert_equal @empty_links, reflection.instance_variable_get(:@_links)
59+
60+
# Build Association
61+
association = reflection.build_association(serializer_instance, @instance_options)
62+
# Assert before instance_eval link
63+
link = association.links.fetch(:self)
64+
assert_respond_to link, :call
65+
66+
# Assert after instance_eval link
67+
assert_equal @expected_links.fetch(:self), reflection.instance_eval(&link)
68+
assert_respond_to reflection.instance_variable_get(:@_links).fetch(:self), :call
69+
end
70+
71+
def test_reflection_block_with_meta_mutates_the_reflection_meta
72+
serializer_class = Class.new(ActiveModel::Serializer) do
73+
has_one :blog do
74+
meta(id: object.blog.id)
75+
end
76+
end
77+
serializer_instance = serializer_class.new(@model, @instance_options)
78+
79+
# Get Reflection
80+
reflection = serializer_class._reflections.fetch(:blog)
81+
assert_nil reflection.instance_variable_get(:@_meta)
82+
83+
# Build Association
84+
association = reflection.build_association(serializer_instance, @instance_options)
85+
assert_equal @expected_meta, association.meta
86+
assert_equal @expected_meta, reflection.instance_variable_get(:@_meta)
87+
end
88+
89+
def test_reflection_block_with_meta_block_mutates_the_reflection_meta
90+
serializer_class = Class.new(ActiveModel::Serializer) do
91+
has_one :blog do
92+
meta do
93+
{ id: object.blog.id }
94+
end
95+
end
96+
end
97+
serializer_instance = serializer_class.new(@model, @instance_options)
98+
99+
# Get Reflection
100+
reflection = serializer_class._reflections.fetch(:blog)
101+
assert_nil reflection.instance_variable_get(:@_meta)
102+
103+
# Build Association
104+
association = reflection.build_association(serializer_instance, @instance_options)
105+
# Assert before instance_eval meta
106+
assert_respond_to association.meta, :call
107+
assert_respond_to reflection.instance_variable_get(:@_meta), :call
108+
109+
# Assert after instance_eval meta
110+
assert_equal @expected_meta, reflection.instance_eval(&association.meta)
111+
assert_respond_to reflection.instance_variable_get(:@_meta), :call
112+
assert_respond_to association.meta, :call
113+
end
114+
115+
def test_reflection_block_with_meta_in_link_block_mutates_the_reflection_meta
116+
serializer_class = Class.new(ActiveModel::Serializer) do
117+
has_one :blog do
118+
link :self do
119+
meta(id: object.blog.id)
120+
'no_uri_validation'
121+
end
122+
end
123+
end
124+
serializer_instance = serializer_class.new(@model, @instance_options)
125+
126+
# Get Reflection
127+
reflection = serializer_class._reflections.fetch(:blog)
128+
assert_nil reflection.instance_variable_get(:@_meta)
129+
assert_equal @empty_links, reflection.instance_variable_get(:@_links)
130+
131+
# Build Association
132+
association = reflection.build_association(serializer_instance, @instance_options)
133+
# Assert before instance_eval link meta
134+
assert_nil association.meta
135+
assert_nil reflection.instance_variable_get(:@_meta)
136+
137+
link = association.links.fetch(:self)
138+
assert_respond_to link, :call
139+
assert_respond_to reflection.instance_variable_get(:@_links).fetch(:self), :call
140+
assert_nil reflection.instance_variable_get(:@_meta)
141+
142+
# Assert after instance_eval link
143+
assert_equal 'no_uri_validation', reflection.instance_eval(&link)
144+
assert_equal @expected_meta, reflection.instance_variable_get(:@_meta)
145+
assert_nil association.meta
146+
end
147+
148+
# rubocop:disable Metrics/AbcSize
149+
def test_reflection_block_with_meta_block_in_link_block_mutates_the_reflection_meta
150+
serializer_class = Class.new(ActiveModel::Serializer) do
151+
has_one :blog do
152+
link :self do
153+
meta do
154+
{ id: object.blog.id }
155+
end
156+
'no_uri_validation'
157+
end
158+
end
159+
end
160+
serializer_instance = serializer_class.new(@model, @instance_options)
161+
162+
# Get Reflection
163+
reflection = serializer_class._reflections.fetch(:blog)
164+
assert_nil reflection.instance_variable_get(:@_meta)
165+
166+
# Build Association
167+
association = reflection.build_association(serializer_instance, @instance_options)
168+
assert_nil association.meta
169+
assert_nil reflection.instance_variable_get(:@_meta)
170+
171+
# Assert before instance_eval link
172+
link = association.links.fetch(:self)
173+
assert_nil reflection.instance_variable_get(:@_meta)
174+
assert_respond_to link, :call
175+
assert_respond_to association.links.fetch(:self), :call
176+
177+
# Assert after instance_eval link
178+
assert_equal 'no_uri_validation', reflection.instance_eval(&link)
179+
assert_respond_to association.links.fetch(:self), :call
180+
# Assert before instance_eval link meta
181+
assert_respond_to reflection.instance_variable_get(:@_meta), :call
182+
assert_nil association.meta
183+
184+
# Assert after instance_eval link meta
185+
assert_equal @expected_meta, reflection.instance_eval(&reflection.instance_variable_get(:@_meta))
186+
assert_nil association.meta
187+
end
188+
# rubocop:enable Metrics/AbcSize
189+
190+
def test_no_href_in_vanilla_reflection
191+
serializer_class = Class.new(ActiveModel::Serializer) do
192+
has_one :blog do
193+
link :self do
194+
href 'no_uri_validation'
195+
end
196+
end
197+
end
198+
serializer_instance = serializer_class.new(@model, @instance_options)
199+
200+
# Get Reflection
201+
reflection = serializer_class._reflections.fetch(:blog)
202+
assert_equal @empty_links, reflection.instance_variable_get(:@_links)
203+
204+
# Build Association
205+
association = reflection.build_association(serializer_instance, @instance_options)
206+
# Assert before instance_eval link
207+
link = association.links.fetch(:self)
208+
assert_respond_to link, :call
209+
210+
# Assert after instance_eval link
211+
exception = assert_raise(NoMethodError) do
212+
reflection.instance_eval(&link)
213+
end
214+
assert_match(/undefined method `href'/, exception.message)
215+
end
216+
end
217+
end
218+
end

0 commit comments

Comments
 (0)