import { describe, expect, test } from 'bun:test'; import { cloneCodexModelConfiguration, codexContextSourceHint, sameCodexModelConfiguration, toggleCodexReasoningLevel, validateCodexModelConfiguration, type CodexModelConfiguration, type CodexCatalogEditorModel, } from '../src/services/codexModelCatalog'; const configuration = (): CodexModelConfiguration => ({ display_name: 'Third Party', description: null, context_window: 128_000, max_context_window: 128_000, effective_context_window_percent: 95, auto_compact_token_limit: null, default_reasoning_level: 'medium', supported_reasoning_levels: [ { effort: 'low', description: 'Low' }, { effort: 'medium', description: 'Medium' }, { effort: 'high', description: 'High' }, ], input_modalities: ['text', 'image'], visibility: 'list', supports_parallel_tool_calls: false, }); describe('Codex 模型列表编辑', () => { test("区分 Codex 客户端 API、模板后备与自定义上下文", () => { const model: CodexCatalogEditorModel = { slug: "model-a", hasOfficialTemplate: true, customized: false, contextSource: "client", configuration: configuration(), defaults: configuration(), }; expect(codexContextSourceHint(model)).toBe("agents.catalog.contextSource.client"); expect(codexContextSourceHint({ ...model, contextSource: "template" })) .toBe("agents.catalog.contextSource.template"); model.configuration.context_window = 64_000; expect(codexContextSourceHint(model)).toBe("agents.catalog.contextSource.customized"); model.configuration = cloneCodexModelConfiguration(model.defaults); expect(codexContextSourceHint(model)).toBe("agents.catalog.contextSource.client"); }); test('克隆配置时隔离数组字段', () => { const original = configuration(); const cloned = cloneCodexModelConfiguration(original); cloned.supported_reasoning_levels[0].description = 'Changed'; cloned.input_modalities.pop(); expect(original.supported_reasoning_levels[0].description).toBe('Low'); expect(original.input_modalities).toEqual(['text', 'image']); expect(sameCodexModelConfiguration(original, cloned)).toBeFalse(); }); test('移除默认思考等级时选择剩余可用等级', () => { const updated = toggleCodexReasoningLevel(configuration(), 'medium', false, []); expect(updated.supported_reasoning_levels.map((level) => level.effort)).toEqual(['low', 'high']); expect(updated.default_reasoning_level).toBe('low'); }); test('校验上下文、压缩阈值和输入类型', () => { expect(validateCodexModelConfiguration(configuration())).toBeNull(); expect(validateCodexModelConfiguration({ ...configuration(), max_context_window: 64_000 })) .toBe('agents.catalog.invalidMaximum'); expect(validateCodexModelConfiguration({ ...configuration(), auto_compact_token_limit: 200_000 })) .toBe('agents.catalog.invalidCompact'); expect(validateCodexModelConfiguration({ ...configuration(), input_modalities: [] })) .toBe('agents.catalog.invalidModalities'); }); });