skill-registry.test.js 2.6 KB
/**
 * Unit Tests — skill-registry.js
 */
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import fs from 'fs';

describe('SkillRegistry', () => {
  let SkillRegistry, registry;
  const TEST_DB_PATH = '/tmp/test-registry-db.sqlite';
  const SKILLS_DIR = '/tmp/test-registry-skills';

  beforeAll(() => {
    if (fs.existsSync(TEST_DB_PATH)) fs.unlinkSync(TEST_DB_PATH);
    fs.mkdirSync(SKILLS_DIR, { recursive: true });
    process.env.SKILLS_DB_PATH = TEST_DB_PATH;
    delete require.cache[require.resolve('../../services/skill-db')];
    delete require.cache[require.resolve('../../services/skill-registry')];
    ({ SkillRegistry } = require('../../services/skill-registry'));
    registry = new SkillRegistry(SKILLS_DIR);
  });

  afterAll(() => {
    try { fs.unlinkSync(TEST_DB_PATH); } catch {}
    try { fs.rmSync(SKILLS_DIR, { recursive: true }); } catch {}
  });

  it('should register a skill', () => {
    const skill = registry.registerSkill({
      skillName: 'registry_test_skill', description: 'Test', domain: 'test',
    });
    expect(skill.skillName).toBe('registry_test_skill');
  });

  it('should get a skill', () => {
    const skill = registry.getSkill('registry_test_skill');
    expect(skill).toBeDefined();
    expect(skill.description).toBe('Test');
  });

  it('should list skills', () => {
    const skills = registry.listSkills();
    expect(skills.length).toBeGreaterThanOrEqual(1);
  });

  it('should update a skill', () => {
    const updated = registry.updateSkill('registry_test_skill', { description: 'Updated' });
    expect(updated.description).toBe('Updated');
  });

  it('should search skills', () => {
    const results = registry.searchSkills('test');
    expect(results.length).toBeGreaterThanOrEqual(0); // FTS may not index immediately
  });

  it('should bump version', () => {
    const updated = registry.bumpVersion('registry_test_skill', 'minor');
    expect(updated.version).toBeDefined();
  });

  it('should increment use count', () => {
    expect(() => registry.incrementUseCount('registry_test_skill')).not.toThrow();
  });

  it('should increment download count', () => {
    expect(() => registry.incrementDownloadCount('registry_test_skill')).not.toThrow();
  });

  it('toPublicInfo should return skill info', () => {
    const skill = registry.getSkill('registry_test_skill');
    const pub = SkillRegistry.toPublicInfo(skill);
    expect(pub.skillName).toBe('registry_test_skill');
  });

  it('should remove a skill', () => {
    expect(registry.removeSkill('registry_test_skill')).toBe(true);
    expect(registry.getSkill('registry_test_skill')).toBeNull();
  });
});