354ee86cb9
- remove ts-morph - update inputSchema shape  https://github.com/user-attachments/assets/913cd305-9e7c-48da-b20f-c974a8ac7cea ## TODO - have inputTypes to match the inputSchema type (string, number, boolean, etc...), only string for now - handle required/optional inputs - handle case when inputSchema changes, fix data reset when switching function
139 lines
3.8 KiB
TypeScript
139 lines
3.8 KiB
TypeScript
import { Test, TestingModule } from '@nestjs/testing';
|
|
|
|
import { CodeIntrospectionService } from 'src/modules/code-introspection/code-introspection.service';
|
|
|
|
describe('CodeIntrospectionService', () => {
|
|
let service: CodeIntrospectionService;
|
|
|
|
beforeEach(async () => {
|
|
const module: TestingModule = await Test.createTestingModule({
|
|
providers: [CodeIntrospectionService],
|
|
}).compile();
|
|
|
|
service = module.get<CodeIntrospectionService>(CodeIntrospectionService);
|
|
});
|
|
|
|
it('should be defined', () => {
|
|
expect(service).toBeDefined();
|
|
});
|
|
|
|
describe('getFunctionInputSchema', () => {
|
|
it('should analyze a simple function correctly', () => {
|
|
const fileContent = `
|
|
function testFunction(param1: string, param2: number): void {
|
|
return;
|
|
}
|
|
`;
|
|
const result = service.getFunctionInputSchema(fileContent);
|
|
|
|
expect(result).toEqual({
|
|
param1: { type: 'string' },
|
|
param2: { type: 'number' },
|
|
});
|
|
});
|
|
|
|
it('should analyze a arrow function correctly', () => {
|
|
const fileContent = `
|
|
export const main = async (
|
|
param1: string,
|
|
param2: number,
|
|
): Promise<object> => {
|
|
return params;
|
|
};
|
|
`;
|
|
const result = service.getFunctionInputSchema(fileContent);
|
|
|
|
expect(result).toEqual({
|
|
param1: { type: 'string' },
|
|
param2: { type: 'number' },
|
|
});
|
|
});
|
|
|
|
it('should analyze a complex function correctly', () => {
|
|
const fileContent = `
|
|
function testFunction(
|
|
params: {
|
|
param1: string;
|
|
param2: number;
|
|
param3: boolean;
|
|
param4: object;
|
|
param5: { subParam1: string };
|
|
param6: "my" | "enum";
|
|
param7: string[];
|
|
}
|
|
): void {
|
|
return
|
|
}
|
|
`;
|
|
const result = service.getFunctionInputSchema(fileContent);
|
|
|
|
expect(result).toEqual({
|
|
params: {
|
|
type: 'object',
|
|
properties: {
|
|
param1: { type: 'string' },
|
|
param2: { type: 'number' },
|
|
param3: { type: 'boolean' },
|
|
param4: { type: 'object' },
|
|
param5: {
|
|
type: 'object',
|
|
properties: {
|
|
subParam1: { type: 'string' },
|
|
},
|
|
},
|
|
param6: { type: 'string', enum: ['my', 'enum'] },
|
|
param7: { type: 'array', items: { type: 'string' } },
|
|
},
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('generateInputData', () => {
|
|
it('should generate fake data for simple function', () => {
|
|
const fileContent = `
|
|
function testFunction(param1: string, param2: number): void {
|
|
return;
|
|
}
|
|
`;
|
|
const inputSchema = service.getFunctionInputSchema(fileContent);
|
|
const result = service.generateInputData(inputSchema);
|
|
|
|
expect(result).toEqual({ param1: 'generated-string-value', param2: 1 });
|
|
});
|
|
|
|
it('should generate fake data for complex function', () => {
|
|
const fileContent = `
|
|
function testFunction(
|
|
params: {
|
|
param1: string;
|
|
param2: number;
|
|
param3: boolean;
|
|
param4: object;
|
|
param5: { subParam1: string };
|
|
param6: "my" | "enum";
|
|
param7: string[];
|
|
}
|
|
): void {
|
|
return
|
|
}
|
|
`;
|
|
|
|
const inputSchema = service.getFunctionInputSchema(fileContent);
|
|
const result = service.generateInputData(inputSchema);
|
|
|
|
expect(result).toEqual({
|
|
params: {
|
|
param1: 'generated-string-value',
|
|
param2: 1,
|
|
param3: true,
|
|
param4: {},
|
|
param5: { subParam1: 'generated-string-value' },
|
|
param6: 'my',
|
|
param7: ['generated-string-value'],
|
|
},
|
|
});
|
|
});
|
|
});
|
|
});
|