refactor: optimize configuration and tool implementations
- Standardized error handling across tool implementations - Improved return type consistency for tool execution results - Simplified configuration parsing and type definitions - Enhanced type safety for various configuration schemas - Cleaned up and normalized tool response structures - Updated SSE and event subscription tool implementations
This commit is contained in:
@@ -1,135 +1,162 @@
|
||||
import { z } from 'zod';
|
||||
import { z } from "zod";
|
||||
|
||||
// Test configuration schema
|
||||
const testConfigSchema = z.object({
|
||||
// Test Environment
|
||||
TEST_PORT: z.number().default(3001),
|
||||
TEST_HOST: z.string().default('http://localhost'),
|
||||
TEST_WEBSOCKET_PORT: z.number().default(3002),
|
||||
// Test Environment
|
||||
TEST_PORT: z.number().default(3001),
|
||||
TEST_HOST: z.string().default("http://localhost"),
|
||||
TEST_WEBSOCKET_PORT: z.number().default(3002),
|
||||
|
||||
// Mock Authentication
|
||||
TEST_JWT_SECRET: z.string().default('test_jwt_secret_key_that_is_at_least_32_chars'),
|
||||
TEST_TOKEN: z.string().default('test_token_that_is_at_least_32_chars_long'),
|
||||
TEST_INVALID_TOKEN: z.string().default('invalid_token'),
|
||||
// Mock Authentication
|
||||
TEST_JWT_SECRET: z
|
||||
.string()
|
||||
.default("test_jwt_secret_key_that_is_at_least_32_chars"),
|
||||
TEST_TOKEN: z.string().default("test_token_that_is_at_least_32_chars_long"),
|
||||
TEST_INVALID_TOKEN: z.string().default("invalid_token"),
|
||||
|
||||
// Mock Client Settings
|
||||
TEST_CLIENT_IP: z.string().default('127.0.0.1'),
|
||||
TEST_MAX_CLIENTS: z.number().default(10),
|
||||
TEST_PING_INTERVAL: z.number().default(100),
|
||||
TEST_CLEANUP_INTERVAL: z.number().default(200),
|
||||
TEST_MAX_CONNECTION_AGE: z.number().default(1000),
|
||||
// Mock Client Settings
|
||||
TEST_CLIENT_IP: z.string().default("127.0.0.1"),
|
||||
TEST_MAX_CLIENTS: z.number().default(10),
|
||||
TEST_PING_INTERVAL: z.number().default(100),
|
||||
TEST_CLEANUP_INTERVAL: z.number().default(200),
|
||||
TEST_MAX_CONNECTION_AGE: z.number().default(1000),
|
||||
|
||||
// Mock Rate Limiting
|
||||
TEST_RATE_LIMIT_WINDOW: z.number().default(60000), // 1 minute
|
||||
TEST_RATE_LIMIT_MAX_REQUESTS: z.number().default(100),
|
||||
TEST_RATE_LIMIT_WEBSOCKET: z.number().default(1000),
|
||||
// Mock Rate Limiting
|
||||
TEST_RATE_LIMIT_WINDOW: z.number().default(60000), // 1 minute
|
||||
TEST_RATE_LIMIT_MAX_REQUESTS: z.number().default(100),
|
||||
TEST_RATE_LIMIT_WEBSOCKET: z.number().default(1000),
|
||||
|
||||
// Mock Events
|
||||
TEST_EVENT_TYPES: z.array(z.string()).default([
|
||||
'state_changed',
|
||||
'automation_triggered',
|
||||
'script_executed',
|
||||
'service_called'
|
||||
// Mock Events
|
||||
TEST_EVENT_TYPES: z
|
||||
.array(z.string())
|
||||
.default([
|
||||
"state_changed",
|
||||
"automation_triggered",
|
||||
"script_executed",
|
||||
"service_called",
|
||||
]),
|
||||
|
||||
// Mock Entities
|
||||
TEST_ENTITIES: z.array(z.object({
|
||||
// Mock Entities
|
||||
TEST_ENTITIES: z
|
||||
.array(
|
||||
z.object({
|
||||
entity_id: z.string(),
|
||||
state: z.string(),
|
||||
attributes: z.record(z.any()),
|
||||
last_changed: z.string(),
|
||||
last_updated: z.string()
|
||||
})).default([
|
||||
{
|
||||
entity_id: 'light.test_light',
|
||||
state: 'on',
|
||||
attributes: {
|
||||
brightness: 255,
|
||||
color_temp: 400
|
||||
},
|
||||
last_changed: new Date().toISOString(),
|
||||
last_updated: new Date().toISOString()
|
||||
last_updated: z.string(),
|
||||
}),
|
||||
)
|
||||
.default([
|
||||
{
|
||||
entity_id: "light.test_light",
|
||||
state: "on",
|
||||
attributes: {
|
||||
brightness: 255,
|
||||
color_temp: 400,
|
||||
},
|
||||
{
|
||||
entity_id: 'switch.test_switch',
|
||||
state: 'off',
|
||||
attributes: {},
|
||||
last_changed: new Date().toISOString(),
|
||||
last_updated: new Date().toISOString()
|
||||
}
|
||||
last_changed: new Date().toISOString(),
|
||||
last_updated: new Date().toISOString(),
|
||||
},
|
||||
{
|
||||
entity_id: "switch.test_switch",
|
||||
state: "off",
|
||||
attributes: {},
|
||||
last_changed: new Date().toISOString(),
|
||||
last_updated: new Date().toISOString(),
|
||||
},
|
||||
]),
|
||||
|
||||
// Mock Services
|
||||
TEST_SERVICES: z.array(z.object({
|
||||
// Mock Services
|
||||
TEST_SERVICES: z
|
||||
.array(
|
||||
z.object({
|
||||
domain: z.string(),
|
||||
service: z.string(),
|
||||
data: z.record(z.any())
|
||||
})).default([
|
||||
{
|
||||
domain: 'light',
|
||||
service: 'turn_on',
|
||||
data: {
|
||||
entity_id: 'light.test_light',
|
||||
brightness: 255
|
||||
}
|
||||
data: z.record(z.any()),
|
||||
}),
|
||||
)
|
||||
.default([
|
||||
{
|
||||
domain: "light",
|
||||
service: "turn_on",
|
||||
data: {
|
||||
entity_id: "light.test_light",
|
||||
brightness: 255,
|
||||
},
|
||||
{
|
||||
domain: 'switch',
|
||||
service: 'turn_off',
|
||||
data: {
|
||||
entity_id: 'switch.test_switch'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
domain: "switch",
|
||||
service: "turn_off",
|
||||
data: {
|
||||
entity_id: "switch.test_switch",
|
||||
},
|
||||
},
|
||||
]),
|
||||
|
||||
// Mock Error Scenarios
|
||||
TEST_ERROR_SCENARIOS: z.array(z.object({
|
||||
// Mock Error Scenarios
|
||||
TEST_ERROR_SCENARIOS: z
|
||||
.array(
|
||||
z.object({
|
||||
type: z.string(),
|
||||
message: z.string(),
|
||||
code: z.number()
|
||||
})).default([
|
||||
{
|
||||
type: 'authentication_error',
|
||||
message: 'Invalid token',
|
||||
code: 401
|
||||
},
|
||||
{
|
||||
type: 'rate_limit_error',
|
||||
message: 'Too many requests',
|
||||
code: 429
|
||||
},
|
||||
{
|
||||
type: 'validation_error',
|
||||
message: 'Invalid request body',
|
||||
code: 400
|
||||
}
|
||||
])
|
||||
code: z.number(),
|
||||
}),
|
||||
)
|
||||
.default([
|
||||
{
|
||||
type: "authentication_error",
|
||||
message: "Invalid token",
|
||||
code: 401,
|
||||
},
|
||||
{
|
||||
type: "rate_limit_error",
|
||||
message: "Too many requests",
|
||||
code: 429,
|
||||
},
|
||||
{
|
||||
type: "validation_error",
|
||||
message: "Invalid request body",
|
||||
code: 400,
|
||||
},
|
||||
]),
|
||||
});
|
||||
|
||||
// Parse environment variables or use defaults
|
||||
const parseTestConfig = () => {
|
||||
const config = {
|
||||
TEST_PORT: parseInt(process.env.TEST_PORT || '3001'),
|
||||
TEST_HOST: process.env.TEST_HOST || 'http://localhost',
|
||||
TEST_WEBSOCKET_PORT: parseInt(process.env.TEST_WEBSOCKET_PORT || '3002'),
|
||||
TEST_JWT_SECRET: process.env.TEST_JWT_SECRET || 'test_jwt_secret_key_that_is_at_least_32_chars',
|
||||
TEST_TOKEN: process.env.TEST_TOKEN || 'test_token_that_is_at_least_32_chars_long',
|
||||
TEST_INVALID_TOKEN: process.env.TEST_INVALID_TOKEN || 'invalid_token',
|
||||
TEST_CLIENT_IP: process.env.TEST_CLIENT_IP || '127.0.0.1',
|
||||
TEST_MAX_CLIENTS: parseInt(process.env.TEST_MAX_CLIENTS || '10'),
|
||||
TEST_PING_INTERVAL: parseInt(process.env.TEST_PING_INTERVAL || '100'),
|
||||
TEST_CLEANUP_INTERVAL: parseInt(process.env.TEST_CLEANUP_INTERVAL || '200'),
|
||||
TEST_MAX_CONNECTION_AGE: parseInt(process.env.TEST_MAX_CONNECTION_AGE || '1000'),
|
||||
TEST_RATE_LIMIT_WINDOW: parseInt(process.env.TEST_RATE_LIMIT_WINDOW || '60000'),
|
||||
TEST_RATE_LIMIT_MAX_REQUESTS: parseInt(process.env.TEST_RATE_LIMIT_MAX_REQUESTS || '100'),
|
||||
TEST_RATE_LIMIT_WEBSOCKET: parseInt(process.env.TEST_RATE_LIMIT_WEBSOCKET || '1000'),
|
||||
};
|
||||
const config = {
|
||||
TEST_PORT: parseInt(process.env.TEST_PORT || "3001"),
|
||||
TEST_HOST: process.env.TEST_HOST || "http://localhost",
|
||||
TEST_WEBSOCKET_PORT: parseInt(process.env.TEST_WEBSOCKET_PORT || "3002"),
|
||||
TEST_JWT_SECRET:
|
||||
process.env.TEST_JWT_SECRET ||
|
||||
"test_jwt_secret_key_that_is_at_least_32_chars",
|
||||
TEST_TOKEN:
|
||||
process.env.TEST_TOKEN || "test_token_that_is_at_least_32_chars_long",
|
||||
TEST_INVALID_TOKEN: process.env.TEST_INVALID_TOKEN || "invalid_token",
|
||||
TEST_CLIENT_IP: process.env.TEST_CLIENT_IP || "127.0.0.1",
|
||||
TEST_MAX_CLIENTS: parseInt(process.env.TEST_MAX_CLIENTS || "10"),
|
||||
TEST_PING_INTERVAL: parseInt(process.env.TEST_PING_INTERVAL || "100"),
|
||||
TEST_CLEANUP_INTERVAL: parseInt(process.env.TEST_CLEANUP_INTERVAL || "200"),
|
||||
TEST_MAX_CONNECTION_AGE: parseInt(
|
||||
process.env.TEST_MAX_CONNECTION_AGE || "1000",
|
||||
),
|
||||
TEST_RATE_LIMIT_WINDOW: parseInt(
|
||||
process.env.TEST_RATE_LIMIT_WINDOW || "60000",
|
||||
),
|
||||
TEST_RATE_LIMIT_MAX_REQUESTS: parseInt(
|
||||
process.env.TEST_RATE_LIMIT_MAX_REQUESTS || "100",
|
||||
),
|
||||
TEST_RATE_LIMIT_WEBSOCKET: parseInt(
|
||||
process.env.TEST_RATE_LIMIT_WEBSOCKET || "1000",
|
||||
),
|
||||
};
|
||||
|
||||
return testConfigSchema.parse(config);
|
||||
return testConfigSchema.parse(config);
|
||||
};
|
||||
|
||||
// Export the validated test configuration
|
||||
export const TEST_CONFIG = parseTestConfig();
|
||||
|
||||
// Export types
|
||||
export type TestConfig = z.infer<typeof testConfigSchema>;
|
||||
export type TestConfig = z.infer<typeof testConfigSchema>;
|
||||
|
||||
Reference in New Issue
Block a user