@@ -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 ( ) ,
@@ -60,6 +78,13 @@ describe("Authorizer Lambda Function", () => {
6078 jest
6179 . useFakeTimers ( { doNotFake : [ "nextTick" ] } )
6280 . setSystemTime ( new Date ( "2025-11-03T14:19:00Z" ) ) ;
81+ ( metricScope as jest . Mock ) . mockClear ( ) ;
82+ ( mockedDeps . logger . warn as jest . Mock ) . mockClear ( ) ;
83+ const metricsMock = jest . requireMock (
84+ "aws-embedded-metrics" ,
85+ ) . __metricsMock ;
86+ metricsMock . setNamespace . mockClear ( ) ;
87+ metricsMock . putMetric . mockClear ( ) ;
6388 } ) ;
6489
6590 afterEach ( ( ) => {
@@ -73,10 +98,7 @@ describe("Authorizer Lambda Function", () => {
7398 handler ( mockEvent , mockContext , mockCallback ) ;
7499 await new Promise ( process . nextTick ) ;
75100
76- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
77- expect ( mockedInfo . mock . calls ) . not . toContainEqual (
78- expect . stringContaining ( "CloudWatchMetrics" ) ,
79- ) ;
101+ expect ( metricScope ) . not . toHaveBeenCalled ( ) ;
80102 } ) ;
81103
82104 it ( "Should log CloudWatch metric when the certificate expiry threshold is reached" , async ( ) => {
@@ -88,29 +110,20 @@ describe("Authorizer Lambda Function", () => {
88110 handler ( mockEvent , mockContext , mockCallback ) ;
89111 await new Promise ( process . nextTick ) ;
90112
91- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
92- expect ( mockedInfo . mock . calls . map ( ( call ) => call [ 0 ] ) ) . toContain (
93- JSON . stringify ( {
94- _aws : {
95- Timestamp : 1_762_179_540_000 ,
96- CloudWatchMetrics : [
97- {
98- Namespace : "cloudwatch-namespace" ,
99- Dimensions : [ "SUBJECT_DN" , "NOT_AFTER" ] ,
100- Metrics : [
101- {
102- Name : "apim-client-certificate-near-expiry" ,
103- Unit : "Count" ,
104- Value : 1 ,
105- } ,
106- ] ,
107- } ,
108- ] ,
109- } ,
110- SUBJECT_DN : "CN=test-subject" ,
111- NOT_AFTER : "2025-11-17T14:19:00Z" ,
112- "apim-client-certificate-near-expiry" : 1 ,
113- } ) ,
113+ const metricsMock = jest . requireMock (
114+ "aws-embedded-metrics" ,
115+ ) . __metricsMock ;
116+
117+ expect ( metricScope ) . toHaveBeenCalledTimes ( 1 ) ;
118+ expect ( mockedDeps . logger . warn ) . toHaveBeenCalledWith ( {
119+ description : "APIM Certificate expiry" ,
120+ days : 14 ,
121+ } ) ;
122+ expect ( metricsMock . setNamespace ) . toHaveBeenCalledWith ( "authorizer" ) ;
123+ expect ( metricsMock . putMetric ) . toHaveBeenCalledWith (
124+ "apim-client-certificate-near-expiry" ,
125+ 14 ,
126+ "Count" ,
114127 ) ;
115128 } ) ;
116129
@@ -123,10 +136,7 @@ describe("Authorizer Lambda Function", () => {
123136 handler ( mockEvent , mockContext , mockCallback ) ;
124137 await new Promise ( process . nextTick ) ;
125138
126- const mockedInfo = mockedDeps . logger . info as jest . Mock ;
127- expect ( mockedInfo . mock . calls ) . not . toContainEqual (
128- expect . stringContaining ( "CloudWatchMetrics" ) ,
129- ) ;
139+ expect ( metricScope ) . not . toHaveBeenCalled ( ) ;
130140 } ) ;
131141 } ) ;
132142
0 commit comments