// 功能描述:充值页面缺少协议保护和待确认请求恢复;版本:1.0.0。 import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:user_app/data/services/recharge_draft_store.dart'; import 'package:user_app/domain/models/recharge.dart'; import 'package:user_app/domain/models/client_models.dart'; import 'package:user_app/ui/features/wallet/recharge_page.dart'; import '../support/a1_fixture.dart'; class _Store implements RechargeDraftStore { PendingRecharge? draft; @override Future read(String owner) async => draft; @override Future write(String owner, PendingRecharge value) async { draft = value; } @override Future delete(String owner) async { draft = null; } } class _Repo extends A1FixtureRepository { bool failBalanceRefresh = false; int balanceReads = 0; @override Future wallet() async { if (++balanceReads > 1 && failBalanceRefresh) throw StateError('余额断网'); return super.wallet(); } @override Future rechargeDraftOwner() async => 'api#alice'; @override Future rechargeOptions() async => const RechargeOptions( min: 1, max: 500000, channels: [RechargeChannel('alipay', app: true, wap: true)], ); @override Future rechargeResult(String request) async => RechargeRecord( identity: 'one', number: request, amount: 10000, status: 23, channel: 'alipay', createdAt: DateTime(2026), ); } void main() { for (final width in [320.0, 390.0]) { testWidgets('充值页窄屏与放大字体无溢出 $width', (tester) async { tester.view.physicalSize = Size(width, 844); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); await tester.pumpWidget( MaterialApp( builder: (context, child) => MediaQuery( data: MediaQuery.of(context).copyWith(textScaler: const TextScaler.linear(1.3)), child: child!, ), home: RechargePage(repository: _Repo(), store: _Store()), ), ); await tester.pumpAndSettle(); expect(tester.takeException(), isNull); await tester.scrollUntilVisible( find.byType(FilledButton), 200, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); expect(tester.takeException(), isNull); }); } testWidgets('缺少协议不能创建充值,但可恢复并查询已有订单', (tester) async { final store = _Store() ..draft = const PendingRecharge( request: 'request-1', amount: 10000, channel: 'alipay', payType: 'app', ); await tester.pumpWidget( MaterialApp( home: RechargePage(repository: _Repo()..failBalanceRefresh = true, store: store), ), ); await tester.pumpAndSettle(); expect(tester.widget(find.byType(TextField)).enabled, isFalse); await tester.scrollUntilVisible( find.text('查询到账结果'), 250, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); expect(tester.widget(find.byType(FilledButton)).onPressed, isNull); await tester.tap(find.text('查询到账结果')); await tester.pumpAndSettle(); expect(store.draft, isNull); expect(find.text('查询到账结果'), findsNothing); await tester.scrollUntilVisible( find.byType(TextField), -250, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); expect(tester.widget(find.byType(TextField)).enabled, isTrue); await tester.tap(find.byTooltip('清空金额')); await tester.pumpAndSettle(); expect(tester.widget(find.byType(TextField)).controller!.text, isEmpty); await tester.enterText(find.byType(TextField), '200.29'); await tester.pumpAndSettle(); await tester.scrollUntilVisible( find.text('确认充值 ¥200.29'), 250, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); expect(find.text('确认充值 ¥200.29'), findsOneWidget); await tester.scrollUntilVisible( find.text('已到账,余额刷新失败,请重新进入页面刷新'), -250, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); expect(find.text('暂未确认充值结果,请稍后查询'), findsNothing); }); }