Skip to main content
Glama

Keyboard Shortcuts MCP Server

by jenova-marie
data-loader.test.ts•6.73 kB
import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { loadShortcutData } from './data-loader.js'; import { mkdirSync, writeFileSync, rmSync } from 'fs'; import { join } from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; import type { ShortcutData } from './types.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); describe('loadShortcutData', () => { const testDataDir = join(__dirname, '..', 'test-data'); beforeEach(() => { // Clean up test directory if it exists try { rmSync(testDataDir, { recursive: true, force: true }); } catch (e) { // Ignore if doesn't exist } // Create test data directory mkdirSync(testDataDir, { recursive: true }); }); afterEach(() => { // Clean up after tests rmSync(testDataDir, { recursive: true, force: true }); }); it('should load JSON files from nested directories', () => { // Create test structure const ubuntuDir = join(testDataDir, 'ubuntu', 'apps'); mkdirSync(ubuntuDir, { recursive: true }); const testShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'test-app', file: 'test-app', categories: [ { name: 'Test Category', shortcuts: [{ keys: 'Ctrl + T', description: 'Test shortcut' }], }, ], }; writeFileSync(join(ubuntuDir, 'test-app.json'), JSON.stringify(testShortcut)); const dataStore = loadShortcutData(testDataDir); expect(dataStore.shortcuts).toHaveLength(1); expect(dataStore.shortcuts[0]).toEqual(testShortcut); }); it('should filter shortcuts by OS', () => { const ubuntuDir = join(testDataDir, 'ubuntu'); const macosDir = join(testDataDir, 'macos'); mkdirSync(ubuntuDir, { recursive: true }); mkdirSync(macosDir, { recursive: true }); const ubuntuShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'app1', file: 'app1', categories: [], }; const macosShortcut: ShortcutData = { os: 'macos', desktop: null, application: 'app2', file: 'app2', categories: [], }; writeFileSync(join(ubuntuDir, 'app1.json'), JSON.stringify(ubuntuShortcut)); writeFileSync(join(macosDir, 'app2.json'), JSON.stringify(macosShortcut)); const dataStore = loadShortcutData(testDataDir); const ubuntuOnly = dataStore.getByFilters({ os: 'ubuntu' }); expect(ubuntuOnly).toHaveLength(1); expect(ubuntuOnly[0].os).toBe('ubuntu'); const macosOnly = dataStore.getByFilters({ os: 'macos' }); expect(macosOnly).toHaveLength(1); expect(macosOnly[0].os).toBe('macos'); }); it('should filter shortcuts by desktop', () => { const gnomeDir = join(testDataDir, 'ubuntu', 'desktops', 'gnome'); mkdirSync(gnomeDir, { recursive: true }); const gnomeShortcut: ShortcutData = { os: 'ubuntu', desktop: 'gnome', application: null, file: 'window-management', categories: [], }; const cliShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'tmux', file: 'tmux', categories: [], }; const ubuntuDir = join(testDataDir, 'ubuntu'); mkdirSync(ubuntuDir, { recursive: true }); writeFileSync(join(gnomeDir, 'window-management.json'), JSON.stringify(gnomeShortcut)); writeFileSync(join(ubuntuDir, 'tmux.json'), JSON.stringify(cliShortcut)); const dataStore = loadShortcutData(testDataDir); const gnomeOnly = dataStore.getByFilters({ os: 'ubuntu', desktop: 'gnome' }); expect(gnomeOnly).toHaveLength(1); expect(gnomeOnly[0].desktop).toBe('gnome'); }); it('should filter shortcuts by application', () => { const appsDir = join(testDataDir, 'ubuntu', 'apps'); mkdirSync(appsDir, { recursive: true }); const firefoxShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'firefox', file: 'firefox', categories: [], }; const chromeShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'chrome', file: 'chrome', categories: [], }; writeFileSync(join(appsDir, 'firefox.json'), JSON.stringify(firefoxShortcut)); writeFileSync(join(appsDir, 'chrome.json'), JSON.stringify(chromeShortcut)); const dataStore = loadShortcutData(testDataDir); const firefoxOnly = dataStore.getByFilters({ os: 'ubuntu', application: 'firefox' }); expect(firefoxOnly).toHaveLength(1); expect(firefoxOnly[0].application).toBe('firefox'); }); it('should filter with multiple criteria', () => { const dir = join(testDataDir, 'ubuntu', 'apps'); mkdirSync(dir, { recursive: true }); const shortcut1: ShortcutData = { os: 'ubuntu', desktop: 'gnome', application: 'firefox', file: 'firefox', categories: [], }; const shortcut2: ShortcutData = { os: 'ubuntu', desktop: 'kde', application: 'firefox', file: 'firefox', categories: [], }; writeFileSync(join(dir, 'firefox-gnome.json'), JSON.stringify(shortcut1)); writeFileSync(join(dir, 'firefox-kde.json'), JSON.stringify(shortcut2)); const dataStore = loadShortcutData(testDataDir); const filtered = dataStore.getByFilters({ os: 'ubuntu', desktop: 'gnome', application: 'firefox', }); expect(filtered).toHaveLength(1); expect(filtered[0].desktop).toBe('gnome'); }); it('should ignore non-JSON files', () => { const dir = join(testDataDir, 'ubuntu'); mkdirSync(dir, { recursive: true }); const validShortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'app', file: 'app', categories: [], }; writeFileSync(join(dir, 'valid.json'), JSON.stringify(validShortcut)); writeFileSync(join(dir, 'readme.md'), '# README'); writeFileSync(join(dir, 'config.txt'), 'config'); const dataStore = loadShortcutData(testDataDir); expect(dataStore.shortcuts).toHaveLength(1); expect(dataStore.shortcuts[0].file).toBe('app'); }); it('should return empty array when no filters match', () => { const dir = join(testDataDir, 'ubuntu'); mkdirSync(dir, { recursive: true }); const shortcut: ShortcutData = { os: 'ubuntu', desktop: null, application: 'app', file: 'app', categories: [], }; writeFileSync(join(dir, 'app.json'), JSON.stringify(shortcut)); const dataStore = loadShortcutData(testDataDir); const notFound = dataStore.getByFilters({ os: 'windows' }); expect(notFound).toHaveLength(0); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jenova-marie/keyboard-shortcuts-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server