import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:water_management_app/features/auth/pages/login_page.dart'; import 'package:water_management_app/features/auth/services/auth_provider.dart'; /// LoginPage widget 测试(对应 Issue #79 登录功能)。 /// /// 覆盖:页面渲染、表单校验、密码可见切换、记住用户名复选框。 void main() { // 轻量 AuthProvider 替身:避免触发 TokenService 的 SharedPreferences 依赖 AuthProvider makeAuth() => AuthProvider(); Widget makeApp({required AuthProvider auth}) { return ChangeNotifierProvider( create: (_) => auth, child: const MaterialApp(home: LoginPage()), ); } testWidgets('登录页渲染标题与输入框', (tester) async { await tester.pumpWidget(makeApp(auth: makeAuth())); expect(find.text('供水管理系统'), findsOneWidget); expect(find.text('供水 · 巡检 · 营收'), findsOneWidget); expect(find.widgetWithText(TextFormField, '请输入用户名'), findsOneWidget); expect(find.text('登 录'), findsOneWidget); }); testWidgets('空用户名提交时不通过校验', (tester) async { await tester.pumpWidget(makeApp(auth: makeAuth())); await tester.tap(find.text('登 录')); await tester.pump(); expect(find.text('请输入用户名'), findsOneWidget); }); testWidgets('密码短于6位显示校验错误', (tester) async { await tester.pumpWidget(makeApp(auth: makeAuth())); await tester.enterText(find.byType(TextFormField).first, 'admin'); await tester.enterText(find.byType(TextFormField).last, '123'); await tester.tap(find.text('登 录')); await tester.pump(); expect(find.text('密码长度不能少于6位'), findsOneWidget); }); testWidgets('点击密码可见图标切换 obscureText', (tester) async { await tester.pumpWidget(makeApp(auth: makeAuth())); // 初始密码隐藏 TextFormField pwdField = tester.widget(find.byType(TextFormField).last); expect(pwdField.obscureText, isTrue); await tester.tap(find.byIcon(Icons.visibility_off)); await tester.pump(); pwdField = tester.widget(find.byType(TextFormField).last); expect(pwdField.obscureText, isFalse); // 再次点击恢复隐藏 await tester.tap(find.byIcon(Icons.visibility)); await tester.pump(); pwdField = tester.widget(find.byType(TextFormField).last); expect(pwdField.obscureText, isTrue); }); testWidgets('记住用户名复选框可切换', (tester) async { await tester.pumpWidget(makeApp(auth: makeAuth())); expect(find.text('记住用户名'), findsOneWidget); Checkbox checkbox = tester.widget(find.byType(Checkbox)); expect(checkbox.value, isTrue); // 默认勾选 await tester.tap(find.text('记住用户名')); await tester.pump(); checkbox = tester.widget(find.byType(Checkbox)); expect(checkbox.value, isFalse); }); }