2020import java .util .ArrayList ;
2121import java .util .List ;
2222import java .util .UUID ;
23+ import java .util .stream .Stream ;
2324import org .junit .jupiter .api .BeforeAll ;
2425import org .junit .jupiter .params .ParameterizedTest ;
2526import org .junit .jupiter .params .provider .Arguments ;
3334import software .amazon .awssdk .auth .credentials .AwsBasicCredentials ;
3435import software .amazon .awssdk .auth .credentials .StaticCredentialsProvider ;
3536import software .amazon .awssdk .enhanced .dynamodb .*;
36- import software .amazon .awssdk .enhanced .dynamodb .model .PageIterable ;
37- import software .amazon .awssdk .enhanced .dynamodb .model .QueryConditional ;
38- import software .amazon .awssdk .enhanced .dynamodb .model .QueryEnhancedRequest ;
39- import software .amazon .awssdk .enhanced .dynamodb .model .ScanEnhancedRequest ;
37+ import software .amazon .awssdk .enhanced .dynamodb .model .*;
4038import software .amazon .awssdk .regions .Region ;
4139import software .amazon .awssdk .services .dynamodb .DynamoDbClient ;
4240import software .amazon .awssdk .services .dynamodb .model .*;
4644 *
4745 * @author Matej Nedic
4846 * @author Arun Patra
47+ * @author Marcus Voltolim
4948 */
5049@ Testcontainers
5150public class DynamoDbTemplateIntegrationTest {
@@ -62,7 +61,7 @@ public class DynamoDbTemplateIntegrationTest {
6261 DockerImageName .parse ("localstack/localstack:4.4.0" ));
6362
6463 @ BeforeAll
65- public static void createTable () {
64+ static void createTable () {
6665 DynamoDbClient dynamoDbClient = DynamoDbClient .builder ().endpointOverride (localstack .getEndpoint ())
6766 .region (Region .of (localstack .getRegion ()))
6867 .credentialsProvider (StaticCredentialsProvider
@@ -107,16 +106,45 @@ void dynamoDbTemplate_read_entitySuccessful_returnsNull(DynamoDbTable<PersonEnti
107106 @ ParameterizedTest
108107 @ MethodSource ("argumentSource" )
109108 void dynamoDbTemplate_saveUpdateAndRead_entitySuccessful (DynamoDbTable <PersonEntity > dynamoDbTable ,
110- DynamoDbTemplate dynamoDbTemplate ) {
109+ DynamoDbTemplate dynamoDbTemplate ) {
111110 PersonEntity personEntity = new PersonEntity (UUID .randomUUID (), "foo" , "bar" );
112111 dynamoDbTemplate .save (personEntity );
113112
113+ personEntity .setName (null );
114114 personEntity .setLastName ("xxx" );
115115 dynamoDbTemplate .update (personEntity );
116116
117- PersonEntity personEntity1 = dynamoDbTemplate
118- .load (Key .builder ().partitionValue (personEntity .getUuid ().toString ()).build (), PersonEntity .class );
119- assertThat (personEntity1 ).isEqualTo (personEntity );
117+
118+ Key key = Key .builder ().partitionValue (personEntity .getUuid ().toString ()).build ();
119+
120+ assertThat (dynamoDbTemplate .load (key , PersonEntity .class ))
121+ .extracting (PersonEntity ::getName , PersonEntity ::getLastName )
122+ .containsExactly (null , "xxx" );
123+
124+ // clean up
125+ cleanUp (dynamoDbTable , personEntity .getUuid ());
126+ }
127+
128+ @ ParameterizedTest
129+ @ MethodSource ("argumentSource" )
130+ void dynamoDbTemplate_saveUpdateIgnoreNullAndRead_entitySuccessful (DynamoDbTable <PersonEntity > dynamoDbTable ,
131+ DynamoDbTemplate dynamoDbTemplate ) {
132+ PersonEntity personEntity = new PersonEntity (UUID .randomUUID (), "foo" , "bar" );
133+ dynamoDbTemplate .save (personEntity );
134+
135+ personEntity .setName (null );
136+ personEntity .setLastName ("xxx" );
137+ UpdateItemEnhancedRequest <PersonEntity > request = UpdateItemEnhancedRequest .builder (PersonEntity .class )
138+ .item (personEntity )
139+ .ignoreNullsMode (IgnoreNullsMode .SCALAR_ONLY )
140+ .build ();
141+ dynamoDbTemplate .update (request );
142+
143+ Key key = Key .builder ().partitionValue (personEntity .getUuid ().toString ()).build ();
144+
145+ assertThat (dynamoDbTemplate .load (key , PersonEntity .class ))
146+ .extracting (PersonEntity ::getName , PersonEntity ::getLastName )
147+ .containsExactly ("foo" , "xxx" );
120148
121149 // clean up
122150 cleanUp (dynamoDbTable , personEntity .getUuid ());
@@ -314,16 +342,18 @@ public static void cleanUp(DynamoDbTable<PersonEntity> dynamoDbTable, UUID uuid)
314342 dynamoDbTable .deleteItem (Key .builder ().partitionValue (uuid .toString ()).build ());
315343 }
316344
317- private static java .util .stream .Stream <Arguments > argumentSource () {
318- return java .util .stream .Stream .of (Arguments .of (dynamoDbTable , dynamoDbTemplate ),
319- Arguments .of (prefixedDynamoDbTable , prefixedDynamoDbTemplate ));
345+ private static Stream <Arguments > argumentSource () {
346+ return Stream .of (
347+ Arguments .of (dynamoDbTable , dynamoDbTemplate ),
348+ Arguments .of (prefixedDynamoDbTable , prefixedDynamoDbTemplate )
349+ );
320350 }
321351
322352 private static void describeAndCreateTable (DynamoDbClient dynamoDbClient , @ Nullable String tablePrefix ) {
323- ArrayList <AttributeDefinition > attributeDefinitions = new ArrayList <AttributeDefinition >();
353+ ArrayList <AttributeDefinition > attributeDefinitions = new ArrayList <>();
324354 attributeDefinitions .add (AttributeDefinition .builder ().attributeName ("uuid" ).attributeType ("S" ).build ());
325355 attributeDefinitions .add (AttributeDefinition .builder ().attributeName (nameOfGSPK ).attributeType ("S" ).build ());
326- ArrayList <KeySchemaElement > tableKeySchema = new ArrayList <KeySchemaElement >();
356+ ArrayList <KeySchemaElement > tableKeySchema = new ArrayList <>();
327357 tableKeySchema .add (KeySchemaElement .builder ().attributeName ("uuid" ).keyType (KeyType .HASH ).build ());
328358 List <KeySchemaElement > indexKeySchema = new ArrayList <>();
329359 indexKeySchema .add (KeySchemaElement .builder ().attributeName (nameOfGSPK ).keyType (KeyType .HASH ).build ());
@@ -347,4 +377,5 @@ private static void describeAndCreateTable(DynamoDbClient dynamoDbClient, @Nulla
347377 // table already exists, do nothing
348378 }
349379 }
380+
350381}
0 commit comments