Increase code coverage on dynamodb-enhanced module#6700
Increase code coverage on dynamodb-enhanced module#6700andreas-grafenberger wants to merge 7 commits intoaws:masterfrom
Conversation
a024740 to
fcfbd00
Compare
337c117 to
f97adfc
Compare
1764264 to
8dd1add
Compare
| @Test | ||
| public void returnsCorrectOperationName() { | ||
| DeleteTableOperation<FakeItemWithIndices> operation = DeleteTableOperation.create(); | ||
| assertThat(operation.operationName().label(), is("DeleteItem")); |
There was a problem hiding this comment.
is("DeleteItem") , should this be delete table ?
There was a problem hiding this comment.
Agreed, but this reflects the original implementation logic. However, the scope of this PR is purely to improve test coverage. I suggest to avoid mixing different types of changes here - the fix for this operation name should be treated separately. What do you think?
L.E: updated assert by replacing literal string "DeleteItem" with the label value from enum.
| if (o == null || getClass() != o.getClass()) { | ||
| return false; | ||
| } | ||
| StaticCounterRecord that = (StaticCounterRecord) o; |
There was a problem hiding this comment.
Should this be ?
BeanCounterRecord that = (BeanCounterRecord) o;
There was a problem hiding this comment.
Updated with the correct type; also, regenerated equals and hashCode methods for both StaticCounterRecord and BeanCounterRecord.
|
|
||
| AutoGeneratedTimestampRecordExtension.Builder rebuilt = extension.toBuilder(); | ||
|
|
||
| assertThat(rebuilt).isNotNull(); |
There was a problem hiding this comment.
we only check is it is not null but shouldn't we check if we preserved the value ?\
assertThat(generatedInstant).isEqualTo(Instant.parse("2025-01-01T00:00:00Z"));There was a problem hiding this comment.
Updated the assert to compare both objects (incl. private fields - like clock): initial extension vs rebuilt extension.
|
|
||
| @TestFactory | ||
| Stream<DynamicTest> testDefaultMethodsThrowUnsupportedOperation() { | ||
| return scanPackageForClasses(BASE_PACKAGE) |
There was a problem hiding this comment.
This will silently return nothing and the test will be passed automatically. You may consider to check if we have any tests returned from the operation before returning values..
Stream<DynamicTest> testDefaultMethodsThrowUnsupportedOperation() {
List<DynamicTest> tests = scanPackageForClasses(BASE_PACKAGE)
.filter(Class::isInterface)
.filter(this::hasDefaultMethods)
.collect(toList())
.stream()
.flatMap(this::createTestsForInterface)
.collect(toList());
assertThat(tests).as("Expected to find interfaces with default UnsupportedOperation methods, "
+ "but classpath scan returned nothing. Check classpath configuration.")
.isNotEmpty();
return tests.stream();There was a problem hiding this comment.
I see your point - you are right - but I would suggest something more restrictive for that list (tests) - I added an assert to compare against the current number of methods that qualify for this test - current number: 100, and the assert looks something like:
assertEquals(100, tests.size());
I would take this approach because it works as an additional check when / if someone introduces such methods.
| mappedTable.putItem(record); | ||
| RecordWithAutogeneratedUuid result = mappedTable.scan().items().stream().findFirst() | ||
| .orElseThrow(() -> new AssertionError("No record found")); | ||
| isValidUuid(result.getId()); |
There was a problem hiding this comment.
This is not an assertion but I think we will be fixed in PR 6373 and we can rebaseline on that
There was a problem hiding this comment.
Yes, tests containing isValidUuid(*) (and no other assertion) will be fixed in mentioned PR and then we can double check to be sure that we don't miss anything on this PR.
| return sort; | ||
| } | ||
|
|
||
| public String stringAttribute() { |
There was a problem hiding this comment.
should this be getStringAttribute() ?
I think the SDK's ImmutableTableSchema uses getter naming conventions. This may cause the attribute to not be mapped correctly
There was a problem hiding this comment.
Yes, there are some checks regarding get / set methods and an exception is thrown if there are problems, but these tests are not affected by this scenario. Regardless, I appreciate the suggestion and have implemented the fix to ensure the code remains consistent.
| return sort; | ||
| } | ||
|
|
||
| public String stringAttribute() { |
There was a problem hiding this comment.
same as in abstract model, shouldn't this be getStringAttribute ?
There was a problem hiding this comment.
Same as above: yes, there are some checks regarding get / set methods and an exception is thrown if there are problems, but these tests are not affected by this scenario. Regardless, I appreciate the suggestion and have implemented the fix to ensure the code remains consistent.
| } | ||
|
|
||
| @Test | ||
| public void createKeyFromItem_withPartitionKeyOnly_createsCorrectKey() { |
There was a problem hiding this comment.
is this really different than createKeyFromItem_partitionKeyOnly_returnsKeyWithPartitionOnly ?
There was a problem hiding this comment.
I removed duplicated tests.
| } | ||
|
|
||
| @Test | ||
| public void keyRef_withSpecialCharacters_cleansAndFormatsKey() { |
There was a problem hiding this comment.
is this testing something different than keyRef_attributeNameWithSpecialCharacters_returnsCleanedReference ?
There was a problem hiding this comment.
Same as above, I removed the duplicated tests.
| import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; | ||
| import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; | ||
|
|
||
| public class ChainExtensionTest extends LocalDynamoDbSyncTestBase { |
There was a problem hiding this comment.
I think more important part of chaining extensions is interaction across operations. Missing: updateItem (does version increment while UUID stays stable?)
Could you add tests for updateItem, batchWriteItem, and transactWriteItems?
The updateItem case will be worth to test, AutoGeneratedUuidExtension always regenerates the UUID on every write, while VersionedRecordExtension increments the version. What happens when both run on an update? Does the version increment correctly? Does the timestamp update?
There was a problem hiding this comment.
Good one - thanks! I will give it a try...
There was a problem hiding this comment.
Added tests in ChainExtensionTest class:
- transactWriteItem_putItemThenUpdateItemAndGetItem_appliesAllChainedExtensions
- putItemThenUpdateItemAndGetItem_appliesAllChainedExtensions
- batchWriteItem_putTwoItems_appliesAllChainedExtensionsWithoutVersion
- batchWriteItem_putTwoItemsAndAppliesAllChainedExtensions_throwsIllegalArgumentException
| EnumAttributeConverter<Person> personConverter = EnumAttributeConverter.createWithNameAsKeys(Person.class); | ||
|
|
||
| Person john = personConverter.transformTo(AttributeValue.fromS("JOHN")); | ||
| personConverter.transformTo(AttributeValue.fromS("JOHN")); |
There was a problem hiding this comment.
I think we should also check the correct enum value is returned, something like
assertThat(personConverter.transformTo(AttributeValue.fromS("JOHN"))).isEqualTo(Person.JOHN);There was a problem hiding this comment.
Good one, thank you! The test should be fine now.
| import software.amazon.awssdk.services.dynamodb.model.ReturnValue; | ||
| import software.amazon.awssdk.services.dynamodb.model.TableDescription; | ||
|
|
||
| public class AnnotatedBeanTableSchemaTest extends LocalDynamoDbSyncTestBase { |
There was a problem hiding this comment.
Can we use a parameterized test and remove the Immutable and Async variants? They are largely the same code.
There was a problem hiding this comment.
We can do it for Bean and Immutable, but not for Sync and Async since there is used a different client type of DynamoDb (sync vs async and is initialized based on inherited test class):
- LocalDynamoDbSyncTestBase is used to create DynamoDbClient
- LocalDynamoDbAsyncTestBase is used to create DynamoDbAsyncClient
Also, there is an existing "pattern" where tests are already separated based on the used DynamoDb client type (tests for Async client usually starts with "Async*").
There was a problem hiding this comment.
Update - I parameterized the mentioned tests (in terms of Bean and Immutable variants) :
- AnnotatedBeanTableSchemaTest.java
- AnnotatedImmutableTableSchemaTest.java
as: AnnotatedTableSchemaTest.java, and:
- AsyncAnnotatedBeanTableSchemaTest.java
- AsyncAnnotatedImmutableTableSchemaTest.java
as: AsyncAnnotatedTableSchemaTest.java
5016df9 to
e33be5f
Compare
…dding assert for OptionalAttributeValueConverterTest.
Motivation and Context
The goal of this work is to increase unit, functional, and integration code coverage for the
aws-sdk-java-v2/services-custom/dynamodb-enhancedmodule.Initial coverage:
Target coverage:
Achieved coverage:
These results exceed the defined targets and significantly improve confidence in the correctness and stability of the enhanced DynamoDB module.
Modifications
This pull request expands code coverage across the DynamoDB Enhanced Client by introducing new unit, functional, and integration tests targeting previously uncovered or partially covered code paths.
Testing
Screenshots
Initial coverage:
Achieved coverage:
Types of changes
Checklist
mvn installsucceedsscripts/new-changescript and following the instructions. Commit the new file created by the script in.changes/next-releasewith your changes.License