Files
jiu/client/test/license_orders_tab_test.dart
T

133 lines
4.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jiu_client/core/auth/auth_state.dart';
import 'package:jiu_client/core/theme/themes.dart';
import 'package:jiu_client/models/license.dart';
import 'package:jiu_client/providers/license_provider.dart';
import 'package:jiu_client/providers/license_purchase_provider.dart';
import 'package:jiu_client/screens/license/license_screen.dart';
/// 订单管理 tab 冒烟测试:切到该 tab 能正常渲染 KPI/表格,点击行能打开详情
/// 抽屉且不抛异常(此 tab 无 golden 覆盖,靠本测试兜底基础可用性)。
class _FakeAuth extends AuthNotifier {
_FakeAuth() {
state = const AuthState(
user: AuthUser(
accessToken: 't',
refreshToken: 'r',
id: 1,
username: 'wang',
realName: '王经理',
shopNo: 'S001',
shopId: 1,
role: 'admin'),
);
}
}
class _FakeLicense extends LicenseNotifier {
@override
Future<LicenseInfo?> build() async => LicenseInfo(
id: 1,
type: 'annual',
isActive: true,
maxDevices: 2,
phase: 'normal',
expiresAt: DateTime.now().add(const Duration(days: 100)),
);
}
final _records = [
PurchaseRecord(
outTradeNo: 'pay-20260710101433-9c41f7ae',
productBizCode: 'annual_pro',
amountMinor: 599900,
currency: 'CNY',
amount: '',
status: 'pending',
payUrl: 'https://pay.example.com/checkout/1',
userName: '王老板',
createdAt: DateTime(2026, 7, 10, 10, 14),
),
PurchaseRecord(
outTradeNo: 'pay-20260610093015-4d7a20cf',
productBizCode: 'monthly_pro',
amountMinor: 59900,
currency: 'CNY',
amount: '',
status: 'paid',
payUrl: '',
userName: '王老板',
createdAt: DateTime(2026, 6, 10, 9, 30),
paidAt: DateTime(2026, 6, 10, 9, 31),
renewedTo: DateTime(2027, 6, 4),
),
PurchaseRecord(
outTradeNo: 'pay-20260702174902-b2e85c10',
productBizCode: 'annual_pro',
amountMinor: 599900,
currency: 'CNY',
amount: '',
status: 'failed',
payUrl: '',
userName: '王老板',
createdAt: DateTime(2026, 7, 2, 17, 49),
),
];
class _FakePurchaseList extends PurchaseListNotifier {
@override
Future<PurchaseListResult> build() async => PurchaseListResult(
items: _records,
total: _records.length,
summary: const PurchaseSummary(
paidTotalMinor: 419700,
paidCount: 5,
pendingCount: 1,
totalCount: 7,
),
);
}
Widget _screen() => ProviderScope(
overrides: [
authStateProvider.overrideWith((ref) => _FakeAuth()),
licenseProvider.overrideWith(() => _FakeLicense()),
purchaseListProvider.overrideWith(() => _FakePurchaseList()),
],
child: MaterialApp(
theme: buildTheme('a'),
home: const Scaffold(body: LicenseScreen()),
),
);
void main() {
testWidgets('订单管理 tab:KPI + 表格 + 详情抽屉均正常渲染', (tester) async {
await tester.pumpWidget(_screen());
await tester.pumpAndSettle();
await tester.tap(find.text('订单管理'));
await tester.pumpAndSettle();
// KPI
expect(find.text('订单总数'), findsOneWidget);
expect(find.text('待支付 · 点击筛选'), findsOneWidget);
// 表格行(套餐 + 状态徽章)
expect(find.text('高级版 · 年付'), findsWidgets);
expect(find.text('高级版 · 月付'), findsOneWidget);
expect(find.text('待支付'), findsWidgets);
expect(find.text('已支付'), findsWidgets);
expect(find.text('已关闭'), findsWidgets);
// 点开第一行详情(待支付单):抽屉出现「继续支付」「取消订单」
await tester.tap(find.text('pay-20260710101433-9c41f7ae'));
await tester.pumpAndSettle();
expect(find.text('订单详情'), findsOneWidget);
expect(find.text('继续支付'), findsOneWidget);
expect(find.text('取消订单'), findsOneWidget);
});
}