134 lines
4.5 KiB
Dart
134 lines
4.5 KiB
Dart
|
|
// 功能描述:充值页面缺少协议保护和待确认请求恢复;版本: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);
|
|||
|
|
});
|
|||
|
|
}
|