feat(dependencies): add rxdart package and improve string extension methods for better handling of empty strings and gender parsing

This commit is contained in:
mso7nueh
2025-12-04 15:45:54 +03:00
parent 0cd8e662d9
commit 953230b387
100 changed files with 7202 additions and 14 deletions

View File

@@ -0,0 +1,128 @@
import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart';
import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart';
import 'package:eatvio_app/features/profile/models/profile_model.dart';
import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'profile_avatar_cubit_test.mocks.dart';
@GenerateNiceMocks([MockSpec<ProfileRepository>()])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('ProfileAvatarCubit', () {
ProfileAvatarCubit? cubit;
late MockProfileRepository mockRepository;
setUp(() {
mockRepository = MockProfileRepository();
});
tearDown(() async {
if (cubit != null && !cubit!.isClosed) {
await cubit!.close();
cubit = null;
}
});
test('начальное состояние - loading', () {
cubit = ProfileAvatarCubit(profileRepository: mockRepository);
expect(cubit!.state, isA<ProfileAvatarStateLoading>());
});
test('getMyProfile - успешная загрузка профиля', () async {
cubit = ProfileAvatarCubit(profileRepository: mockRepository);
const testProfile = ProfileModel(
id: 1,
slug: 'test-user',
name: 'Test User',
email: 'test@example.com',
phoneConfirmationState: 'confirmed',
isPublicProfile: true,
isBlockedByMe: false,
isBlockedByAuthor: false,
isBlockedByUser: false,
isEntitySubscribedByMe: false,
profilePhotoUrl: 'https://example.com/icon.jpg',
roles: [],
badges: [],
subscriptions: [],
subscribers: [],
);
const testProfileDetails = ProfileDetailsModel(
firstName: 'Test',
lastName: 'User',
birthdate: '1990-01-01',
gender: 'male',
country: 'Russia',
city: 'Moscow',
lang: 'ru',
weight: 70.0,
height: 175,
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
bloodPressureUp: 120,
bloodPressureDown: 80,
hasHypo: false,
hasHyper: false,
aboutAlergy: 'No allergies',
aboutTakingPils: 'No pills',
aboutSportHobbies: 'Running',
favoriteFoods: 'Fruits',
unfavoriteFoods: 'Fast food',
additionalInfo: 'Additional info',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.5,
);
when(mockRepository.getMyProfile())
.thenAnswer((_) async => testProfile);
when(mockRepository.getMyProfileDetails())
.thenAnswer((_) async => testProfileDetails);
// Отслеживаем изменения состояния
ProfileAvatarState? loadedState;
final subscription = cubit!.stream.listen((state) {
if (state is ProfileAvatarStateLoaded) {
loadedState = state;
}
});
try {
await cubit!.getMyProfile();
// Даем время для завершения асинхронных операций плагинов
await Future.delayed(const Duration(milliseconds: 100));
} catch (e) {
// Игнорируем ошибки плагинов
} finally {
await subscription.cancel();
}
// В тестовом окружении плагины могут падать, но профиль должен быть загружен
// Проверяем что состояние было loaded хотя бы на момент
expect(loadedState, isNotNull);
if (loadedState != null) {
expect((loadedState as ProfileAvatarStateLoaded).profile.id, 1);
}
});
test('getMyProfile - обработка ошибки', () async {
cubit = ProfileAvatarCubit(profileRepository: mockRepository);
when(mockRepository.getMyProfile())
.thenThrow(Exception('Ошибка загрузки'));
await cubit!.getMyProfile();
// Состояние должно быть error из-за ошибки загрузки профиля
expect(cubit!.state, isA<ProfileAvatarStateError>());
});
});
}