import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:jiu_client/core/auth/auth_state.dart'; import 'package:jiu_client/providers/connectivity_provider.dart'; import 'package:jiu_client/repositories/auth_repository.dart'; import 'package:jiu_client/screens/auth/login_screen.dart'; import 'package:shared_preferences/shared_preferences.dart'; Widget _buildApp() { final router = GoRouter( initialLocation: '/login', routes: [ GoRoute( path: '/login', builder: (_, __) => const LoginScreen(), ), GoRoute( path: '/stock-in', builder: (_, __) => const Scaffold(body: Text('stock-in home')), ), ], ); return ProviderScope( overrides: [ connectivityProvider.overrideWith( (_) => ConnectivityNotifier(skipInit: true), ), ], child: MaterialApp.router(routerConfig: router), ); } void main() { setUp(() { SharedPreferences.setMockInitialValues({}); AuthRepository.loginOverride = null; }); tearDown(() { AuthRepository.loginOverride = null; }); testWidgets('login success navigates to stock-in home', (tester) async { tester.view.physicalSize = const Size(1280, 800); tester.view.devicePixelRatio = 1.0; addTearDown(tester.view.resetPhysicalSize); AuthRepository.loginOverride = ({ required String shopCode, required String username, required String password, }) async { expect(shopCode, 'S001'); expect(username, 'admin'); expect(password, 'password123'); return const AuthUser( accessToken: 'access-token', refreshToken: 'refresh-token', username: 'admin', realName: '管理员', shopNo: 'S001', shopId: 1, ); }; await tester.pumpWidget(_buildApp()); await tester.pumpAndSettle(); await tester.enterText( find.widgetWithText(TextFormField, '请输入门店编号'), 'S001', ); await tester.enterText( find.widgetWithText(TextFormField, '请输入用户名'), 'admin', ); await tester.enterText( find.widgetWithText(TextFormField, '请输入密码'), 'password123', ); await tester.tap(find.text('登 录')); await tester.pump(); await tester.pumpAndSettle(); expect(find.text('stock-in home'), findsOneWidget); }); }