1+ import { InvokeStore } from "@aws/lambda-invoke-store" ;
12import { HttpRequest } from "@smithy/protocol-http" ;
23import { afterAll , beforeEach , describe , expect , test as it , vi } from "vitest" ;
34
@@ -6,31 +7,71 @@ import { recursionDetectionMiddleware } from "./recursionDetectionMiddleware";
67describe ( recursionDetectionMiddleware . name , ( ) => {
78 const mockNextHandler = vi . fn ( ) ;
89 const originEnv = process . env ;
10+
911 const TRACE_ID_HEADER_NAME = "X-Amzn-Trace-Id" ;
1012
1113 beforeEach ( ( ) => {
1214 vi . clearAllMocks ( ) ;
15+ vi . spyOn ( InvokeStore , "getXRayTraceId" ) . mockImplementation ( ( ) => undefined ) ;
1316 process . env = { } ;
1417 } ) ;
1518
1619 afterAll ( ( ) => {
1720 process . env = originEnv ;
1821 } ) ;
1922
20- it ( `sets ${ TRACE_ID_HEADER_NAME } header when function name and trace id environmental variables are set` , async ( ) => {
21- process . env = {
22- AWS_LAMBDA_FUNCTION_NAME : "some-function" ,
23- _X_AMZN_TRACE_ID : "some-trace-id" ,
24- } ;
25- const handler = recursionDetectionMiddleware ( ) ( mockNextHandler , { } as any ) ;
26- await handler ( {
27- input : { } ,
28- request : new HttpRequest ( { } ) ,
23+ describe ( `sets ${ TRACE_ID_HEADER_NAME } header when function name and` , ( ) => {
24+ const mockTraceIdEnv = "trace-id-from-env" ;
25+ const mockTraceIdInvokeStore = "trace-id-from-invoke-store" ;
26+
27+ it ( "trace id environmental variables is set" , async ( ) => {
28+ process . env = {
29+ AWS_LAMBDA_FUNCTION_NAME : "some-function" ,
30+ _X_AMZN_TRACE_ID : mockTraceIdEnv ,
31+ } ;
32+ const handler = recursionDetectionMiddleware ( ) ( mockNextHandler , { } as any ) ;
33+ await handler ( {
34+ input : { } ,
35+ request : new HttpRequest ( { } ) ,
36+ } ) ;
37+ const { calls } = ( mockNextHandler as any ) . mock ;
38+ expect ( calls . length ) . toBe ( 1 ) ;
39+ const { request } = mockNextHandler . mock . calls [ 0 ] [ 0 ] ;
40+ expect ( request . headers [ TRACE_ID_HEADER_NAME ] ) . toBe ( mockTraceIdEnv ) ;
41+ } ) ;
42+
43+ it ( "trace id value is set in InvokeStore" , async ( ) => {
44+ vi . spyOn ( InvokeStore , "getXRayTraceId" ) . mockImplementation ( ( ) => mockTraceIdInvokeStore ) ;
45+ process . env = {
46+ AWS_LAMBDA_FUNCTION_NAME : "some-function" ,
47+ } ;
48+ const handler = recursionDetectionMiddleware ( ) ( mockNextHandler , { } as any ) ;
49+ await handler ( {
50+ input : { } ,
51+ request : new HttpRequest ( { } ) ,
52+ } ) ;
53+ const { calls } = ( mockNextHandler as any ) . mock ;
54+ expect ( calls . length ) . toBe ( 1 ) ;
55+ const { request } = mockNextHandler . mock . calls [ 0 ] [ 0 ] ;
56+ expect ( request . headers [ TRACE_ID_HEADER_NAME ] ) . toBe ( mockTraceIdInvokeStore ) ;
57+ } ) ;
58+
59+ it ( "favors trace id value from InvokeStore over that from env variable" , async ( ) => {
60+ vi . spyOn ( InvokeStore , "getXRayTraceId" ) . mockImplementation ( ( ) => mockTraceIdInvokeStore ) ;
61+ process . env = {
62+ AWS_LAMBDA_FUNCTION_NAME : "some-function" ,
63+ _X_AMZN_TRACE_ID : mockTraceIdEnv ,
64+ } ;
65+ const handler = recursionDetectionMiddleware ( ) ( mockNextHandler , { } as any ) ;
66+ await handler ( {
67+ input : { } ,
68+ request : new HttpRequest ( { } ) ,
69+ } ) ;
70+ const { calls } = ( mockNextHandler as any ) . mock ;
71+ expect ( calls . length ) . toBe ( 1 ) ;
72+ const { request } = mockNextHandler . mock . calls [ 0 ] [ 0 ] ;
73+ expect ( request . headers [ TRACE_ID_HEADER_NAME ] ) . toBe ( mockTraceIdInvokeStore ) ;
2974 } ) ;
30- const { calls } = ( mockNextHandler as any ) . mock ;
31- expect ( calls . length ) . toBe ( 1 ) ;
32- const { request } = mockNextHandler . mock . calls [ 0 ] [ 0 ] ;
33- expect ( request . headers [ TRACE_ID_HEADER_NAME ] ) . toBe ( "some-trace-id" ) ;
3475 } ) ;
3576
3677 it ( `should NOT set ${ TRACE_ID_HEADER_NAME } header when function name environmental variable is NOT set` , async ( ) => {
0 commit comments