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 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 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); }); }