55import random
66
77import docker
8+ from botocore .exceptions import ClientError
89from pydantic import BaseModel as PydanticBaseModel , Field , root_validator , ValidationError
910from pydanticrud import BaseModel , DynamoDbBackend , ConditionCheckFailed
1011import pytest
@@ -66,6 +67,7 @@ class ComplexKeyModel(BaseModel):
6667 category_id : int
6768 notification_id : str
6869 thread_id : str
70+ body : str = 'some random string'
6971
7072 class Config :
7173 title = "ComplexModelTitle123"
@@ -396,7 +398,7 @@ def test_query_with_hash_key_complex(dynamo, complex_query_data):
396398
397399@pytest .mark .parametrize ('order' , ('asc' , 'desc' ))
398400def test_ordered_query_with_hash_key_complex (dynamo , complex_query_data , order ):
399- middle_record = complex_query_data [(len (complex_query_data )// 2 )]
401+ middle_record = complex_query_data [(len (complex_query_data ) // 2 )]
400402 res = ComplexKeyModel .query (
401403 Rule (f"account == '{ middle_record ['account' ]} ' and sort_date_key >= '{ middle_record ['sort_date_key' ]} '" ),
402404 order = order
@@ -414,8 +416,9 @@ def test_ordered_query_with_hash_key_complex(dynamo, complex_query_data, order):
414416@pytest .mark .parametrize ('order' , ('asc' , 'desc' ))
415417def test_pagination_query_with_hash_key_complex (dynamo , complex_query_data , order ):
416418 page_size = 2
417- middle_record = complex_query_data [(len (complex_query_data )// 2 )]
418- query_rule = Rule (f"account == '{ middle_record ['account' ]} ' and sort_date_key >= '{ middle_record ['sort_date_key' ]} '" )
419+ middle_record = complex_query_data [(len (complex_query_data ) // 2 )]
420+ query_rule = Rule (
421+ f"account == '{ middle_record ['account' ]} ' and sort_date_key >= '{ middle_record ['sort_date_key' ]} '" )
419422 res = ComplexKeyModel .query (query_rule , order = order , limit = page_size )
420423 res_data = [(m .account , m .sort_date_key ) for m in res ]
421424 check_data = sorted ([
@@ -432,13 +435,13 @@ def test_pagination_query_with_hash_key_complex(dynamo, complex_query_data, orde
432435 (m ["account" ], m ["sort_date_key" ])
433436 for m in complex_query_data
434437 if m ["account" ] == middle_record ['account' ] and m ["sort_date_key" ] >= middle_record ['sort_date_key' ]
435- ], reverse = order == 'desc' )[page_size :page_size * 2 ]
438+ ], reverse = order == 'desc' )[page_size :page_size * 2 ]
436439 assert res_data == check_data
437440
438441
439442def test_pagination_query_with_index_complex (dynamo , complex_query_data ):
440443 page_size = 2
441- middle_record = complex_query_data [(len (complex_query_data )// 2 )]
444+ middle_record = complex_query_data [(len (complex_query_data ) // 2 )]
442445 query_rule = Rule (f"account == '{ middle_record ['account' ]} ' and category_id >= { middle_record ['category_id' ]} " )
443446 check_data = ComplexKeyModel .query (query_rule )
444447 res = ComplexKeyModel .query (query_rule , limit = page_size )
@@ -528,3 +531,28 @@ def test_alias_model_validator_ingest(dynamo):
528531 data .pop ("typ" )
529532 with pytest .raises (ValidationError ):
530533 AliasKeyModel (** data )
534+
535+
536+ def test_batch_write (dynamo , complex_table ):
537+ response = {"UnprocessedItems" : {}}
538+ data = [
539+ ComplexKeyModel .parse_obj (complex_model_data_generator ())
540+ for x in range (0 , 10 )
541+ ]
542+ un_proc = ComplexKeyModel .batch_save (data )
543+ assert un_proc == response ["UnprocessedItems" ]
544+ res_get = ComplexKeyModel .get ((data [0 ].account , data [0 ].sort_date_key ))
545+ res_query = ComplexKeyModel .query (Rule (f"account == '{ data [0 ].account } ' and sort_date_key == '{ data [0 ].sort_date_key } '" ))
546+ assert res_get == data [0 ]
547+ assert res_query .count == 1
548+ assert res_query .records == [data [0 ]]
549+
550+
551+ def test_message_batch_write_client_exception (dynamo , complex_table ):
552+ data = [
553+ ComplexKeyModel .parse_obj (complex_model_data_generator (body = "some big string" * 10000 ))
554+ for x in range (0 , 2 )
555+ ]
556+ with pytest .raises (ClientError ) as exc :
557+ ComplexKeyModel .batch_save (data )
558+ assert exc .value .response ['Error' ]['Message' ] == 'Item size has exceeded the maximum allowed size'
0 commit comments