feat(test): update oauth handling and improve preferences management

This commit is contained in:
mso7nueh
2025-12-01 23:51:40 +03:00
parent 9fcfac87d4
commit 965ae2f02b
11 changed files with 902 additions and 0 deletions

View File

@@ -0,0 +1,103 @@
import 'package:eatvio_app/features/feed/models/feed_consultant_model.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_cubit.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_state.dart';
import 'package:eatvio_app/features/feed/repositories/feed_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'consultants_cubit_test.mocks.dart';
@GenerateNiceMocks([MockSpec<FeedRepository>()])
void main() {
group('ConsultantsCubit', () {
late ConsultantsCubit consultantsCubit;
late MockFeedRepository mockFeedRepository;
setUp(() {
mockFeedRepository = MockFeedRepository();
consultantsCubit = ConsultantsCubit(feedRepository: mockFeedRepository);
});
tearDown(() async {
if (!consultantsCubit.isClosed) {
await consultantsCubit.close();
}
});
test('начальное состояние - ConsultantsState', () {
expect(consultantsCubit.state, const ConsultantsState());
});
test('getConsultants - успешная загрузка консультантов', () async {
final testConsultants = [
FeedConsultantModel(
slug: 'consultant-1',
name: 'Консультант 1',
description: 'Описание консультанта 1',
totalScores: 100,
photo: 'https://example.com/icon1.jpg',
badges: [],
ratingPlace: 1,
),
FeedConsultantModel(
slug: 'consultant-2',
name: 'Консультант 2',
description: 'Описание консультанта 2',
totalScores: 200,
photo: 'https://example.com/icon2.jpg',
badges: [],
ratingPlace: 2,
),
];
when(mockFeedRepository.getConsultants()).thenAnswer((_) async => testConsultants);
await consultantsCubit.getConsultants();
await Future.delayed(const Duration(milliseconds: 100));
expect(consultantsCubit.state, isA<ConsultantsStateLoaded>());
final loadedState = consultantsCubit.state as ConsultantsStateLoaded;
expect(loadedState.consultantsList.length, 2);
expect(loadedState.isLoading, false);
verify(mockFeedRepository.getConsultants()).called(1);
});
test('getConsultants - переход в состояние loading', () async {
when(mockFeedRepository.getConsultants()).thenAnswer((_) async {
await Future.delayed(const Duration(milliseconds: 50));
return [];
});
final future = consultantsCubit.getConsultants();
await Future.delayed(const Duration(milliseconds: 10));
expect(consultantsCubit.state, const ConsultantsState.loading());
await future;
});
test('getConsultants - обработка ошибки', () async {
when(mockFeedRepository.getConsultants()).thenThrow(Exception('Ошибка загрузки'));
await consultantsCubit.getConsultants();
await Future.delayed(const Duration(milliseconds: 100));
expect(consultantsCubit.state, isA<ConsultantsStateError>());
final errorState = consultantsCubit.state as ConsultantsStateError;
expect(errorState.errorMessage, contains('Exception'));
});
test('getConsultants - загрузка с пустым списком', () async {
when(mockFeedRepository.getConsultants()).thenAnswer((_) async => []);
await consultantsCubit.getConsultants();
await Future.delayed(const Duration(milliseconds: 100));
expect(consultantsCubit.state, isA<ConsultantsStateLoaded>());
final loadedState = consultantsCubit.state as ConsultantsStateLoaded;
expect(loadedState.consultantsList, isEmpty);
expect(loadedState.isLoading, false);
});
});
}