Add unit tests for skill capabilities, skill planner, and UV setup
- Implement tests for random ID generation, ensuring preference for crypto.randomUUID. - Create tests for runtime context capabilities, validating the injection of enabled skill capabilities. - Add tests for skill capability parsing, including classification and command example extraction. - Introduce tests for the skill planner, verifying tool call planning based on user requests and attachment requirements. - Establish tests for UV setup, ensuring proper handling of Python installation scenarios and environment checks.
This commit is contained in:
107
tests/runtime-context-capabilities.test.ts
Normal file
107
tests/runtime-context-capabilities.test.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
// @vitest-environment node
|
||||
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
const mocks = vi.hoisted(() => ({
|
||||
getEnabledSkillCapabilities: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('../electron/gateway/skill-capability-registry', () => ({
|
||||
getEnabledSkillCapabilities: mocks.getEnabledSkillCapabilities,
|
||||
}));
|
||||
|
||||
const spreadsheetCapability = {
|
||||
skillKey: 'minimax-xlsx',
|
||||
slug: 'minimax-xlsx',
|
||||
name: 'MiniMax XLSX',
|
||||
description: 'Analyze spreadsheet files.',
|
||||
enabled: true,
|
||||
category: 'document',
|
||||
allowedTools: [],
|
||||
operationHints: ['read', 'analyze'],
|
||||
triggerHints: ['spreadsheet', 'excel'],
|
||||
inputExtensions: ['.xlsx', '.csv', '.tsv'],
|
||||
requiredEnvVars: [],
|
||||
requiresAuth: false,
|
||||
plannerSummary: 'document skill; operations: read, analyze; inputs: .xlsx, .csv, .tsv',
|
||||
renderHints: {
|
||||
card: 'document-analysis',
|
||||
preferredView: 'table',
|
||||
skillType: 'spreadsheet',
|
||||
},
|
||||
};
|
||||
|
||||
const genericSearchCapability = {
|
||||
skillKey: 'minimax-search',
|
||||
slug: 'minimax-search',
|
||||
name: 'MiniMax Search',
|
||||
description: 'Search across indexed knowledge sources.',
|
||||
enabled: true,
|
||||
category: 'search',
|
||||
allowedTools: ['web.search'],
|
||||
operationHints: ['search', 'retrieve'],
|
||||
triggerHints: ['search', 'lookup'],
|
||||
inputExtensions: [],
|
||||
requiredEnvVars: ['MINIMAX_API_KEY'],
|
||||
requiresAuth: true,
|
||||
plannerSummary: 'search skill; operations: search, retrieve; inputs: text',
|
||||
renderHints: {
|
||||
card: 'search-results',
|
||||
preferredView: 'summary',
|
||||
skillType: 'search',
|
||||
},
|
||||
};
|
||||
|
||||
describe('runtime context capabilities', () => {
|
||||
it('injects enabled skill capabilities into the system runtime context', async () => {
|
||||
mocks.getEnabledSkillCapabilities.mockReturnValue([spreadsheetCapability]);
|
||||
const { buildRuntimeContextMessages } = await import('../electron/gateway/runtime-context');
|
||||
|
||||
const messages = buildRuntimeContextMessages('agent:test:main');
|
||||
|
||||
expect(messages).toHaveLength(1);
|
||||
expect(messages[0]).toEqual(expect.objectContaining({
|
||||
role: 'system',
|
||||
content: expect.stringContaining('Enabled skill capabilities registered for routing/planning'),
|
||||
}));
|
||||
expect(messages[0]?.content).toContain('minimax-xlsx');
|
||||
expect(messages[0]?.content).toContain('inputs=.xlsx,.csv,.tsv');
|
||||
expect(messages[0]?.content).toContain('operations=read,analyze');
|
||||
});
|
||||
|
||||
it('maps a non-spreadsheet skill into the generic registry and runtime capability context', async () => {
|
||||
mocks.getEnabledSkillCapabilities.mockReturnValue([genericSearchCapability]);
|
||||
|
||||
const { mapSkillCapabilitiesToRegistryInputs } = await import('../electron/gateway/chat-tooling');
|
||||
const { buildRuntimeContextMessages } = await import('../electron/gateway/runtime-context');
|
||||
const { createToolRegistry, getRegistryEntryByName } = await import('../electron/gateway/tool-registry');
|
||||
|
||||
const registry = createToolRegistry({
|
||||
capabilities: mapSkillCapabilitiesToRegistryInputs([genericSearchCapability]),
|
||||
});
|
||||
const entry = getRegistryEntryByName(registry, 'minimax-search');
|
||||
|
||||
expect(entry).toEqual(expect.objectContaining({
|
||||
capabilityKey: 'minimax-search',
|
||||
toolName: 'minimax-search',
|
||||
familyKey: 'minimax-search',
|
||||
kind: 'skill',
|
||||
displayName: 'MiniMax Search',
|
||||
requiresFiles: false,
|
||||
}));
|
||||
expect(entry?.metadata).toEqual(expect.objectContaining({
|
||||
category: 'search',
|
||||
requiredEnvVars: ['MINIMAX_API_KEY'],
|
||||
requiresAuth: true,
|
||||
}));
|
||||
|
||||
const messages = buildRuntimeContextMessages('agent:test:main');
|
||||
|
||||
expect(messages[0]?.content).toContain('minimax-search');
|
||||
expect(messages[0]?.content).toContain('category=search');
|
||||
expect(messages[0]?.content).toContain('operations=search,retrieve');
|
||||
expect(messages[0]?.content).toContain('allowedTools=web.search');
|
||||
expect(messages[0]?.content).toContain('env=MINIMAX_API_KEY');
|
||||
expect(messages[0]?.content).toContain('auth=required');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user