已完成用户APP首期功能开发
交付用户端首期页面、配套接口、后台资源及测试文档。用户APP构建、静态分析和三个管理后台构建通过;完整测试仍有2项失败,后端模型注释检查未通过,详见交付记录。
This commit is contained in:
133
apps/user_app/test/ui/recharge_page_test.dart
Normal file
133
apps/user_app/test/ui/recharge_page_test.dart
Normal file
@@ -0,0 +1,133 @@
|
||||
// 功能描述:充值页面缺少协议保护和待确认请求恢复;版本: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);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user