protip 0.20.7 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/protip.rb +10 -0
- data/lib/protip/{wrapper.rb → decorator.rb} +98 -82
- data/lib/protip/extensions.rb +0 -1
- data/lib/protip/resource.rb +56 -32
- data/lib/protip/resource/extra_methods.rb +5 -3
- data/lib/protip/tasks/compile.rake +2 -2
- data/lib/protip/transformer.rb +14 -0
- data/lib/protip/transformers/abstract_transformer.rb +11 -0
- data/lib/protip/transformers/active_support/time_with_zone_transformer.rb +35 -0
- data/lib/protip/transformers/decorating_transformer.rb +33 -0
- data/lib/protip/transformers/default_transformer.rb +22 -0
- data/lib/protip/transformers/delegating_transformer.rb +44 -0
- data/lib/protip/transformers/deprecated_transformer.rb +90 -0
- data/lib/protip/transformers/enum_transformer.rb +93 -0
- data/lib/protip/transformers/primitives_transformer.rb +78 -0
- data/lib/protip/transformers/timestamp_transformer.rb +31 -0
- data/test/functional/protip/decorator_test.rb +204 -0
- data/test/unit/protip/decorator_test.rb +665 -0
- data/test/unit/protip/resource_test.rb +76 -92
- data/test/unit/protip/transformers/decorating_transformer_test.rb +92 -0
- data/test/unit/protip/transformers/delegating_transformer_test.rb +83 -0
- data/test/unit/protip/transformers/deprecated_transformer_test.rb +139 -0
- data/test/unit/protip/transformers/enum_transformer_test.rb +157 -0
- data/test/unit/protip/transformers/primitives_transformer_test.rb +139 -0
- data/test/unit/protip/transformers/timestamp_transformer_test.rb +46 -0
- metadata +23 -12
- data/definitions/google/protobuf/wrappers.proto +0 -99
- data/lib/google/protobuf/descriptor.rb +0 -1
- data/lib/google/protobuf/wrappers.rb +0 -48
- data/lib/protip/converter.rb +0 -22
- data/lib/protip/standard_converter.rb +0 -185
- data/test/unit/protip/standard_converter_test.rb +0 -502
- data/test/unit/protip/wrapper_test.rb +0 -646
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
require 'protip/client'
|
4
|
-
require 'protip/converter'
|
5
4
|
require 'protip/resource'
|
6
5
|
|
7
6
|
module Protip::ResourceTest # Namespace for internal constants
|
@@ -84,16 +83,16 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
84
83
|
|
85
84
|
describe '.resource' do
|
86
85
|
|
87
|
-
let :
|
86
|
+
let :transformer do
|
88
87
|
Class.new do
|
89
|
-
include Protip::
|
88
|
+
include Protip::Transformer
|
90
89
|
end.new
|
91
90
|
end
|
92
91
|
describe 'with basic resource' do
|
93
92
|
before do
|
94
|
-
resource_class.class_exec(
|
93
|
+
resource_class.class_exec(transformer, resource_message_class) do |transformer, message|
|
95
94
|
resource actions: [], message: message
|
96
|
-
self.
|
95
|
+
self.transformer = transformer
|
97
96
|
end
|
98
97
|
end
|
99
98
|
|
@@ -143,24 +142,21 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
143
142
|
assert_equal 'intern', resource.string
|
144
143
|
end
|
145
144
|
|
146
|
-
it 'never checks with the
|
147
|
-
|
145
|
+
it 'never checks with the transformer when setting simple types' do
|
146
|
+
transformer.expects(:to_message).never
|
148
147
|
resource = resource_class.new
|
149
148
|
resource.string = 'intern'
|
150
149
|
end
|
151
150
|
|
152
|
-
it '
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
converter.expects(:convertible?).at_least_once.with(nested_message_class).returns(true)
|
162
|
-
converter.expects(:to_message).once.with(6, nested_message_class, nested_message_field).returns(nested_message_class.new number: 100)
|
163
|
-
converter.expects(:to_object).at_least_once.with(nested_message_class.new(number: 100), nested_message_field).returns 'intern'
|
151
|
+
it 'transforms message types to and from their Ruby values' do
|
152
|
+
transformer.expects(:to_message).
|
153
|
+
once.
|
154
|
+
with(6, nested_message_field).
|
155
|
+
returns(nested_message_class.new number: 100)
|
156
|
+
transformer.expects(:to_object).
|
157
|
+
at_least_once.
|
158
|
+
with(nested_message_class.new(number: 100), nested_message_field).
|
159
|
+
returns 'intern'
|
164
160
|
|
165
161
|
resource = resource_class.new
|
166
162
|
resource.nested_message = 6
|
@@ -177,37 +173,27 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
177
173
|
refute resource.number?(:ONE)
|
178
174
|
end
|
179
175
|
|
180
|
-
it 'defines query methods for the
|
176
|
+
it 'defines query methods for the primitives on its message' do
|
181
177
|
resource.boolean = true
|
182
178
|
assert_respond_to resource, :boolean?
|
183
179
|
assert_equal true, resource.boolean?
|
184
180
|
end
|
185
181
|
|
186
|
-
it 'defines query methods for the
|
182
|
+
it 'defines query methods for the submessages on its message' do
|
187
183
|
assert_respond_to resource, :google_bool_value?
|
188
184
|
assert_equal false, resource.google_bool_value?
|
189
185
|
end
|
190
186
|
|
191
|
-
it '
|
192
|
-
|
193
|
-
|
194
|
-
resource.numbers?(:ZERO)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
it 'does not define query methods for non-enum fields' do
|
199
|
-
refute_respond_to resource, :inner?
|
200
|
-
assert_raises NoMethodError do
|
201
|
-
resource.inner?(:ZERO)
|
202
|
-
end
|
187
|
+
it 'defines query methods for repeated fields' do
|
188
|
+
assert_respond_to resource, :numbers?
|
189
|
+
assert_equal false, resource.numbers?
|
203
190
|
end
|
204
191
|
end
|
205
192
|
end
|
206
193
|
describe 'with empty nested resources' do
|
207
194
|
it 'does not throw an error' do
|
208
|
-
resource_class.class_exec(
|
195
|
+
resource_class.class_exec(resource_message_class) do |message|
|
209
196
|
resource actions: [], message: message, nested_resources: {}
|
210
|
-
self.converter = converter
|
211
197
|
end
|
212
198
|
end
|
213
199
|
end
|
@@ -215,11 +201,10 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
215
201
|
describe 'with invalid nested resource key' do
|
216
202
|
it 'throws an error' do
|
217
203
|
assert_raises RuntimeError do
|
218
|
-
resource_class.class_exec(
|
204
|
+
resource_class.class_exec(resource_message_class) do |message|
|
219
205
|
resource actions: [],
|
220
206
|
message: message,
|
221
207
|
nested_resources: {'snoop' => Protip::Resource}
|
222
|
-
self.converter = converter
|
223
208
|
end
|
224
209
|
end
|
225
210
|
end
|
@@ -228,9 +213,8 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
228
213
|
describe 'with invalid nested resource class' do
|
229
214
|
it 'throws an error' do
|
230
215
|
assert_raises RuntimeError do
|
231
|
-
resource_class.class_exec(
|
216
|
+
resource_class.class_exec(resource_message_class) do |message|
|
232
217
|
resource actions: [], message: message, nested_resources: {dogg: Object}
|
233
|
-
self.converter = converter
|
234
218
|
end
|
235
219
|
end
|
236
220
|
end
|
@@ -242,12 +226,16 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
242
226
|
# queries
|
243
227
|
def self.it_converts_query_parameters
|
244
228
|
before do
|
245
|
-
# Sanity check - the user should specify all these variables
|
246
|
-
# http_method, path, query_class, and
|
247
|
-
#
|
248
|
-
#
|
249
|
-
#
|
250
|
-
#
|
229
|
+
# Sanity check - the user should specify all these variables
|
230
|
+
# in "let" statements http_method, path, query_class, and
|
231
|
+
# response specify the expected call to the client
|
232
|
+
# nested_message_field_name specifies the field on the query
|
233
|
+
# class that may or may not be convertible, and should refer
|
234
|
+
# to a submessage field of type nested_message_class
|
235
|
+
# invoke_method! should call the desired method, assuming that
|
236
|
+
# +parameters+ contains the query parameters to pass in
|
237
|
+
# (e.g. `resource_class.all(parameters)` or
|
238
|
+
# `resource_class.find('id', parameters)`)
|
251
239
|
%i(
|
252
240
|
http_method
|
253
241
|
path
|
@@ -268,40 +256,34 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
268
256
|
).returns(response)
|
269
257
|
end
|
270
258
|
|
271
|
-
|
272
|
-
|
273
|
-
describe 'with a convertible message' do
|
259
|
+
describe 'with a transformable object as one of the attributes' do
|
274
260
|
before do
|
275
|
-
resource_class.
|
276
|
-
|
277
|
-
.with(42, nested_message_class, query_class.descriptor.lookup(nested_message_field_name.to_s))
|
261
|
+
resource_class.transformer.stubs(:to_message)
|
262
|
+
.with(42, query_class.descriptor.lookup(nested_message_field_name.to_s))
|
278
263
|
.returns(nested_message_class.new(number: 43))
|
279
264
|
end
|
280
265
|
|
281
266
|
let(:parameters) { {"#{nested_message_field_name}" => 42} }
|
282
|
-
it '
|
267
|
+
it 'transforms query parameters' do
|
283
268
|
invoke_method!
|
284
269
|
end
|
285
270
|
end
|
286
271
|
|
287
|
-
describe 'with
|
288
|
-
|
289
|
-
|
290
|
-
|
272
|
+
describe 'with a submessage as one of the attributes' do
|
273
|
+
let(:parameters) { {"#{nested_message_field_name}" => nested_message_class.new(number: 43)} }
|
274
|
+
it 'allows a submessage to be provided directly' do
|
275
|
+
invoke_method!
|
291
276
|
end
|
277
|
+
end
|
292
278
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
279
|
+
describe 'with a message as the main argument' do
|
280
|
+
let(:parameters) do
|
281
|
+
query_class.new(
|
282
|
+
:"#{nested_message_field_name}" => nested_message_class.new(number: 43)
|
283
|
+
)
|
298
284
|
end
|
299
|
-
|
300
|
-
|
301
|
-
let(:parameters) { {"#{nested_message_field_name}" => nested_message_class.new(number: 43)} }
|
302
|
-
it 'allows a submessage to be provided directly' do
|
303
|
-
invoke_method!
|
304
|
-
end
|
285
|
+
it 'allows a complete message to be provided directly' do
|
286
|
+
invoke_method!
|
305
287
|
end
|
306
288
|
end
|
307
289
|
end
|
@@ -537,17 +519,14 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
537
519
|
def self.describe_dirty_attributes_setter(setter_class)
|
538
520
|
|
539
521
|
describe 'dirty attributes' do
|
540
|
-
let
|
541
|
-
Class.new
|
542
|
-
include Protip::Converter
|
543
|
-
end.new
|
522
|
+
let(:transformer) do
|
523
|
+
mock.responds_like_instance_of(Class.new { include Protip::Transformer })
|
544
524
|
end
|
545
|
-
|
546
525
|
let :resource do
|
547
526
|
resource_class.new resource_message_class.new({
|
548
|
-
|
549
|
-
|
550
|
-
|
527
|
+
string: 'foo',
|
528
|
+
nested_message: nested_message_class.new(number: 32)
|
529
|
+
})
|
551
530
|
end
|
552
531
|
|
553
532
|
let :setter do
|
@@ -555,7 +534,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
555
534
|
end
|
556
535
|
|
557
536
|
before do
|
558
|
-
resource_class.
|
537
|
+
resource_class.transformer = transformer
|
559
538
|
raise 'sanity check failed' if resource.changed? || resource.string_changed? || resource.nested_message_changed?
|
560
539
|
end
|
561
540
|
|
@@ -573,12 +552,19 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
573
552
|
|
574
553
|
describe '(message attributes)' do
|
575
554
|
before do
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
555
|
+
transformer.stubs(:to_message).
|
556
|
+
with(42, nested_message_field).
|
557
|
+
returns(nested_message_class.new(number: 52))
|
558
|
+
|
559
|
+
transformer.stubs(:to_object).
|
560
|
+
with(nested_message_class.new(number: 52), nested_message_field).
|
561
|
+
returns(42)
|
562
|
+
|
563
|
+
transformer.stubs(:to_object).
|
564
|
+
with(nested_message_class.new(number: 62), nested_message_field).
|
565
|
+
returns(72)
|
580
566
|
end
|
581
|
-
it 'marks
|
567
|
+
it 'marks messages as changed if they are changed as Ruby values' do
|
582
568
|
setter.set nested_message: 42
|
583
569
|
assert resource.changed?, 'resource was not marked as changed'
|
584
570
|
assert resource.nested_message_changed?, 'field was not marked as changed'
|
@@ -593,7 +579,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
593
579
|
assert resource.changed?, 'resource was not marked as changed'
|
594
580
|
assert resource.nested_message_changed?, 'field was not marked as changed'
|
595
581
|
end
|
596
|
-
it 'recognizes when
|
582
|
+
it 'recognizes when messages are not changed when set as Ruby values' do
|
597
583
|
resource.message.nested_message.number = 52
|
598
584
|
raise 'sanity check failed' if resource.changed? || resource.nested_message_changed?
|
599
585
|
setter.set nested_message: 42
|
@@ -620,7 +606,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
620
606
|
it 'delegates writes to the wrapper object' do
|
621
607
|
resource = resource_class.new
|
622
608
|
test_string = 'new'
|
623
|
-
Protip::
|
609
|
+
Protip::Decorator.any_instance.expects(:string=).with(test_string)
|
624
610
|
resource.string = test_string
|
625
611
|
end
|
626
612
|
|
@@ -647,7 +633,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
647
633
|
# called during #initialize as well
|
648
634
|
resource
|
649
635
|
|
650
|
-
Protip::
|
636
|
+
Protip::Decorator.any_instance.expects(:assign_attributes).with(string: 'foo')
|
651
637
|
resource.assign_attributes string: 'foo'
|
652
638
|
end
|
653
639
|
|
@@ -656,6 +642,8 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
656
642
|
def set(attributes) ; @resource.assign_attributes attributes ; end
|
657
643
|
end
|
658
644
|
describe_dirty_attributes_setter setter_class
|
645
|
+
|
646
|
+
# This section relies on correct behavior of +Protip.default_transformer+.
|
659
647
|
describe 'dirty attributes (nested hashes)' do
|
660
648
|
|
661
649
|
it 'marks nested hashes as changed if they set a new field' do
|
@@ -964,7 +952,7 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
964
952
|
|
965
953
|
it 'returns the wrapped server response' do
|
966
954
|
client.stubs(:request).returns(response)
|
967
|
-
assert_equal Protip::
|
955
|
+
assert_equal Protip::Decorator.new(response, resource_class.transformer), target.action
|
968
956
|
end
|
969
957
|
end
|
970
958
|
end
|
@@ -1065,14 +1053,10 @@ module Protip::ResourceTest # Namespace for internal constants
|
|
1065
1053
|
Protip::Resource::Associations::BelongsToPolymorphicAssociation) { }
|
1066
1054
|
end
|
1067
1055
|
|
1068
|
-
describe '.
|
1056
|
+
describe '.transformer' do
|
1069
1057
|
describe 'default value' do
|
1070
|
-
it 'defaults to the
|
1071
|
-
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
it 're-uses the same converter on repeated accesses' do
|
1075
|
-
assert_same resource_class.converter, resource_class.converter
|
1058
|
+
it 'defaults to the default transformer' do
|
1059
|
+
assert_same Protip.default_transformer, resource_class.transformer
|
1076
1060
|
end
|
1077
1061
|
end
|
1078
1062
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'protip/transformers/decorating_transformer'
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
describe Protip::Transformers::DecoratingTransformer do
|
7
|
+
let(:parent_transformer) do
|
8
|
+
mock('parent transformer')
|
9
|
+
end
|
10
|
+
let(:transformer) do
|
11
|
+
Protip::Transformers::DecoratingTransformer.new(parent_transformer)
|
12
|
+
end
|
13
|
+
describe '#to_object' do
|
14
|
+
let(:field) { mock 'field' }
|
15
|
+
let(:from_message) { mock 'message' }
|
16
|
+
let(:object) { transformer.to_object(from_message, field) }
|
17
|
+
it 'returns a decorator' do
|
18
|
+
assert_instance_of Protip::Decorator, object
|
19
|
+
end
|
20
|
+
it 'passes along the message' do
|
21
|
+
assert_equal from_message, object.message
|
22
|
+
end
|
23
|
+
it 'passes along the transformer' do
|
24
|
+
assert_equal parent_transformer, object.transformer
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#to_message' do
|
29
|
+
let(:pool) do
|
30
|
+
pool = Google::Protobuf::DescriptorPool.new
|
31
|
+
pool.build do
|
32
|
+
add_message 'message' do
|
33
|
+
optional :value, :int64, 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
pool
|
37
|
+
end
|
38
|
+
let(:message_class) { pool.lookup('message').msgclass }
|
39
|
+
let(:field) do
|
40
|
+
field = mock.responds_like_instance_of ::Google::Protobuf::FieldDescriptor
|
41
|
+
field.stubs(:submsg_name).returns(message_class.descriptor.name)
|
42
|
+
field.stubs(:subtype).returns(message_class.descriptor)
|
43
|
+
field
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'when given a decorator' do
|
47
|
+
let(:decorated_message) do
|
48
|
+
mock('message')
|
49
|
+
end
|
50
|
+
let(:decorator) do
|
51
|
+
Protip::Decorator.new(decorated_message, mock('transformer'))
|
52
|
+
end
|
53
|
+
it 'returns the decorated message' do
|
54
|
+
assert_equal decorated_message, transformer.to_message(decorator, field)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'when given a hash' do
|
59
|
+
it 'assigns the hash attributes through a decorator' do
|
60
|
+
created_message = mock('created message')
|
61
|
+
created_decorator =
|
62
|
+
mock('created decorator').responds_like_instance_of(Protip::Decorator)
|
63
|
+
Protip::Decorator.expects(:new).
|
64
|
+
once.
|
65
|
+
# We expect a newly-generated message, and the transformer
|
66
|
+
# that we use for our decorators.
|
67
|
+
with(message_class.new, parent_transformer).
|
68
|
+
returns(created_decorator)
|
69
|
+
|
70
|
+
assignment = sequence 'assignment'
|
71
|
+
created_decorator.expects(:assign_attributes).
|
72
|
+
once.
|
73
|
+
in_sequence(assignment).
|
74
|
+
with(value: 55)
|
75
|
+
created_decorator.expects(:message).
|
76
|
+
once.
|
77
|
+
in_sequence(assignment).
|
78
|
+
returns(created_message)
|
79
|
+
|
80
|
+
assert_equal created_message, transformer.to_message({value: 55}, field)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Simple functional test without all the complex transformer
|
84
|
+
# mocks - transformer never touched because the message only has
|
85
|
+
# a primitive field.
|
86
|
+
it 'assigns the hash attributes (functional)' do
|
87
|
+
message = transformer.to_message({value: 12}, field)
|
88
|
+
assert_equal message_class.new(value: 12), message
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'protip/transformers/delegating_transformer'
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
describe Protip::Transformers::DelegatingTransformer do
|
7
|
+
let(:pool) do
|
8
|
+
pool = ::Google::Protobuf::DescriptorPool.new
|
9
|
+
pool.build do
|
10
|
+
# We just need a couple empty message types
|
11
|
+
add_message('message_one') { }
|
12
|
+
add_message('message_two') { }
|
13
|
+
end
|
14
|
+
pool
|
15
|
+
end
|
16
|
+
%w(one two).each do |name|
|
17
|
+
let(:"message_#{name}_class") do
|
18
|
+
pool.lookup("message_#{name}").msgclass
|
19
|
+
end
|
20
|
+
end
|
21
|
+
%i(one two fallback).each do |name|
|
22
|
+
let(:"transformer_#{name}") do
|
23
|
+
mock("transformer_#{name}").
|
24
|
+
responds_like_instance_of(Class.new { include Protip::Transformer })
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:"field_#{name}") do
|
28
|
+
field = mock("field_#{name}").
|
29
|
+
responds_like_instance_of(::Google::Protobuf::FieldDescriptor)
|
30
|
+
field.stubs(:submsg_name).returns("message_#{name}")
|
31
|
+
field
|
32
|
+
end
|
33
|
+
end
|
34
|
+
let(:delegating_transformer) do
|
35
|
+
transformer = Protip::Transformers::DelegatingTransformer.new(transformer_fallback)
|
36
|
+
transformer['message_one'] = transformer_one
|
37
|
+
transformer['message_two'] = transformer_two
|
38
|
+
transformer
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#to_object' do
|
42
|
+
let(:transformed_message) { mock 'transformed message' }
|
43
|
+
let(:result) { mock 'result' }
|
44
|
+
it 'delegates to transformers based on the message type being transformed' do
|
45
|
+
transformer_one.expects(:to_object).
|
46
|
+
once.
|
47
|
+
with(transformed_message, field_one).
|
48
|
+
returns(result)
|
49
|
+
|
50
|
+
assert_equal result, delegating_transformer.to_object(transformed_message, field_one)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'delegates to the fallback transformer when the message type has not been configured' do
|
54
|
+
transformer_fallback.expects(:to_object).
|
55
|
+
once.
|
56
|
+
with(transformed_message, field_fallback).
|
57
|
+
returns(result)
|
58
|
+
assert_equal result,
|
59
|
+
delegating_transformer.to_object(transformed_message, field_fallback)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#to_message' do
|
64
|
+
let(:result) { mock 'result' }
|
65
|
+
let(:object) { mock 'object' }
|
66
|
+
it 'delegates to transformers based on the message type being transformed' do
|
67
|
+
transformer_two.expects(:to_message).
|
68
|
+
once.
|
69
|
+
with(object, field_two).
|
70
|
+
returns(result)
|
71
|
+
assert_equal result, delegating_transformer.to_message(object, field_two)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'delegates to the fallback transformer when the message type has not been configured' do
|
75
|
+
transformer_fallback.expects(:to_message).
|
76
|
+
once.
|
77
|
+
with(object, field_fallback).
|
78
|
+
returns(result)
|
79
|
+
assert_equal result,
|
80
|
+
delegating_transformer.to_message(object, field_fallback)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|