|
16 | 16 | package io.awspring.cloud.dynamodb;
|
17 | 17 |
|
18 | 18 | import static org.assertj.core.api.Assertions.assertThat;
|
| 19 | +import static org.junit.Assert.assertThrows; |
19 | 20 |
|
20 | 21 | import java.util.ArrayList;
|
21 | 22 | import java.util.List;
|
|
29 | 30 | import org.springframework.util.StringUtils;
|
30 | 31 | import software.amazon.awssdk.enhanced.dynamodb.*;
|
31 | 32 | import software.amazon.awssdk.enhanced.dynamodb.model.*;
|
| 33 | +import software.amazon.awssdk.enhanced.dynamodb.model.DeleteItemEnhancedRequest; |
32 | 34 | import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
|
| 35 | +import software.amazon.awssdk.enhanced.dynamodb.model.PutItemEnhancedRequest; |
33 | 36 | import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional;
|
34 | 37 | import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
|
35 | 38 | import software.amazon.awssdk.enhanced.dynamodb.model.ScanEnhancedRequest;
|
| 39 | +import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest; |
36 | 40 | import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
|
37 | 41 | import software.amazon.awssdk.services.dynamodb.model.*;
|
38 | 42 |
|
@@ -322,6 +326,91 @@ void dynamoDbTemplate_saveAndScanForParticularIndex_entitySuccessful(DynamoDbTab
|
322 | 326 | cleanUp(dynamoDbTable, personEntity2.getUuid());
|
323 | 327 | }
|
324 | 328 |
|
| 329 | + @ParameterizedTest |
| 330 | + @MethodSource("argumentSource") |
| 331 | + void dynamoDbTemplate_saveConditionallyAndRead_entitySuccessfully(DynamoDbTable<PersonEntity> dynamoDbTable, |
| 332 | + DynamoDbTemplate dynamoDbTemplate) { |
| 333 | + UUID uuid = UUID.randomUUID(); |
| 334 | + PersonEntity personEntity = new PersonEntity(uuid, "foo", null); |
| 335 | + PersonEntity secondPersonEntity = new PersonEntity(uuid, "foo", "jar"); |
| 336 | + PutItemEnhancedRequest<PersonEntity> putItemEnhancedRequest = PutItemEnhancedRequest.builder(PersonEntity.class) |
| 337 | + .conditionExpression(Expression.builder().expression("attribute_not_exists(lastName)").build()) |
| 338 | + .item(secondPersonEntity).build(); |
| 339 | + // save a person with lastName "bar" |
| 340 | + dynamoDbTemplate.save(personEntity); |
| 341 | + // attempt to replace person with lastName "jar" |
| 342 | + dynamoDbTemplate.save(putItemEnhancedRequest); |
| 343 | + PersonEntity savedPersonEntity = dynamoDbTemplate.load( |
| 344 | + Key.builder().partitionValue(secondPersonEntity.getUuid().toString()).build(), PersonEntity.class); |
| 345 | + assertThat(savedPersonEntity).isEqualTo(secondPersonEntity); |
| 346 | + |
| 347 | + cleanUp(dynamoDbTable, personEntity.getUuid()); |
| 348 | + } |
| 349 | + |
| 350 | + @ParameterizedTest |
| 351 | + @MethodSource("argumentSource") |
| 352 | + void dynamoDbTemplate_saveConditionally_entityFails(DynamoDbTable<PersonEntity> dynamoDbTable, |
| 353 | + DynamoDbTemplate dynamoDbTemplate) { |
| 354 | + UUID uuid = UUID.randomUUID(); |
| 355 | + PersonEntity personEntity = new PersonEntity(uuid, "foo", "bar"); |
| 356 | + PersonEntity secondPersonEntity = new PersonEntity(uuid, "foo", "jar"); |
| 357 | + PutItemEnhancedRequest<PersonEntity> putItemEnhancedRequest = PutItemEnhancedRequest.builder(PersonEntity.class) |
| 358 | + .conditionExpression(Expression.builder().expression("attribute_not_exists(lastName)").build()) |
| 359 | + .item(secondPersonEntity).build(); |
| 360 | + // save person with lastName "bar" |
| 361 | + dynamoDbTemplate.save(personEntity); |
| 362 | + // try to save new lastName "jar" for the same person |
| 363 | + assertThrows(DynamoDbException.class, () -> { |
| 364 | + dynamoDbTemplate.save(putItemEnhancedRequest); |
| 365 | + }); |
| 366 | + |
| 367 | + cleanUp(dynamoDbTable, personEntity.getUuid()); |
| 368 | + |
| 369 | + } |
| 370 | + |
| 371 | + @ParameterizedTest |
| 372 | + @MethodSource("argumentSource") |
| 373 | + void dynamoDbTemplate_deleteConditionally_entitySuccessfully(DynamoDbTable<PersonEntity> dynamoDbTable, |
| 374 | + DynamoDbTemplate dynamoDbTemplate) { |
| 375 | + UUID uuid = UUID.randomUUID(); |
| 376 | + PersonEntity personEntity = new PersonEntity(uuid, "notfoo", "bar"); |
| 377 | + DeleteItemEnhancedRequest deleteItemEnhancedRequest = DeleteItemEnhancedRequest.builder() |
| 378 | + .conditionExpression(Expression.builder().expression("#nameNotBeDeleted <> :value") |
| 379 | + .putExpressionName("#nameNotBeDeleted", "name") |
| 380 | + .putExpressionValue(":value", AttributeValue.builder().s("foo").build()).build()) |
| 381 | + .key(Key.builder().partitionValue(personEntity.getUuid().toString()).build()).build(); |
| 382 | + dynamoDbTemplate.save(personEntity); |
| 383 | + dynamoDbTemplate.delete(deleteItemEnhancedRequest, PersonEntity.class); |
| 384 | + |
| 385 | + PersonEntity deletedEntity = dynamoDbTemplate |
| 386 | + .load(Key.builder().partitionValue(personEntity.getUuid().toString()).build(), PersonEntity.class); |
| 387 | + |
| 388 | + assertThat(deletedEntity).isNull(); |
| 389 | + } |
| 390 | + |
| 391 | + @ParameterizedTest |
| 392 | + @MethodSource("argumentSource") |
| 393 | + void dynamoDbTemplate_deleteConditionally_entityFails(DynamoDbTable<PersonEntity> dynamoDbTable, |
| 394 | + DynamoDbTemplate dynamoDbTemplate) { |
| 395 | + UUID uuid = UUID.randomUUID(); |
| 396 | + PersonEntity personEntity = new PersonEntity(uuid, "foo", "bar"); |
| 397 | + DeleteItemEnhancedRequest deleteItemEnhancedRequest = DeleteItemEnhancedRequest.builder() |
| 398 | + .conditionExpression(Expression.builder().expression("#nameNotBeDeleted <> :value") |
| 399 | + .putExpressionName("#nameNotBeDeleted", "name") |
| 400 | + .putExpressionValue(":value", AttributeValue.builder().s("foo").build()).build()) |
| 401 | + .key(Key.builder().partitionValue(personEntity.getUuid().toString()).build()).build(); |
| 402 | + dynamoDbTemplate.save(personEntity); |
| 403 | + assertThrows(DynamoDbException.class, () -> { |
| 404 | + dynamoDbTemplate.delete(deleteItemEnhancedRequest, PersonEntity.class); |
| 405 | + }); |
| 406 | + |
| 407 | + PersonEntity deletedEntity = dynamoDbTemplate |
| 408 | + .load(Key.builder().partitionValue(personEntity.getUuid().toString()).build(), PersonEntity.class); |
| 409 | + |
| 410 | + assertThat(deletedEntity).isNotNull(); |
| 411 | + cleanUp(dynamoDbTable, personEntity.getUuid()); |
| 412 | + } |
| 413 | + |
325 | 414 | public static void cleanUp(DynamoDbTable<PersonEntity> dynamoDbTable, UUID uuid) {
|
326 | 415 | dynamoDbTable.deleteItem(Key.builder().partitionValue(uuid.toString()).build());
|
327 | 416 | }
|
|
0 commit comments