forked from eatvio/eatvio_app
feat(tests): tests coverage 67.2
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user