12
12
import jakarta .ws .rs .ClientErrorException ;
13
13
import java .time .Duration ;
14
14
import java .time .Instant ;
15
+ import java .util .List ;
16
+ import java .util .Map ;
17
+ import java .util .Set ;
15
18
import java .util .concurrent .CompletableFuture ;
19
+ import java .util .stream .Collectors ;
16
20
import org .assertj .core .api .Condition ;
17
21
import org .junit .jupiter .api .BeforeEach ;
18
22
import org .junit .jupiter .api .Test ;
19
23
import org .junit .jupiter .api .extension .RegisterExtension ;
20
24
import org .signal .libsignal .zkgroup .receipts .ReceiptCredentialRequest ;
21
25
import org .whispersystems .textsecuregcm .storage .DynamoDbExtensionSchema .Tables ;
22
26
import org .whispersystems .textsecuregcm .subscriptions .PaymentProvider ;
27
+ import org .whispersystems .textsecuregcm .util .AttributeValues ;
23
28
import org .whispersystems .textsecuregcm .util .TestRandomUtil ;
29
+ import software .amazon .awssdk .core .SdkBytes ;
30
+ import software .amazon .awssdk .services .dynamodb .DynamoDbClient ;
31
+ import software .amazon .awssdk .services .dynamodb .model .AttributeValue ;
32
+ import software .amazon .awssdk .services .dynamodb .model .GetItemRequest ;
33
+ import software .amazon .awssdk .services .dynamodb .model .GetItemResponse ;
24
34
25
35
class IssuedReceiptsManagerTest {
26
36
@@ -29,12 +39,10 @@ class IssuedReceiptsManagerTest {
29
39
@ RegisterExtension
30
40
static final DynamoDbExtension DYNAMO_DB_EXTENSION = new DynamoDbExtension (Tables .ISSUED_RECEIPTS );
31
41
32
- ReceiptCredentialRequest receiptCredentialRequest ;
33
42
IssuedReceiptsManager issuedReceiptsManager ;
34
43
35
44
@ BeforeEach
36
45
void beforeEach () {
37
- receiptCredentialRequest = mock (ReceiptCredentialRequest .class );
38
46
issuedReceiptsManager = new IssuedReceiptsManager (
39
47
Tables .ISSUED_RECEIPTS .tableName (),
40
48
Duration .ofDays (90 ),
@@ -45,12 +53,18 @@ void beforeEach() {
45
53
@ Test
46
54
void testRecordIssuance () {
47
55
Instant now = Instant .ofEpochSecond (NOW_EPOCH_SECONDS );
48
- byte [] request1 = TestRandomUtil .nextBytes (20 );
49
- when (receiptCredentialRequest .serialize ()).thenReturn (request1 );
56
+ final ReceiptCredentialRequest receiptCredentialRequest = randomReceiptCredentialRequest ();
50
57
CompletableFuture <Void > future = issuedReceiptsManager .recordIssuance ("item-1" , PaymentProvider .STRIPE ,
51
58
receiptCredentialRequest , now );
52
59
assertThat (future ).succeedsWithin (Duration .ofSeconds (3 ));
53
60
61
+ final Map <String , AttributeValue > item = getItem ("item-1" ).item ();
62
+ final Set <byte []> tagSet = item .get (IssuedReceiptsManager .KEY_ISSUED_RECEIPT_TAG_SET ).bs ()
63
+ .stream ()
64
+ .map (SdkBytes ::asByteArray )
65
+ .collect (Collectors .toSet ());
66
+ assertThat (tagSet ).containsExactly (item .get (IssuedReceiptsManager .KEY_ISSUED_RECEIPT_TAG ).b ().asByteArray ());
67
+
54
68
// same request should succeed
55
69
future = issuedReceiptsManager .recordIssuance ("item-1" , PaymentProvider .STRIPE , receiptCredentialRequest ,
56
70
now );
@@ -74,4 +88,20 @@ void testRecordIssuance() {
74
88
now );
75
89
assertThat (future ).succeedsWithin (Duration .ofSeconds (3 ));
76
90
}
91
+
92
+
93
+ private GetItemResponse getItem (final String itemId ) {
94
+ final DynamoDbClient client = DYNAMO_DB_EXTENSION .getDynamoDbClient ();
95
+ return client .getItem (GetItemRequest .builder ()
96
+ .tableName (Tables .ISSUED_RECEIPTS .tableName ())
97
+ .key (Map .of (IssuedReceiptsManager .KEY_PROCESSOR_ITEM_ID , AttributeValues .s (itemId )))
98
+ .build ());
99
+ }
100
+
101
+ private static ReceiptCredentialRequest randomReceiptCredentialRequest () {
102
+ final ReceiptCredentialRequest request = mock (ReceiptCredentialRequest .class );
103
+ final byte [] bytes = TestRandomUtil .nextBytes (20 );
104
+ when (request .serialize ()).thenReturn (bytes );
105
+ return request ;
106
+ }
77
107
}
0 commit comments