import 'package:eatvio_app/core/prefs.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/features/registration/presentation/pages/name_screen.dart'; import 'package:eatvio_app/features/registration/repositories/registration_repository.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'name_screen_test.mocks.dart'; @GenerateMocks([RegistrationRepository, Prefs]) void main() { group('NameScreen', () { late MockRegistrationRepository mockRegistrationRepository; late RegistrationCubit registrationCubit; setUp(() { mockRegistrationRepository = MockRegistrationRepository(); registrationCubit = RegistrationCubit( registrationRepository: mockRegistrationRepository, prefs: MockPrefs(), ); }); tearDown(() { registrationCubit.close(); }); Widget createTestWidget(UserRegistrationSheet sheet) { return MaterialApp( theme: ThemeHelper().themeData(), localizationsDelegates: const [ S.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [Locale('ru')], home: Scaffold( body: BlocProvider( create: (context) => registrationCubit, child: NameScreen(sheet: sheet), ), ), ); } testWidgets('displays screen with initial first and last name from sheet', (WidgetTester tester) async { const sheet = UserRegistrationSheet( firstName: 'John', lastName: 'Doe', email: 'john@example.com', password: 'password123', passwordConfirmation: 'password123', birthdate: '1990-01-01', gender: 'male', location: 'Moscow', responseBody: '{}', lang: 'ru', weight: 75, height: 180, phone: '+1234567890', chestCircumference: 100, waistCircumference: 80, hipCircumference: 90, bloodPressureUp: 120, bloodPressureDown: 80, hasHypo: 0, hasHyper: 0, aboutAllergy: 'None', aboutTakingPils: 'None', aboutSportHobbies: 'Running', favoriteFoods: 'Pizza', unfavoriteFoods: 'Broccoli', additionalInfo: 'No additional info', ); await tester.pumpWidget(createTestWidget(sheet)); await tester.pumpAndSettle(); expect(find.text('John'), findsOneWidget); expect(find.text('Doe'), findsOneWidget); }); testWidgets('displays empty fields when names are empty', (WidgetTester tester) async { const sheet = UserRegistrationSheet( firstName: '', lastName: '', email: 'john@example.com', password: 'password123', passwordConfirmation: 'password123', birthdate: '1990-01-01', gender: 'male', location: 'Moscow', responseBody: '{}', lang: 'ru', weight: 75, height: 180, phone: '+1234567890', chestCircumference: 100, waistCircumference: 80, hipCircumference: 90, bloodPressureUp: 120, bloodPressureDown: 80, hasHypo: 0, hasHyper: 0, aboutAllergy: 'None', aboutTakingPils: 'None', aboutSportHobbies: 'Running', favoriteFoods: 'Pizza', unfavoriteFoods: 'Broccoli', additionalInfo: 'No additional info', ); await tester.pumpWidget(createTestWidget(sheet)); await tester.pumpAndSettle(); final textFields = find.byType(TextField); expect(textFields, findsNWidgets(2)); }); testWidgets('displays hint texts', (WidgetTester tester) async { const sheet = UserRegistrationSheet( firstName: '', lastName: '', email: 'john@example.com', password: 'password123', passwordConfirmation: 'password123', birthdate: '1990-01-01', gender: 'male', location: 'Moscow', responseBody: '{}', lang: 'ru', weight: 75, height: 180, phone: '+1234567890', chestCircumference: 100, waistCircumference: 80, hipCircumference: 90, bloodPressureUp: 120, bloodPressureDown: 80, hasHypo: 0, hasHyper: 0, aboutAllergy: 'None', aboutTakingPils: 'None', aboutSportHobbies: 'Running', favoriteFoods: 'Pizza', unfavoriteFoods: 'Broccoli', additionalInfo: 'No additional info', ); await tester.pumpWidget(createTestWidget(sheet)); await tester.pumpAndSettle(); expect(find.text('Введите имя'), findsOneWidget); expect(find.text('Введите фамилию'), findsOneWidget); }); testWidgets('updates registration cubit when first name changes', (WidgetTester tester) async { const sheet = UserRegistrationSheet( firstName: 'John', lastName: 'Doe', email: 'john@example.com', password: 'password123', passwordConfirmation: 'password123', birthdate: '1990-01-01', gender: 'male', location: 'Moscow', responseBody: '{}', lang: 'ru', weight: 75, height: 180, phone: '+1234567890', chestCircumference: 100, waistCircumference: 80, hipCircumference: 90, bloodPressureUp: 120, bloodPressureDown: 80, hasHypo: 0, hasHyper: 0, aboutAllergy: 'None', aboutTakingPils: 'None', aboutSportHobbies: 'Running', favoriteFoods: 'Pizza', unfavoriteFoods: 'Broccoli', additionalInfo: 'No additional info', ); await tester.pumpWidget(createTestWidget(sheet)); await tester.pumpAndSettle(); final textFields = find.byType(TextField); expect(textFields, findsNWidgets(2)); // Enter new first name await tester.enterText(textFields.first, 'Jane'); await tester.pump(); // Verify that the cubit state was updated expect(registrationCubit.state.sheet.firstName, 'Jane'); }); testWidgets('updates registration cubit when last name changes', (WidgetTester tester) async { const sheet = UserRegistrationSheet( firstName: 'John', lastName: 'Doe', email: 'john@example.com', password: 'password123', passwordConfirmation: 'password123', birthdate: '1990-01-01', gender: 'male', location: 'Moscow', responseBody: '{}', lang: 'ru', weight: 75, height: 180, phone: '+1234567890', chestCircumference: 100, waistCircumference: 80, hipCircumference: 90, bloodPressureUp: 120, bloodPressureDown: 80, hasHypo: 0, hasHyper: 0, aboutAllergy: 'None', aboutTakingPils: 'None', aboutSportHobbies: 'Running', favoriteFoods: 'Pizza', unfavoriteFoods: 'Broccoli', additionalInfo: 'No additional info', ); await tester.pumpWidget(createTestWidget(sheet)); await tester.pumpAndSettle(); final textFields = find.byType(TextField); expect(textFields, findsNWidgets(2)); // Enter new last name await tester.enterText(textFields.last, 'Smith'); await tester.pump(); // Verify that the cubit state was updated expect(registrationCubit.state.sheet.lastName, 'Smith'); }); }); }