From 0f053859959f31cd894430644a67f3ac48241b9e Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Wed, 8 Jul 2026 08:41:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(client/test):=20pin=20zh=20locale=20?= =?UTF-8?q?=E4=BF=AE=20i18n=20=E9=BB=98=E8=AE=A4=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E5=90=8E=E5=A4=B1=E9=85=8D=E7=9A=84=E5=8D=95=E6=B5=8B/?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 早前 i18n 把默认语种改英文(localeProvider 默认 AppLang.en),但这几个测试硬编码 const t = StringsZh() 中文预期,被测代码经 appTextProvider 渲染英文 → 断言失配 (既存 broken,先于 ds-flow;DinD 修复后 Flutter test job 才跑到暴露)。 修:各失败测试的 ProviderScope/Container overrides 加 localeProvider.overrideWith((ref) => _FixedLocale(AppLang.zh)),把被测代码钉回 中文(与硬编码 StringsZh 预期一致)。只动测试文件,未碰 lib/golden/test_config。 - connection_watchdog_test(节点异常提示 / 免费额度归零切断) - node_connect_confirm_test(点节点/智能卡弹确认取消不切换) - stats_page_test(PeriodCard 周期卡中文标签) 容器复跑 test/unit+widget+contract:+97 All passed。 Co-Authored-By: Claude Opus 4.8 --- client/test/unit/connection_watchdog_test.dart | 10 ++++++++++ client/test/widget/node_connect_confirm_test.dart | 10 ++++++++++ client/test/widget/stats_page_test.dart | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/client/test/unit/connection_watchdog_test.dart b/client/test/unit/connection_watchdog_test.dart index 1eebd2c..a162c7c 100644 --- a/client/test/unit/connection_watchdog_test.dart +++ b/client/test/unit/connection_watchdog_test.dart @@ -8,14 +8,23 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_provider.dart'; +import 'package:pangolin_vpn/l10n/app_text.dart'; import 'package:pangolin_vpn/l10n/strings_zh.dart'; import 'package:pangolin_vpn/models/node.dart'; import 'package:pangolin_vpn/services/connect_api.dart'; import 'package:pangolin_vpn/services/device_identity.dart'; +import 'package:pangolin_vpn/state/app_providers.dart'; import 'package:pangolin_vpn/state/connection_provider.dart'; import 'package:pangolin_vpn/state/nodes_provider.dart'; import 'package:pangolin_vpn/state/quota_provider.dart'; +// localeProvider 现默认英文;测试硬编码 StringsZh 预期 → 钉死中文 locale。 +class _FixedLocale extends LocaleNotifier { + _FixedLocale(AppLang lang) { + state = lang; + } +} + // 可控假桥:能手动推 VpnStatus,无内部计时器(避免 pending timer)。 class _FakeBridge implements VpnBridge { final _status = StreamController.broadcast(); @@ -94,6 +103,7 @@ void main() { ProviderContainer makeContainer(_FakeBridge bridge, {NodesNotifier Function()? nodes, DateTime Function()? now}) => ProviderContainer(overrides: [ + localeProvider.overrideWith((ref) => _FixedLocale(AppLang.zh)), vpnBridgeProvider.overrideWithValue(bridge), nodesProvider.overrideWith(nodes ?? _StubNodes.new), deviceIdentityProvider.overrideWithValue(DeviceIdentity(store: _MemKV())), diff --git a/client/test/widget/node_connect_confirm_test.dart b/client/test/widget/node_connect_confirm_test.dart index e1e1395..7746fb1 100644 --- a/client/test/widget/node_connect_confirm_test.dart +++ b/client/test/widget/node_connect_confirm_test.dart @@ -8,10 +8,12 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_mock.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_provider.dart'; +import 'package:pangolin_vpn/l10n/app_text.dart'; import 'package:pangolin_vpn/l10n/strings_zh.dart'; import 'package:pangolin_vpn/models/node.dart'; import 'package:pangolin_vpn/pangolin_theme.dart'; import 'package:pangolin_vpn/screens/nodes_page.dart'; +import 'package:pangolin_vpn/state/app_providers.dart'; import 'package:pangolin_vpn/state/connection_provider.dart'; import 'package:pangolin_vpn/state/nodes_provider.dart'; import 'package:pangolin_vpn/widgets/smart_select_card.dart'; @@ -31,11 +33,19 @@ const _nodes = [ Node(code: 'JP', nameZh: '东京', nameEn: 'Tokyo', ping: 35, uuid: 'jp-uuid', host: 'jp', port: 443), ]; +// localeProvider 现默认英文;测试硬编码 StringsZh 预期 → 钉死中文 locale。 +class _FixedLocale extends LocaleNotifier { + _FixedLocale(AppLang lang) { + state = lang; + } +} + void main() { setUpAll(disableGoogleFontsFetching); const t = StringsZh(); ProviderContainer makeContainer(VpnBridge bridge) => ProviderContainer(overrides: [ + localeProvider.overrideWith((ref) => _FixedLocale(AppLang.zh)), nodesProvider.overrideWith(_StubNodes.new), vpnBridgeProvider.overrideWithValue(bridge), ]); diff --git a/client/test/widget/stats_page_test.dart b/client/test/widget/stats_page_test.dart index ac95eb1..865bc95 100644 --- a/client/test/widget/stats_page_test.dart +++ b/client/test/widget/stats_page_test.dart @@ -13,6 +13,7 @@ import 'package:http/http.dart' as http; import 'package:http/testing.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_mock.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_provider.dart'; +import 'package:pangolin_vpn/l10n/app_text.dart'; import 'package:pangolin_vpn/l10n/strings_zh.dart'; import 'package:pangolin_vpn/models/node.dart'; import 'package:pangolin_vpn/pangolin_theme.dart'; @@ -20,6 +21,7 @@ import 'package:pangolin_vpn/screens/stats_page.dart'; import 'package:pangolin_vpn/services/api_client.dart'; import 'package:pangolin_vpn/services/token_store.dart'; import 'package:pangolin_vpn/state/account_providers.dart'; +import 'package:pangolin_vpn/state/app_providers.dart'; import 'package:pangolin_vpn/state/auth_provider.dart'; import 'package:pangolin_vpn/state/nodes_provider.dart'; import 'package:pangolin_vpn/widgets/period_card.dart'; @@ -101,6 +103,13 @@ Finder _metric(String period, int i, String value, String unit) => find.byWidget w.metrics[i].unit == unit, ); +// localeProvider 现默认英文;测试硬编码 StringsZh 预期 → 钉死中文 locale。 +class _FixedLocale extends LocaleNotifier { + _FixedLocale(AppLang lang) { + state = lang; + } +} + void main() { setUpAll(disableGoogleFontsFetching); const t = StringsZh(); @@ -111,6 +120,7 @@ void main() { await tester.pumpWidget(ProviderScope( overrides: [ + localeProvider.overrideWith((ref) => _FixedLocale(AppLang.zh)), tokenStoreProvider.overrideWithValue(const _LoggedInTokenStore()), apiClientProvider.overrideWithValue(ApiClient( baseUrl: 'http://test.local',