@@ -4,11 +4,29 @@ import {
44 Callback ,
55 Context ,
66} from "aws-lambda" ;
7+ import { metricScope } from "aws-embedded-metrics" ;
78import pino from "pino" ;
89import { Deps } from "../deps" ;
910import { EnvVars } from "../env" ;
1011import createAuthorizerHandler from "../authorizer" ;
1112
13+ jest . mock ( "aws-embedded-metrics" , ( ) => {
14+ const metricsMock = {
15+ setNamespace : jest . fn ( ) ,
16+ putMetric : jest . fn ( ) ,
17+ } ;
18+
19+ return {
20+ metricScope : jest . fn ( ( handler ) => async ( ) => {
21+ const wrapped = handler ( metricsMock ) ;
22+ if ( typeof wrapped === "function" ) {
23+ await wrapped ( ) ;
24+ }
25+ } ) ,
26+ __metricsMock : metricsMock ,
27+ } ;
28+ } ) ;
29+
1230const mockedDeps : jest . Mocked < Deps > = {
1331 logger : {
1432 info : jest . fn ( ) ,
@@ -61,6 +79,13 @@ describe("Authorizer Lambda Function", () => {
6179 jest
6280 . useFakeTimers ( { doNotFake : [ "nextTick" ] } )
6381 . setSystemTime ( currentDate ) ;
82+ ( metricScope as jest . Mock ) . mockClear ( ) ;
83+ ( mockedDeps . logger . warn as jest . Mock ) . mockClear ( ) ;
84+ const metricsMock = jest . requireMock (
85+ "aws-embedded-metrics" ,
86+ ) . __metricsMock ;
87+ metricsMock . setNamespace . mockClear ( ) ;
88+ metricsMock . putMetric . mockClear ( ) ;
6489 } ) ;
6590
6691 afterEach ( ( ) => {
@@ -74,10 +99,7 @@ describe("Authorizer Lambda Function", () => {
7499 handler ( mockEvent , mockContext , mockCallback ) ;
75100 await new Promise ( process . nextTick ) ;
76101
77- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
78- expect ( mockedInfo . mock . calls ) . not . toContainEqual (
79- expect . stringContaining ( "CloudWatchMetrics" ) ,
80- ) ;
102+ expect ( metricScope ) . not . toHaveBeenCalled ( ) ;
81103 } ) ;
82104
83105 it ( "Should log CloudWatch metric when the certificate expiry threshold is reached" , async ( ) => {
@@ -89,29 +111,20 @@ describe("Authorizer Lambda Function", () => {
89111 handler ( mockEvent , mockContext , mockCallback ) ;
90112 await new Promise ( process . nextTick ) ;
91113
92- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
93- expect ( mockedInfo . mock . calls . map ( ( call ) => call [ 0 ] ) ) . toContain (
94- JSON . stringify ( {
95- _aws : {
96- Timestamp : currentDate . getTime ( ) ,
97- CloudWatchMetrics : [
98- {
99- Namespace : "cloudwatch-namespace" ,
100- Dimensions : [ "SUBJECT_DN" , "NOT_AFTER" ] ,
101- Metrics : [
102- {
103- Name : "apim-client-certificate-near-expiry" ,
104- Unit : "Count" ,
105- Value : 1 ,
106- } ,
107- ] ,
108- } ,
109- ] ,
110- } ,
111- SUBJECT_DN : "CN=test-subject" ,
112- NOT_AFTER : "2025-11-31T14:19:00Z" ,
113- "apim-client-certificate-near-expiry" : 1 ,
114- } ) ,
114+ const metricsMock = jest . requireMock (
115+ "aws-embedded-metrics" ,
116+ ) . __metricsMock ;
117+
118+ expect ( metricScope ) . toHaveBeenCalledTimes ( 1 ) ;
119+ expect ( mockedDeps . logger . warn ) . toHaveBeenCalledWith ( {
120+ description : "APIM Certificate expiry" ,
121+ days : 30 ,
122+ } ) ;
123+ expect ( metricsMock . setNamespace ) . toHaveBeenCalledWith ( "authorizer" ) ;
124+ expect ( metricsMock . putMetric ) . toHaveBeenCalledWith (
125+ "apim-client-certificate-near-expiry" ,
126+ 30 ,
127+ "Count" ,
115128 ) ;
116129 } ) ;
117130
@@ -124,10 +137,7 @@ describe("Authorizer Lambda Function", () => {
124137 handler ( mockEvent , mockContext , mockCallback ) ;
125138 await new Promise ( process . nextTick ) ;
126139
127- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
128- expect ( mockedInfo . mock . calls ) . not . toContainEqual (
129- expect . stringContaining ( "CloudWatchMetrics" ) ,
130- ) ;
140+ expect ( metricScope ) . not . toHaveBeenCalled ( ) ;
131141 } ) ;
132142 } ) ;
133143
0 commit comments