@optimizely-opal/opal-tool-ocp-sdk 1.0.0 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -3
- package/dist/function/GlobalToolFunction.d.ts +4 -1
- package/dist/function/GlobalToolFunction.d.ts.map +1 -1
- package/dist/function/GlobalToolFunction.js +25 -19
- package/dist/function/GlobalToolFunction.js.map +1 -1
- package/dist/function/GlobalToolFunction.test.js +114 -193
- package/dist/function/GlobalToolFunction.test.js.map +1 -1
- package/dist/function/ToolFunction.d.ts +4 -1
- package/dist/function/ToolFunction.d.ts.map +1 -1
- package/dist/function/ToolFunction.js +20 -21
- package/dist/function/ToolFunction.js.map +1 -1
- package/dist/function/ToolFunction.test.js +73 -263
- package/dist/function/ToolFunction.test.js.map +1 -1
- package/dist/service/Service.d.ts +10 -9
- package/dist/service/Service.d.ts.map +1 -1
- package/dist/service/Service.js +42 -74
- package/dist/service/Service.js.map +1 -1
- package/dist/service/Service.test.js +60 -95
- package/dist/service/Service.test.js.map +1 -1
- package/dist/utils/ErrorFormatter.d.ts +9 -0
- package/dist/utils/ErrorFormatter.d.ts.map +1 -0
- package/dist/utils/ErrorFormatter.js +25 -0
- package/dist/utils/ErrorFormatter.js.map +1 -0
- package/package.json +1 -1
- package/src/function/GlobalToolFunction.test.ts +113 -213
- package/src/function/GlobalToolFunction.ts +29 -29
- package/src/function/ToolFunction.test.ts +78 -285
- package/src/function/ToolFunction.ts +24 -30
- package/src/service/Service.test.ts +61 -113
- package/src/service/Service.ts +45 -79
- package/src/utils/ErrorFormatter.ts +31 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"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"}
|
package/dist/service/Service.js
CHANGED
|
@@ -41,7 +41,7 @@ const App = __importStar(require("@zaiusinc/app-sdk"));
|
|
|
41
41
|
const app_sdk_1 = require("@zaiusinc/app-sdk");
|
|
42
42
|
const ParameterValidator_1 = require("../validation/ParameterValidator");
|
|
43
43
|
/**
|
|
44
|
-
* Default OptiID authentication requirement
|
|
44
|
+
* Default OptiID authentication requirement added when tool doesn't specify any auth
|
|
45
45
|
*/
|
|
46
46
|
const DEFAULT_OPTIID_AUTH = new Models_1.AuthRequirement('OptiID', 'default', true);
|
|
47
47
|
class NestedInteractions {
|
|
@@ -208,42 +208,33 @@ class ToolsService {
|
|
|
208
208
|
return tools;
|
|
209
209
|
}
|
|
210
210
|
/**
|
|
211
|
-
*
|
|
211
|
+
* Apply default auth requirements if none are specified
|
|
212
212
|
* @param authRequirements Original authentication requirements
|
|
213
|
-
* @returns
|
|
213
|
+
* @returns Auth requirements with default OptiID if none specified, otherwise unchanged
|
|
214
214
|
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return authRequirements;
|
|
215
|
+
withDefaultAuthRequirements(authRequirements) {
|
|
216
|
+
// Only add default OptiID if no auth requirements are specified
|
|
217
|
+
if (!authRequirements || authRequirements.length === 0) {
|
|
218
|
+
return [DEFAULT_OPTIID_AUTH];
|
|
220
219
|
}
|
|
221
|
-
|
|
220
|
+
// Respect developer's choice - return as-is
|
|
221
|
+
return authRequirements;
|
|
222
222
|
}
|
|
223
223
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
* @
|
|
224
|
+
* Check if an endpoint requires OptiID authentication
|
|
225
|
+
* Tools: Check auth requirements for OptiID provider
|
|
226
|
+
* Interactions: Always require OptiID
|
|
227
|
+
* @param endpoint The endpoint path to check
|
|
228
|
+
* @returns true if the endpoint requires OptiID auth
|
|
228
229
|
*/
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
// Use ToolError's status and format
|
|
234
|
-
status = error.status;
|
|
235
|
-
problemDetails = error.toProblemDetails(instance);
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
// Convert regular errors to RFC 9457 format with 500 status
|
|
239
|
-
problemDetails = {
|
|
240
|
-
title: 'Internal Server Error',
|
|
241
|
-
status: 500,
|
|
242
|
-
detail: error.message || 'An unexpected error occurred',
|
|
243
|
-
instance
|
|
244
|
-
};
|
|
230
|
+
requiresOptiIdAuth(endpoint) {
|
|
231
|
+
const func = this.functions.get(endpoint);
|
|
232
|
+
if (func) {
|
|
233
|
+
return func.authRequirements.some((auth) => auth.provider.toLowerCase() === 'optiid');
|
|
245
234
|
}
|
|
246
|
-
|
|
235
|
+
// Interactions always require OptiID
|
|
236
|
+
const interaction = this.interactions.get(endpoint);
|
|
237
|
+
return !!interaction;
|
|
247
238
|
}
|
|
248
239
|
/**
|
|
249
240
|
* Register a tool function with generic auth data
|
|
@@ -252,12 +243,11 @@ class ToolsService {
|
|
|
252
243
|
* @param handler Function implementing the tool
|
|
253
244
|
* @param parameters List of parameters for the tool
|
|
254
245
|
* @param endpoint API endpoint for the tool
|
|
255
|
-
* @param authRequirements Authentication requirements (optional)
|
|
246
|
+
* @param authRequirements Authentication requirements (optional - defaults to OptiID if not specified)
|
|
256
247
|
*/
|
|
257
248
|
registerTool(name, description, handler, parameters, endpoint, authRequirements) {
|
|
258
|
-
|
|
259
|
-
const
|
|
260
|
-
const func = new Tool(name, description, parameters, endpoint, handler, enforcedAuthRequirements);
|
|
249
|
+
const resolvedAuthRequirements = this.withDefaultAuthRequirements(authRequirements);
|
|
250
|
+
const func = new Tool(name, description, parameters, endpoint, handler, resolvedAuthRequirements);
|
|
261
251
|
this.functions.set(endpoint, func);
|
|
262
252
|
}
|
|
263
253
|
/**
|
|
@@ -275,58 +265,36 @@ class ToolsService {
|
|
|
275
265
|
if (req.path === '/discovery') {
|
|
276
266
|
return await this.handleDiscoveryRequest(functionContext);
|
|
277
267
|
}
|
|
278
|
-
// Handle overrides endpoint
|
|
268
|
+
// Handle overrides endpoint (auth handled by function layer)
|
|
279
269
|
if (req.path === '/overrides') {
|
|
280
270
|
return await this.handleOverridesRequest(req, functionContext);
|
|
281
271
|
}
|
|
282
272
|
// Handle regular tool functions
|
|
273
|
+
// Auth is already validated by the function layer
|
|
283
274
|
const func = this.functions.get(req.path);
|
|
284
275
|
if (func) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
else {
|
|
291
|
-
params = req.bodyJSON;
|
|
292
|
-
}
|
|
293
|
-
// Validate parameters before calling the handler (only if tool has parameter definitions)
|
|
294
|
-
// ParameterValidator.validate() throws ToolError if validation fails
|
|
295
|
-
if (func.parameters && func.parameters.length > 0) {
|
|
296
|
-
ParameterValidator_1.ParameterValidator.validate(params, func.parameters, func.endpoint);
|
|
297
|
-
}
|
|
298
|
-
// Extract auth data from body JSON
|
|
299
|
-
const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
|
|
300
|
-
const result = await func.handler(functionContext, params, authData);
|
|
301
|
-
return new App.Response(200, result);
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
app_sdk_1.logger.error(`Error in function ${func.name}:`, error);
|
|
305
|
-
return this.formatErrorResponse(error, func.endpoint);
|
|
276
|
+
const params = req.bodyJSON?.parameters ?? req.bodyJSON;
|
|
277
|
+
// Validate parameters before calling the handler (only if tool has parameter definitions)
|
|
278
|
+
// ParameterValidator.validate() throws ToolError if validation fails
|
|
279
|
+
if (func.parameters && func.parameters.length > 0) {
|
|
280
|
+
ParameterValidator_1.ParameterValidator.validate(params, func.parameters, func.endpoint);
|
|
306
281
|
}
|
|
282
|
+
// Extract auth data from body JSON
|
|
283
|
+
const authData = req.bodyJSON?.auth;
|
|
284
|
+
const result = await func.handler(functionContext, params, authData);
|
|
285
|
+
return new App.Response(200, result);
|
|
307
286
|
}
|
|
308
287
|
// Handle interactions
|
|
288
|
+
// Auth is already validated by the function layer
|
|
309
289
|
const interaction = this.interactions.get(req.path);
|
|
310
290
|
if (interaction) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
else {
|
|
317
|
-
params = req.bodyJSON;
|
|
318
|
-
}
|
|
319
|
-
// Extract auth data from body JSON
|
|
320
|
-
const authData = req.bodyJSON ? req.bodyJSON.auth : undefined;
|
|
321
|
-
const result = await interaction.handler(functionContext, params, authData);
|
|
322
|
-
return new App.Response(200, result);
|
|
323
|
-
}
|
|
324
|
-
catch (error) {
|
|
325
|
-
app_sdk_1.logger.error(`Error in function ${interaction.name}:`, error);
|
|
326
|
-
return this.formatErrorResponse(error, interaction.endpoint);
|
|
327
|
-
}
|
|
291
|
+
const params = req.bodyJSON?.data ?? req.bodyJSON;
|
|
292
|
+
// Extract auth data from body JSON
|
|
293
|
+
const authData = req.bodyJSON?.auth;
|
|
294
|
+
const result = await interaction.handler(functionContext, params, authData);
|
|
295
|
+
return new App.Response(200, result);
|
|
328
296
|
}
|
|
329
|
-
|
|
297
|
+
throw new ToolError_1.ToolError('Function not found', 404);
|
|
330
298
|
}
|
|
331
299
|
/**
|
|
332
300
|
* Handle discovery endpoint with overrides applied
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAyC;AACzC,4CAA6E;AAC7E,kDAA+C;AAC/C,uDAAyC;AACzC,+
|
|
1
|
+
{"version":3,"file":"Service.js","sourceRoot":"","sources":["../../src/service/Service.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,6 +72,10 @@ jest.mock('@zaiusinc/app-sdk', () => {
|
|
|
72
72
|
}))
|
|
73
73
|
};
|
|
74
74
|
});
|
|
75
|
+
// Mock the authenticateInternalRequest function
|
|
76
|
+
jest.mock('../auth/AuthUtils', () => ({
|
|
77
|
+
authenticateInternalRequest: jest.fn().mockResolvedValue(undefined)
|
|
78
|
+
}));
|
|
75
79
|
// Get the mocked kvStore for use in tests
|
|
76
80
|
const { storage } = jest.requireMock('@zaiusinc/app-sdk');
|
|
77
81
|
const mockKvStore = storage.kvStore;
|
|
@@ -194,8 +198,7 @@ describe('ToolsService', () => {
|
|
|
194
198
|
endpoint: '/second-tool',
|
|
195
199
|
http_method: 'POST',
|
|
196
200
|
auth_requirements: [
|
|
197
|
-
{ provider: 'oauth2', scope_bundle: 'calendar', required: true }
|
|
198
|
-
{ provider: 'OptiID', scope_bundle: 'default', required: true }
|
|
201
|
+
{ provider: 'oauth2', scope_bundle: 'calendar', required: true }
|
|
199
202
|
]
|
|
200
203
|
});
|
|
201
204
|
});
|
|
@@ -296,75 +299,41 @@ describe('ToolsService', () => {
|
|
|
296
299
|
expect(mockTool.handler).toHaveBeenCalledWith(mockToolFunction, // functionContext
|
|
297
300
|
{ param1: 'test-value' }, undefined);
|
|
298
301
|
});
|
|
299
|
-
it('should
|
|
302
|
+
it('should throw error when tool handler throws a regular error', async () => {
|
|
300
303
|
const errorMessage = 'Tool execution failed';
|
|
301
304
|
jest.mocked(mockTool.handler).mockRejectedValueOnce(new Error(errorMessage));
|
|
302
305
|
const mockRequest = createMockRequest();
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
expect(response.bodyJSON).toEqual({
|
|
306
|
-
title: 'Internal Server Error',
|
|
307
|
-
status: 500,
|
|
308
|
-
detail: errorMessage,
|
|
309
|
-
instance: mockTool.endpoint
|
|
310
|
-
});
|
|
311
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
312
|
-
expect(app_sdk_1.logger.error).toHaveBeenCalledWith(`Error in function ${mockTool.name}:`, expect.any(Error));
|
|
306
|
+
await expect(Service_1.toolsService.processRequest(mockRequest, mockToolFunction))
|
|
307
|
+
.rejects.toThrow(errorMessage);
|
|
313
308
|
});
|
|
314
|
-
it('should
|
|
309
|
+
it('should throw when tool handler throws object without message', async () => {
|
|
315
310
|
jest.mocked(mockTool.handler).mockRejectedValueOnce({});
|
|
316
311
|
const mockRequest = createMockRequest();
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
expect(response.bodyJSON).toEqual({
|
|
320
|
-
title: 'Internal Server Error',
|
|
321
|
-
status: 500,
|
|
322
|
-
detail: 'An unexpected error occurred',
|
|
323
|
-
instance: mockTool.endpoint
|
|
324
|
-
});
|
|
325
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
312
|
+
await expect(Service_1.toolsService.processRequest(mockRequest, mockToolFunction))
|
|
313
|
+
.rejects.toEqual({});
|
|
326
314
|
});
|
|
327
|
-
it('should
|
|
315
|
+
it('should throw ToolError when tool handler throws ToolError', async () => {
|
|
328
316
|
const toolError = new ToolError_1.ToolError('Resource not found', 404, 'The requested task does not exist');
|
|
329
317
|
jest.mocked(mockTool.handler).mockRejectedValueOnce(toolError);
|
|
330
318
|
const mockRequest = createMockRequest();
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
expect(response.bodyJSON).toEqual({
|
|
334
|
-
title: 'Resource not found',
|
|
335
|
-
status: 404,
|
|
336
|
-
detail: 'The requested task does not exist',
|
|
337
|
-
instance: mockTool.endpoint
|
|
338
|
-
});
|
|
339
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
340
|
-
expect(app_sdk_1.logger.error).toHaveBeenCalledWith(`Error in function ${mockTool.name}:`, expect.any(ToolError_1.ToolError));
|
|
319
|
+
await expect(Service_1.toolsService.processRequest(mockRequest, mockToolFunction))
|
|
320
|
+
.rejects.toThrow(toolError);
|
|
341
321
|
});
|
|
342
|
-
it('should
|
|
322
|
+
it('should throw ToolError without detail when detail is not provided', async () => {
|
|
343
323
|
const toolError = new ToolError_1.ToolError('Bad request', 400);
|
|
344
324
|
jest.mocked(mockTool.handler).mockRejectedValueOnce(toolError);
|
|
345
325
|
const mockRequest = createMockRequest();
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
expect(
|
|
349
|
-
title: 'Bad request',
|
|
350
|
-
status: 400,
|
|
351
|
-
instance: mockTool.endpoint
|
|
352
|
-
});
|
|
353
|
-
expect(response.bodyJSON).not.toHaveProperty('detail');
|
|
354
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
326
|
+
await expect(Service_1.toolsService.processRequest(mockRequest, mockToolFunction))
|
|
327
|
+
.rejects.toThrow(toolError);
|
|
328
|
+
expect(toolError.status).toBe(400);
|
|
355
329
|
});
|
|
356
|
-
it('should default
|
|
330
|
+
it('should throw ToolError with default 500 status when created without status', async () => {
|
|
357
331
|
const toolError = new ToolError_1.ToolError('Database error');
|
|
358
332
|
jest.mocked(mockTool.handler).mockRejectedValueOnce(toolError);
|
|
359
333
|
const mockRequest = createMockRequest();
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
expect(
|
|
363
|
-
title: 'Database error',
|
|
364
|
-
status: 500,
|
|
365
|
-
instance: mockTool.endpoint
|
|
366
|
-
});
|
|
367
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
334
|
+
await expect(Service_1.toolsService.processRequest(mockRequest, mockToolFunction))
|
|
335
|
+
.rejects.toThrow(toolError);
|
|
336
|
+
expect(toolError.status).toBe(500);
|
|
368
337
|
});
|
|
369
338
|
});
|
|
370
339
|
describe('interaction execution', () => {
|
|
@@ -430,48 +399,41 @@ describe('ToolsService', () => {
|
|
|
430
399
|
auth: authData
|
|
431
400
|
}, authData);
|
|
432
401
|
});
|
|
433
|
-
it('should
|
|
402
|
+
it('should throw error when interaction handler throws a regular error', async () => {
|
|
434
403
|
const errorMessage = 'Interaction execution failed';
|
|
435
404
|
jest.mocked(mockInteraction.handler).mockRejectedValueOnce(new Error(errorMessage));
|
|
436
405
|
const interactionRequest = createMockRequest({
|
|
437
406
|
path: '/test-interaction',
|
|
438
407
|
bodyJSON: { data: { param1: 'test-value' } }
|
|
439
408
|
});
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
expect(response.bodyJSON).toEqual({
|
|
443
|
-
title: 'Internal Server Error',
|
|
444
|
-
status: 500,
|
|
445
|
-
detail: errorMessage,
|
|
446
|
-
instance: mockInteraction.endpoint
|
|
447
|
-
});
|
|
448
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
449
|
-
expect(app_sdk_1.logger.error).toHaveBeenCalledWith(`Error in function ${mockInteraction.name}:`, expect.any(Error));
|
|
409
|
+
await expect(Service_1.toolsService.processRequest(interactionRequest, mockToolFunction))
|
|
410
|
+
.rejects.toThrow(errorMessage);
|
|
450
411
|
});
|
|
451
|
-
it('should
|
|
412
|
+
it('should throw ToolError when interaction handler throws ToolError', async () => {
|
|
452
413
|
const toolError = new ToolError_1.ToolError('Webhook validation failed', 400, 'Invalid signature');
|
|
453
414
|
jest.mocked(mockInteraction.handler).mockRejectedValueOnce(toolError);
|
|
454
415
|
const interactionRequest = createMockRequest({
|
|
455
416
|
path: '/test-interaction',
|
|
456
417
|
bodyJSON: { data: { param1: 'test-value' } }
|
|
457
418
|
});
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
expect(response.bodyJSON).toEqual({
|
|
461
|
-
title: 'Webhook validation failed',
|
|
462
|
-
status: 400,
|
|
463
|
-
detail: 'Invalid signature',
|
|
464
|
-
instance: mockInteraction.endpoint
|
|
465
|
-
});
|
|
466
|
-
expect(response.headers.get('content-type')).toBe('application/problem+json');
|
|
467
|
-
expect(app_sdk_1.logger.error).toHaveBeenCalledWith(`Error in function ${mockInteraction.name}:`, expect.any(ToolError_1.ToolError));
|
|
419
|
+
await expect(Service_1.toolsService.processRequest(interactionRequest, mockToolFunction))
|
|
420
|
+
.rejects.toThrow(toolError);
|
|
468
421
|
});
|
|
469
422
|
});
|
|
470
423
|
describe('error cases', () => {
|
|
471
|
-
it('should
|
|
424
|
+
it('should throw ToolError with 404 when no matching tool or interaction is found', async () => {
|
|
472
425
|
const unknownRequest = createMockRequest({ path: '/unknown-endpoint' });
|
|
473
|
-
|
|
474
|
-
|
|
426
|
+
await expect(Service_1.toolsService.processRequest(unknownRequest, mockToolFunction))
|
|
427
|
+
.rejects.toThrow(ToolError_1.ToolError);
|
|
428
|
+
try {
|
|
429
|
+
await Service_1.toolsService.processRequest(unknownRequest, mockToolFunction);
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
expect(error).toBeInstanceOf(ToolError_1.ToolError);
|
|
433
|
+
expect(error.status).toBe(404);
|
|
434
|
+
// ToolError prepends status to message
|
|
435
|
+
expect(error.message).toContain('Function not found');
|
|
436
|
+
}
|
|
475
437
|
});
|
|
476
438
|
it('should handle tool with OptiID auth requirements', async () => {
|
|
477
439
|
const authRequirements = [
|
|
@@ -578,7 +540,7 @@ describe('ToolsService', () => {
|
|
|
578
540
|
beforeEach(() => {
|
|
579
541
|
jest.clearAllMocks();
|
|
580
542
|
});
|
|
581
|
-
it('should
|
|
543
|
+
it('should throw ToolError with 400 for invalid parameter types', async () => {
|
|
582
544
|
// Register a tool with specific parameter types
|
|
583
545
|
const toolWithTypedParams = {
|
|
584
546
|
name: 'typed_tool',
|
|
@@ -603,22 +565,25 @@ describe('ToolsService', () => {
|
|
|
603
565
|
}
|
|
604
566
|
}
|
|
605
567
|
});
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
568
|
+
await expect(Service_1.toolsService.processRequest(invalidRequest, mockToolFunction))
|
|
569
|
+
.rejects.toThrow(ToolError_1.ToolError);
|
|
570
|
+
try {
|
|
571
|
+
await Service_1.toolsService.processRequest(invalidRequest, mockToolFunction);
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
expect(error).toBeInstanceOf(ToolError_1.ToolError);
|
|
575
|
+
const toolError = error;
|
|
576
|
+
expect(toolError.status).toBe(400);
|
|
577
|
+
// The ToolError has title property, message includes more details
|
|
578
|
+
expect(toolError.toProblemDetails('/typed-tool')).toMatchObject({
|
|
579
|
+
title: 'One or more validation errors occurred.',
|
|
580
|
+
status: 400
|
|
581
|
+
});
|
|
582
|
+
expect(toolError.errors).toHaveLength(3);
|
|
583
|
+
expect(toolError.errors[0]).toHaveProperty('field', 'name');
|
|
584
|
+
expect(toolError.errors[0].message)
|
|
585
|
+
.toBe("Parameter 'name' must be a string, but received number");
|
|
586
|
+
}
|
|
622
587
|
// Verify the handler was not called
|
|
623
588
|
expect(toolWithTypedParams.handler).not.toHaveBeenCalled();
|
|
624
589
|
});
|