@@ -212,6 +212,130 @@ def initialize(a, b, c)
212212 end
213213 end
214214
215+ context 'with :default option' do
216+ let ( :a ) { nil }
217+ let ( :b ) { nil }
218+ let ( :c ) { 'value' }
219+
220+ context 'when model is a PORO' do
221+ let ( :model ) { Model . new ( a , b , c ) }
222+
223+ before do
224+ stub_const 'Model' , Class . new
225+ Model . class_eval do
226+ attr_accessor :a , :b , :c
227+
228+ def initialize ( a , b , c )
229+ @a = a
230+ @b = b
231+ @c = c
232+ end
233+ end
234+ end
235+
236+ context 'when default option is not provided' do
237+ it 'exposes attributes values' do
238+ subject . expose ( :a )
239+ subject . expose ( :b )
240+ subject . expose ( :c )
241+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : nil , b : nil , c : 'value' )
242+ end
243+ end
244+
245+ context 'when default option is set' do
246+ it 'exposes default values for attributes' do
247+ subject . expose ( :a , default : 'a' )
248+ subject . expose ( :b , default : 'b' )
249+ subject . expose ( :c , default : 'c' )
250+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : 'a' , b : 'b' , c : 'value' )
251+ end
252+ end
253+
254+ context 'when default option is set and block passed' do
255+ it 'return default value if block returns nil' do
256+ subject . expose ( :a , default : 'a' ) do |_obj , _options |
257+ nil
258+ end
259+ subject . expose ( :b )
260+ subject . expose ( :c )
261+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : 'a' , b : nil , c : 'value' )
262+ end
263+
264+ it 'return value from block if block returns a value' do
265+ subject . expose ( :a , default : 'a' ) do |_obj , _options |
266+ 100
267+ end
268+ subject . expose ( :b )
269+ subject . expose ( :c )
270+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : 100 , b : nil , c : 'value' )
271+ end
272+ end
273+ end
274+
275+ context 'when model is a hash' do
276+ let ( :model ) { { a : a , b : b , c : c } }
277+
278+ context 'when expose_nil option is not provided' do
279+ it 'exposes nil attributes' do
280+ subject . expose ( :a )
281+ subject . expose ( :b )
282+ subject . expose ( :c )
283+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : nil , b : nil , c : 'value' )
284+ end
285+ end
286+
287+ context 'when expose_nil option is true' do
288+ it 'exposes nil attributes' do
289+ subject . expose ( :a , expose_nil : true )
290+ subject . expose ( :b , expose_nil : true )
291+ subject . expose ( :c )
292+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( a : nil , b : nil , c : 'value' )
293+ end
294+ end
295+
296+ context 'when expose_nil option is false' do
297+ it 'does not expose nil attributes' do
298+ subject . expose ( :a , expose_nil : false )
299+ subject . expose ( :b , expose_nil : false )
300+ subject . expose ( :c )
301+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( c : 'value' )
302+ end
303+
304+ it 'is only applied per attribute' do
305+ subject . expose ( :a , expose_nil : false )
306+ subject . expose ( :b )
307+ subject . expose ( :c )
308+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( b : nil , c : 'value' )
309+ end
310+
311+ it 'raises an error when applied to multiple attribute exposures' do
312+ expect { subject . expose ( :a , :b , :c , expose_nil : false ) } . to raise_error ArgumentError
313+ end
314+ end
315+ end
316+
317+ context 'with nested structures' do
318+ let ( :model ) { { a : a , b : b , c : { d : nil , e : nil , f : { g : nil , h : nil } } } }
319+
320+ context 'when expose_nil option is false' do
321+ it 'does not expose nil attributes' do
322+ subject . expose ( :a , expose_nil : false )
323+ subject . expose ( :b )
324+ subject . expose ( :c ) do
325+ subject . expose ( :d , expose_nil : false )
326+ subject . expose ( :e )
327+ subject . expose ( :f ) do
328+ subject . expose ( :g , expose_nil : false )
329+ subject . expose ( :h )
330+ end
331+ end
332+
333+ expect ( subject . represent ( model ) . serializable_hash ) . to eq ( b : nil , c : { e : nil , f : { h : nil } } )
334+ end
335+ end
336+ end
337+ end
338+
215339 context 'with a block' do
216340 it 'errors out if called with multiple attributes' do
217341 expect { subject . expose ( :name , :email ) { true } } . to raise_error ArgumentError
0 commit comments