@optimizely-opal/opal-tool-ocp-sdk 0.0.0-devmg.12 → 1.0.0-OCP-1441.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 +108 -15
- package/dist/auth/AuthUtils.d.ts +26 -0
- package/dist/auth/AuthUtils.d.ts.map +1 -0
- package/dist/auth/AuthUtils.js +109 -0
- package/dist/auth/AuthUtils.js.map +1 -0
- package/dist/auth/AuthUtils.test.d.ts +2 -0
- package/dist/auth/AuthUtils.test.d.ts.map +1 -0
- package/dist/auth/AuthUtils.test.js +601 -0
- package/dist/auth/AuthUtils.test.js.map +1 -0
- package/dist/auth/TokenVerifier.d.ts.map +1 -1
- package/dist/auth/TokenVerifier.js +0 -1
- package/dist/auth/TokenVerifier.js.map +1 -1
- package/dist/auth/TokenVerifier.test.js +9 -0
- package/dist/auth/TokenVerifier.test.js.map +1 -1
- package/dist/function/GlobalToolFunction.d.ts +27 -0
- package/dist/function/GlobalToolFunction.d.ts.map +1 -0
- package/dist/function/GlobalToolFunction.js +53 -0
- package/dist/function/GlobalToolFunction.js.map +1 -0
- package/dist/function/GlobalToolFunction.test.d.ts +2 -0
- package/dist/function/GlobalToolFunction.test.d.ts.map +1 -0
- package/dist/function/GlobalToolFunction.test.js +425 -0
- package/dist/function/GlobalToolFunction.test.js.map +1 -0
- package/dist/function/ToolFunction.d.ts +1 -2
- package/dist/function/ToolFunction.d.ts.map +1 -1
- package/dist/function/ToolFunction.js +2 -36
- package/dist/function/ToolFunction.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/service/Service.d.ts +8 -7
- package/dist/service/Service.d.ts.map +1 -1
- package/dist/service/Service.js +13 -0
- package/dist/service/Service.js.map +1 -1
- package/dist/service/Service.test.js +86 -4
- package/dist/service/Service.test.js.map +1 -1
- package/dist/validation/ParameterValidator.d.ts +42 -0
- package/dist/validation/ParameterValidator.d.ts.map +1 -0
- package/dist/validation/ParameterValidator.js +122 -0
- package/dist/validation/ParameterValidator.js.map +1 -0
- package/dist/validation/ParameterValidator.test.d.ts +2 -0
- package/dist/validation/ParameterValidator.test.d.ts.map +1 -0
- package/dist/validation/ParameterValidator.test.js +282 -0
- package/dist/validation/ParameterValidator.test.js.map +1 -0
- package/package.json +3 -4
- package/src/auth/AuthUtils.test.ts +729 -0
- package/src/auth/AuthUtils.ts +117 -0
- package/src/auth/TokenVerifier.test.ts +11 -0
- package/src/auth/TokenVerifier.ts +0 -1
- package/src/function/GlobalToolFunction.test.ts +505 -0
- package/src/function/GlobalToolFunction.ts +56 -0
- package/src/function/ToolFunction.ts +3 -42
- package/src/index.ts +1 -0
- package/src/service/Service.test.ts +126 -12
- package/src/service/Service.ts +47 -9
- package/src/validation/ParameterValidator.test.ts +341 -0
- package/src/validation/ParameterValidator.ts +153 -0
- package/dist/function/ToolFunction.test.d.ts +0 -2
- package/dist/function/ToolFunction.test.d.ts.map +0 -1
- package/dist/function/ToolFunction.test.js +0 -314
- package/dist/function/ToolFunction.test.js.map +0 -1
- package/src/function/ToolFunction.test.ts +0 -374
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Parameter, ParameterType } from '../types/Models';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validation error details
|
|
5
|
+
*/
|
|
6
|
+
export interface ValidationError {
|
|
7
|
+
parameter: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Validation result
|
|
13
|
+
*/
|
|
14
|
+
export interface ValidationResult {
|
|
15
|
+
isValid: boolean;
|
|
16
|
+
errors: ValidationError[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parameter validator for tool inputs
|
|
21
|
+
*/
|
|
22
|
+
export class ParameterValidator {
|
|
23
|
+
/**
|
|
24
|
+
* Validate parameters against their definitions
|
|
25
|
+
* @param params The actual parameters received
|
|
26
|
+
* @param parameterDefinitions The expected parameter definitions
|
|
27
|
+
* @returns Validation result with any errors found
|
|
28
|
+
*/
|
|
29
|
+
public static validate(
|
|
30
|
+
params: any,
|
|
31
|
+
parameterDefinitions: Parameter[]
|
|
32
|
+
): ValidationResult {
|
|
33
|
+
const errors: ValidationError[] = [];
|
|
34
|
+
|
|
35
|
+
// Validate each defined parameter
|
|
36
|
+
for (const paramDef of parameterDefinitions) {
|
|
37
|
+
const value = params ? params[paramDef.name] : undefined;
|
|
38
|
+
|
|
39
|
+
// Check if required parameter is missing
|
|
40
|
+
if (paramDef.required && (value === undefined || value === null)) {
|
|
41
|
+
errors.push({
|
|
42
|
+
parameter: paramDef.name,
|
|
43
|
+
message: `Required parameter '${paramDef.name}' is missing`
|
|
44
|
+
});
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Skip validation if parameter is optional and not provided
|
|
49
|
+
if (!paramDef.required && (value === undefined || value === null)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Validate parameter type
|
|
54
|
+
const typeError = this.validateParameterType(paramDef.name, value, paramDef.type);
|
|
55
|
+
if (typeError) {
|
|
56
|
+
errors.push(typeError);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return { isValid: errors.length === 0, errors };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Validate a single parameter's type
|
|
65
|
+
* @param paramName Parameter name
|
|
66
|
+
* @param value Parameter value
|
|
67
|
+
* @param expectedType Expected parameter type
|
|
68
|
+
* @returns Validation error if invalid, null if valid
|
|
69
|
+
*/
|
|
70
|
+
private static validateParameterType(
|
|
71
|
+
paramName: string,
|
|
72
|
+
value: any,
|
|
73
|
+
expectedType: ParameterType
|
|
74
|
+
): ValidationError | null {
|
|
75
|
+
const actualType = this.getActualType(value);
|
|
76
|
+
|
|
77
|
+
switch (expectedType) {
|
|
78
|
+
case ParameterType.String:
|
|
79
|
+
if (typeof value !== 'string') {
|
|
80
|
+
return {
|
|
81
|
+
parameter: paramName,
|
|
82
|
+
message: `Parameter '${paramName}' must be a string, but received ${actualType}`
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
|
|
87
|
+
case ParameterType.Integer:
|
|
88
|
+
if (!Number.isInteger(value)) {
|
|
89
|
+
return {
|
|
90
|
+
parameter: paramName,
|
|
91
|
+
message: `Parameter '${paramName}' must be an integer, but received ${actualType}`
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
|
|
96
|
+
case ParameterType.Number:
|
|
97
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
98
|
+
return {
|
|
99
|
+
parameter: paramName,
|
|
100
|
+
message: `Parameter '${paramName}' must be a number, but received ${actualType}`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
|
|
105
|
+
case ParameterType.Boolean:
|
|
106
|
+
if (typeof value !== 'boolean') {
|
|
107
|
+
return {
|
|
108
|
+
parameter: paramName,
|
|
109
|
+
message: `Parameter '${paramName}' must be a boolean, but received ${actualType}`
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
|
|
114
|
+
case ParameterType.List:
|
|
115
|
+
if (!Array.isArray(value)) {
|
|
116
|
+
return {
|
|
117
|
+
parameter: paramName,
|
|
118
|
+
message: `Parameter '${paramName}' must be an array, but received ${actualType}`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
|
|
123
|
+
case ParameterType.Dictionary:
|
|
124
|
+
if (typeof value !== 'object' || Array.isArray(value) || value === null) {
|
|
125
|
+
return {
|
|
126
|
+
parameter: paramName,
|
|
127
|
+
message: `Parameter '${paramName}' must be an object, but received ${actualType}`
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
|
|
132
|
+
default:
|
|
133
|
+
return {
|
|
134
|
+
parameter: paramName,
|
|
135
|
+
message: `Parameter '${paramName}' has unknown expected type: ${String(expectedType)}`
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Get a human-readable description of the actual type
|
|
144
|
+
* @param value The value to check
|
|
145
|
+
* @returns String description of the type
|
|
146
|
+
*/
|
|
147
|
+
private static getActualType(value: any): string {
|
|
148
|
+
if (value === null) return 'null';
|
|
149
|
+
if (value === undefined) return 'undefined';
|
|
150
|
+
if (Array.isArray(value)) return 'array';
|
|
151
|
+
return typeof value;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolFunction.test.d.ts","sourceRoot":"","sources":["../../src/function/ToolFunction.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const ToolFunction_1 = require("./ToolFunction");
|
|
4
|
-
const Service_1 = require("../service/Service");
|
|
5
|
-
const app_sdk_1 = require("@zaiusinc/app-sdk");
|
|
6
|
-
const TokenVerifier_1 = require("../auth/TokenVerifier");
|
|
7
|
-
// Mock the dependencies
|
|
8
|
-
jest.mock('../service/Service', () => ({
|
|
9
|
-
toolsService: {
|
|
10
|
-
processRequest: jest.fn(),
|
|
11
|
-
},
|
|
12
|
-
}));
|
|
13
|
-
jest.mock('../auth/TokenVerifier', () => ({
|
|
14
|
-
getTokenVerifier: jest.fn(),
|
|
15
|
-
}));
|
|
16
|
-
jest.mock('@zaiusinc/app-sdk', () => ({
|
|
17
|
-
Function: class {
|
|
18
|
-
request;
|
|
19
|
-
constructor(_name) {
|
|
20
|
-
this.request = {};
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
Request: jest.fn().mockImplementation(() => ({})),
|
|
24
|
-
Response: jest.fn().mockImplementation((status, data) => ({
|
|
25
|
-
status,
|
|
26
|
-
data,
|
|
27
|
-
bodyJSON: data,
|
|
28
|
-
bodyAsU8Array: new Uint8Array()
|
|
29
|
-
})),
|
|
30
|
-
amendLogContext: jest.fn(),
|
|
31
|
-
getAppContext: jest.fn(),
|
|
32
|
-
logger: {
|
|
33
|
-
info: jest.fn(),
|
|
34
|
-
error: jest.fn(),
|
|
35
|
-
warn: jest.fn(),
|
|
36
|
-
debug: jest.fn(),
|
|
37
|
-
},
|
|
38
|
-
}));
|
|
39
|
-
// Create a concrete implementation for testing
|
|
40
|
-
class TestToolFunction extends ToolFunction_1.ToolFunction {
|
|
41
|
-
mockReady;
|
|
42
|
-
constructor(request) {
|
|
43
|
-
super(request || {});
|
|
44
|
-
this.request = request;
|
|
45
|
-
this.mockReady = jest.fn().mockResolvedValue(true);
|
|
46
|
-
}
|
|
47
|
-
// Override the ready method with mock implementation for testing
|
|
48
|
-
ready() {
|
|
49
|
-
return this.mockReady();
|
|
50
|
-
}
|
|
51
|
-
getRequest() {
|
|
52
|
-
return this.request;
|
|
53
|
-
}
|
|
54
|
-
getMockReady() {
|
|
55
|
-
return this.mockReady;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
describe('ToolFunction', () => {
|
|
59
|
-
let mockRequest;
|
|
60
|
-
let mockResponse;
|
|
61
|
-
let toolFunction;
|
|
62
|
-
let mockProcessRequest;
|
|
63
|
-
let mockGetTokenVerifier;
|
|
64
|
-
let mockGetAppContext;
|
|
65
|
-
let mockTokenVerifier;
|
|
66
|
-
beforeEach(() => {
|
|
67
|
-
jest.clearAllMocks();
|
|
68
|
-
// Create mock token verifier
|
|
69
|
-
mockTokenVerifier = {
|
|
70
|
-
verify: jest.fn(),
|
|
71
|
-
};
|
|
72
|
-
// Setup the mocks
|
|
73
|
-
mockProcessRequest = jest.mocked(Service_1.toolsService.processRequest);
|
|
74
|
-
mockGetTokenVerifier = jest.mocked(TokenVerifier_1.getTokenVerifier);
|
|
75
|
-
mockGetAppContext = jest.mocked(app_sdk_1.getAppContext);
|
|
76
|
-
mockGetTokenVerifier.mockResolvedValue(mockTokenVerifier);
|
|
77
|
-
mockGetAppContext.mockReturnValue({
|
|
78
|
-
account: {
|
|
79
|
-
organizationId: 'app-org-123'
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
// Create mock request with bodyJSON structure
|
|
83
|
-
mockRequest = {
|
|
84
|
-
headers: new Map(),
|
|
85
|
-
method: 'POST',
|
|
86
|
-
path: '/test',
|
|
87
|
-
bodyJSON: {
|
|
88
|
-
parameters: {
|
|
89
|
-
task_id: 'task-123',
|
|
90
|
-
content_id: 'content-456'
|
|
91
|
-
},
|
|
92
|
-
auth: {
|
|
93
|
-
provider: 'OptiID',
|
|
94
|
-
credentials: {
|
|
95
|
-
token_type: 'Bearer',
|
|
96
|
-
access_token: 'valid-access-token',
|
|
97
|
-
org_sso_id: 'org-sso-123',
|
|
98
|
-
user_id: 'user-456',
|
|
99
|
-
instance_id: 'instance-789',
|
|
100
|
-
customer_id: 'app-org-123',
|
|
101
|
-
product_sku: 'OPAL'
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
environment: {
|
|
105
|
-
execution_mode: 'headless'
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
mockResponse = {};
|
|
110
|
-
toolFunction = new TestToolFunction(mockRequest);
|
|
111
|
-
});
|
|
112
|
-
// Helper function to create a ready request with valid auth
|
|
113
|
-
const createReadyRequestWithAuth = () => ({
|
|
114
|
-
headers: new Map(),
|
|
115
|
-
method: 'GET',
|
|
116
|
-
path: '/ready',
|
|
117
|
-
bodyJSON: {
|
|
118
|
-
auth: {
|
|
119
|
-
provider: 'OptiID',
|
|
120
|
-
credentials: {
|
|
121
|
-
access_token: 'valid-token',
|
|
122
|
-
customer_id: 'app-org-123'
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
// Helper function to setup authorization mocks to pass
|
|
128
|
-
const setupAuthMocks = () => {
|
|
129
|
-
mockTokenVerifier.verify.mockResolvedValue(true);
|
|
130
|
-
mockGetAppContext.mockReturnValue({
|
|
131
|
-
account: {
|
|
132
|
-
organizationId: 'app-org-123'
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
};
|
|
136
|
-
describe('/ready endpoint', () => {
|
|
137
|
-
beforeEach(() => {
|
|
138
|
-
setupAuthMocks();
|
|
139
|
-
});
|
|
140
|
-
it('should return ready: true when ready method returns true', async () => {
|
|
141
|
-
// Arrange
|
|
142
|
-
const readyRequest = createReadyRequestWithAuth();
|
|
143
|
-
toolFunction = new TestToolFunction(readyRequest);
|
|
144
|
-
toolFunction.getMockReady().mockResolvedValue(true);
|
|
145
|
-
// Act
|
|
146
|
-
const result = await toolFunction.perform();
|
|
147
|
-
// Assert
|
|
148
|
-
expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
|
|
149
|
-
expect(result).toEqual(new app_sdk_1.Response(200, { ready: true }));
|
|
150
|
-
expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
|
|
151
|
-
});
|
|
152
|
-
it('should return ready: false when ready method returns false', async () => {
|
|
153
|
-
// Arrange
|
|
154
|
-
const readyRequest = createReadyRequestWithAuth();
|
|
155
|
-
toolFunction = new TestToolFunction(readyRequest);
|
|
156
|
-
toolFunction.getMockReady().mockResolvedValue(false);
|
|
157
|
-
// Act
|
|
158
|
-
const result = await toolFunction.perform();
|
|
159
|
-
// Assert
|
|
160
|
-
expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
|
|
161
|
-
expect(result).toEqual(new app_sdk_1.Response(200, { ready: false }));
|
|
162
|
-
expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
|
|
163
|
-
});
|
|
164
|
-
it('should handle ready method throwing an error', async () => {
|
|
165
|
-
// Arrange
|
|
166
|
-
const readyRequest = createReadyRequestWithAuth();
|
|
167
|
-
toolFunction = new TestToolFunction(readyRequest);
|
|
168
|
-
toolFunction.getMockReady().mockRejectedValue(new Error('Ready check failed'));
|
|
169
|
-
// Act & Assert
|
|
170
|
-
await expect(toolFunction.perform()).rejects.toThrow('Ready check failed');
|
|
171
|
-
expect(toolFunction.getMockReady()).toHaveBeenCalledTimes(1);
|
|
172
|
-
expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
|
|
173
|
-
});
|
|
174
|
-
it('should use default ready implementation when not overridden', async () => {
|
|
175
|
-
// Create a class that doesn't override ready method
|
|
176
|
-
class DefaultReadyToolFunction extends ToolFunction_1.ToolFunction {
|
|
177
|
-
constructor(request) {
|
|
178
|
-
super(request || {});
|
|
179
|
-
this.request = request;
|
|
180
|
-
}
|
|
181
|
-
getRequest() {
|
|
182
|
-
return this.request;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// Arrange
|
|
186
|
-
const readyRequest = createReadyRequestWithAuth();
|
|
187
|
-
const defaultToolFunction = new DefaultReadyToolFunction(readyRequest);
|
|
188
|
-
// Act
|
|
189
|
-
const result = await defaultToolFunction.perform();
|
|
190
|
-
// Assert - Default implementation should return true
|
|
191
|
-
expect(result).toEqual(new app_sdk_1.Response(200, { ready: true }));
|
|
192
|
-
expect(mockProcessRequest).not.toHaveBeenCalled(); // Should not call service
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe('perform', () => {
|
|
196
|
-
it('should execute successfully with valid token and matching organization', async () => {
|
|
197
|
-
// Setup mock token verifier to return true for valid token
|
|
198
|
-
mockTokenVerifier.verify.mockResolvedValue(true);
|
|
199
|
-
mockProcessRequest.mockResolvedValue(mockResponse);
|
|
200
|
-
const result = await toolFunction.perform();
|
|
201
|
-
expect(result).toBe(mockResponse);
|
|
202
|
-
expect(mockGetTokenVerifier).toHaveBeenCalled();
|
|
203
|
-
expect(mockTokenVerifier.verify).toHaveBeenCalledWith('valid-access-token');
|
|
204
|
-
expect(mockGetAppContext).toHaveBeenCalled();
|
|
205
|
-
expect(mockProcessRequest).toHaveBeenCalledWith(mockRequest, toolFunction);
|
|
206
|
-
});
|
|
207
|
-
it('should return 403 response with invalid token', async () => {
|
|
208
|
-
// Setup mock token verifier to return false
|
|
209
|
-
mockTokenVerifier.verify.mockResolvedValue(false);
|
|
210
|
-
const result = await toolFunction.perform();
|
|
211
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
212
|
-
expect(mockGetTokenVerifier).toHaveBeenCalled();
|
|
213
|
-
expect(mockTokenVerifier.verify).toHaveBeenCalledWith('valid-access-token');
|
|
214
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
215
|
-
});
|
|
216
|
-
it('should return 403 response when organization ID does not match', async () => {
|
|
217
|
-
// Update mock request with different customer_id
|
|
218
|
-
const requestWithDifferentOrgId = {
|
|
219
|
-
...mockRequest,
|
|
220
|
-
bodyJSON: {
|
|
221
|
-
...mockRequest.bodyJSON,
|
|
222
|
-
auth: {
|
|
223
|
-
...mockRequest.bodyJSON.auth,
|
|
224
|
-
credentials: {
|
|
225
|
-
...mockRequest.bodyJSON.auth.credentials,
|
|
226
|
-
customer_id: 'different-org-123'
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
const toolFunctionWithDifferentOrgId = new TestToolFunction(requestWithDifferentOrgId);
|
|
232
|
-
const result = await toolFunctionWithDifferentOrgId.perform();
|
|
233
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
234
|
-
expect(mockGetAppContext).toHaveBeenCalled();
|
|
235
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
236
|
-
});
|
|
237
|
-
it('should return 403 response when access token is missing', async () => {
|
|
238
|
-
// Create request without access token
|
|
239
|
-
const requestWithoutToken = {
|
|
240
|
-
...mockRequest,
|
|
241
|
-
bodyJSON: {
|
|
242
|
-
...mockRequest.bodyJSON,
|
|
243
|
-
auth: {
|
|
244
|
-
...mockRequest.bodyJSON.auth,
|
|
245
|
-
credentials: {
|
|
246
|
-
...mockRequest.bodyJSON.auth.credentials,
|
|
247
|
-
access_token: undefined
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
const toolFunctionWithoutToken = new TestToolFunction(requestWithoutToken);
|
|
253
|
-
const result = await toolFunctionWithoutToken.perform();
|
|
254
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
255
|
-
expect(mockGetTokenVerifier).not.toHaveBeenCalled();
|
|
256
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
257
|
-
});
|
|
258
|
-
it('should return 403 response when organisation id is missing', async () => {
|
|
259
|
-
// Create request without customer_id
|
|
260
|
-
const requestWithoutCustomerId = {
|
|
261
|
-
...mockRequest,
|
|
262
|
-
bodyJSON: {
|
|
263
|
-
...mockRequest.bodyJSON,
|
|
264
|
-
auth: {
|
|
265
|
-
...mockRequest.bodyJSON.auth,
|
|
266
|
-
credentials: {
|
|
267
|
-
...mockRequest.bodyJSON.auth.credentials,
|
|
268
|
-
customer_id: undefined
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
const toolFunctionWithoutCustomerId = new TestToolFunction(requestWithoutCustomerId);
|
|
274
|
-
const result = await toolFunctionWithoutCustomerId.perform();
|
|
275
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
276
|
-
expect(mockGetTokenVerifier).not.toHaveBeenCalled();
|
|
277
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
278
|
-
});
|
|
279
|
-
it('should return 403 response when auth structure is missing', async () => {
|
|
280
|
-
// Create request without auth structure
|
|
281
|
-
const requestWithoutAuth = {
|
|
282
|
-
...mockRequest,
|
|
283
|
-
bodyJSON: {
|
|
284
|
-
parameters: mockRequest.bodyJSON.parameters,
|
|
285
|
-
environment: mockRequest.bodyJSON.environment
|
|
286
|
-
}
|
|
287
|
-
};
|
|
288
|
-
const toolFunctionWithoutAuth = new TestToolFunction(requestWithoutAuth);
|
|
289
|
-
const result = await toolFunctionWithoutAuth.perform();
|
|
290
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
291
|
-
expect(mockGetTokenVerifier).not.toHaveBeenCalled();
|
|
292
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
293
|
-
});
|
|
294
|
-
it('should return 403 response when token verifier initialization fails', async () => {
|
|
295
|
-
// Setup mock to fail during token verifier initialization
|
|
296
|
-
mockGetTokenVerifier.mockRejectedValue(new Error('Failed to initialize token verifier'));
|
|
297
|
-
const result = await toolFunction.perform();
|
|
298
|
-
expect(result).toEqual(new app_sdk_1.Response(403, { error: 'Forbidden' }));
|
|
299
|
-
expect(mockGetTokenVerifier).toHaveBeenCalled();
|
|
300
|
-
expect(mockProcessRequest).not.toHaveBeenCalled();
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
describe('inheritance', () => {
|
|
304
|
-
it('should be an instance of Function', () => {
|
|
305
|
-
// Assert
|
|
306
|
-
expect(toolFunction).toBeInstanceOf(ToolFunction_1.ToolFunction);
|
|
307
|
-
});
|
|
308
|
-
it('should have access to the request property', () => {
|
|
309
|
-
// Assert
|
|
310
|
-
expect(toolFunction.getRequest()).toBe(mockRequest);
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
//# sourceMappingURL=ToolFunction.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolFunction.test.js","sourceRoot":"","sources":["../../src/function/ToolFunction.test.ts"],"names":[],"mappings":"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"}
|