@@ -214,6 +214,80 @@ module Record
214
214
expect ( actual ) . to eq ( expected )
215
215
expect ( api_requests . size ) . to eq ( 1 )
216
216
end
217
+
218
+ context 'model_filter is set' do
219
+
220
+ let ( :model_a ) do
221
+ Class . new do
222
+ include ( Aws ::Record )
223
+ set_table_name ( "TestTable" )
224
+ integer_attr ( :id , hash_key : true )
225
+ string_attr ( :class_name )
226
+ string_attr ( :attr_a )
227
+ end
228
+ end
229
+
230
+ let ( :model_b ) do
231
+ Class . new do
232
+ include ( Aws ::Record )
233
+ set_table_name ( "TestTable" )
234
+ integer_attr ( :id , hash_key : true )
235
+ string_attr ( :class_name )
236
+ string_attr ( :attr_b )
237
+ end
238
+ end
239
+
240
+ let ( :resp ) do
241
+ {
242
+ items : [
243
+ { 'id' => 1 , 'class_name' => 'A' , 'attr_a' => 'a' } ,
244
+ { 'id' => 2 , 'class_name' => 'B' , 'attr_b' => 'b' } ,
245
+ { 'id' => 3 }
246
+ ] ,
247
+ count : 3
248
+ }
249
+ end
250
+
251
+ let ( :model_filter ) do
252
+ Proc . new do |raw_item_attributes |
253
+ case raw_item_attributes [ 'class_name' ]
254
+ when "A" then model_a
255
+ when "B" then model_b
256
+ else
257
+ nil
258
+ end
259
+ end
260
+ end
261
+
262
+ before { stub_client . stub_responses ( :scan , resp ) }
263
+
264
+ let ( :c ) do
265
+ ItemCollection . new (
266
+ :scan ,
267
+ { table_name : "TestTable" , model_filter : model_filter } ,
268
+ model_a ,
269
+ stub_client
270
+ )
271
+ end
272
+
273
+ it 'uses the model proc to determine the returned model classes' do
274
+ expected = [ model_a , model_b ]
275
+ actual = c . map { |item | item . class }
276
+ expect ( actual ) . to eq ( expected )
277
+ end
278
+
279
+ it 'maps class specific attributes' do
280
+ actual = c . page
281
+ expect ( actual [ 0 ] . attr_a ) . to eq ( 'a' )
282
+ expect ( actual [ 1 ] . attr_b ) . to eq ( 'b' )
283
+ end
284
+
285
+ it 'skips items when model_filter returns nil' do
286
+ actual = c . page
287
+ expect ( actual . size ) . to eq ( 2 )
288
+ end
289
+ end
290
+
217
291
end
218
292
219
293
describe "#empty?" do
0 commit comments