Skip to content

Commit b9008c1

Browse files
authored
Merge pull request #559 from CMSgov/task-dynamodb-test
Limit DynamoDb retrieve file list
2 parents 56bac71 + 3a6ea95 commit b9008c1

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

rest-api/src/main/java/gov/cms/qpp/conversion/api/services/DbServiceImpl.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class DbServiceImpl extends AnyOrderActionService<Metadata, Metadata>
2727
implements DbService {
2828

2929
private static final Logger API_LOG = LoggerFactory.getLogger(DbServiceImpl.class);
30+
private static final int LIMIT = 3;
3031

3132
@Inject
3233
private DynamoDBMapper mapper;
@@ -59,7 +60,9 @@ public CompletableFuture<Metadata> write(Metadata meta) {
5960
}
6061

6162
/**
62-
* Scans the DynamoDB table for unprocessed {@link Metadata}
63+
* Queries the DynamoDB GSI for unprocessed {@link Metadata} with a maximum of 96 items.
64+
*
65+
* Iterates over all of the different partitions, returning a maximum of three items from each.
6366
*
6467
* @return {@link List} of unprocessed {@link Metadata}
6568
*/
@@ -75,9 +78,10 @@ public List<Metadata> getUnprocessedCpcPlusMetaData() {
7578
.withKeyConditionExpression(Constants.DYNAMO_CPC_ATTRIBUTE + " = :cpcValue and begins_with(" +
7679
Constants.DYNAMO_CPC_PROCESSED_CREATE_DATE_ATTRIBUTE + ", :cpcProcessedValue)")
7780
.withExpressionAttributeValues(valueMap)
78-
.withConsistentRead(false);
81+
.withConsistentRead(false)
82+
.withLimit(LIMIT);
7983

80-
return mapper.query(Metadata.class, metadataQuery).stream();
84+
return mapper.queryPage(Metadata.class, metadataQuery).getResults().stream();
8185
}).flatMap(Function.identity()).collect(Collectors.toList());
8286
}
8387

@@ -88,6 +92,7 @@ public List<Metadata> getUnprocessedCpcPlusMetaData() {
8892
* @return Metadata found
8993
*/
9094
public Metadata getMetadataById(String uuid) {
95+
API_LOG.info("Read item {} from DynamoDB", uuid);
9196
return mapper.load(Metadata.class, uuid);
9297
}
9398

rest-api/src/test/java/gov/cms/qpp/conversion/api/services/DbServiceImplTest.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
package gov.cms.qpp.conversion.api.services;
22

3+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
4+
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
5+
import com.amazonaws.services.dynamodbv2.datamodeling.QueryResultPage;
6+
import gov.cms.qpp.conversion.api.model.Constants;
7+
import gov.cms.qpp.conversion.api.model.Metadata;
8+
import gov.cms.qpp.test.MockitoExtension;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.mockito.InjectMocks;
13+
import org.mockito.Mock;
14+
import org.springframework.core.env.Environment;
15+
import org.springframework.core.task.TaskExecutor;
16+
17+
import java.util.List;
18+
import java.util.concurrent.CompletableFuture;
19+
import java.util.stream.Collectors;
20+
import java.util.stream.Stream;
21+
322
import static com.google.common.truth.Truth.assertThat;
423
import static com.google.common.truth.Truth.assertWithMessage;
524
import static org.mockito.ArgumentMatchers.any;
@@ -12,26 +31,6 @@
1231
import static org.mockito.Mockito.verifyZeroInteractions;
1332
import static org.mockito.Mockito.when;
1433

15-
import java.util.List;
16-
import java.util.concurrent.CompletableFuture;
17-
import java.util.stream.Stream;
18-
19-
import org.junit.jupiter.api.BeforeEach;
20-
import org.junit.jupiter.api.Test;
21-
import org.junit.jupiter.api.extension.ExtendWith;
22-
import org.mockito.InjectMocks;
23-
import org.mockito.Mock;
24-
import org.springframework.core.env.Environment;
25-
import org.springframework.core.task.TaskExecutor;
26-
27-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
28-
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
29-
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
30-
31-
import gov.cms.qpp.conversion.api.model.Constants;
32-
import gov.cms.qpp.conversion.api.model.Metadata;
33-
import gov.cms.qpp.test.MockitoExtension;
34-
3534
@ExtendWith(MockitoExtension.class)
3635
class DbServiceImplTest {
3736

@@ -92,14 +91,16 @@ void testNoWriteBecauseNoAudit() {
9291

9392
@Test
9493
void testGetUnprocessedCpcPlusMetaData() {
95-
PaginatedQueryList<Metadata> mockMetadataList = mock(PaginatedQueryList.class);
96-
when(mockMetadataList.stream()).thenAnswer(invocationOnMock -> Stream.of(new Metadata(), new Metadata()));
97-
when(dbMapper.query(eq(Metadata.class), any(DynamoDBQueryExpression.class))).thenReturn(mockMetadataList);
94+
int itemsPerPartition = 2;
95+
96+
QueryResultPage<Metadata> mockMetadataPage = mock(QueryResultPage.class);
97+
when(mockMetadataPage.getResults()).thenReturn(Stream.generate(Metadata::new).limit(itemsPerPartition).collect(Collectors.toList()));
98+
when(dbMapper.queryPage(eq(Metadata.class), any(DynamoDBQueryExpression.class))).thenReturn(mockMetadataPage);
9899

99100
List<Metadata> metaDataList = underTest.getUnprocessedCpcPlusMetaData();
100101

101-
verify(dbMapper, times(Constants.CPC_DYNAMO_PARTITIONS)).query(any(Class.class), any(DynamoDBQueryExpression.class));
102-
assertThat(metaDataList).hasSize(2 * Constants.CPC_DYNAMO_PARTITIONS);
102+
verify(dbMapper, times(Constants.CPC_DYNAMO_PARTITIONS)).queryPage(any(Class.class), any(DynamoDBQueryExpression.class));
103+
assertThat(metaDataList).hasSize(itemsPerPartition * Constants.CPC_DYNAMO_PARTITIONS);
103104
}
104105

105106
@Test

0 commit comments

Comments
 (0)