@@ -19,6 +19,9 @@ import 'package:echo_loop/database/app_database.dart'
1919 hide AudioItem, Collection;
2020import 'package:echo_loop/database/providers.dart' ;
2121import 'package:echo_loop/features/onboarding_survey/providers/onboarding_survey_provider.dart' ;
22+ import 'package:echo_loop/features/remote_config/remote_config.dart' ;
23+ import 'package:echo_loop/features/user_region/user_region_bootstrapper.dart' ;
24+ import 'package:echo_loop/features/user_region/user_region_providers.dart' ;
2225import 'package:echo_loop/l10n/app_localizations.dart' ;
2326import 'package:echo_loop/main.dart' ;
2427import 'package:echo_loop/models/audio_engine_state.dart' ;
@@ -29,9 +32,13 @@ import 'package:echo_loop/models/sentence.dart';
2932import 'package:echo_loop/database/enums.dart' show LearningStage;
3033import 'package:echo_loop/providers/new_user_guide_provider.dart' ;
3134import 'package:echo_loop/providers/package_info_provider.dart' ;
35+ import 'package:echo_loop/providers/startup_bootstrap_provider.dart' ;
3236import 'package:echo_loop/providers/settings_provider.dart' ;
3337import 'package:echo_loop/providers/audio_library_provider.dart' ;
3438import 'package:echo_loop/providers/collection_provider.dart' ;
39+ import 'package:echo_loop/providers/saved_word_provider.dart' ;
40+ import 'package:echo_loop/providers/saved_sense_group_provider.dart' ;
41+ import 'package:echo_loop/providers/study_task_provider.dart' ;
3542import 'package:echo_loop/providers/tag_provider.dart' ;
3643import 'package:echo_loop/providers/listening_practice/listening_practice_provider.dart' ;
3744import 'package:echo_loop/providers/audio_engine/audio_engine_provider.dart' ;
@@ -45,7 +52,6 @@ import 'package:echo_loop/providers/learning_session/intensive_listen_player_pro
4552import 'package:echo_loop/providers/learning_session/retell_player_provider.dart' ;
4653import 'package:echo_loop/providers/learning_session/review_difficult_practice_provider.dart' ;
4754import 'package:echo_loop/providers/offline_asr_settings_provider.dart' ;
48- import 'package:echo_loop/providers/saved_word_provider.dart' ;
4955import 'package:echo_loop/providers/transcription_task_provider.dart' ;
5056import 'package:echo_loop/router/app_router.dart' ;
5157import 'package:echo_loop/theme/app_theme.dart' ;
@@ -297,6 +303,45 @@ class _DisabledGuideEnabledNotifier extends GuideEnabledNotifier {
297303 }
298304}
299305
306+ /// 完整 App 的路由测试使用已完成的地区决策和失败的本地启动结果。
307+ ///
308+ /// 这样启动门禁会挂载路由树,同时避免测试运行真实数据库初始化、远程配置
309+ /// 请求和本地启动成功后的后台副作用。
310+ List <Override > fullAppRouteTestStartupOverrides () => [
311+ localStartupProvider.overrideWith (_FailedLocalStartupController .new ),
312+ userRegionBootstrapProvider.overrideWith (
313+ (ref) async => const UserRegionBootstrapResult (
314+ isChinaUser: false ,
315+ source: UserRegionDecisionSource .systemFallback,
316+ remoteConfig: RemoteConfig .defaults,
317+ ),
318+ ),
319+ bookmarkListProvider.overrideWith ((ref) => Stream .value (const [])),
320+ savedWordListProvider.overrideWith (_EmptySavedWordList .new ),
321+ savedSenseGroupListProvider.overrideWith (_EmptySavedSenseGroupList .new ),
322+ savedTextIndexProvider.overrideWithValue (const SavedTextIndex .empty ()),
323+ studyRecommendationProvider.overrideWithValue (
324+ const AsyncData <AudioItem ?>(null ),
325+ ),
326+ ];
327+
328+ class _FailedLocalStartupController extends LocalStartupController {
329+ @override
330+ Future <StartupReport > build () async => throw StateError (
331+ 'Local startup is outside the scope of this full-app route test.' ,
332+ );
333+ }
334+
335+ class _EmptySavedWordList extends SavedWordList {
336+ @override
337+ Stream <List <SavedWord >> build () => Stream .value (const []);
338+ }
339+
340+ class _EmptySavedSenseGroupList extends SavedSenseGroupList {
341+ @override
342+ Stream <List <SavedSenseGroup >> build () => Stream .value (const []);
343+ }
344+
300345/// 在 flutter_test 中渲染完整 [EchoLoopApp] 并预置一份音频学习数据。
301346///
302347/// 对应 integration_test 中的 `createTestAppWithAudio` :注入 1 个 AudioItem +
0 commit comments