import 'package:eaimar/data/models/appconfig.dart'; import 'package:eaimar/data/models/appconfig_model.dart'; import 'package:flutter_test/flutter_test.dart'; /// AppConfig.cred 的取值口径:thirdsvcs 的 (服务 id, 字段) 优先,退回 env[老键名],两边都没有 → null。 /// 各业务服务 2026-09-14 起都改走它;口径错了表现为「某个能力鉴权失败」,不报配置错误。 void main() { UserGetAppConfigResp build({Map env = const {}, List svcs = const []}) => UserGetAppConfigResp(env: env, agents: const [], mcps: const {}, products: const [], thirdsvcs: svcs); test('thirdsvcs 有值时优先于 env', () { AppConfig.initialize(build( env: {'AZURE_SPEECH_KEY': 'from-env'}, svcs: [ThirdSvc(id: 'stt_azure', name: '', provider: 'azure', categories: '1', fields: {'subscription_key': 'from-svc'})], )); expect(AppConfig.cred('stt_azure', 'subscription_key', 'AZURE_SPEECH_KEY'), 'from-svc'); expect(AppConfig.usingThirdSvcs, isTrue); }); test('thirdsvcs 没有该服务/字段或为空串 → 退回 env', () { AppConfig.initialize(build( env: {'AZURE_SPEECH_KEY': 'from-env'}, svcs: [ThirdSvc(id: 'stt_azure', name: '', provider: 'azure', categories: '1', fields: {'subscription_key': ' '})], )); expect(AppConfig.cred('stt_azure', 'subscription_key', 'AZURE_SPEECH_KEY'), 'from-env'); expect(AppConfig.cred('mt_azure', 'subscription_key', 'AZURE_SPEECH_KEY'), 'from-env'); }); test('两边都没有 → null(空串也算没有),调用方的 ?? 默认值才能生效', () { AppConfig.initialize(build(env: {'AZURE_TRANSLATION_ENDPOINT': ''})); expect(AppConfig.cred('mt_azure', 'endpoint', 'AZURE_TRANSLATION_ENDPOINT'), isNull); expect(AppConfig.cred('mt_azure', 'endpoint', 'AZURE_TRANSLATION_ENDPOINT') ?? 'default', 'default'); expect(AppConfig.usingThirdSvcs, isFalse); }); test('svcsByCategory 按逗号整项比对', () { AppConfig.initialize(build(svcs: [ ThirdSvc(id: 'a', name: '', provider: '', categories: '1', fields: {}), ThirdSvc(id: 'b', name: '', provider: '', categories: '10,11', fields: {}), ])); expect(AppConfig.svcsByCategory(1).map((s) => s.id), ['a']); expect(AppConfig.svcsByCategory(11).map((s) => s.id), ['b']); }); }