@@ -16,19 +16,6 @@ import createHandler from "../update-letter-queue";
1616import { EnvVars } from "../env" ;
1717import { LetterStatus } from "../../../api-handler/src/contracts/letters" ;
1818
19- const mockPutMetric = jest . fn ( ) ;
20- const mockSetNamespace = jest . fn ( ) ;
21-
22- jest . mock ( "aws-embedded-metrics" , ( ) => ( {
23- // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
24- metricScope : ( fn : Function ) =>
25- fn ( {
26- putMetric : mockPutMetric ,
27- setNamespace : mockSetNamespace ,
28- } ) ,
29- Unit : { Count : "Count" } ,
30- } ) ) ;
31-
3219const mockedDeps : jest . Mocked < Deps > = {
3320 letterQueueRepository : {
3421 putLetter : jest . fn ( ) ,
@@ -198,105 +185,69 @@ describe("update-letter-queue Lambda", () => {
198185 ) ;
199186 } ) ;
200187 } ) ;
201- } ) ;
202188
203- describe ( "Metrics" , ( ) => {
204- it ( "emits success metrics when all letters are processed successfully" , async ( ) => {
205- const handler = createHandler ( mockedDeps ) ;
206- const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
207- const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
208-
209- const testData = generateKinesisEvent ( [
210- generateInsertRecord ( newLetter1 ) ,
211- generateInsertRecord ( newLetter2 ) ,
212- ] ) ;
213- await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
214-
215- expect ( mockSetNamespace ) . toHaveBeenCalledWith ( "update-letter-queue" ) ;
216- expect ( mockPutMetric ) . toHaveBeenCalledWith (
217- "letters queued successfully" ,
218- 2 ,
219- "Count" ,
220- ) ;
221- expect ( mockPutMetric ) . toHaveBeenCalledWith (
222- "letters queued failed" ,
223- 0 ,
224- "Count" ,
225- ) ;
226- } ) ;
189+ describe ( "Metrics" , ( ) => {
190+ it ( "emits success metrics when all letters are processed successfully" , async ( ) => {
191+ const handler = createHandler ( mockedDeps ) ;
192+ const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
193+ const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
227194
228- it ( "emits failure metrics when a letter fails to process" , async ( ) => {
229- const handler = createHandler ( mockedDeps ) ;
230- const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
231- const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
232- ( mockedDeps . letterQueueRepository . putLetter as jest . Mock )
233- . mockResolvedValueOnce ( { } )
234- . mockRejectedValueOnce ( new Error ( "DynamoDB error" ) ) ;
235-
236- const testData = generateKinesisEvent ( [
237- generateInsertRecord ( newLetter1 ) ,
238- generateInsertRecord ( newLetter2 ) ,
239- ] ) ;
240- await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
241-
242- expect ( mockSetNamespace ) . toHaveBeenCalledWith ( "update-letter-queue" ) ;
243- expect ( mockPutMetric ) . toHaveBeenCalledWith (
244- "letters queued successfully" ,
245- 1 ,
246- "Count" ,
247- ) ;
248- expect ( mockPutMetric ) . toHaveBeenCalledWith (
249- "letters queued failed" ,
250- 1 ,
251- "Count" ,
252- ) ;
253- } ) ;
195+ const testData = generateKinesisEvent ( [
196+ generateInsertRecord ( newLetter1 ) ,
197+ generateInsertRecord ( newLetter2 ) ,
198+ ] ) ;
199+ await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
254200
255- it ( "does not count a reprocessed event as a success or failure" , async ( ) => {
256- const handler = createHandler ( mockedDeps ) ;
257- const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
258- const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
259- ( mockedDeps . letterQueueRepository . putLetter as jest . Mock )
260- . mockRejectedValueOnce ( new LetterAlreadyExistsError ( "supplier1" , "1" ) )
261- . mockResolvedValueOnce ( { } ) ;
262-
263- const testData = generateKinesisEvent ( [
264- generateInsertRecord ( newLetter1 ) ,
265- generateInsertRecord ( newLetter2 ) ,
266- ] ) ;
267- await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
268-
269- expect ( mockSetNamespace ) . toHaveBeenCalledWith ( "update-letter-queue" ) ;
270- expect ( mockPutMetric ) . toHaveBeenCalledWith (
271- "letters queued successfully" ,
272- 1 ,
273- "Count" ,
274- ) ;
275- expect ( mockPutMetric ) . toHaveBeenCalledWith (
276- "letters queued failed" ,
277- 0 ,
278- "Count" ,
279- ) ;
280- } ) ;
201+ assertSuccessMetricLogged ( 2 ) ;
202+ assertFailureMetricLogged ( 0 ) ;
203+ } ) ;
281204
282- it ( "emits zero success metrics when no pending letters are in the batch" , async ( ) => {
283- const handler = createHandler ( mockedDeps ) ;
284- const newLetter = generateLetter ( "PRINTED" ) ;
205+ it ( "emits failure metrics when a letter fails to process" , async ( ) => {
206+ const handler = createHandler ( mockedDeps ) ;
207+ const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
208+ const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
209+ ( mockedDeps . letterQueueRepository . putLetter as jest . Mock )
210+ . mockResolvedValueOnce ( { } )
211+ . mockRejectedValueOnce ( new Error ( "DynamoDB error" ) ) ;
285212
286- const testData = generateKinesisEvent ( [ generateInsertRecord ( newLetter ) ] ) ;
287- await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
213+ const testData = generateKinesisEvent ( [
214+ generateInsertRecord ( newLetter1 ) ,
215+ generateInsertRecord ( newLetter2 ) ,
216+ ] ) ;
217+ await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
288218
289- expect ( mockSetNamespace ) . toHaveBeenCalledWith ( "update-letter-queue" ) ;
290- expect ( mockPutMetric ) . toHaveBeenCalledWith (
291- "letters queued successfully" ,
292- 0 ,
293- "Count" ,
294- ) ;
295- expect ( mockPutMetric ) . toHaveBeenCalledWith (
296- "letters queued failed" ,
297- 0 ,
298- "Count" ,
299- ) ;
219+ assertSuccessMetricLogged ( 1 ) ;
220+ assertFailureMetricLogged ( 1 ) ;
221+ } ) ;
222+
223+ it ( "does not count a reprocessed event as a success or failure" , async ( ) => {
224+ const handler = createHandler ( mockedDeps ) ;
225+ const newLetter1 = generateLetter ( "PENDING" , "1" ) ;
226+ const newLetter2 = generateLetter ( "PENDING" , "2" ) ;
227+ ( mockedDeps . letterQueueRepository . putLetter as jest . Mock )
228+ . mockRejectedValueOnce ( new LetterAlreadyExistsError ( "supplier1" , "1" ) )
229+ . mockResolvedValueOnce ( { } ) ;
230+
231+ const testData = generateKinesisEvent ( [
232+ generateInsertRecord ( newLetter1 ) ,
233+ generateInsertRecord ( newLetter2 ) ,
234+ ] ) ;
235+ await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
236+
237+ assertSuccessMetricLogged ( 1 ) ;
238+ assertFailureMetricLogged ( 0 ) ;
239+ } ) ;
240+
241+ it ( "emits zero success metrics when no pending letters are in the batch" , async ( ) => {
242+ const handler = createHandler ( mockedDeps ) ;
243+ const newLetter = generateLetter ( "PRINTED" ) ;
244+
245+ const testData = generateKinesisEvent ( [ generateInsertRecord ( newLetter ) ] ) ;
246+ await handler ( testData , mockDeep < Context > ( ) , jest . fn ( ) ) ;
247+
248+ assertSuccessMetricLogged ( 0 ) ;
249+ assertFailureMetricLogged ( 0 ) ;
250+ } ) ;
300251 } ) ;
301252} ) ;
302253
@@ -339,3 +290,41 @@ function mapToImage(oldLetter: Letter) {
339290 ] ) ,
340291 ) ;
341292}
293+
294+ function assertSuccessMetricLogged ( count : number ) {
295+ expect ( mockedDeps . logger . info ) . toHaveBeenCalledWith (
296+ expect . objectContaining ( {
297+ _aws : expect . objectContaining ( {
298+ CloudWatchMetrics : expect . arrayContaining ( [
299+ expect . objectContaining ( {
300+ Metrics : [
301+ expect . objectContaining ( {
302+ Name : "letters queued successfully" ,
303+ Value : count ,
304+ } ) ,
305+ ] ,
306+ } ) ,
307+ ] ) ,
308+ } ) ,
309+ } ) ,
310+ ) ;
311+ }
312+
313+ function assertFailureMetricLogged ( count : number ) {
314+ expect ( mockedDeps . logger . info ) . toHaveBeenCalledWith (
315+ expect . objectContaining ( {
316+ _aws : expect . objectContaining ( {
317+ CloudWatchMetrics : expect . arrayContaining ( [
318+ expect . objectContaining ( {
319+ Metrics : [
320+ expect . objectContaining ( {
321+ Name : "letters queued failed" ,
322+ Value : count ,
323+ } ) ,
324+ ] ,
325+ } ) ,
326+ ] ) ,
327+ } ) ,
328+ } ) ,
329+ ) ;
330+ }
0 commit comments