@@ -56,7 +56,11 @@ describe('GET Resource Handler', () => {
5656
5757 it ( 'should return a mock resource for valid resource ID' , async ( ) => {
5858 const handler = createGetResourceHandler ( mockLogger ) ;
59- const event = createMockEvent ( ) ;
59+ const event = createMockEvent ( {
60+ headers : {
61+ 'X-Request-ID' : 'get-test-1234-5678-9abc-def012345678' ,
62+ } ,
63+ } ) ;
6064
6165 const response = await handler ( event ) ;
6266
@@ -81,7 +85,12 @@ describe('GET Resource Handler', () => {
8185
8286 it ( 'should return 400 error when resource ID is missing' , async ( ) => {
8387 const handler = createGetResourceHandler ( mockLogger ) ;
84- const event = createMockEvent ( { pathParameters : null } ) ;
88+ const event = createMockEvent ( {
89+ pathParameters : null ,
90+ headers : {
91+ 'X-Request-ID' : 'missing-id-test-1234-5678-9abc-def012345678' ,
92+ } ,
93+ } ) ;
8594
8695 const response = await handler ( event ) ;
8796
@@ -93,7 +102,12 @@ describe('GET Resource Handler', () => {
93102
94103 it ( 'should return empty response for empty-response scenario' , async ( ) => {
95104 const handler = createGetResourceHandler ( mockLogger ) ;
96- const event = createMockEvent ( { pathParameters : { id : 'empty-response' } } ) ;
105+ const event = createMockEvent ( {
106+ pathParameters : { id : 'empty-response' } ,
107+ headers : {
108+ 'X-Request-ID' : 'empty-response-test-1234-5678-9abc-def012345678' ,
109+ } ,
110+ } ) ;
97111
98112 const response = await handler ( event ) ;
99113
@@ -143,7 +157,12 @@ describe('GET Resource Handler', () => {
143157 for ( const { expectedCode, expectedStatus, id } of errorCases ) {
144158 it ( `should return ${ expectedStatus } error for ${ id } ` , async ( ) => {
145159 const handler = createGetResourceHandler ( mockLogger ) ;
146- const event = createMockEvent ( { pathParameters : { id } } ) ;
160+ const event = createMockEvent ( {
161+ pathParameters : { id } ,
162+ headers : {
163+ 'X-Request-ID' : `${ id } -test-1234-5678-9abc-def012345678` ,
164+ } ,
165+ } ) ;
147166
148167 const response = await handler ( event ) ;
149168
@@ -154,6 +173,20 @@ describe('GET Resource Handler', () => {
154173 } ) ;
155174 }
156175 } ) ;
176+
177+ it ( 'should return 400 error when X-Request-ID header is missing' , async ( ) => {
178+ const handler = createGetResourceHandler ( mockLogger ) ;
179+ const event = createMockEvent ( ) ;
180+
181+ const response = await handler ( event ) ;
182+
183+ expect ( response . statusCode ) . toBe ( 400 ) ;
184+ const body = JSON . parse ( response . body ) ;
185+ expect ( body . resourceType ) . toBe ( 'OperationOutcome' ) ;
186+ expect ( body . issue [ 0 ] . severity ) . toBe ( 'error' ) ;
187+ expect ( body . issue [ 0 ] . code ) . toBe ( 'required' ) ;
188+ expect ( body . issue [ 0 ] . details . text ) . toBe ( 'Missing X-Request-ID header' ) ;
189+ } ) ;
157190} ) ;
158191
159192describe ( 'POST Create Resource Handler' , ( ) => {
@@ -163,9 +196,13 @@ describe('POST Create Resource Handler', () => {
163196
164197 it ( 'should create a new resource with provided ID' , async ( ) => {
165198 const handler = createCreateResourceHandler ( mockLogger ) ;
199+ const xRequestId = 'custom-id-1234-5678-9abc-def012345678' ;
166200 const event = createMockEvent ( {
167201 httpMethod : 'POST' ,
168202 body : JSON . stringify ( { id : 'custom-id' } ) ,
203+ headers : {
204+ 'X-Request-ID' : xRequestId ,
205+ } ,
169206 } ) ;
170207
171208 const response = await handler ( event ) ;
@@ -175,54 +212,76 @@ describe('POST Create Resource Handler', () => {
175212
176213 const body = JSON . parse ( response . body ) ;
177214 expect ( body . resourceType ) . toBe ( 'DocumentReference' ) ;
178- expect ( body . id ) . toBeDefined ( ) ;
179- expect ( body . id ) . toMatch (
180- / ^ [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 12 } $ / i,
181- ) ;
215+ expect ( body . id ) . toBe ( xRequestId ) ;
182216 expect ( body . status ) . toBe ( 'current' ) ;
183217 expect ( body . meta ) . toBeDefined ( ) ;
184218 expect ( body . meta . versionId ) . toBe ( '1' ) ;
185219 expect ( body . meta . lastUpdated ) . toBeDefined ( ) ;
186220 } ) ;
187221
188- it ( 'should create a new resource with generated ID when not provided' , async ( ) => {
222+ it ( 'should use X-Request-ID header as resource ID when provided' , async ( ) => {
189223 const handler = createCreateResourceHandler ( mockLogger ) ;
224+ const xRequestId = '4a0e5f18-1747-4438-ac52-5ba2c21575f5' ;
190225 const event = createMockEvent ( {
191226 httpMethod : 'POST' ,
192227 body : JSON . stringify ( { } ) ,
228+ headers : {
229+ 'X-Request-ID' : xRequestId ,
230+ 'Content-Type' : 'application/fhir+json' ,
231+ } ,
193232 } ) ;
194233
195234 const response = await handler ( event ) ;
196235
197236 expect ( response . statusCode ) . toBe ( 201 ) ;
237+ const body = JSON . parse ( response . body ) ;
238+ expect ( body . id ) . toBe ( xRequestId ) ;
239+ } ) ;
240+
241+ it ( 'should return 400 error when X-Request-ID header is missing' , async ( ) => {
242+ const handler = createCreateResourceHandler ( mockLogger ) ;
243+ const event = createMockEvent ( {
244+ httpMethod : 'POST' ,
245+ body : JSON . stringify ( { } ) ,
246+ headers : { } ,
247+ } ) ;
198248
249+ const response = await handler ( event ) ;
250+
251+ expect ( response . statusCode ) . toBe ( 400 ) ;
199252 const body = JSON . parse ( response . body ) ;
200- expect ( body . id ) . toMatch (
201- / ^ [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 12 } $ / i,
202- ) ;
253+ expect ( body . resourceType ) . toBe ( 'OperationOutcome' ) ;
254+ expect ( body . issue [ 0 ] . severity ) . toBe ( 'error' ) ;
255+ expect ( body . issue [ 0 ] . code ) . toBe ( 'required' ) ;
256+ expect ( body . issue [ 0 ] . details . text ) . toBe ( 'Missing X-Request-ID header' ) ;
203257 } ) ;
204258
205- it ( 'should handle empty body' , async ( ) => {
259+ it ( 'should handle empty body with X-Request-ID header ' , async ( ) => {
206260 const handler = createCreateResourceHandler ( mockLogger ) ;
261+ const xRequestId = 'aabbccdd-1111-2222-3333-444455556666' ;
207262 const event = createMockEvent ( {
208263 httpMethod : 'POST' ,
209264 body : null ,
265+ headers : {
266+ 'X-Request-ID' : xRequestId ,
267+ } ,
210268 } ) ;
211269
212270 const response = await handler ( event ) ;
213271
214272 expect ( response . statusCode ) . toBe ( 201 ) ;
215273 const body = JSON . parse ( response . body ) ;
216- expect ( body . id ) . toMatch (
217- / ^ [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 12 } $ / i,
218- ) ;
274+ expect ( body . id ) . toBe ( xRequestId ) ;
219275 } ) ;
220276
221277 it ( 'should return 400 error for invalid JSON' , async ( ) => {
222278 const handler = createCreateResourceHandler ( mockLogger ) ;
223279 const event = createMockEvent ( {
224280 httpMethod : 'POST' ,
225281 body : 'invalid-json{' ,
282+ headers : {
283+ 'X-Request-ID' : 'invalid-json-test-1234-5678-9abc-def012345678' ,
284+ } ,
226285 } ) ;
227286
228287 const response = await handler ( event ) ;
@@ -238,6 +297,9 @@ describe('POST Create Resource Handler', () => {
238297 const event = createMockEvent ( {
239298 httpMethod : 'POST' ,
240299 body : JSON . stringify ( { emptyResponse : true } ) ,
300+ headers : {
301+ 'X-Request-ID' : 'empty-test-1234-5678-9abc-def012345678' ,
302+ } ,
241303 } ) ;
242304
243305 const response = await handler ( event ) ;
@@ -251,6 +313,9 @@ describe('POST Create Resource Handler', () => {
251313 const event = createMockEvent ( {
252314 httpMethod : 'POST' ,
253315 body : JSON . stringify ( { triggerError : 'error-409-conflict' } ) ,
316+ headers : {
317+ 'X-Request-ID' : 'error-test-1234-5678-9abc-def012345678' ,
318+ } ,
254319 } ) ;
255320
256321 const response = await handler ( event ) ;
0 commit comments