feat(test): diet, plan, registration

This commit is contained in:
mso7nueh
2025-10-21 21:02:17 +03:00
parent 1841199291
commit ed612aa019
13 changed files with 32985 additions and 66 deletions

View File

@@ -0,0 +1,374 @@
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/diet_duration_drop_down_widget.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/diet_type_choice_widget.dart';
import 'package:eatvio_app/features/create_diet/presentation/widgets/status_drop_down_widget.dart';
import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart';
import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart';
import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'advanced_widget_test.mocks.dart';
@GenerateMocks([CreateDietRepository, ProfileRepository, GlossaryRepository])
void main() {
group('Diet Creation Advanced Widget Tests', () {
late MockCreateDietRepository mockCreateDietRepository;
late MockProfileRepository mockProfileRepository;
late MockGlossaryRepository mockGlossaryRepository;
late CreateDietCubit createDietCubit;
setUp(() {
mockCreateDietRepository = MockCreateDietRepository();
mockProfileRepository = MockProfileRepository();
mockGlossaryRepository = MockGlossaryRepository();
createDietCubit = CreateDietCubit(
createDietRepository: mockCreateDietRepository,
profileRepository: mockProfileRepository,
glossaryRepository: mockGlossaryRepository,
);
});
tearDown(() {
createDietCubit.close();
});
Widget createTestWidget(Widget child) {
return MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('ru')],
home: BlocProvider<CreateDietCubit>(
create: (context) => createDietCubit,
child: Scaffold(body: SingleChildScrollView(child: child)),
),
);
}
testWidgets('should display DietTypeChoiceWidget', (WidgetTester tester) async {
// Arrange & Act
await tester.pumpWidget(createTestWidget(const DietTypeChoiceWidget()));
await tester.pumpAndSettle();
// Assert
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
});
testWidgets('should display DietDurationDropDownWidget', (WidgetTester tester) async {
// Arrange & Act
await tester.pumpWidget(createTestWidget(const DietDurationDropDownWidget()));
await tester.pumpAndSettle();
// Assert
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
});
testWidgets('should display StatusDropDownWidget', (WidgetTester tester) async {
// Arrange & Act
await tester.pumpWidget(createTestWidget(const StatusDropDownWidget()));
await tester.pumpAndSettle();
// Assert
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should display diet creation form with all widgets', (WidgetTester tester) async {
// Arrange
Widget completeForm = const Column(
children: [
Text('Создание диеты'),
SizedBox(height: 16),
DietTypeChoiceWidget(),
SizedBox(height: 16),
DietDurationDropDownWidget(),
SizedBox(height: 16),
StatusDropDownWidget(),
],
);
// Act
await tester.pumpWidget(createTestWidget(completeForm));
await tester.pumpAndSettle();
// Assert
expect(find.text('Создание диеты'), findsOneWidget);
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should handle diet type selection in DietTypeChoiceWidget', (WidgetTester tester) async {
// Arrange
await tester.pumpWidget(createTestWidget(const DietTypeChoiceWidget()));
await tester.pumpAndSettle();
// Act - Try to find and tap on diet type options
// Note: This test might need adjustment based on actual widget implementation
final dietTypeWidget = find.byType(DietTypeChoiceWidget);
expect(dietTypeWidget, findsOneWidget);
// Assert
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
});
testWidgets('should handle duration selection in DietDurationDropDownWidget', (WidgetTester tester) async {
// Arrange
await tester.pumpWidget(createTestWidget(const DietDurationDropDownWidget()));
await tester.pumpAndSettle();
// Act - Try to find and interact with duration dropdown
final durationWidget = find.byType(DietDurationDropDownWidget);
expect(durationWidget, findsOneWidget);
// Assert
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
});
testWidgets('should handle status selection in StatusDropDownWidget', (WidgetTester tester) async {
// Arrange
await tester.pumpWidget(createTestWidget(const StatusDropDownWidget()));
await tester.pumpAndSettle();
// Act - Try to find and interact with status dropdown
final statusWidget = find.byType(StatusDropDownWidget);
expect(statusWidget, findsOneWidget);
// Assert
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should display diet creation screen layout', (WidgetTester tester) async {
// Arrange
Widget screenLayout = Scaffold(
appBar: AppBar(title: const Text('Создание диеты')),
body: const SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Основная информация'),
SizedBox(height: 16),
DietTypeChoiceWidget(),
SizedBox(height: 24),
Text('Настройки диеты'),
SizedBox(height: 16),
DietDurationDropDownWidget(),
SizedBox(height: 16),
StatusDropDownWidget(),
SizedBox(height: 32),
SizedBox(
width: double.infinity,
child: ElevatedButton(onPressed: null, child: Text('Создать диету')),
),
],
),
),
),
);
// Act
await tester.pumpWidget(
MaterialApp(
theme: ThemeHelper().themeData(),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [Locale('ru')],
home: BlocProvider<CreateDietCubit>(create: (context) => createDietCubit, child: screenLayout),
),
);
await tester.pumpAndSettle();
// Assert
expect(find.text('Создание диеты'), findsOneWidget);
expect(find.text('Основная информация'), findsOneWidget);
expect(find.text('Настройки диеты'), findsOneWidget);
expect(find.text('Создать диету'), findsOneWidget);
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should display diet creation form with validation', (WidgetTester tester) async {
// Arrange
Widget formWithValidation = Column(
children: [
TextFormField(
key: const Key('dietNameField'),
decoration: const InputDecoration(labelText: 'Название диеты', errorText: 'Название диеты обязательно'),
),
const SizedBox(height: 16),
TextFormField(
key: const Key('dietDescriptionField'),
decoration: const InputDecoration(labelText: 'Описание диеты', errorText: 'Описание диеты обязательно'),
),
const SizedBox(height: 16),
const DietTypeChoiceWidget(),
const SizedBox(height: 16),
const DietDurationDropDownWidget(),
const SizedBox(height: 16),
const StatusDropDownWidget(),
],
);
// Act
await tester.pumpWidget(createTestWidget(formWithValidation));
await tester.pumpAndSettle();
// Assert
expect(find.text('Название диеты обязательно'), findsOneWidget);
expect(find.text('Описание диеты обязательно'), findsOneWidget);
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should display diet creation form with all sections', (WidgetTester tester) async {
// Arrange
Widget completeForm = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('Информация о диете', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
TextFormField(
key: const Key('dietNameField'),
decoration: const InputDecoration(labelText: 'Название диеты', hintText: 'Введите название диеты'),
),
const SizedBox(height: 16),
TextFormField(
key: const Key('dietDescriptionField'),
decoration: const InputDecoration(labelText: 'Описание диеты', hintText: 'Опишите особенности диеты'),
maxLines: 3,
),
const SizedBox(height: 24),
const Text('Тип диеты', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
const DietTypeChoiceWidget(),
const SizedBox(height: 24),
const Text('Настройки', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
const DietDurationDropDownWidget(),
const SizedBox(height: 16),
const StatusDropDownWidget(),
const SizedBox(height: 32),
SizedBox(
width: double.infinity,
child: ElevatedButton(key: const Key('createDietButton'), onPressed: () {}, child: const Text('Создать диету')),
),
],
);
// Act
await tester.pumpWidget(createTestWidget(completeForm));
await tester.pumpAndSettle();
// Assert
expect(find.text('Информация о диете'), findsOneWidget);
expect(find.text('Тип диеты'), findsOneWidget);
expect(find.text('Настройки'), findsOneWidget);
expect(find.byKey(const Key('dietNameField')), findsOneWidget);
expect(find.byKey(const Key('dietDescriptionField')), findsOneWidget);
expect(find.byKey(const Key('createDietButton')), findsOneWidget);
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
expect(find.byType(DietDurationDropDownWidget), findsOneWidget);
expect(find.byType(StatusDropDownWidget), findsOneWidget);
});
testWidgets('should display diet creation form with image picker', (WidgetTester tester) async {
// Arrange
Widget formWithImagePicker = Column(
children: [
const Text('Изображение диеты'),
const SizedBox(height: 16),
Container(
key: const Key('imagePickerContainer'),
height: 200,
width: double.infinity,
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(8),
),
child: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.add_photo_alternate, size: 48, color: Colors.grey),
SizedBox(height: 8),
Text('Добавить изображение'),
],
),
),
),
const SizedBox(height: 16),
const DietTypeChoiceWidget(),
],
);
// Act
await tester.pumpWidget(createTestWidget(formWithImagePicker));
await tester.pumpAndSettle();
// Assert
expect(find.text('Изображение диеты'), findsOneWidget);
expect(find.text('Добавить изображение'), findsOneWidget);
expect(find.byKey(const Key('imagePickerContainer')), findsOneWidget);
expect(find.byType(DietTypeChoiceWidget), findsOneWidget);
});
testWidgets('should display diet creation form with meal planning', (WidgetTester tester) async {
// Arrange
Widget formWithMealPlanning = Column(
children: [
const Text('Планирование приемов пищи'),
const SizedBox(height: 16),
Container(
key: const Key('mealPlanningContainer'),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(8),
),
child: const Column(
children: [
Text('День 1'),
SizedBox(height: 8),
Text('Завтрак: Не указан'),
Text('Обед: Не указан'),
Text('Ужин: Не указан'),
SizedBox(height: 16),
ElevatedButton(onPressed: null, child: Text('Добавить прием пищи')),
],
),
),
],
);
// Act
await tester.pumpWidget(createTestWidget(formWithMealPlanning));
await tester.pumpAndSettle();
// Assert
expect(find.text('Планирование приемов пищи'), findsOneWidget);
expect(find.text('День 1'), findsOneWidget);
expect(find.text('Завтрак: Не указан'), findsOneWidget);
expect(find.text('Обед: Не указан'), findsOneWidget);
expect(find.text('Ужин: Не указан'), findsOneWidget);
expect(find.text('Добавить прием пищи'), findsOneWidget);
expect(find.byKey(const Key('mealPlanningContainer')), findsOneWidget);
});
});
}