handlers.test.tsā¢5.93 kB
import { describe, it, expect, vi } from 'vitest';
import { handleGetShortcuts } from './handlers.js';
import type { GetShortcutsParams, DataStore, ShortcutData } from './types.js';
import type { OpusClient } from './opus-client.js';
describe('handleGetShortcuts', () => {
it('should return shortcuts when data is found', async () => {
const mockShortcuts: ShortcutData[] = [
{
os: 'ubuntu',
desktop: null,
application: 'tmux',
file: 'tmux',
categories: [
{
name: 'Pane Management',
shortcuts: [{ keys: 'Prefix + %', description: 'Split pane vertically' }],
},
],
},
];
const mockDataStore: DataStore = {
shortcuts: mockShortcuts,
getByFilters: vi.fn().mockReturnValue(mockShortcuts),
};
const mockOpusClient = {
queryShortcuts: vi.fn().mockResolvedValue('Use Prefix + % to split vertically'),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'ubuntu',
application: 'tmux',
query: 'how to split pane vertically?',
};
const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(mockDataStore.getByFilters).toHaveBeenCalledWith({
os: 'ubuntu',
desktop: undefined,
application: 'tmux',
});
expect(mockOpusClient.queryShortcuts).toHaveBeenCalledWith(
'how to split pane vertically?',
mockShortcuts
);
expect(result).toEqual({
content: [
{
type: 'text',
text: 'Use Prefix + % to split vertically',
},
],
});
});
it('should return error message when no data is found', async () => {
const mockDataStore: DataStore = {
shortcuts: [],
getByFilters: vi.fn().mockReturnValue([]),
};
const mockOpusClient = {
queryShortcuts: vi.fn(),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'windows',
query: 'test query',
};
const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(mockDataStore.getByFilters).toHaveBeenCalledWith({
os: 'windows',
desktop: undefined,
application: undefined,
});
expect(mockOpusClient.queryShortcuts).not.toHaveBeenCalled();
expect(result).toEqual({
content: [
{
type: 'text',
text: 'No shortcut data found for: OS=windows',
},
],
});
});
it('should include desktop and application in error message when provided', async () => {
const mockDataStore: DataStore = {
shortcuts: [],
getByFilters: vi.fn().mockReturnValue([]),
};
const mockOpusClient = {
queryShortcuts: vi.fn(),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
application: 'firefox',
query: 'test query',
};
const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(result.content[0].text).toBe(
'No shortcut data found for: OS=ubuntu, Desktop=gnome, App=firefox'
);
});
it('should filter by os, desktop, and application', async () => {
const mockShortcuts: ShortcutData[] = [
{
os: 'ubuntu',
desktop: 'gnome',
application: 'firefox',
file: 'firefox',
categories: [],
},
];
const mockDataStore: DataStore = {
shortcuts: mockShortcuts,
getByFilters: vi.fn().mockReturnValue(mockShortcuts),
};
const mockOpusClient = {
queryShortcuts: vi.fn().mockResolvedValue('Firefox shortcuts'),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
application: 'firefox',
query: 'new tab',
};
await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(mockDataStore.getByFilters).toHaveBeenCalledWith({
os: 'ubuntu',
desktop: 'gnome',
application: 'firefox',
});
});
it('should handle optional desktop parameter', async () => {
const mockShortcuts: ShortcutData[] = [
{
os: 'ubuntu',
desktop: null,
application: 'vim',
file: 'vim',
categories: [],
},
];
const mockDataStore: DataStore = {
shortcuts: mockShortcuts,
getByFilters: vi.fn().mockReturnValue(mockShortcuts),
};
const mockOpusClient = {
queryShortcuts: vi.fn().mockResolvedValue('Vim shortcuts'),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'ubuntu',
application: 'vim',
query: 'save file',
};
await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(mockDataStore.getByFilters).toHaveBeenCalledWith({
os: 'ubuntu',
desktop: undefined,
application: 'vim',
});
});
it('should pass filtered data to opus client', async () => {
const mockShortcuts: ShortcutData[] = [
{
os: 'ubuntu',
desktop: 'gnome',
application: null,
file: 'window-management',
categories: [
{
name: 'Window Tiling',
shortcuts: [{ keys: 'Super + Left', description: 'Tile left' }],
},
],
},
];
const mockDataStore: DataStore = {
shortcuts: mockShortcuts,
getByFilters: vi.fn().mockReturnValue(mockShortcuts),
};
const mockOpusClient = {
queryShortcuts: vi.fn().mockResolvedValue('Use Super + Left'),
} as unknown as OpusClient;
const params: GetShortcutsParams = {
os: 'ubuntu',
desktop: 'gnome',
query: 'tile window left',
};
await handleGetShortcuts(params, mockDataStore, mockOpusClient);
expect(mockOpusClient.queryShortcuts).toHaveBeenCalledWith(
'tile window left',
mockShortcuts
);
});
});