feat(tests): increased tests coverage

This commit is contained in:
misha
2025-12-25 12:56:38 +03:00
parent 5b705dfb72
commit 99659f7ea1
132 changed files with 10304 additions and 6226 deletions

View File

@@ -0,0 +1,157 @@
import 'package:eatvio_app/features/diary/models/consultant_comment_model.dart';
import 'package:eatvio_app/features/diary/presentation/bloc/consultant_comments_cubit/consultant_comments_cubit.dart';
import 'package:eatvio_app/features/diary/presentation/bloc/consultant_comments_cubit/consultant_comments_state.dart';
import 'package:eatvio_app/features/diary/repositories/diary_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'consultant_comments_cubit_test.mocks.dart';
@GenerateNiceMocks([MockSpec<DiaryRepository>()])
void main() {
group('ConsultantCommentsCubit', () {
late ConsultantCommentsCubit cubit;
late MockDiaryRepository mockDiaryRepository;
setUp(() {
mockDiaryRepository = MockDiaryRepository();
cubit = ConsultantCommentsCubit(diaryRepository: mockDiaryRepository);
});
tearDown(() async {
await cubit.close();
});
test('начальное состояние - ConsultantCommentsState', () {
expect(cubit.state, isA<ConsultantCommentsState>());
expect(cubit.state.commentsModel.comment, '');
expect(cubit.state.commentsModel.mealsComments, isEmpty);
expect(cubit.state.commentsModel.portions, isEmpty);
});
test('setComment - устанавливает комментарий дня', () {
cubit.setComment('Test comment');
expect(cubit.state.commentsModel.comment, 'Test comment');
expect(cubit.state.dayCommentNeedsToBeFilled, false);
});
test('setComment - устанавливает dayCommentNeedsToBeFilled для короткого комментария', () {
cubit.setComment('Te');
expect(cubit.state.commentsModel.comment, 'Te');
expect(cubit.state.dayCommentNeedsToBeFilled, true);
});
test('setMealComment - устанавливает комментарий к приему пищи', () {
cubit.setMealComment(mealNumber: 1, comment: 'Test meal comment');
expect(cubit.state.commentsModel.mealsComments['1'], isNotNull);
expect(cubit.state.commentsModel.mealsComments['1']!.comment, 'Test meal comment');
expect(cubit.state.commentsModel.mealsComments['1']!.typeNumber, 1);
});
test('setMealComment - удаляет комментарий при пустой строке', () {
cubit.setMealComment(mealNumber: 1, comment: 'Test meal comment');
expect(cubit.state.commentsModel.mealsComments['1'], isNotNull);
cubit.setMealComment(mealNumber: 1, comment: '');
expect(cubit.state.commentsModel.mealsComments['1'], isNull);
});
test('addPortionComment - добавляет комментарий к порции', () {
final portionComment = PortionCommentModel(id: 1, comment: 'Test portion comment');
cubit.addPortionComment(portionComment);
expect(cubit.state.commentsModel.portions.length, 1);
expect(cubit.state.commentsModel.portions[0].comment, 'Test portion comment');
});
test('updatePortionComment - обновляет комментарий к порции', () {
final portionComment1 = PortionCommentModel(id: 1, comment: 'Test portion comment 1');
final portionComment2 = PortionCommentModel(id: 2, comment: 'Test portion comment 2');
cubit.addPortionComment(portionComment1);
cubit.addPortionComment(portionComment2);
final updatedComment = PortionCommentModel(id: 1, comment: 'Updated portion comment');
cubit.updatePortionComment(updatedComment);
expect(cubit.state.commentsModel.portions.length, 2);
expect(cubit.state.commentsModel.portions[0].comment, 'Updated portion comment');
});
test('updatePortionComment - удаляет комментарий при пустой строке', () {
final portionComment = PortionCommentModel(id: 1, comment: 'Test portion comment');
cubit.addPortionComment(portionComment);
expect(cubit.state.commentsModel.portions.length, 1);
final emptyComment = PortionCommentModel(id: 1, comment: '');
cubit.updatePortionComment(emptyComment);
expect(cubit.state.commentsModel.portions.length, 0);
});
test('submitComments - успешная отправка комментариев', () async {
when(
mockDiaryRepository.commentUserDay(diaryId: anyNamed('diaryId'), commentModel: anyNamed('commentModel')),
).thenAnswer((_) async => Future<void>.value());
cubit.setComment('Test comment with more than 3 characters');
cubit.setMealComment(mealNumber: 1, comment: 'Test meal comment with more than 3 characters');
final portionComment = PortionCommentModel(id: 1, comment: 'Test portion comment with more than 3 characters');
cubit.addPortionComment(portionComment);
await cubit.submitComments(1);
verify(mockDiaryRepository.commentUserDay(diaryId: 1, commentModel: anyNamed('commentModel'))).called(1);
});
test('submitComments - не отправляет при коротком комментарии дня', () async {
cubit.setComment('Te');
await cubit.submitComments(1);
expect(cubit.state.dayCommentNeedsToBeFilled, true);
verifyNever(mockDiaryRepository.commentUserDay(diaryId: anyNamed('diaryId'), commentModel: anyNamed('commentModel')));
});
test('submitComments - не отправляет при коротком комментарии к приему пищи', () async {
cubit.setComment('Test comment with more than 3 characters');
cubit.setMealComment(mealNumber: 1, comment: 'Te');
await cubit.submitComments(1);
verifyNever(mockDiaryRepository.commentUserDay(diaryId: anyNamed('diaryId'), commentModel: anyNamed('commentModel')));
});
test('submitComments - не отправляет при коротком комментарии к порции', () async {
cubit.setComment('Test comment with more than 3 characters');
final portionComment = PortionCommentModel(id: 1, comment: 'Te');
cubit.addPortionComment(portionComment);
await cubit.submitComments(1);
verifyNever(mockDiaryRepository.commentUserDay(diaryId: anyNamed('diaryId'), commentModel: anyNamed('commentModel')));
});
test('submitComments - обрабатывает ошибку', () async {
when(mockDiaryRepository.commentUserDay(diaryId: anyNamed('diaryId'), commentModel: anyNamed('commentModel'))).thenThrow(Exception('Ошибка отправки'));
cubit.setComment('Test comment with more than 3 characters');
await cubit.submitComments(1);
// Тест проверяет, что метод не выбрасывает исключение
expect(cubit.state.commentsModel.comment, 'Test comment with more than 3 characters');
});
});
}