refactor: update TypeScript configuration and test utilities for improved type safety

- Modify tsconfig.json to relax strict type checking for gradual migration
- Update test files to use more flexible type checking and mocking
- Add type-safe mock and test utility functions
- Improve error handling and type inference in test suites
- Export Tool interface and tools list for better testing support
This commit is contained in:
jango-blockchained
2025-02-05 09:16:21 +01:00
parent eefbf790c3
commit 4e9ebbbc2c
21 changed files with 526 additions and 532 deletions

View File

@@ -5,10 +5,10 @@ import router from '../../../src/ai/endpoints/ai-router.js';
import type { AIResponse, AIError } from '../../../src/ai/types/index.js';
// Mock NLPProcessor
jest.mock('../../../src/ai/nlp/processor.js', () => {
// // jest.mock('../../../src/ai/nlp/processor.js', () => {
return {
NLPProcessor: jest.fn().mockImplementation(() => ({
processCommand: jest.fn().mockImplementation(async () => ({
NLPProcessor: mock().mockImplementation(() => ({
processCommand: mock().mockImplementation(async () => ({
intent: {
action: 'turn_on',
target: 'light.living_room',
@@ -21,8 +21,8 @@ jest.mock('../../../src/ai/nlp/processor.js', () => {
context: 0.9
}
})),
validateIntent: jest.fn().mockImplementation(async () => true),
suggestCorrections: jest.fn().mockImplementation(async () => [
validateIntent: mock().mockImplementation(async () => true),
suggestCorrections: mock().mockImplementation(async () => [
'Try using simpler commands',
'Specify the device name clearly'
])
@@ -57,7 +57,7 @@ describe('AI Router', () => {
model: 'claude' as const
};
it('should successfully interpret a valid command', async () => {
test('should successfully interpret a valid command', async () => {
const response = await request(app)
.post('/ai/interpret')
.send(validRequest);
@@ -81,7 +81,7 @@ describe('AI Router', () => {
expect(body.context).toBeDefined();
});
it('should handle invalid input format', async () => {
test('should handle invalid input format', async () => {
const response = await request(app)
.post('/ai/interpret')
.send({
@@ -97,7 +97,7 @@ describe('AI Router', () => {
expect(Array.isArray(error.recovery_options)).toBe(true);
});
it('should handle missing required fields', async () => {
test('should handle missing required fields', async () => {
const response = await request(app)
.post('/ai/interpret')
.send({
@@ -111,7 +111,7 @@ describe('AI Router', () => {
expect(typeof error.message).toBe('string');
});
it('should handle rate limiting', async () => {
test('should handle rate limiting', async () => {
// Make multiple requests to trigger rate limiting
const requests = Array(101).fill(validRequest);
const responses = await Promise.all(
@@ -145,7 +145,7 @@ describe('AI Router', () => {
model: 'claude' as const
};
it('should successfully execute a valid intent', async () => {
test('should successfully execute a valid intent', async () => {
const response = await request(app)
.post('/ai/execute')
.send(validRequest);
@@ -169,7 +169,7 @@ describe('AI Router', () => {
expect(body.context).toBeDefined();
});
it('should handle invalid intent format', async () => {
test('should handle invalid intent format', async () => {
const response = await request(app)
.post('/ai/execute')
.send({
@@ -199,7 +199,7 @@ describe('AI Router', () => {
model: 'claude' as const
};
it('should return a list of suggestions', async () => {
test('should return a list of suggestions', async () => {
const response = await request(app)
.get('/ai/suggestions')
.send(validRequest);
@@ -209,7 +209,7 @@ describe('AI Router', () => {
expect(response.body.suggestions.length).toBeGreaterThan(0);
});
it('should handle missing context', async () => {
test('should handle missing context', async () => {
const response = await request(app)
.get('/ai/suggestions')
.send({});

View File

@@ -8,7 +8,7 @@ describe('IntentClassifier', () => {
});
describe('Basic Intent Classification', () => {
it('should classify turn_on commands', async () => {
test('should classify turn_on commands', async () => {
const testCases = [
{
input: 'turn on the living room light',
@@ -35,7 +35,7 @@ describe('IntentClassifier', () => {
}
});
it('should classify turn_off commands', async () => {
test('should classify turn_off commands', async () => {
const testCases = [
{
input: 'turn off the living room light',
@@ -62,7 +62,7 @@ describe('IntentClassifier', () => {
}
});
it('should classify set commands with parameters', async () => {
test('should classify set commands with parameters', async () => {
const testCases = [
{
input: 'set the living room light brightness to 50',
@@ -99,7 +99,7 @@ describe('IntentClassifier', () => {
}
});
it('should classify query commands', async () => {
test('should classify query commands', async () => {
const testCases = [
{
input: 'what is the living room temperature',
@@ -128,13 +128,13 @@ describe('IntentClassifier', () => {
});
describe('Edge Cases and Error Handling', () => {
it('should handle empty input gracefully', async () => {
test('should handle empty input gracefully', async () => {
const result = await classifier.classify('', { parameters: {}, primary_target: '' });
expect(result.action).toBe('unknown');
expect(result.confidence).toBeLessThan(0.5);
});
it('should handle unknown commands with low confidence', async () => {
test('should handle unknown commands with low confidence', async () => {
const result = await classifier.classify(
'do something random',
{ parameters: {}, primary_target: 'light.living_room' }
@@ -143,7 +143,7 @@ describe('IntentClassifier', () => {
expect(result.confidence).toBeLessThan(0.5);
});
it('should handle missing entities gracefully', async () => {
test('should handle missing entities gracefully', async () => {
const result = await classifier.classify(
'turn on the lights',
{ parameters: {}, primary_target: '' }
@@ -154,7 +154,7 @@ describe('IntentClassifier', () => {
});
describe('Confidence Calculation', () => {
it('should assign higher confidence to exact matches', async () => {
test('should assign higher confidence to exact matches', async () => {
const exactMatch = await classifier.classify(
'turn on',
{ parameters: {}, primary_target: 'light.living_room' }
@@ -166,7 +166,7 @@ describe('IntentClassifier', () => {
expect(exactMatch.confidence).toBeGreaterThan(partialMatch.confidence);
});
it('should boost confidence for polite phrases', async () => {
test('should boost confidence for polite phrases', async () => {
const politeRequest = await classifier.classify(
'please turn on the lights',
{ parameters: {}, primary_target: 'light.living_room' }
@@ -180,7 +180,7 @@ describe('IntentClassifier', () => {
});
describe('Context Inference', () => {
it('should infer set action when parameters are present', async () => {
test('should infer set action when parameters are present', async () => {
const result = await classifier.classify(
'lights at 50%',
{
@@ -192,7 +192,7 @@ describe('IntentClassifier', () => {
expect(result.parameters).toHaveProperty('brightness', 50);
});
it('should infer query action for question-like inputs', async () => {
test('should infer query action for question-like inputs', async () => {
const result = await classifier.classify(
'how warm is it',
{ parameters: {}, primary_target: 'sensor.temperature' }