// account_ia_test.dart — 账户页 IA 结构断言:邀请入口在/语言不在/兑换在。 // // 桌面态(windows 平台 + 宽 surface),经 HomeShell 渲染真实 DesktopShell → AccountPage, // 与 account_desktop_nav_test.dart 同一套 harness。 import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.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/pangolin_theme.dart'; import 'package:pangolin_vpn/screens/account_page.dart'; import 'package:pangolin_vpn/services/token_store.dart'; import 'package:pangolin_vpn/shell/desktop_shell.dart'; import 'package:pangolin_vpn/shell/home_shell.dart'; import 'package:pangolin_vpn/state/app_providers.dart'; import 'package:pangolin_vpn/state/auth_provider.dart'; import 'package:pangolin_vpn/state/navigation_provider.dart'; import '../helpers/harness.dart'; final AppText t = StringsZh(); class _NullTokenStore implements TokenStore { const _NullTokenStore(); @override Future saveTokens({required String access, required String refresh}) async {} @override Future loadAccessToken() async => null; @override Future loadRefreshToken() async => null; @override Future clear() async {} @override Future markOnboarded() async {} @override Future isOnboarded() async => true; @override Future saveLastEmail(String email) async {} @override Future loadLastEmail() async => null; } void main() { setUpAll(disableGoogleFontsFetching); testWidgets('account page IA: invite entry present / language moved out / redeem present', (tester) async { debugDefaultTargetPlatformOverride = TargetPlatform.windows; tester.view.physicalSize = const Size(920, 1400); tester.view.devicePixelRatio = 1.0; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); try { await tester.pumpWidget(ProviderScope( overrides: [ tokenStoreProvider.overrideWithValue(const _NullTokenStore()), vpnBridgeProvider.overrideWithValue(VpnBridgeMock()), appTextProvider.overrideWithValue(t), navViewProvider.overrideWith((ref) => NavView.account), ], child: MaterialApp( debugShowCheckedModeBanner: false, theme: PangolinTheme.light, home: const HomeShell(), ), )); await tester.pumpAndSettle(); expect(find.byType(DesktopShell), findsOneWidget); expect(find.byType(AccountPage), findsOneWidget); // 邀请入口存在(账户页内)。 expect(find.descendant(of: find.byType(AccountPage), matching: find.text(t.inviteEntry)), findsOneWidget); // 语言/主题不在账户页(移到 Settings)。 expect(find.descendant(of: find.byType(AccountPage), matching: find.text(t.language)), findsNothing); // 兑换在账户页(购买&订单&兑换块)。 expect(find.descendant(of: find.byType(AccountPage), matching: find.text(t.redeemEntry)), findsOneWidget); } finally { debugDefaultTargetPlatformOverride = null; } }); }