@@ -3,6 +3,9 @@ import { expect } from 'chai';
3
3
import sinon from 'sinon' ;
4
4
5
5
import { KmsConnector , MOCK_GEN_DK_RESPONSE } from 'aws-kms-ee' ;
6
+ import { DynamoDBDocumentClient , UpdateCommand } from '@aws-sdk/lib-dynamodb' ;
7
+ import { ConditionalCheckFailedException } from '@aws-sdk/client-dynamodb' ;
8
+ import { mockClient } from 'aws-sdk-client-mock' ;
6
9
7
10
import {
8
11
initialize , initializeFrom ,
@@ -17,16 +20,21 @@ import {
17
20
import {
18
21
updateExpression , timestampCondition ,
19
22
} from '../../../src/sinks/dynamodb' ;
20
- import { DynamoDBConnector } from '../../../src/connectors' ;
23
+ import { DynamoDBConnector , EventBridgeConnector } from '../../../src/connectors' ;
21
24
22
25
import { update } from '../../../src/flavors/update' ;
23
26
24
27
describe ( 'flavors/update.js' , ( ) => {
28
+ let mockDdb ;
29
+
25
30
beforeEach ( ( ) => {
26
31
sinon . stub ( DynamoDBConnector . prototype , 'update' ) . resolves ( { } ) ;
27
32
} ) ;
28
33
29
- afterEach ( sinon . restore ) ;
34
+ afterEach ( ( ) => {
35
+ sinon . restore ( ) ;
36
+ mockDdb ?. restore ( ) ;
37
+ } ) ;
30
38
31
39
it ( 'should execute' , ( done ) => {
32
40
sinon . stub ( DynamoDBConnector . prototype , 'query' ) . resolves ( [ ] ) ;
@@ -157,6 +165,54 @@ describe('flavors/update.js', () => {
157
165
} )
158
166
. done ( done ) ;
159
167
} ) ;
168
+
169
+ it ( 'should optionally throw conditional check' , ( done ) => {
170
+ sinon . restore ( ) ;
171
+ sinon . stub ( EventBridgeConnector . prototype , 'putEvents' ) . resolves ( { } ) ;
172
+ mockDdb = mockClient ( DynamoDBDocumentClient ) ;
173
+ mockDdb . on ( UpdateCommand ) . rejects ( new ConditionalCheckFailedException ( { } ) ) ;
174
+
175
+ const events = toDynamodbRecords ( [
176
+ {
177
+ timestamp : 1572832690 ,
178
+ keys : {
179
+ pk : '1' ,
180
+ sk : 'thing' ,
181
+ } ,
182
+ newImage : {
183
+ pk : '1' ,
184
+ sk : 'thing' ,
185
+ discriminator : 'thing' ,
186
+ ttl : 1549053422 ,
187
+ timestamp : 1548967022000 ,
188
+ } ,
189
+ } ,
190
+ ] ) ;
191
+
192
+ const rule = {
193
+ id : 'updateThrow' ,
194
+ flavor : update ,
195
+ eventType : / t h i n g - * / ,
196
+ toUpdateRequest : ( ) => ( { } ) ,
197
+ throwConditionFailure : true ,
198
+ } ;
199
+
200
+ initialize ( {
201
+ ...initializeFrom ( [
202
+ rule ,
203
+ ] ) ,
204
+ } , { ...defaultOptions , AES : false } )
205
+ . assemble ( fromDynamodb ( events ) , true )
206
+ . collect ( )
207
+ // .tap((collected) => console.log(JSON.stringify(collected, null, 2)))
208
+ . tap ( ( collected ) => {
209
+ expect ( collected . length ) . to . equal ( 1 ) ;
210
+ expect ( collected [ 0 ] . event . tags . pipeline ) . to . equal ( 'updateThrow' ) ;
211
+ expect ( collected [ 0 ] . event . type ) . to . equal ( 'fault' ) ;
212
+ expect ( collected [ 0 ] . event . err . name ) . to . equal ( 'ConditionalCheckFailedException' ) ;
213
+ } )
214
+ . done ( done ) ;
215
+ } ) ;
160
216
} ) ;
161
217
162
218
const toUpdateRequest = ( uow ) => ( {
0 commit comments