forked from eatvio/eatvio_app
487 lines
22 KiB
Dart
487 lines
22 KiB
Dart
import 'package:eatvio_app/core/prefs.dart';
|
||
import 'package:eatvio_app/core/theme/theme_helper.dart';
|
||
import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
|
||
import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:mockito/annotations.dart';
|
||
|
||
import 'integration_widget_test.mocks.dart';
|
||
|
||
@GenerateMocks([RegistrationRepository, Prefs])
|
||
void main() {
|
||
group('Registration Integration Widget Tests', () {
|
||
late MockRegistrationRepository mockRegistrationRepository;
|
||
late RegistrationCubit registrationCubit;
|
||
|
||
setUp(() {
|
||
mockRegistrationRepository = MockRegistrationRepository();
|
||
registrationCubit = RegistrationCubit(registrationRepository: mockRegistrationRepository, prefs: MockPrefs());
|
||
});
|
||
|
||
tearDown(() {
|
||
registrationCubit.close();
|
||
});
|
||
|
||
Widget createTestWidget(Widget child) {
|
||
return MaterialApp(
|
||
theme: ThemeHelper().themeData(),
|
||
home: Scaffold(
|
||
body: SingleChildScrollView(
|
||
child: BlocProvider<RegistrationCubit>(create: (context) => registrationCubit, child: child),
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
testWidgets('should display registration screen', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget registrationWidget = const Text('Registration Screen');
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(registrationWidget));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Registration Screen'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should handle complete registration workflow', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget registrationWidget = const Text('Complete Registration Workflow');
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(registrationWidget));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Complete Registration Workflow'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with all steps', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget completeRegistrationForm = Column(
|
||
children: [
|
||
const Text('Регистрация в Eatvio'),
|
||
const SizedBox(height: 16),
|
||
const Text('Шаг 1 из 15'),
|
||
const SizedBox(height: 8),
|
||
const LinearProgressIndicator(value: 0.067),
|
||
const SizedBox(height: 16),
|
||
const Text('Основная информация'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('firstNameField'),
|
||
decoration: const InputDecoration(labelText: 'Имя', hintText: 'Введите ваше имя'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('lastNameField'),
|
||
decoration: const InputDecoration(labelText: 'Фамилия', hintText: 'Введите вашу фамилию'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('emailField'),
|
||
decoration: const InputDecoration(labelText: 'Email', hintText: 'example@email.com'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('passwordField'),
|
||
decoration: const InputDecoration(labelText: 'Пароль', hintText: 'Введите пароль'),
|
||
obscureText: true,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('passwordConfirmationField'),
|
||
decoration: const InputDecoration(labelText: 'Подтверждение пароля', hintText: 'Повторите пароль'),
|
||
obscureText: true,
|
||
),
|
||
const SizedBox(height: 24),
|
||
const Text('Шаг 2 из 15'),
|
||
const SizedBox(height: 8),
|
||
const LinearProgressIndicator(value: 0.133),
|
||
const SizedBox(height: 16),
|
||
const Text('Личные данные'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('phoneField'),
|
||
decoration: const InputDecoration(labelText: 'Номер телефона', hintText: '+7 (999) 123-45-67'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('heightField'),
|
||
decoration: const InputDecoration(labelText: 'Рост (см)', hintText: '175'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('weightField'),
|
||
decoration: const InputDecoration(labelText: 'Вес (кг)', hintText: '70'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 32),
|
||
SizedBox(
|
||
width: double.infinity,
|
||
child: ElevatedButton(key: const Key('continueButton'), onPressed: () {}, child: const Text('Продолжить')),
|
||
),
|
||
],
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(completeRegistrationForm));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Регистрация в Eatvio'), findsOneWidget);
|
||
expect(find.text('Шаг 1 из 15'), findsOneWidget);
|
||
expect(find.text('Шаг 2 из 15'), findsOneWidget);
|
||
expect(find.text('Основная информация'), findsOneWidget);
|
||
expect(find.text('Личные данные'), findsOneWidget);
|
||
expect(find.byKey(const Key('firstNameField')), findsOneWidget);
|
||
expect(find.byKey(const Key('lastNameField')), findsOneWidget);
|
||
expect(find.byKey(const Key('emailField')), findsOneWidget);
|
||
expect(find.byKey(const Key('passwordField')), findsOneWidget);
|
||
expect(find.byKey(const Key('passwordConfirmationField')), findsOneWidget);
|
||
expect(find.byKey(const Key('phoneField')), findsOneWidget);
|
||
expect(find.byKey(const Key('heightField')), findsOneWidget);
|
||
expect(find.byKey(const Key('weightField')), findsOneWidget);
|
||
expect(find.byKey(const Key('continueButton')), findsOneWidget);
|
||
expect(find.byType(LinearProgressIndicator), findsNWidgets(2));
|
||
});
|
||
|
||
testWidgets('should display registration form with validation', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget formWithValidation = Column(
|
||
children: [
|
||
const Text('Регистрация'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('firstNameField'),
|
||
decoration: const InputDecoration(labelText: 'Имя', errorText: 'Имя обязательно'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('lastNameField'),
|
||
decoration: const InputDecoration(labelText: 'Фамилия', errorText: 'Фамилия обязательна'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('emailField'),
|
||
decoration: const InputDecoration(labelText: 'Email', errorText: 'Email обязателен'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('passwordField'),
|
||
decoration: const InputDecoration(labelText: 'Пароль', errorText: 'Пароль обязателен'),
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('passwordConfirmationField'),
|
||
decoration: const InputDecoration(labelText: 'Подтверждение пароля', errorText: 'Пароли не совпадают'),
|
||
),
|
||
],
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(formWithValidation));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Имя обязательно'), findsOneWidget);
|
||
expect(find.text('Фамилия обязательна'), findsOneWidget);
|
||
expect(find.text('Email обязателен'), findsOneWidget);
|
||
expect(find.text('Пароль обязателен'), findsOneWidget);
|
||
expect(find.text('Пароли не совпадают'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with success state', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget successWidget = const Center(
|
||
child: Column(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: [
|
||
Icon(Icons.check_circle, color: Colors.green, size: 64),
|
||
SizedBox(height: 16),
|
||
Text('Регистрация прошла успешно!', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
||
SizedBox(height: 8),
|
||
Text('Добро пожаловать в Eatvio!'),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(successWidget));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.byIcon(Icons.check_circle), findsOneWidget);
|
||
expect(find.text('Регистрация прошла успешно!'), findsOneWidget);
|
||
expect(find.text('Добро пожаловать в Eatvio!'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with error state', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget errorWidget = const Center(
|
||
child: Column(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: [
|
||
Icon(Icons.error, color: Colors.red, size: 64),
|
||
SizedBox(height: 16),
|
||
Text('Ошибка регистрации', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
||
SizedBox(height: 8),
|
||
Text('Произошла ошибка при регистрации. Попробуйте еще раз.'),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(errorWidget));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.byIcon(Icons.error), findsOneWidget);
|
||
expect(find.text('Ошибка регистрации'), findsOneWidget);
|
||
expect(find.text('Произошла ошибка при регистрации. Попробуйте еще раз.'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with loading state', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget loadingWidget = const Center(
|
||
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [CircularProgressIndicator(), SizedBox(height: 16), Text('Регистрация...')]),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(loadingWidget));
|
||
await tester.pump();
|
||
|
||
// Assert
|
||
expect(find.byType(CircularProgressIndicator), findsOneWidget);
|
||
expect(find.text('Регистрация...'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should handle registration editing workflow', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget editWidget = const Text('Registration Editing Workflow');
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(editWidget));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Registration Editing Workflow'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with all additional information', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget additionalInfoForm = SingleChildScrollView(
|
||
child: Column(
|
||
children: [
|
||
const Text('Дополнительная информация'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('allergiesField'),
|
||
decoration: const InputDecoration(labelText: 'Аллергии', hintText: 'Укажите ваши аллергии'),
|
||
maxLines: 3,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('medicationsField'),
|
||
decoration: const InputDecoration(labelText: 'Принимаемые лекарства', hintText: 'Укажите принимаемые лекарства'),
|
||
maxLines: 3,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('sportsField'),
|
||
decoration: const InputDecoration(labelText: 'Любимые виды спорта', hintText: 'Укажите ваши любимые виды спорта'),
|
||
maxLines: 2,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('favoriteFoodsField'),
|
||
decoration: const InputDecoration(labelText: 'Любимые продукты', hintText: 'Укажите ваши любимые продукты'),
|
||
maxLines: 2,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('unfavoriteFoodsField'),
|
||
decoration: const InputDecoration(labelText: 'Нелюбимые продукты', hintText: 'Укажите продукты, которые не любите'),
|
||
maxLines: 2,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('additionalInfoField'),
|
||
decoration: const InputDecoration(labelText: 'Дополнительная информация', hintText: 'Любая дополнительная информация'),
|
||
maxLines: 3,
|
||
),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(additionalInfoForm));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Дополнительная информация'), findsNWidgets(2));
|
||
expect(find.byKey(const Key('allergiesField')), findsOneWidget);
|
||
expect(find.byKey(const Key('medicationsField')), findsOneWidget);
|
||
expect(find.byKey(const Key('sportsField')), findsOneWidget);
|
||
expect(find.byKey(const Key('favoriteFoodsField')), findsOneWidget);
|
||
expect(find.byKey(const Key('unfavoriteFoodsField')), findsOneWidget);
|
||
expect(find.byKey(const Key('additionalInfoField')), findsOneWidget);
|
||
expect(find.text('Аллергии'), findsOneWidget);
|
||
expect(find.text('Принимаемые лекарства'), findsOneWidget);
|
||
expect(find.text('Любимые виды спорта'), findsOneWidget);
|
||
expect(find.text('Любимые продукты'), findsOneWidget);
|
||
expect(find.text('Нелюбимые продукты'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with physical measurements', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget physicalMeasurementsForm = SingleChildScrollView(
|
||
child: Column(
|
||
children: [
|
||
const Text('Физические параметры'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('heightField'),
|
||
decoration: const InputDecoration(labelText: 'Рост (см)', hintText: '175'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('weightField'),
|
||
decoration: const InputDecoration(labelText: 'Вес (кг)', hintText: '70'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('chestCircumferenceField'),
|
||
decoration: const InputDecoration(labelText: 'Обхват груди (см)', hintText: '90'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('waistCircumferenceField'),
|
||
decoration: const InputDecoration(labelText: 'Обхват талии (см)', hintText: '80'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('hipCircumferenceField'),
|
||
decoration: const InputDecoration(labelText: 'Обхват бедер (см)', hintText: '95'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(physicalMeasurementsForm));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Физические параметры'), findsOneWidget);
|
||
expect(find.byKey(const Key('heightField')), findsOneWidget);
|
||
expect(find.byKey(const Key('weightField')), findsOneWidget);
|
||
expect(find.byKey(const Key('chestCircumferenceField')), findsOneWidget);
|
||
expect(find.byKey(const Key('waistCircumferenceField')), findsOneWidget);
|
||
expect(find.byKey(const Key('hipCircumferenceField')), findsOneWidget);
|
||
expect(find.text('Рост (см)'), findsOneWidget);
|
||
expect(find.text('Вес (кг)'), findsOneWidget);
|
||
expect(find.text('Обхват груди (см)'), findsOneWidget);
|
||
expect(find.text('Обхват талии (см)'), findsOneWidget);
|
||
expect(find.text('Обхват бедер (см)'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with health information', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget healthInfoForm = SingleChildScrollView(
|
||
child: Column(
|
||
children: [
|
||
const Text('Информация о здоровье'),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('bloodPressureUpField'),
|
||
decoration: const InputDecoration(labelText: 'Верхнее давление', hintText: '120'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
TextFormField(
|
||
key: const Key('bloodPressureDownField'),
|
||
decoration: const InputDecoration(labelText: 'Нижнее давление', hintText: '80'),
|
||
keyboardType: TextInputType.number,
|
||
),
|
||
const SizedBox(height: 16),
|
||
CheckboxListTile(key: const Key('hasHypoCheckbox'), title: const Text('Гипотония'), value: false, onChanged: (value) {}),
|
||
const SizedBox(height: 8),
|
||
CheckboxListTile(key: const Key('hasHyperCheckbox'), title: const Text('Гипертония'), value: false, onChanged: (value) {}),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(healthInfoForm));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Информация о здоровье'), findsOneWidget);
|
||
expect(find.byKey(const Key('bloodPressureUpField')), findsOneWidget);
|
||
expect(find.byKey(const Key('bloodPressureDownField')), findsOneWidget);
|
||
expect(find.byKey(const Key('hasHypoCheckbox')), findsOneWidget);
|
||
expect(find.byKey(const Key('hasHyperCheckbox')), findsOneWidget);
|
||
expect(find.text('Верхнее давление'), findsOneWidget);
|
||
expect(find.text('Нижнее давление'), findsOneWidget);
|
||
expect(find.text('Гипотония'), findsOneWidget);
|
||
expect(find.text('Гипертония'), findsOneWidget);
|
||
});
|
||
|
||
testWidgets('should display registration form with terms and conditions', (WidgetTester tester) async {
|
||
// Arrange
|
||
Widget termsForm = SingleChildScrollView(
|
||
child: Column(
|
||
children: [
|
||
const Text('Завершение регистрации'),
|
||
const SizedBox(height: 16),
|
||
CheckboxListTile(
|
||
key: const Key('termsCheckbox'),
|
||
title: const Text('Я согласен с условиями использования'),
|
||
subtitle: const Text('Нажимая кнопку "Зарегистрироваться", вы принимаете наши условия'),
|
||
value: false,
|
||
onChanged: (value) {},
|
||
),
|
||
const SizedBox(height: 16),
|
||
CheckboxListTile(
|
||
key: const Key('privacyCheckbox'),
|
||
title: const Text('Я согласен с политикой конфиденциальности'),
|
||
subtitle: const Text('Мы обрабатываем ваши данные в соответствии с нашей политикой'),
|
||
value: false,
|
||
onChanged: (value) {},
|
||
),
|
||
const SizedBox(height: 24),
|
||
SizedBox(
|
||
width: double.infinity,
|
||
child: ElevatedButton(key: const Key('registerButton'), onPressed: () {}, child: const Text('Зарегистрироваться')),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
|
||
// Act
|
||
await tester.pumpWidget(createTestWidget(termsForm));
|
||
await tester.pumpAndSettle();
|
||
|
||
// Assert
|
||
expect(find.text('Завершение регистрации'), findsOneWidget);
|
||
expect(find.byKey(const Key('termsCheckbox')), findsOneWidget);
|
||
expect(find.byKey(const Key('privacyCheckbox')), findsOneWidget);
|
||
expect(find.byKey(const Key('registerButton')), findsOneWidget);
|
||
expect(find.text('Я согласен с условиями использования'), findsOneWidget);
|
||
expect(find.text('Я согласен с политикой конфиденциальности'), findsOneWidget);
|
||
expect(find.text('Нажимая кнопку "Зарегистрироваться", вы принимаете наши условия'), findsOneWidget);
|
||
expect(find.text('Мы обрабатываем ваши данные в соответствии с нашей политикой'), findsOneWidget);
|
||
});
|
||
});
|
||
}
|