Files
范智鹏 e469554691 test: 新增 8 个测试文件 63 用例 + 覆盖率设施,行覆盖 42.58%→48.24%
- 新增 jsp-extractor/report/method-extractor/fix-prompt/registry/provider-chat/import-service/yaml-parser 测试
- .vscode-test.mjs 加 srcDir+coverage,package.json 加 test:coverage,产出 tests/coverage/(html)
- 修复 method-extractor java fallback 取错捕获组、mockDocument.getText 忽略 range
- 更新 tests/test-cases.md(24 文件 179 条)与 test-execution-log.md(覆盖率记录)
2026-08-27 22:54:00 +08:00

86 lines
3.1 KiB
TypeScript

import * as assert from 'assert';
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { getProviders, invalidateProviderCache, getProviderById, getAllProviderMeta } from '../src/ai/registry';
import type { ProviderConfig } from '../src/ai/types';
function cfg(overrides: Partial<ProviderConfig>): ProviderConfig {
return {
id: 'x',
name: 'X',
protocol: 'openai-compatible',
defaultBaseUrl: 'https://api.x.test/v1',
models: ['m1'],
...overrides,
};
}
function writeTempProviders(providers: ProviderConfig[]): string {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'reg-test-'));
fs.writeFileSync(path.join(dir, 'providers.json'), JSON.stringify({ providers }), 'utf8');
return dir;
}
suite('Provider Registry Tests', () => {
setup(() => invalidateProviderCache());
test('returns empty when no extension uri', () => {
assert.deepStrictEqual(getProviders(), []);
});
test('loads builtin providers from extension providers.json', () => {
const dir = writeTempProviders([cfg({ id: 'a', name: 'A' })]);
const uri = vscode.Uri.file(dir);
const providers = getProviders(uri);
assert.strictEqual(providers.length, 1);
assert.strictEqual(providers[0].id, 'a');
fs.rmSync(dir, { recursive: true, force: true });
});
test('caches providers across calls', () => {
const dir = writeTempProviders([cfg({ id: 'b', name: 'B' })]);
const uri = vscode.Uri.file(dir);
const first = getProviders(uri);
fs.rmSync(dir, { recursive: true, force: true });
const second = getProviders(uri);
assert.strictEqual(second, first);
});
test('invalidateProviderCache forces reload', () => {
const dir = writeTempProviders([cfg({ id: 'c', name: 'C' })]);
const uri = vscode.Uri.file(dir);
getProviders(uri);
invalidateProviderCache();
assert.strictEqual(getProviders(uri).length, 1);
fs.rmSync(dir, { recursive: true, force: true });
});
test('returns empty for missing or invalid providers.json', () => {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'reg-test2-'));
const uri = vscode.Uri.file(dir);
assert.deepStrictEqual(getProviders(uri), []);
fs.writeFileSync(path.join(dir, 'providers.json'), 'not json', 'utf8');
invalidateProviderCache();
assert.deepStrictEqual(getProviders(uri), []);
fs.rmSync(dir, { recursive: true, force: true });
});
test('getProviderById finds or misses', () => {
const dir = writeTempProviders([cfg({ id: 'x', name: 'X', models: ['m'] })]);
const uri = vscode.Uri.file(dir);
assert.strictEqual(getProviderById(uri, 'x')?.name, 'X');
assert.strictEqual(getProviderById(uri, 'nope'), undefined);
fs.rmSync(dir, { recursive: true, force: true });
});
test('getAllProviderMeta returns name and models', () => {
const dir = writeTempProviders([cfg({ id: 'p1', name: 'P1', models: ['a', 'b'] })]);
const uri = vscode.Uri.file(dir);
const meta = getAllProviderMeta(uri);
assert.deepStrictEqual(meta.p1, { name: 'P1', models: ['a', 'b'] });
fs.rmSync(dir, { recursive: true, force: true });
});
});