Write a set field in IssuedReceiptsManager

This commit is contained in:
Ravi Khadiwala
2024-12-04 14:15:46 -06:00
committed by ravi-signal
parent f68ddf66e9
commit 236b0496d3
2 changed files with 47 additions and 6 deletions

View File

@@ -12,7 +12,11 @@ import static org.mockito.Mockito.when;
import jakarta.ws.rs.ClientErrorException;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import org.assertj.core.api.Condition;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -20,7 +24,13 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialRequest;
import org.whispersystems.textsecuregcm.storage.DynamoDbExtensionSchema.Tables;
import org.whispersystems.textsecuregcm.subscriptions.PaymentProvider;
import org.whispersystems.textsecuregcm.util.AttributeValues;
import org.whispersystems.textsecuregcm.util.TestRandomUtil;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
class IssuedReceiptsManagerTest {
@@ -29,12 +39,10 @@ class IssuedReceiptsManagerTest {
@RegisterExtension
static final DynamoDbExtension DYNAMO_DB_EXTENSION = new DynamoDbExtension(Tables.ISSUED_RECEIPTS);
ReceiptCredentialRequest receiptCredentialRequest;
IssuedReceiptsManager issuedReceiptsManager;
@BeforeEach
void beforeEach() {
receiptCredentialRequest = mock(ReceiptCredentialRequest.class);
issuedReceiptsManager = new IssuedReceiptsManager(
Tables.ISSUED_RECEIPTS.tableName(),
Duration.ofDays(90),
@@ -45,12 +53,18 @@ class IssuedReceiptsManagerTest {
@Test
void testRecordIssuance() {
Instant now = Instant.ofEpochSecond(NOW_EPOCH_SECONDS);
byte[] request1 = TestRandomUtil.nextBytes(20);
when(receiptCredentialRequest.serialize()).thenReturn(request1);
final ReceiptCredentialRequest receiptCredentialRequest = randomReceiptCredentialRequest();
CompletableFuture<Void> future = issuedReceiptsManager.recordIssuance("item-1", PaymentProvider.STRIPE,
receiptCredentialRequest, now);
assertThat(future).succeedsWithin(Duration.ofSeconds(3));
final Map<String, AttributeValue> item = getItem("item-1").item();
final Set<byte[]> tagSet = item.get(IssuedReceiptsManager.KEY_ISSUED_RECEIPT_TAG_SET).bs()
.stream()
.map(SdkBytes::asByteArray)
.collect(Collectors.toSet());
assertThat(tagSet).containsExactly(item.get(IssuedReceiptsManager.KEY_ISSUED_RECEIPT_TAG).b().asByteArray());
// same request should succeed
future = issuedReceiptsManager.recordIssuance("item-1", PaymentProvider.STRIPE, receiptCredentialRequest,
now);
@@ -74,4 +88,20 @@ class IssuedReceiptsManagerTest {
now);
assertThat(future).succeedsWithin(Duration.ofSeconds(3));
}
private GetItemResponse getItem(final String itemId) {
final DynamoDbClient client = DYNAMO_DB_EXTENSION.getDynamoDbClient();
return client.getItem(GetItemRequest.builder()
.tableName(Tables.ISSUED_RECEIPTS.tableName())
.key(Map.of(IssuedReceiptsManager.KEY_PROCESSOR_ITEM_ID, AttributeValues.s(itemId)))
.build());
}
private static ReceiptCredentialRequest randomReceiptCredentialRequest() {
final ReceiptCredentialRequest request = mock(ReceiptCredentialRequest.class);
final byte[] bytes = TestRandomUtil.nextBytes(20);
when(request.serialize()).thenReturn(bytes);
return request;
}
}