test(lint): remove non-null assertions in skills loader tests
This commit is contained in:
+40
-33
@@ -118,6 +118,13 @@ describe('loadSkill', () => {
|
||||
// Objective: verify that a single skill directory is correctly loaded into a Skill object.
|
||||
let tmpDir: string;
|
||||
|
||||
function assertSkill(skill: ReturnType<typeof loadSkill>): NonNullable<ReturnType<typeof loadSkill>> {
|
||||
if (!skill) {
|
||||
throw new Error('Expected skill to be loaded');
|
||||
}
|
||||
return skill;
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
if (tmpDir) {
|
||||
rmSync(tmpDir, { recursive: true, force: true });
|
||||
@@ -138,12 +145,12 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.manifest.name).toBe('my-skill');
|
||||
expect(skill!.manifest.description).toBe('A test skill');
|
||||
expect(skill!.manifest.version).toBe('1.2.0');
|
||||
expect(skill!.instructions).toBe('# My Skill\nDo something useful.');
|
||||
expect(skill!.available).toBe(true);
|
||||
expect(skill!.directory).toBe(skillDir);
|
||||
expect(assertSkill(skill).manifest.name).toBe('my-skill');
|
||||
expect(assertSkill(skill).manifest.description).toBe('A test skill');
|
||||
expect(assertSkill(skill).manifest.version).toBe('1.2.0');
|
||||
expect(assertSkill(skill).instructions).toBe('# My Skill\nDo something useful.');
|
||||
expect(assertSkill(skill).available).toBe(true);
|
||||
expect(assertSkill(skill).directory).toBe(skillDir);
|
||||
});
|
||||
|
||||
it('returns null when SKILL.md is missing', () => {
|
||||
@@ -171,10 +178,10 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'workspace');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.manifest.name).toBe('inferred-skill');
|
||||
expect(skill!.manifest.description).toBe('A useful skill description');
|
||||
expect(skill!.manifest.version).toBe('0.0.0');
|
||||
expect(skill!.manifest.tier).toBe('workspace');
|
||||
expect(assertSkill(skill).manifest.name).toBe('inferred-skill');
|
||||
expect(assertSkill(skill).manifest.description).toBe('A useful skill description');
|
||||
expect(assertSkill(skill).manifest.version).toBe('0.0.0');
|
||||
expect(assertSkill(skill).manifest.tier).toBe('workspace');
|
||||
});
|
||||
|
||||
it('marks skill unavailable when manifest.json has invalid JSON', () => {
|
||||
@@ -188,8 +195,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_json|manifest\.invalid_json/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_json|manifest\.invalid_json/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when manifest.json is missing required fields', () => {
|
||||
@@ -203,8 +210,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/manifest\.missing_required_fields/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/manifest\.missing_required_fields/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when manifest.json has invalid permissions specification', () => {
|
||||
@@ -227,8 +234,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_permissions/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_permissions/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when skill directory contains a symlink', () => {
|
||||
@@ -243,8 +250,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/fs\.symlink/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/fs\.symlink/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when SKILL.md contains prompt injection markers', () => {
|
||||
@@ -256,8 +263,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/prompt\./i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/prompt\./i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when a file exceeds the max size threshold', () => {
|
||||
@@ -272,8 +279,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/fs\.oversize/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/fs\.oversize/i);
|
||||
});
|
||||
|
||||
it('strips markdown heading markers from inferred description', () => {
|
||||
@@ -286,7 +293,7 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.manifest.description).toBe('Heading Skill Title');
|
||||
expect(assertSkill(skill).manifest.description).toBe('Heading Skill Title');
|
||||
});
|
||||
|
||||
it('sets tier from the argument, not from manifest content', () => {
|
||||
@@ -303,7 +310,7 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'managed');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.manifest.tier).toBe('managed');
|
||||
expect(assertSkill(skill).manifest.tier).toBe('managed');
|
||||
});
|
||||
|
||||
it('accepts valid manifest installers definitions', () => {
|
||||
@@ -329,7 +336,7 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.manifest.installers).toHaveLength(4);
|
||||
expect(assertSkill(skill).manifest.installers).toHaveLength(4);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when installers is not an array', () => {
|
||||
@@ -350,8 +357,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_installers/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_installers/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when installer entries are invalid', () => {
|
||||
@@ -375,8 +382,8 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_installers/i);
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons?.join('\n')).toMatch(/manifest\.invalid_installers/i);
|
||||
});
|
||||
|
||||
it('marks skill unavailable when requirements are not met', () => {
|
||||
@@ -398,10 +405,10 @@ describe('loadSkill', () => {
|
||||
const skill = loadSkill(skillDir, 'bundled');
|
||||
|
||||
expect(skill).not.toBeNull();
|
||||
expect(skill!.available).toBe(false);
|
||||
expect(skill!.unavailableReasons).toBeDefined();
|
||||
expect(skill!.unavailableReasons!.length).toBeGreaterThan(0);
|
||||
expect(skill!.unavailableReasons![0]).toContain('nonexistent-binary-xyz123');
|
||||
expect(assertSkill(skill).available).toBe(false);
|
||||
expect(assertSkill(skill).unavailableReasons).toBeDefined();
|
||||
expect((assertSkill(skill).unavailableReasons ?? []).length).toBeGreaterThan(0);
|
||||
expect((assertSkill(skill).unavailableReasons ?? [])[0]).toContain('nonexistent-binary-xyz123');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user