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/height_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 'height_screen_test.mocks.dart'; @GenerateMocks([RegistrationRepository, Prefs]) void main() { group('HeightScreen', () { 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: HeightScreen(sheet: sheet), ), ), ); } testWidgets('displays screen with initial height 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('180'), findsOneWidget); }); testWidgets('displays empty field when height is 0', (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: 0, 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 textField = find.byType(TextField); expect(textField, findsOneWidget); }); testWidgets('displays hint text', (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: 0, 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); }); testWidgets('updates registration cubit when height 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: 170, 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 textField = find.byType(TextField); expect(textField, findsOneWidget); await tester.enterText(textField, '185'); await tester.pump(); // Verify that the cubit state was updated expect(registrationCubit.state.sheet.height, 185); }); testWidgets('only accepts digits input', (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: 0, 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 textField = find.byType(TextField); expect(textField, findsOneWidget); // Try to enter non-digit characters await tester.enterText(textField, 'abc'); await tester.pump(); // The text field should only accept digits final textFieldWidget = tester.widget(textField); expect(textFieldWidget.controller?.text, isEmpty); }); }); }