@@ -47,6 +47,23 @@ class NoOpNativeHttp {
47
47
}
48
48
}
49
49
50
+ class MockNativeClient {
51
+ constructor ( response ) {
52
+ this . response = response ;
53
+ this . called = false ;
54
+ this . shouldThrowError = false ;
55
+ }
56
+
57
+ next ( ) {
58
+ this . called = true ;
59
+ if ( this . shouldThrowError ) {
60
+ return Promise . reject ( new Error ( 'Failed to get next invocation' ) ) ;
61
+ } else {
62
+ return Promise . resolve ( this . response ) ;
63
+ }
64
+ }
65
+ }
66
+
50
67
class EvilError extends Error {
51
68
get name ( ) {
52
69
throw 'gotcha' ;
@@ -115,3 +132,88 @@ describe('invalid request id works', () => {
115
132
} ) ;
116
133
} ) ;
117
134
} ) ;
135
+
136
+ describe ( 'next invocation with native client works' , ( ) => {
137
+ it ( 'should call the native client next() method' , async ( ) => {
138
+ const mockNative = new MockNativeClient ( {
139
+ bodyJson : '' ,
140
+ headers : {
141
+ 'lambda-runtime-aws-request-id' : 'test-request-id' ,
142
+ } ,
143
+ } ) ;
144
+ const client = new RAPIDClient ( 'notUsed:1337' , undefined , mockNative ) ;
145
+ client . useAlternativeClient = false ;
146
+
147
+ await client . nextInvocation ( ) ;
148
+ // verify native client was called
149
+ mockNative . called . should . be . true ( ) ;
150
+ } ) ;
151
+ it ( 'should parse all required headers' , async ( ) => {
152
+ const mockResponse = {
153
+ bodyJson : '{"message":"Hello from Lambda!"}' ,
154
+ headers : {
155
+ 'lambda-runtime-aws-request-id' : 'test-request-id' ,
156
+ 'lambda-runtime-deadline-ms' : 1619712000000 ,
157
+ 'lambda-runtime-trace-id' : 'test-trace-id' ,
158
+ 'lambda-runtime-invoked-function-arn' : 'test-function-arn' ,
159
+ 'lambda-runtime-client-context' : '{"client":{"app_title":"MyApp"}}' ,
160
+ 'lambda-runtime-cognito-identity' :
161
+ '{"identityId":"id123","identityPoolId":"pool123"}' ,
162
+ 'lambda-runtime-aws-tenant-id' : 'test-tenant-id' ,
163
+ } ,
164
+ } ;
165
+
166
+ const mockNative = new MockNativeClient ( mockResponse ) ;
167
+ const client = new RAPIDClient ( 'notUsed:1337' , undefined , mockNative ) ;
168
+
169
+ client . useAlternativeClient = false ;
170
+ const response = await client . nextInvocation ( ) ;
171
+
172
+ // Verify all headers are present
173
+ response . headers . should . have . property (
174
+ 'lambda-runtime-aws-request-id' ,
175
+ 'test-request-id' ,
176
+ ) ;
177
+ response . headers . should . have . property (
178
+ 'lambda-runtime-deadline-ms' ,
179
+ 1619712000000 ,
180
+ ) ;
181
+ response . headers . should . have . property (
182
+ 'lambda-runtime-trace-id' ,
183
+ 'test-trace-id' ,
184
+ ) ;
185
+ response . headers . should . have . property (
186
+ 'lambda-runtime-invoked-function-arn' ,
187
+ 'test-function-arn' ,
188
+ ) ;
189
+ response . headers . should . have . property (
190
+ 'lambda-runtime-client-context' ,
191
+ '{"client":{"app_title":"MyApp"}}' ,
192
+ ) ;
193
+ response . headers . should . have . property (
194
+ 'lambda-runtime-cognito-identity' ,
195
+ '{"identityId":"id123","identityPoolId":"pool123"}' ,
196
+ ) ;
197
+ response . headers . should . have . property (
198
+ 'lambda-runtime-aws-tenant-id' ,
199
+ 'test-tenant-id' ,
200
+ ) ;
201
+ // Verify body is correctly passed through
202
+ response . bodyJson . should . equal ( '{"message":"Hello from Lambda!"}' ) ;
203
+ } ) ;
204
+ it ( 'should handle native client errors' , async ( ) => {
205
+ const nativeClient = new MockNativeClient ( { } ) ;
206
+ nativeClient . shouldThrowError = true ;
207
+
208
+ const client = new RAPIDClient ( 'localhost:8080' , null , nativeClient ) ;
209
+ client . useAlternativeClient = false ;
210
+
211
+ try {
212
+ await client . nextInvocation ( ) ;
213
+ // Should not reach here
214
+ false . should . be . true ( 'Expected an error but none was thrown' ) ;
215
+ } catch ( error ) {
216
+ error . message . should . equal ( 'Failed to get next invocation' ) ;
217
+ }
218
+ } ) ;
219
+ } ) ;
0 commit comments