Files
platforms/apps/user_app/test/ui/recharge_page_test.dart

134 lines
4.5 KiB
Dart
Raw Normal View History

// 功能描述充值页面缺少协议保护和待确认请求恢复版本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<PendingRecharge?> read(String owner) async => draft;
@override
Future<void> write(String owner, PendingRecharge value) async {
draft = value;
}
@override
Future<void> delete(String owner) async {
draft = null;
}
}
class _Repo extends A1FixtureRepository {
bool failBalanceRefresh = false;
int balanceReads = 0;
@override
Future<WalletSummary> wallet() async {
if (++balanceReads > 1 && failBalanceRefresh) throw StateError('余额断网');
return super.wallet();
}
@override
Future<String> rechargeDraftOwner() async => 'api#alice';
@override
Future<RechargeOptions> rechargeOptions() async => const RechargeOptions(
min: 1,
max: 500000,
channels: [RechargeChannel('alipay', app: true, wap: true)],
);
@override
Future<RechargeRecord> 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<TextField>(find.byType(TextField)).enabled, isFalse);
await tester.scrollUntilVisible(
find.text('查询到账结果'),
250,
scrollable: find.byType(Scrollable).first,
);
await tester.pumpAndSettle();
expect(tester.widget<FilledButton>(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<TextField>(find.byType(TextField)).enabled, isTrue);
await tester.tap(find.byTooltip('清空金额'));
await tester.pumpAndSettle();
expect(tester.widget<TextField>(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);
});
}