import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patbond_flutter/core/theme/app_theme.dart'; import 'package:patbond_flutter/features/auth/register_page.dart'; import '../../helpers/auth_test_helpers.dart'; void main() { Future pumpRegister( WidgetTester tester, FakeAuthRepository repository, ) { return tester.pumpWidget( MaterialApp( theme: buildAppTheme(), home: RegisterPage(authRepository: repository), ), ); } testWidgets('渲染四个字段与 helperText,不渲染任何预留区', (tester) async { await pumpRegister(tester, FakeAuthRepository()); expect(find.text('创建账号'), findsOneWidget); expect(find.byType(TextFormField), findsNWidgets(4)); expect(find.text('密码 8–32 位,需包含字母和数字'), findsOneWidget); // ADR-004:短信验证码与第三方登录预留区不渲染。 expect(find.textContaining('验证码'), findsNothing); expect(find.text('注册'), findsOneWidget); expect(find.text('直接登录'), findsOneWidget); }); testWidgets('空表单提交:非空校验拦截,不发请求', (tester) async { final repository = FakeAuthRepository(); await pumpRegister(tester, repository); await tester.tap(find.text('注册')); await tester.pump(); expect(find.text('请输入用户名'), findsOneWidget); expect(find.text('请输入手机号'), findsOneWidget); expect(find.text('密码需 8–32 位,且同时包含字母和数字'), findsOneWidget); expect(repository.registerCalls, 0); }); testWidgets('格式校验:用户名/手机号/密码/确认密码逐项报错', (tester) async { final repository = FakeAuthRepository(); await pumpRegister(tester, repository); await tester.enterText(find.byType(TextFormField).at(0), '1abc'); await tester.enterText(find.byType(TextFormField).at(1), '23800138000'); await tester.enterText(find.byType(TextFormField).at(2), 'abcdefgh'); await tester.enterText(find.byType(TextFormField).at(3), 'abcdefg1'); await tester.tap(find.text('注册')); await tester.pump(); expect(find.text('用户名需 3–20 位,字母开头,可含数字和下划线'), findsOneWidget); expect(find.text('请输入正确的 11 位手机号'), findsOneWidget); expect(find.text('密码需 8–32 位,且同时包含字母和数字'), findsOneWidget); expect(find.text('两次输入的密码不一致'), findsOneWidget); expect(repository.registerCalls, 0); }); testWidgets('全部合法:提交调用注册接口', (tester) async { final repository = FakeAuthRepository(); await pumpRegister(tester, repository); await tester.enterText(find.byType(TextFormField).at(0), 'gunnar'); await tester.enterText(find.byType(TextFormField).at(1), '13800138000'); await tester.enterText(find.byType(TextFormField).at(2), 'passw0rd'); await tester.enterText(find.byType(TextFormField).at(3), 'passw0rd'); await tester.tap(find.text('注册')); await tester.pumpAndSettle(); expect(repository.registerCalls, 1); expect(find.text('两次输入的密码不一致'), findsNothing); }); }