整个课程和数据UI重新设计版本
This commit is contained in:
@@ -13,7 +13,10 @@ void main() {
|
||||
endpoint: 'https://api.openai.com/v1',
|
||||
model: 'gpt-4o-mini',
|
||||
);
|
||||
expect(uri.toString(), equals('https://api.openai.com/v1/chat/completions'));
|
||||
expect(
|
||||
uri.toString(),
|
||||
equals('https://api.openai.com/v1/chat/completions'),
|
||||
);
|
||||
});
|
||||
|
||||
test('resolves OpenAI endpoint without /v1 to /v1/chat/completions', () {
|
||||
@@ -22,7 +25,10 @@ void main() {
|
||||
endpoint: 'https://api.openai.com',
|
||||
model: 'gpt-4o-mini',
|
||||
);
|
||||
expect(uri.toString(), equals('https://api.openai.com/v1/chat/completions'));
|
||||
expect(
|
||||
uri.toString(),
|
||||
equals('https://api.openai.com/v1/chat/completions'),
|
||||
);
|
||||
});
|
||||
|
||||
test('resolves custom compatible endpoint to /v1/chat/completions', () {
|
||||
@@ -31,7 +37,10 @@ void main() {
|
||||
endpoint: 'https://codex.slcydia.fun/v1',
|
||||
model: 'gpt-4o-mini',
|
||||
);
|
||||
expect(uri.toString(), equals('https://codex.slcydia.fun/v1/chat/completions'));
|
||||
expect(
|
||||
uri.toString(),
|
||||
equals('https://codex.slcydia.fun/v1/chat/completions'),
|
||||
);
|
||||
});
|
||||
|
||||
test('preserves endpoint already ending in /v1/chat/completions', () {
|
||||
@@ -40,7 +49,10 @@ void main() {
|
||||
endpoint: 'https://codex.slcydia.fun/v1/chat/completions',
|
||||
model: 'gpt-4o-mini',
|
||||
);
|
||||
expect(uri.toString(), equals('https://codex.slcydia.fun/v1/chat/completions'));
|
||||
expect(
|
||||
uri.toString(),
|
||||
equals('https://codex.slcydia.fun/v1/chat/completions'),
|
||||
);
|
||||
});
|
||||
|
||||
test('preserves /responses endpoint for OpenAI Responses API support', () {
|
||||
@@ -60,7 +72,9 @@ void main() {
|
||||
);
|
||||
expect(
|
||||
uri.toString(),
|
||||
equals('https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent'),
|
||||
equals(
|
||||
'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent',
|
||||
),
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -84,17 +98,32 @@ void main() {
|
||||
});
|
||||
|
||||
test('handles case-insensitive provider mapping and fallbacks', () {
|
||||
const openAiJson = '{"provider": "openAi", "endpoint": "https://api.openai.com/v1", "model": "gpt-4o"}';
|
||||
expect(AiConfigFile.parse(openAiJson).provider, equals(AiProviderType.openAi));
|
||||
const openAiJson =
|
||||
'{"provider": "openAi", "endpoint": "https://api.openai.com/v1", "model": "gpt-4o"}';
|
||||
expect(
|
||||
AiConfigFile.parse(openAiJson).provider,
|
||||
equals(AiProviderType.openAi),
|
||||
);
|
||||
|
||||
const geminiJson = '{"provider": "GEMINI", "endpoint": "https://generativelanguage.googleapis.com/v1beta", "model": "gemini-2.5-flash"}';
|
||||
expect(AiConfigFile.parse(geminiJson).provider, equals(AiProviderType.gemini));
|
||||
const geminiJson =
|
||||
'{"provider": "GEMINI", "endpoint": "https://generativelanguage.googleapis.com/v1beta", "model": "gemini-2.5-flash"}';
|
||||
expect(
|
||||
AiConfigFile.parse(geminiJson).provider,
|
||||
equals(AiProviderType.gemini),
|
||||
);
|
||||
|
||||
const mockJson = '{"provider": "mock", "endpoint": "", "model": ""}';
|
||||
expect(AiConfigFile.parse(mockJson).provider, equals(AiProviderType.mock));
|
||||
expect(
|
||||
AiConfigFile.parse(mockJson).provider,
|
||||
equals(AiProviderType.mock),
|
||||
);
|
||||
|
||||
const unknownJson = '{"provider": "unknown_provider", "endpoint": "", "model": ""}';
|
||||
expect(AiConfigFile.parse(unknownJson).provider, equals(AiProviderType.compatible));
|
||||
const unknownJson =
|
||||
'{"provider": "unknown_provider", "endpoint": "", "model": ""}';
|
||||
expect(
|
||||
AiConfigFile.parse(unknownJson).provider,
|
||||
equals(AiProviderType.compatible),
|
||||
);
|
||||
});
|
||||
|
||||
test('serializes to JSON correctly', () {
|
||||
@@ -121,10 +150,13 @@ void main() {
|
||||
expect(key, equals('explicit-override'));
|
||||
});
|
||||
|
||||
test('falls back to fallbackApiKey when no explicit or secure key is set', () async {
|
||||
AiService.instance.setFallbackApiKey('config-file-key');
|
||||
final key = await AiService.instance.resolveApiKey();
|
||||
expect(key, equals('config-file-key'));
|
||||
});
|
||||
test(
|
||||
'falls back to fallbackApiKey when no explicit or secure key is set',
|
||||
() async {
|
||||
AiService.instance.setFallbackApiKey('config-file-key');
|
||||
final key = await AiService.instance.resolveApiKey();
|
||||
expect(key, equals('config-file-key'));
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user