integration.test.ts•7.13 kB
import { describe, it, expect } from 'vitest';
import { loadShortcutData } from './data-loader.js';
import { OpusClient } from './opus-client.js';
import { handleGetShortcuts } from './handlers.js';
import type { GetShortcutsParams } from './types.js';
describe.skipIf(!process.env.ANTHROPIC_API_KEY)('Full Integration Test', () => {
it('should handle complete flow: load data → filter → query Opus → return response', async () => {
// 1. Load real data
const dataStore = loadShortcutData();
expect(dataStore.shortcuts.length).toBeGreaterThan(0);
// 2. Create real Opus client
const opusClient = new OpusClient();
// 3. Test tmux query (CLI tool)
const tmuxParams: GetShortcutsParams = {
os: 'ubuntu',
application: 'tmux',
query: 'how do I split a pane vertically?',
};
const tmuxResult = await handleGetShortcuts(tmuxParams, dataStore, opusClient);
expect(tmuxResult.content).toHaveLength(1);
expect(tmuxResult.content[0].type).toBe('text');
expect(tmuxResult.content[0].text.toLowerCase()).toContain('vertical');
expect(tmuxResult.content[0].text).toContain('Prefix');
console.log('\n✅ Tmux integration test result:');
console.log(tmuxResult.content[0].text);
});
it('should handle desktop environment shortcuts', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
const gnomeParams: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
query: 'tile window to the left',
};
const gnomeResult = await handleGetShortcuts(gnomeParams, dataStore, opusClient);
expect(gnomeResult.content).toHaveLength(1);
expect(gnomeResult.content[0].type).toBe('text');
expect(gnomeResult.content[0].text.toLowerCase()).toContain('left');
expect(gnomeResult.content[0].text).toContain('Super');
console.log('\n✅ GNOME integration test result:');
console.log(gnomeResult.content[0].text);
});
it('should handle application-specific shortcuts', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
const firefoxParams: GetShortcutsParams = {
os: 'ubuntu',
application: 'firefox',
query: 'open a new tab',
};
const firefoxResult = await handleGetShortcuts(firefoxParams, dataStore, opusClient);
expect(firefoxResult.content).toHaveLength(1);
expect(firefoxResult.content[0].type).toBe('text');
expect(firefoxResult.content[0].text.toLowerCase()).toMatch(/tab|ctrl/);
console.log('\n✅ Firefox integration test result:');
console.log(firefoxResult.content[0].text);
});
it('should return error message for unsupported OS', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
const windowsParams: GetShortcutsParams = {
os: 'windows',
query: 'test query',
};
const windowsResult = await handleGetShortcuts(windowsParams, dataStore, opusClient);
expect(windowsResult.content).toHaveLength(1);
expect(windowsResult.content[0].type).toBe('text');
expect(windowsResult.content[0].text).toContain('No shortcut data found');
expect(windowsResult.content[0].text).toContain('OS=windows');
console.log('\n✅ Unsupported OS test result:');
console.log(windowsResult.content[0].text);
});
it('should return error message for unsupported application', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
const params: GetShortcutsParams = {
os: 'ubuntu',
application: 'nonexistent-app',
query: 'test query',
};
const result = await handleGetShortcuts(params, dataStore, opusClient);
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
expect(result.content[0].text).toContain('No shortcut data found');
expect(result.content[0].text).toContain('App=nonexistent-app');
});
it('should handle complex multi-parameter queries', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
const complexParams: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
application: 'firefox',
query: 'open developer tools',
};
const result = await handleGetShortcuts(complexParams, dataStore, opusClient);
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
expect(result.content[0].text.length).toBeGreaterThan(0);
console.log('\n✅ Complex query integration test result:');
console.log(result.content[0].text);
});
it('should verify data filtering works correctly', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
// Get all ubuntu shortcuts
const allUbuntu = dataStore.getByFilters({ os: 'ubuntu' });
expect(allUbuntu.length).toBeGreaterThan(20);
// Get only tmux shortcuts
const onlyTmux = dataStore.getByFilters({ os: 'ubuntu', application: 'tmux' });
expect(onlyTmux.length).toBe(1);
expect(onlyTmux[0].application).toBe('tmux');
// Get only GNOME shortcuts
const onlyGnome = dataStore.getByFilters({ os: 'ubuntu', desktop: 'gnome' });
expect(onlyGnome.length).toBeGreaterThan(0);
onlyGnome.forEach(item => {
expect(item.desktop).toBe('gnome');
});
console.log('\n✅ Data filtering verification:');
console.log(` - Total Ubuntu shortcuts: ${allUbuntu.length}`);
console.log(` - Tmux shortcuts: ${onlyTmux.length}`);
console.log(` - GNOME shortcuts: ${onlyGnome.length}`);
});
it('should demonstrate end-to-end workflow with different query types', async () => {
const dataStore = loadShortcutData();
const opusClient = new OpusClient();
// Test 1: General query about window management
const windowQuery: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
query: 'maximize window',
};
const windowResult = await handleGetShortcuts(windowQuery, dataStore, opusClient);
expect(windowResult.content[0].text).toBeTruthy();
// Test 2: Specific application feature query
const vimQuery: GetShortcutsParams = {
os: 'ubuntu',
application: 'vim',
query: 'save and quit',
};
const vimResult = await handleGetShortcuts(vimQuery, dataStore, opusClient);
expect(vimResult.content[0].text).toBeTruthy();
// Test 3: CLI tool session management
const screenQuery: GetShortcutsParams = {
os: 'ubuntu',
application: 'screen',
query: 'detach session',
};
const screenResult = await handleGetShortcuts(screenQuery, dataStore, opusClient);
expect(screenResult.content[0].text).toBeTruthy();
console.log('\n✅ End-to-end workflow results:');
console.log('1. Window management:', windowResult.content[0].text.substring(0, 100) + '...');
console.log('2. Vim command:', vimResult.content[0].text.substring(0, 100) + '...');
console.log('3. Screen session:', screenResult.content[0].text.substring(0, 100) + '...');
});
});