import { buildSkillEnvSchema, isSkillEnvSchemaEqual, } from '../src/modules/netaclaw/service/skill_env_schema.js'; describe('buildSkillEnvSchema', () => { it('uses skill.config.yaml env as the envSchema source of truth', () => { const schema = buildSkillEnvSchema({ env: [ { name: 'ARK_API_KEY', required: true, description: '火山方舟/豆包 OpenAI-compatible API Key', }, { name: 'DAMAGE_DETECT_MODEL', required: true, default: 'doubao-seed-2-0-pro-260215', description: '用于环车旧伤候选检测的多模态模型 ID', }, ], }); expect(schema).toEqual([ { name: 'ARK_API_KEY', required: true, description: '火山方舟/豆包 OpenAI-compatible API Key', default: undefined, }, { name: 'DAMAGE_DETECT_MODEL', required: true, description: '用于环车旧伤候选检测的多模态模型 ID', default: 'doubao-seed-2-0-pro-260215', }, ]); }); it('returns null when the skill has no env declaration', () => { expect(buildSkillEnvSchema({})).toBeNull(); }); it('preserves empty-string defaults', () => { expect(buildSkillEnvSchema({ env: [ { name: 'OPTIONAL_PREFIX', required: false, default: '', }, ], })).toEqual([ { name: 'OPTIONAL_PREFIX', required: false, description: undefined, default: '', }, ]); }); }); describe('isSkillEnvSchemaEqual', () => { it('treats schemas with the same items as equal', () => { expect(isSkillEnvSchemaEqual( [ { name: 'DAMAGE_DETECT_MODEL', required: true, description: 'model', default: '', }, ], [ { name: 'DAMAGE_DETECT_MODEL', required: true, description: 'model', default: '', }, ], )).toBe(true); }); it('detects schema differences', () => { expect(isSkillEnvSchemaEqual( [ { name: 'DAMAGE_DETECT_MODEL', required: true, description: 'model', default: 'old-model', }, ], [ { name: 'DAMAGE_DETECT_MODEL', required: true, description: 'model', default: 'new-model', }, ], )).toBe(false); }); });