import 'package:eatvio_app/core/enums/complained_content.dart'; import 'package:eatvio_app/features/complaining/presentation/complaining_bottom_sheet.dart'; import 'package:eatvio_app/features/complaining/presentation/cubit/complaining_cubit.dart'; import 'package:eatvio_app/features/complaining/repositories/complaining_repository.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'complaining_cubit_test.mocks.dart'; @GenerateNiceMocks([MockSpec()]) void main() { group('ComplainingCubit', () { ComplainingCubit? complainingCubit; late MockComplainingRepository mockRepository; setUp(() { mockRepository = MockComplainingRepository(); }); tearDown(() async { if (complainingCubit != null && !complainingCubit!.isClosed) { await complainingCubit!.close(); complainingCubit = null; } }); test('начальное состояние - пустое', () { complainingCubit = ComplainingCubit(repository: mockRepository); expect(complainingCubit!.state.contentType, isNull); expect(complainingCubit!.state.category, isNull); expect(complainingCubit!.state.wasSentSuccessfully, isNull); }); test('setContentTypeAndIdentifier - устанавливает тип контента и идентификатор', () { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setContentTypeAndIdentifier( contentType: ComplainedContent.diet, id: 1, ); expect(complainingCubit!.state.contentType, ComplainedContent.diet); expect(complainingCubit!.state.contentId, 1); }); test('setCategory - устанавливает категорию жалобы', () { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setCategory(ComplainType.spam); expect(complainingCubit!.state.category, ComplainType.spam); }); test('setTags - устанавливает теги', () { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setTags(['tag1', 'tag2']); expect(complainingCubit!.state.complainInfo.tags, ['tag1', 'tag2']); }); test('toggleDescription - переключает описание', () { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.toggleDescription(); expect(complainingCubit!.state.complainInfo.description, ''); complainingCubit!.toggleDescription(); expect(complainingCubit!.state.complainInfo.description, isNull); }); test('setDescription - устанавливает описание', () { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setDescription('Test description'); expect(complainingCubit!.state.complainInfo.description, 'Test description'); }); test('complain - отправляет жалобу на диету', () async { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setContentTypeAndIdentifier( contentType: ComplainedContent.diet, id: 1, ); complainingCubit!.setCategory(ComplainType.spam); when(mockRepository.sendDietComplain( id: 1, category: anyNamed('category'), body: anyNamed('body'), )).thenAnswer((_) async => {}); await complainingCubit!.complain(); expect(complainingCubit!.state.wasSentSuccessfully, isTrue); }); test('complain - отправляет жалобу на план', () async { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setContentTypeAndIdentifier( contentType: ComplainedContent.plan, slug: 'test-plan', ); complainingCubit!.setCategory(ComplainType.spam); when(mockRepository.sendPlanComplain( slug: 'test-plan', category: anyNamed('category'), body: anyNamed('body'), )).thenAnswer((_) async => {}); await complainingCubit!.complain(); expect(complainingCubit!.state.wasSentSuccessfully, isTrue); }); test('complain - обработка ошибки', () async { complainingCubit = ComplainingCubit(repository: mockRepository); complainingCubit!.setContentTypeAndIdentifier( contentType: ComplainedContent.diet, id: 1, ); complainingCubit!.setCategory(ComplainType.spam); when(mockRepository.sendDietComplain( id: anyNamed('id'), category: anyNamed('category'), body: anyNamed('body'), )).thenThrow(Exception('Ошибка отправки')); await complainingCubit!.complain(); expect(complainingCubit!.state.wasSentSuccessfully, isFalse); }); }); }