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:
@@ -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({});
|
||||
|
||||
@@ -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' }
|
||||
|
||||
Reference in New Issue
Block a user