Skip to content

Commit b29fc22

Browse files
Strengthen test assertions for condition expression and returnValuesOnConditionCheckFailure
- Add full condition expression validation in putRecord_shouldSendCorrectPutItemRequest - Add returnValuesOnConditionCheckFailure='ALL_OLD' assertion - Protects bugfix from #1285 and behavior from #1821 - Per code review feedback from @phipag
1 parent cdaf3d7 commit b29fc22

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

  • powertools-idempotency/powertools-idempotency-dynamodb/src/test/java/software/amazon/lambda/powertools/idempotency/persistence/dynamodb

powertools-idempotency/powertools-idempotency-dynamodb/src/test/java/software/amazon/lambda/powertools/idempotency/persistence/dynamodb/DynamoDBPersistenceStoreTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,26 @@ void putRecord_shouldSendCorrectPutItemRequest() throws IdempotencyItemAlreadyEx
8282
assertThat(request.item()).containsEntry("id", AttributeValue.builder().s("key").build());
8383
assertThat(request.item().get("status").s()).isEqualTo("COMPLETED");
8484
assertThat(request.item().get("expiration").n()).isEqualTo(String.valueOf(expiry));
85-
assertThat(request.conditionExpression()).contains("attribute_not_exists(#id)");
86-
assertThat(request.conditionExpression()).contains("#expiry < :now");
85+
86+
// Assert full condition expression (protects bugfix from #1285)
87+
assertThat(request.conditionExpression()).isEqualTo(
88+
"attribute_not_exists(#id) OR #expiry < :now OR " +
89+
"(attribute_exists(#in_progress_expiry) AND #in_progress_expiry < :now_milliseconds AND #status = :inprogress)");
90+
91+
// Assert expression attribute names
92+
assertThat(request.expressionAttributeNames())
93+
.containsEntry("#id", "id")
94+
.containsEntry("#expiry", "expiration")
95+
.containsEntry("#in_progress_expiry", "in_progress_expiration")
96+
.containsEntry("#status", "status");
97+
98+
// Assert expression attribute values
99+
assertThat(request.expressionAttributeValues().get(":now").n())
100+
.isEqualTo(String.valueOf(now.getEpochSecond()));
101+
assertThat(request.expressionAttributeValues().get(":now_milliseconds").n())
102+
.isEqualTo(String.valueOf(now.toEpochMilli()));
103+
assertThat(request.expressionAttributeValues().get(":inprogress").s())
104+
.isEqualTo("INPROGRESS");
87105
}
88106

89107
@Test
@@ -134,6 +152,12 @@ void putRecord_shouldThrowIdempotencyItemAlreadyExistsException_whenConditionFai
134152
assertThat(existingRecord.getStatus()).isEqualTo(DataRecord.Status.COMPLETED);
135153
assertThat(existingRecord.getResponseData()).isEqualTo("Existing Data");
136154
});
155+
156+
// Assert returnValuesOnConditionCheckFailure is ALL_OLD (protects behavior from #1821)
157+
ArgumentCaptor<PutItemRequest> captor = ArgumentCaptor.forClass(PutItemRequest.class);
158+
verify(mockClient).putItem(captor.capture());
159+
PutItemRequest request = captor.getValue();
160+
assertThat(request.returnValuesOnConditionCheckFailureAsString()).isEqualTo("ALL_OLD");
137161
}
138162

139163
@Test

0 commit comments

Comments
 (0)