185 lines
5.9 KiB
TypeScript
185 lines
5.9 KiB
TypeScript
import {
|
|
type AgentToolTestContext,
|
|
createAgentToolTestModule,
|
|
} from './utils/agent-tool-test-utils';
|
|
|
|
describe('AgentToolGeneratorService Integration', () => {
|
|
let context: AgentToolTestContext;
|
|
|
|
beforeEach(async () => {
|
|
context = await createAgentToolTestModule();
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await context.module.close();
|
|
});
|
|
|
|
describe('Tool Generation', () => {
|
|
it('should generate complete tool set for agent with full permissions', async () => {
|
|
const roleWithFullPermissions = {
|
|
...context.testRole,
|
|
canDestroyAllObjectRecords: true,
|
|
};
|
|
|
|
jest
|
|
.spyOn(context.agentService, 'findOneAgent')
|
|
.mockResolvedValue(context.testAgent as any);
|
|
jest
|
|
.spyOn(context.roleRepository, 'findOne')
|
|
.mockResolvedValue(roleWithFullPermissions);
|
|
jest
|
|
.spyOn(
|
|
context.workspacePermissionsCacheService,
|
|
'getRolesPermissionsFromCache',
|
|
)
|
|
.mockResolvedValue({
|
|
data: {
|
|
[context.testRoleId]: {
|
|
[context.testObjectMetadata.id]: {
|
|
canRead: true,
|
|
canUpdate: true,
|
|
canSoftDelete: true,
|
|
canDestroy: true,
|
|
canReadObjectRecords: true,
|
|
canUpdateObjectRecords: true,
|
|
canSoftDeleteObjectRecords: true,
|
|
canDestroyObjectRecords: true,
|
|
restrictedFields: {},
|
|
},
|
|
},
|
|
},
|
|
version: '1.0',
|
|
});
|
|
jest
|
|
.spyOn(context.objectMetadataService, 'findManyWithinWorkspace')
|
|
.mockResolvedValue([context.testObjectMetadata]);
|
|
|
|
const tools = await context.agentToolService.generateToolsForAgent(
|
|
context.testAgentId,
|
|
context.testWorkspaceId,
|
|
);
|
|
|
|
expect(tools).toBeDefined();
|
|
expect(Object.keys(tools)).toHaveLength(7);
|
|
expect(Object.keys(tools)).toContain('create_testObject');
|
|
expect(Object.keys(tools)).toContain('update_testObject');
|
|
expect(Object.keys(tools)).toContain('find_testObject');
|
|
expect(Object.keys(tools)).toContain('find_one_testObject');
|
|
expect(Object.keys(tools)).toContain('soft_delete_testObject');
|
|
expect(Object.keys(tools)).toContain('soft_delete_many_testObject');
|
|
expect(Object.keys(tools)).toContain('http_request');
|
|
});
|
|
|
|
it('should generate read-only tools for agent with read permissions only', async () => {
|
|
jest
|
|
.spyOn(context.agentService, 'findOneAgent')
|
|
.mockResolvedValue(context.testAgent as any);
|
|
jest
|
|
.spyOn(context.roleRepository, 'findOne')
|
|
.mockResolvedValue(context.testRole);
|
|
jest
|
|
.spyOn(
|
|
context.workspacePermissionsCacheService,
|
|
'getRolesPermissionsFromCache',
|
|
)
|
|
.mockResolvedValue({
|
|
data: {
|
|
[context.testRoleId]: {
|
|
[context.testObjectMetadata.id]: {
|
|
canRead: true,
|
|
canUpdate: false,
|
|
canSoftDelete: false,
|
|
canDestroy: false,
|
|
canReadObjectRecords: true,
|
|
canUpdateObjectRecords: false,
|
|
canSoftDeleteObjectRecords: false,
|
|
canDestroyObjectRecords: false,
|
|
restrictedFields: {},
|
|
},
|
|
},
|
|
},
|
|
version: '1.0',
|
|
});
|
|
jest
|
|
.spyOn(context.objectMetadataService, 'findManyWithinWorkspace')
|
|
.mockResolvedValue([context.testObjectMetadata]);
|
|
|
|
const tools = await context.agentToolService.generateToolsForAgent(
|
|
context.testAgentId,
|
|
context.testWorkspaceId,
|
|
);
|
|
|
|
expect(tools).toBeDefined();
|
|
expect(Object.keys(tools)).toHaveLength(3);
|
|
expect(Object.keys(tools)).toContain('find_testObject');
|
|
expect(Object.keys(tools)).toContain('find_one_testObject');
|
|
expect(Object.keys(tools)).not.toContain('create_testObject');
|
|
expect(Object.keys(tools)).not.toContain('update_testObject');
|
|
});
|
|
|
|
it('should return only http request tool for agent without role', async () => {
|
|
const agentWithoutRole = { ...context.testAgent, roleId: null };
|
|
|
|
jest
|
|
.spyOn(context.agentService, 'findOneAgent')
|
|
.mockResolvedValue(agentWithoutRole as any);
|
|
|
|
const tools = await context.agentToolService.generateToolsForAgent(
|
|
context.testAgentId,
|
|
context.testWorkspaceId,
|
|
);
|
|
|
|
expect(Object.keys(tools)).toHaveLength(1);
|
|
expect(Object.keys(tools)).toContain('http_request');
|
|
});
|
|
|
|
it('should filter out workflow-run objects', async () => {
|
|
const workflowObject = {
|
|
...context.testObjectMetadata,
|
|
nameSingular: 'workflow',
|
|
namePlural: 'workflows',
|
|
};
|
|
|
|
jest
|
|
.spyOn(context.agentService, 'findOneAgent')
|
|
.mockResolvedValue(context.testAgent as any);
|
|
jest
|
|
.spyOn(context.roleRepository, 'findOne')
|
|
.mockResolvedValue(context.testRole);
|
|
jest
|
|
.spyOn(
|
|
context.workspacePermissionsCacheService,
|
|
'getRolesPermissionsFromCache',
|
|
)
|
|
.mockResolvedValue({
|
|
data: {
|
|
[context.testRoleId]: {
|
|
[workflowObject.id]: {
|
|
canRead: true,
|
|
canUpdate: true,
|
|
canSoftDelete: true,
|
|
canDestroy: false,
|
|
canReadObjectRecords: true,
|
|
canUpdateObjectRecords: true,
|
|
canSoftDeleteObjectRecords: true,
|
|
canDestroyObjectRecords: false,
|
|
restrictedFields: {},
|
|
},
|
|
},
|
|
},
|
|
version: '1.0',
|
|
});
|
|
jest
|
|
.spyOn(context.objectMetadataService, 'findManyWithinWorkspace')
|
|
.mockResolvedValue([workflowObject]);
|
|
|
|
const tools = await context.agentToolService.generateToolsForAgent(
|
|
context.testAgentId,
|
|
context.testWorkspaceId,
|
|
);
|
|
|
|
expect(Object.keys(tools)).toHaveLength(7);
|
|
});
|
|
});
|
|
});
|