feat(tests): tests coverage 67.2

This commit is contained in:
misha
2026-01-19 12:32:11 +03:00
parent 13ccf56df0
commit 44ede73ceb
20 changed files with 5084 additions and 409 deletions

View File

@@ -1,21 +1,30 @@
import 'package:dio/dio.dart';
import 'dart:io';
import 'package:eatvio_app/features/create_recipe/entities/recipe_create_entity.dart';
import 'package:eatvio_app/features/create_recipe/models/ingredient.dart' as i;
import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
import 'package:eatvio_app/features/create_recipe/reporitories/recipe_repository.dart';
import 'package:eatvio_app/features/create_recipe/services/recipe_service.dart';
import 'package:eatvio_app/features/glossary/models/glossary_model.dart';
import 'package:eatvio_app/features/glossary/repositories/glossary_repository.dart';
import 'package:eatvio_app/features/glossary/services/glossary_service.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'create_recipe_cubit_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<RecipeRepository>(),
MockSpec<GlossaryRepository>(),
])
void main() {
group('CreateRecipeCubit', () {
late CreateRecipeCubit cubit;
late MockRecipeRepository mockRecipeRepository;
late MockGlossaryRepository mockGlossaryRepository;
setUp(() {
final recipeRepository = RecipeRepository(recipeService: CreateRecipeService(Dio(), baseUrl: ''));
final glossaryRepository = GlossaryRepository(glossaryService: GlossaryService(Dio(), baseUrl: ''));
cubit = CreateRecipeCubit(recipeRepository: recipeRepository, glossaryRepository: glossaryRepository);
mockRecipeRepository = MockRecipeRepository();
mockGlossaryRepository = MockGlossaryRepository();
cubit = CreateRecipeCubit(recipeRepository: mockRecipeRepository, glossaryRepository: mockGlossaryRepository);
});
tearDown(() async {
@@ -156,5 +165,276 @@ void main() {
expect(cubit.state.loading, false);
});
test('changeType updates type of recipe', () {
cubit.changeType(TypeOfRecipe.secondMeals);
expect(cubit.state.entity.typeOfRecipe, TypeOfRecipe.secondMeals);
});
test('replaceTitle with empty string sets title to null', () {
cubit.replaceTitle('Test Title');
expect(cubit.state.entity.title, 'Test Title');
cubit.replaceTitle('');
expect(cubit.state.entity.title, isNull);
});
test('replaceDescription with empty string sets description to null', () {
cubit.replaceDescription('Test Description');
expect(cubit.state.entity.description, 'Test Description');
cubit.replaceDescription('');
expect(cubit.state.entity.description, isNull);
});
test('publishRecipe - успешно публикует рецепт', () async {
when(mockRecipeRepository.publishRecipe(any, false, null)).thenAnswer((_) async => {});
cubit.replaceTitle('Test Recipe');
cubit.replaceDescription('Test Description');
cubit.replacePortionsCount(4);
cubit.replaceEnegryInPortion(250);
cubit.setTotalCookingHours(1);
cubit.setTotalCookingMinutes(30);
cubit.setActiveCookingHours(0);
cubit.setActiveCookingMinutes(20);
final tempFile = File('${Directory.systemTemp.path}/test_image.jpg');
await tempFile.writeAsBytes([1, 2, 3]);
cubit.replaceImage(tempFile);
final result = await cubit.publishRecipe();
expect(result, true);
verify(mockRecipeRepository.publishRecipe(any, false, null)).called(1);
});
test('publishRecipe - обновляет рецепт', () async {
when(mockRecipeRepository.publishRecipe(any, true, 'test-slug')).thenAnswer((_) async => {});
cubit.replaceTitle('Test Recipe');
cubit.replaceDescription('Test Description');
cubit.replacePortionsCount(4);
cubit.replaceEnegryInPortion(250);
cubit.setTotalCookingHours(1);
cubit.setTotalCookingMinutes(30);
cubit.setActiveCookingHours(0);
cubit.setActiveCookingMinutes(20);
final tempFile = File('${Directory.systemTemp.path}/test_image.jpg');
await tempFile.writeAsBytes([1, 2, 3]);
cubit.replaceImage(tempFile);
final result = await cubit.publishRecipe(true, 'test-slug');
expect(result, true);
verify(mockRecipeRepository.publishRecipe(any, true, 'test-slug')).called(1);
});
test('publishRecipe - обрабатывает ошибку', () async {
when(mockRecipeRepository.publishRecipe(any, false, null)).thenThrow(Exception('Ошибка'));
cubit.replaceTitle('Test Recipe');
cubit.replaceDescription('Test Description');
cubit.replacePortionsCount(4);
cubit.replaceEnegryInPortion(250);
cubit.setTotalCookingHours(1);
cubit.setTotalCookingMinutes(30);
cubit.setActiveCookingHours(0);
cubit.setActiveCookingMinutes(20);
final tempFile = File('${Directory.systemTemp.path}/test_image.jpg');
await tempFile.writeAsBytes([1, 2, 3]);
cubit.replaceImage(tempFile);
final result = await cubit.publishRecipe();
expect(result, false);
});
test('deleteRecipe - успешно удаляет рецепт', () async {
when(mockRecipeRepository.deleteRecipe('test-slug')).thenAnswer((_) async => {});
final result = await cubit.deleteRecipe('test-slug');
expect(result, true);
verify(mockRecipeRepository.deleteRecipe('test-slug')).called(1);
});
test('deleteRecipe - обрабатывает ошибку', () async {
when(mockRecipeRepository.deleteRecipe('test-slug')).thenThrow(Exception('Ошибка'));
final result = await cubit.deleteRecipe('test-slug');
expect(result, false);
});
test('getGlossaryListByQuery - получает список глоссария', () async {
final glossaryList = [
const GlossaryModel(
id: 1,
name: 'Apple',
grInPortion: 100,
energyOn100Gr: 50.0,
proteinsOn100Gr: 0.3,
fatsOn100Gr: 0.2,
carbohydratesOn100Gr: 10.0,
energyOnPortion: 50.0,
proteinsOnPortion: 0.3,
fatsOnPortion: 0.2,
carbohydratesOnPortion: 10.0,
),
const GlossaryModel(
id: 2,
name: 'Banana',
grInPortion: 100,
energyOn100Gr: 90.0,
proteinsOn100Gr: 1.1,
fatsOn100Gr: 0.3,
carbohydratesOn100Gr: 21.0,
energyOnPortion: 90.0,
proteinsOnPortion: 1.1,
fatsOnPortion: 0.3,
carbohydratesOnPortion: 21.0,
),
];
when(mockGlossaryRepository.getGlossaryListByQuery('apple')).thenAnswer((_) async => glossaryList);
final result = await cubit.getGlossaryListByQuery('apple');
expect(result.length, 2);
expect(result[0].name, 'Apple');
verify(mockGlossaryRepository.getGlossaryListByQuery('apple')).called(1);
});
test('validateTitle - возвращает false для null', () {
expect(cubit.validateTitle(), false);
expect(cubit.state.titleValidationError, 'Поле не заполнено');
});
test('validateTitle - возвращает false для пустой строки', () {
cubit.replaceTitle('');
expect(cubit.validateTitle(), false);
expect(cubit.state.titleValidationError, 'Поле не заполнено');
});
test('validateTitle - возвращает false для короткого названия', () {
cubit.replaceTitle('AB');
expect(cubit.validateTitle(), false);
expect(cubit.state.titleValidationError, 'Минимальная длина 3 символа ');
});
test('validateTitle - возвращает true для валидного названия', () {
cubit.replaceTitle('Test Recipe');
expect(cubit.validateTitle(), true);
expect(cubit.state.titleValidationError, isNull);
});
test('validateDescription - возвращает false для null', () {
expect(cubit.validateDescription(), false);
expect(cubit.state.descriptionValidationError, 'Поле не заполнено');
});
test('validateDescription - возвращает false для пустой строки', () {
cubit.replaceDescription('');
expect(cubit.validateDescription(), false);
expect(cubit.state.descriptionValidationError, 'Поле не заполнено');
});
test('validateDescription - возвращает false для короткого описания', () {
cubit.replaceDescription('AB');
expect(cubit.validateDescription(), false);
expect(cubit.state.descriptionValidationError, 'Минимальная длина 3 символа ');
});
test('validateDescription - возвращает true для валидного описания', () {
cubit.replaceDescription('Test Description');
expect(cubit.validateDescription(), true);
expect(cubit.state.descriptionValidationError, isNull);
});
test('validateServings - возвращает false для null', () {
expect(cubit.validateServings(), false);
expect(cubit.state.servingsValidationError, 'Поле не заполнено');
});
test('validateServings - возвращает true для валидного значения', () {
cubit.replacePortionsCount(4);
expect(cubit.validateServings(), true);
expect(cubit.state.servingsValidationError, isNull);
});
test('validateEnergyPerServing - возвращает false для null', () {
expect(cubit.validateEnergyPerServing(), false);
expect(cubit.state.energyPerServingValidationError, 'Поле не заполнено');
});
test('validateEnergyPerServing - возвращает true для валидного значения', () {
cubit.replaceEnegryInPortion(250);
expect(cubit.validateEnergyPerServing(), true);
expect(cubit.state.energyPerServingValidationError, isNull);
});
test('validateActiveCookTime - возвращает false когда оба поля null', () {
expect(cubit.validateActiveCookTime(), false);
expect(cubit.state.activeTimeValidationError, 'Поле не заполнено');
});
test('validateActiveCookTime - возвращает true когда хотя бы одно поле заполнено', () {
cubit.setActiveCookingMinutes(30);
expect(cubit.validateActiveCookTime(), true);
expect(cubit.state.activeTimeValidationError, isNull);
});
test('validateTotalCookTime - возвращает false когда одно из полей null', () {
cubit.setTotalCookingHours(1);
expect(cubit.validateTotalCookTime(), false);
expect(cubit.state.cookingTimeValidationError, 'Поле не заполнено');
});
test('validateTotalCookTime - возвращает true когда оба поля заполнены', () {
cubit.setTotalCookingHours(1);
cubit.setTotalCookingMinutes(30);
expect(cubit.validateTotalCookTime(), true);
expect(cubit.state.cookingTimeValidationError, isNull);
});
test('validateImage - возвращает false для null', () {
expect(cubit.validateImage(), false);
expect(cubit.state.imageValidationError, 'Поле не заполнено');
});
test('validateImage - возвращает true для валидного изображения', () async {
final tempFile = File('${Directory.systemTemp.path}/test_image.jpg');
await tempFile.writeAsBytes([1, 2, 3]);
cubit.replaceImage(tempFile);
expect(cubit.validateImage(), true);
expect(cubit.state.imageValidationError, isNull);
});
test('validateAll - возвращает false когда не все поля валидны', () {
// Не заполняем обязательные поля
expect(cubit.validateAll(), false);
});
test('validateAll - возвращает true когда все поля валидны', () async {
cubit.replaceTitle('Test Recipe');
cubit.replaceDescription('Test Description');
cubit.replacePortionsCount(4);
cubit.replaceEnegryInPortion(250);
cubit.setTotalCookingHours(1);
cubit.setTotalCookingMinutes(30);
cubit.setActiveCookingHours(0);
cubit.setActiveCookingMinutes(20);
final tempFile = File('${Directory.systemTemp.path}/test_image.jpg');
await tempFile.writeAsBytes([1, 2, 3]);
cubit.replaceImage(tempFile);
expect(cubit.validateAll(), true);
});
});
}