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);
});
});