Tạo class LoginPage đặt tên tập tin là login_page.dart với nội dung sau:
class LoginPage extends StatefulWidget {
final String title;
const LoginPage({super.key, required this.title});
@override
State<StatefulWidget> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
String? _msg;
TextEditingController _emailController = TextEditingController();
TextEditingController _passwordController = TextEditingController();
var _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
validator: _validateEmail,
key: Key("email"),
controller: _emailController,
decoration: InputDecoration(labelText: 'Email'),
),
TextFormField(
validator: _validatePassword,
key: Key("password"),
controller: _passwordController,
decoration: InputDecoration(labelText: 'Password'),
),
ElevatedButton(
key: Key("login"),
onPressed: _login,
child: Text('Login'),
),
if (_msg != null) Text(_msg!),
],
),
),
);
}
String? _validatePassword(String? password) {
if (password == null || password.isEmpty) return "Please enter password";
if (password.length < 3) return "Please enter password min 3 character";
return null;
}
String? _validateEmail(String? email) {
if (email == null || email.isEmpty) return "Please enter email";
RegExp regExp = RegExp(r'^[a-z][a-z0-9]+@[a-z0-9]{2,}(\.[a-z]{2,})+$');
return regExp.hasMatch(email) ? null : "Email invalid";
}
void _login() {
if (_formKey.currentState!.validate()) {
String email = _emailController.text.trim();
String password = _passwordController.text.trim();
setState(() {
if (email == "thanh@ceb.net.vn" && password == "123") {
_msg = "Login Success";
} else {
_msg = "Login Failed";
}
});
}
}
}
Tạo file login_page_test.dart với nội dung như sau:
void main() {
testWidgets('Login Page Test Success', (tester) async {
await tester.pumpWidget(
const MaterialApp(home: LoginPage(title: 'Login Page')),
);
await tester.enterText(find.byKey(const Key('email')), "thanh@ceb.net.vn");
await tester.enterText(find.byKey(const Key("password")), '123');
await tester.tap(find.byKey(const Key('login')));
await tester.pump();
expect(find.text('Login Success'), findsOneWidget);
});
}