feat(tests): updated tests coverage to 66.5%

This commit is contained in:
misha
2026-01-14 18:47:11 +03:00
parent 497ff19cfa
commit 13ccf56df0
102 changed files with 10146 additions and 379 deletions

View File

@@ -32,6 +32,24 @@ void main() {
expect(model.id, 1);
expect(model.title, 'Test Badge');
});
test('toJson serializes BadgeModel correctly', () {
const model = BadgeModel(
id: 1,
title: 'Test Badge',
description: 'Test description',
image: 'https://example.com/badge.jpg',
type: 'achievement',
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['title'], 'Test Badge');
expect(json['description'], 'Test description');
expect(json['image'], 'https://example.com/badge.jpg');
expect(json['type'], 'achievement');
});
});
}

View File

@@ -111,5 +111,58 @@ void main() {
expect(model.dietId, null);
});
test('toJson serializes ChosenDietModel correctly', () {
final model = ChosenDietModel(
chosenDietID: 1,
chosenPlanId: 10,
state: 'active',
startDate: DateTime(2023, 1, 1),
dietId: 5,
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['chosen_plan_id'], 10);
expect(json['state'], 'active');
expect(json.containsKey('start_date'), isTrue);
});
test('toJson serializes ChosenDietModel with null dietId correctly', () {
final model = ChosenDietModel(
chosenDietID: 1,
chosenPlanId: 10,
state: 'active',
startDate: DateTime(2023, 1, 1),
dietId: null,
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['diet'], isNull);
});
});
group('ChosenDietsPaginationModel toJson', () {
test('toJson serializes ChosenDietsPaginationModel correctly', () {
final diets = [
ChosenDietModel(
chosenDietID: 1,
chosenPlanId: 10,
state: 'active',
startDate: DateTime(2023, 1, 1),
dietId: 5,
),
];
final model = ChosenDietsPaginationModel(diets: diets);
final json = model.toJson();
expect(json.containsKey('data'), isTrue);
expect((json['data'] as List).length, 1);
});
});
}

View File

@@ -0,0 +1,51 @@
import 'package:eatvio_app/features/profile/models/circumference_model.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('CircumferenceModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 1,
'user_id': 123,
'chest_circumference': 100,
'waist_circumference': 80,
'hip_circumference': 95,
'created_at': '2024-01-15T10:00:00Z',
'updated_at': '2024-01-16T10:00:00Z',
};
final model = CircumferenceModel.fromJson(json);
expect(model.id, 1);
expect(model.userId, 123);
expect(model.chestCircumference, 100);
expect(model.waistCircumference, 80);
expect(model.hipCircumference, 95);
expect(model.createdAt, isA<DateTime>());
expect(model.updatedAt, isA<DateTime>());
});
test('toJson serializes all fields correctly', () {
final model = CircumferenceModel(
id: 1,
userId: 123,
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 95,
createdAt: DateTime(2024, 1, 15, 10, 0, 0),
updatedAt: DateTime(2024, 1, 16, 10, 0, 0),
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['user_id'], 123);
expect(json['chest_circumference'], 100);
expect(json['waist_circumference'], 80);
expect(json['hip_circumference'], 95);
expect(json['created_at'], isA<String>());
expect(json['updated_at'], isA<String>());
});
});
}

View File

@@ -0,0 +1,355 @@
import 'package:eatvio_app/features/consultant/become_consultant/models/consultation_request_model.dart';
import 'package:eatvio_app/features/profile/models/profile_model.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('CompletedCoursesModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'date': '2024-01-15',
'title': 'Course Title',
};
final model = CompletedCoursesModel.fromJson(json);
expect(model.date, '2024-01-15');
expect(model.title, 'Course Title');
});
test('toJson serializes all fields correctly', () {
const model = CompletedCoursesModel(date: '2024-01-15', title: 'Course Title');
final json = model.toJson();
expect(json['date'], '2024-01-15');
expect(json['title'], 'Course Title');
});
});
group('EducationModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'has_medical_education': 1,
'completed_courses': [
{'course1': {'date': '2024-01-01', 'title': 'Course 1'}},
],
'vk_link': 'https://vk.com/user',
'insta_link': 'https://instagram.com/user',
'fb_link': 'https://facebook.com/user',
'tg_link': 'https://t.me/user',
'personal_site_link': 'https://example.com',
'request_state': 'approved',
};
final model = EducationModel.fromJson(json);
expect(model.hasMedicalEducation, 1);
expect(model.completedCourses, isNotNull);
expect(model.vkLink, 'https://vk.com/user');
expect(model.instaLink, 'https://instagram.com/user');
expect(model.fbLink, 'https://facebook.com/user');
expect(model.tgLink, 'https://t.me/user');
expect(model.personalSiteLink, 'https://example.com');
expect(model.requestState, ModerationStatus.approved);
});
test('fromJson handles null optional fields', () {
final json = {
'request_state': 'created',
};
final model = EducationModel.fromJson(json);
expect(model.hasMedicalEducation, isNull);
expect(model.completedCourses, isNull);
expect(model.vkLink, isNull);
expect(model.requestState, ModerationStatus.created);
});
test('toJson serializes all fields correctly', () {
const model = EducationModel(
hasMedicalEducation: 1,
completedCourses: null,
vkLink: 'https://vk.com/user',
instaLink: 'https://instagram.com/user',
fbLink: 'https://facebook.com/user',
tgLink: 'https://t.me/user',
personalSiteLink: 'https://example.com',
requestState: ModerationStatus.approved,
);
final json = model.toJson();
expect(json['has_medical_education'], 1);
expect(json['vk_link'], 'https://vk.com/user');
expect(json['request_state'], 'approved');
});
});
group('ProfileDetailsModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'first_name': 'John',
'last_name': 'Doe',
'birthdate': '1990-01-01',
'gender': 'male',
'country': 'Russia',
'city': 'Moscow',
'lang': 'ru',
'weight': 75.5,
'height': 175,
'chest_circumference': 100,
'waist_circumference': 80,
'hip_circumference': 95,
'blood_pressure_up': 120,
'blood_pressure_down': 80,
'has_hypo': false,
'has_hyper': false,
'about_alergy': 'No allergies',
'about_taking_pils': 'No pills',
'about_sport_hobbies': 'Running',
'favorite_foods': 'Pizza',
'unfavorite_foods': 'Broccoli',
'additional_info': 'Additional info',
'created_at': '2024-01-01T00:00:00Z',
'updated_at': '2024-01-02T00:00:00Z',
'is_mood_fillable': true,
'is_bedtime_fillable': true,
'activity_coefficient': 1.5,
};
final model = ProfileDetailsModel.fromJson(json);
expect(model.firstName, 'John');
expect(model.lastName, 'Doe');
expect(model.birthdate, '1990-01-01');
expect(model.gender, 'male');
expect(model.country, 'Russia');
expect(model.city, 'Moscow');
expect(model.lang, 'ru');
expect(model.weight, 75.5);
expect(model.height, 175);
expect(model.chestCircumference, 100);
expect(model.waistCircumference, 80);
expect(model.hipCircumference, 95);
expect(model.bloodPressureUp, 120);
expect(model.bloodPressureDown, 80);
expect(model.hasHypo, isFalse);
expect(model.hasHyper, isFalse);
expect(model.aboutAlergy, 'No allergies');
expect(model.aboutTakingPils, 'No pills');
expect(model.aboutSportHobbies, 'Running');
expect(model.favoriteFoods, 'Pizza');
expect(model.unfavoriteFoods, 'Broccoli');
expect(model.additionalInfo, 'Additional info');
expect(model.isMoodFillable, isTrue);
expect(model.isBedtimeFillable, isTrue);
expect(model.activityCoefficient, 1.5);
});
test('toJson serializes all fields correctly', () {
final model = ProfileDetailsModel(
firstName: 'John',
lastName: 'Doe',
birthdate: '1990-01-01',
gender: 'male',
country: 'Russia',
city: 'Moscow',
lang: 'ru',
weight: 75.5,
height: 175,
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 95,
bloodPressureUp: 120,
bloodPressureDown: 80,
hasHypo: false,
hasHyper: false,
aboutAlergy: 'No allergies',
aboutTakingPils: 'No pills',
aboutSportHobbies: 'Running',
favoriteFoods: 'Pizza',
unfavoriteFoods: 'Broccoli',
additionalInfo: 'Additional info',
createdAt: DateTime(2024, 1, 1),
updatedAt: DateTime(2024, 1, 2),
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.5,
);
final json = model.toJson();
expect(json['first_name'], 'John');
expect(json['last_name'], 'Doe');
expect(json['birthdate'], '1990-01-01');
expect(json['gender'], 'male');
expect(json['weight'], 75.5);
expect(json['height'], 175);
expect(json['is_mood_fillable'], isTrue);
expect(json['activity_coefficient'], 1.5);
});
});
group('ProfilePreviewModel', () {
test('fromJson parses profilePhotoUrl correctly', () {
final json = {'profile_photo_url': 'https://example.com/photo.jpg'};
final model = ProfilePreviewModel.fromJson(json);
expect(model.profilePhotoUrl, 'https://example.com/photo.jpg');
});
test('toJson serializes profilePhotoUrl correctly', () {
const model = ProfilePreviewModel(profilePhotoUrl: 'https://example.com/photo.jpg');
final json = model.toJson();
expect(json['profile_photo_url'], 'https://example.com/photo.jpg');
});
test('creates instance with profilePhotoUrl', () {
const model = ProfilePreviewModel(profilePhotoUrl: 'https://example.com/photo2.jpg');
expect(model.profilePhotoUrl, 'https://example.com/photo2.jpg');
});
});
group('ProfileModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 1,
'name': 'John Doe',
'email': 'john@example.com',
'rating_place': 5,
'email_verified_at': '2024-01-01T00:00:00Z',
'phone_confirmation_state': 'confirmed',
'created_at': '2024-01-01T00:00:00Z',
'updated_at': '2024-01-02T00:00:00Z',
'is_public_profile': true,
'is_blocked_by_me': false,
'is_blocked_by_author': false,
'is_blocked_by_user': false,
'is_entity_subscribed_by_me': false,
'slug': 'john-doe',
'profile_photo_url': 'https://example.com/photo.jpg',
'roles': ['user'],
'badges': [
{
'id': 1,
'title': 'Badge 1',
'description': 'Description',
'image': 'https://example.com/badge1.jpg',
'type': 'type',
},
],
'subscriptions': ['user1', 'user2'],
'subscribers': ['user3'],
'education_resource': null,
'cert_photos': null,
};
final model = ProfileModel.fromJson(json);
expect(model.id, 1);
expect(model.name, 'John Doe');
expect(model.email, 'john@example.com');
expect(model.ratingPlace, 5);
expect(model.phoneConfirmationState, 'confirmed');
expect(model.isPublicProfile, isTrue);
expect(model.slug, 'john-doe');
expect(model.roles.length, 1);
expect(model.badges.length, 1);
});
test('fromJson handles null optional fields', () {
final json = {
'id': 1,
'name': 'John Doe',
'email': 'john@example.com',
'phone_confirmation_state': 'confirmed',
'is_public_profile': false,
'is_blocked_by_me': false,
'is_blocked_by_author': false,
'is_blocked_by_user': false,
'is_entity_subscribed_by_me': false,
'slug': 'john-doe',
'profile_photo_url': '',
'roles': [],
'badges': [],
'subscriptions': [],
'subscribers': [],
};
final model = ProfileModel.fromJson(json);
expect(model.ratingPlace, isNull);
expect(model.emailVerifiedAt, isNull);
expect(model.educationResource, isNull);
expect(model.diplomasAndCertificates, isNull);
});
test('toJson serializes ProfileModel correctly', () {
const model = ProfileModel(
id: 1,
name: 'John Doe',
email: 'john@example.com',
ratingPlace: 5,
emailVerifiedAt: null,
phoneConfirmationState: 'confirmed',
createdAt: null,
updatedAt: null,
isPublicProfile: true,
isBlockedByMe: false,
isBlockedByAuthor: false,
isBlockedByUser: false,
isEntitySubscribedByMe: false,
slug: 'john-doe',
profilePhotoUrl: 'https://example.com/photo.jpg',
roles: ['user'],
badges: [],
subscriptions: [],
subscribers: [],
educationResource: null,
diplomasAndCertificates: null,
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['name'], 'John Doe');
expect(json['email'], 'john@example.com');
expect(json['rating_place'], 5);
expect(json['phone_confirmation_state'], 'confirmed');
expect(json['is_public_profile'], isTrue);
expect(json['slug'], 'john-doe');
});
});
group('DiplomasAndCertificatesModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 1,
'path': 'https://example.com/cert.jpg',
};
final model = DiplomasAndCertificatesModel.fromJson(json);
expect(model.id, 1);
expect(model.path, 'https://example.com/cert.jpg');
});
test('toJson serializes DiplomasAndCertificatesModel correctly', () {
const model = DiplomasAndCertificatesModel(
id: 1,
path: 'https://example.com/cert.jpg',
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['path'], 'https://example.com/cert.jpg');
});
});
}

View File

@@ -179,5 +179,74 @@ void main() {
expect(sub.name, 'User One');
expect(sub.isEntitySubscribedByMe, true);
});
test('toJson serializes SubModel correctly', () {
final sub = SubModel(
slug: 'user1',
name: 'User One',
city: 'New York',
birthdate: DateTime(1990, 1, 1),
isEntitySubscribedByMe: true,
profilePhotoUrl: 'photo1.jpg',
roles: ['consultant'],
);
final json = sub.toJson();
expect(json['slug'], 'user1');
expect(json['name'], 'User One');
expect(json['city'], 'New York');
expect(json['is_entity_subscribed_by_me'], isTrue);
expect(json['profile_photo_url'], 'photo1.jpg');
expect(json['roles'], ['consultant']);
expect(json.containsKey('birthdate'), isTrue);
});
});
group('SubPaginationModel', () {
test('toJson serializes SubPaginationModel correctly', () {
final subs = [
SubModel(
slug: 'user1',
name: 'User One',
city: 'New York',
birthdate: DateTime(1990, 1, 1),
isEntitySubscribedByMe: true,
profilePhotoUrl: 'photo1.jpg',
roles: ['consultant'],
),
];
const links = Links(
first: 'http://example.com?page=1',
last: 'http://example.com?page=1',
prev: null,
next: null,
);
const meta = Meta(
currentPage: 1,
from: 1,
lastPage: 1,
links: [],
path: '/api/subs',
perPage: 10,
to: 1,
total: 1,
);
final model = SubPaginationModel(
data: subs,
links: links,
meta: meta,
);
final json = model.toJson();
expect(json.containsKey('data'), isTrue);
expect((json['data'] as List).length, 1);
expect(json.containsKey('links'), isTrue);
expect(json.containsKey('meta'), isTrue);
});
});
}

View File

@@ -0,0 +1,47 @@
import 'package:eatvio_app/features/profile/models/weight_model.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('WeightModel', () {
test('fromJson parses all fields correctly', () {
final json = {
'id': 1,
'user_id': 123,
'weight': 75,
'created_at': '2024-01-15T10:00:00Z',
'updated_at': '2024-01-16T10:00:00Z',
'bmi': 22.5,
};
final model = WeightModel.fromJson(json);
expect(model.id, 1);
expect(model.userId, 123);
expect(model.weight, 75);
expect(model.createdAt, isA<DateTime>());
expect(model.updatedAt, isA<DateTime>());
expect(model.bmi, 22.5);
});
test('toJson serializes all fields correctly', () {
final model = WeightModel(
id: 1,
userId: 123,
weight: 75,
createdAt: DateTime(2024, 1, 15, 10, 0, 0),
updatedAt: DateTime(2024, 1, 16, 10, 0, 0),
bmi: 22.5,
);
final json = model.toJson();
expect(json['id'], 1);
expect(json['user_id'], 123);
expect(json['weight'], 75);
expect(json['bmi'], 22.5);
expect(json['created_at'], isA<String>());
expect(json['updated_at'], isA<String>());
});
});
}

View File

@@ -0,0 +1,513 @@
import 'package:eatvio_app/features/chat/repositories/chat_repository.dart';
import 'package:eatvio_app/features/consultant/become_consultant/repositories/consultant_repository.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/feed/models/feed_blog_post_model.dart';
import 'package:eatvio_app/features/profile/models/profile_model.dart';
import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart';
import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_state.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_cubit_test.mocks.dart';
@GenerateNiceMocks([
MockSpec<ProfileRepository>(),
MockSpec<ChatRepository>(),
MockSpec<ConsultantRepository>(),
])
void main() {
group('ProfileCubit', () {
ProfileCubit? profileCubit;
late MockProfileRepository mockProfileRepository;
late MockChatRepository mockChatRepository;
late MockConsultantRepository mockConsultantRepository;
setUp(() {
mockProfileRepository = MockProfileRepository();
mockChatRepository = MockChatRepository();
mockConsultantRepository = MockConsultantRepository();
});
tearDown(() async {
if (profileCubit != null && !profileCubit!.isClosed) {
await Future.delayed(const Duration(milliseconds: 100));
await profileCubit!.close();
profileCubit = null;
}
});
test('начальное состояние - loading', () {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
expect(profileCubit!.state, isA<ProfileStateLoading>());
});
test('getProfileBySlug - успешная загрузка профиля', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
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 myProfile = ProfileModel(
id: 2,
slug: 'my-user',
name: 'My User',
email: 'my@example.com',
phoneConfirmationState: 'confirmed',
isPublicProfile: true,
isBlockedByMe: false,
isBlockedByAuthor: false,
isBlockedByUser: false,
isEntitySubscribedByMe: false,
profilePhotoUrl: 'https://example.com/icon2.jpg',
roles: [],
badges: [],
subscriptions: [],
subscribers: [],
);
const profileDetails = 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: '',
aboutTakingPils: '',
aboutSportHobbies: '',
favoriteFoods: '',
unfavoriteFoods: '',
additionalInfo: '',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.2,
);
when(mockProfileRepository.getProfileBySlug('test-user')).thenAnswer((_) async => testProfile);
when(mockProfileRepository.getMyProfile()).thenAnswer((_) async => myProfile);
when(mockProfileRepository.getProfileDetailsBySlug('test-user')).thenAnswer((_) async => profileDetails);
when(mockProfileRepository.getBlogPostsByAuthorSlug(slug: 'test-user')).thenAnswer((_) async => []);
await profileCubit!.getProfileBySlug('test-user');
final state = profileCubit!.state;
expect(state, isA<ProfileStateLoaded>());
if (state is ProfileStateLoaded) {
expect(state.profile.id, 1);
expect(state.isMyProfile, false);
}
});
test('getProfileBySlug - обработка ошибки', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
when(mockProfileRepository.getProfileBySlug('test-user')).thenThrow(Exception('Ошибка загрузки'));
expect(() => profileCubit!.getProfileBySlug('test-user'), throwsException);
final state = profileCubit!.state;
expect(state, isA<ProfileStateError>());
});
test('getMyProfile - успешная загрузка моего профиля', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
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 profileDetails = 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: '',
aboutTakingPils: '',
aboutSportHobbies: '',
favoriteFoods: '',
unfavoriteFoods: '',
additionalInfo: '',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.2,
);
when(mockProfileRepository.getMyProfile()).thenAnswer((_) async => testProfile);
when(mockProfileRepository.getMyProfileDetails()).thenAnswer((_) async => profileDetails);
when(mockProfileRepository.getBlogPostsByAuthorSlug(slug: 'test-user')).thenAnswer((_) async => []);
when(mockProfileRepository.getWeight(period: '1')).thenAnswer((_) async => []);
when(mockProfileRepository.getCircumferences(period: '1')).thenAnswer((_) async => []);
await profileCubit!.getMyProfile();
final state = profileCubit!.state;
expect(state, isA<ProfileStateLoaded>());
if (state is ProfileStateLoaded) {
expect(state.profile.id, 1);
expect(state.isMyProfile, true);
}
});
test('getMyProfile - обработка ошибки', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
when(mockProfileRepository.getMyProfile()).thenThrow(Exception('Ошибка загрузки'));
await profileCubit!.getMyProfile();
final state = profileCubit!.state;
expect(state, isA<ProfileStateError>());
});
test('updateFeedBlogPostList - обновляет лайк в списке блогов', () {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
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 author = Author(
authorSlug: 'test-user',
authorName: 'Test User',
authorProfileIcon: 'https://example.com/icon.jpg',
authorIsMe: false,
isEntitySubscribedByMe: null,
authorPlaceInRating: null,
);
final blogPost = FeedBlogPostModel(
id: 1,
state: 'published',
title: 'Test Post',
description: 'Test Content',
image: 'https://example.com/image.jpg',
author: author,
videoUrl: '',
createdAt: DateTime.now(),
updatedAt: DateTime.now(),
totalLikes: 10,
totalComments: 5,
totalViews: 100,
wasLikedByMe: false,
);
const profileDetails = 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: '',
aboutTakingPils: '',
aboutSportHobbies: '',
favoriteFoods: '',
unfavoriteFoods: '',
additionalInfo: '',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.2,
);
profileCubit!.emit(ProfileState.loaded(
profile: testProfile,
isMyProfile: true,
profileDetails: profileDetails,
blogPosts: [blogPost],
));
profileCubit!.updateFeedBlogPostList(blogPost, true);
final state = profileCubit!.state;
expect(state, isA<ProfileStateLoaded>());
if (state is ProfileStateLoaded) {
expect(state.blogPosts.length, 1);
expect(state.blogPosts.first.wasLikedByMe, true);
expect(state.blogPosts.first.totalLikes, 11);
}
});
test('addCircumference - успешно добавляет обхваты', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
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: [],
);
when(mockProfileRepository.addCircumference(
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
)).thenAnswer((_) async => {});
const profileDetails = 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: '',
aboutTakingPils: '',
aboutSportHobbies: '',
favoriteFoods: '',
unfavoriteFoods: '',
additionalInfo: '',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.2,
);
when(mockProfileRepository.getMyProfile()).thenAnswer((_) async => testProfile);
when(mockProfileRepository.getMyProfileDetails()).thenAnswer((_) async => profileDetails);
when(mockProfileRepository.getBlogPostsByAuthorSlug(slug: 'test-user')).thenAnswer((_) async => []);
when(mockProfileRepository.getWeight(period: '1')).thenAnswer((_) async => []);
when(mockProfileRepository.getCircumferences(period: '1')).thenAnswer((_) async => []);
await profileCubit!.addCircumference(
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
);
verify(mockProfileRepository.addCircumference(
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
)).called(1);
});
test('addCircumference - обработка ошибки', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
when(mockProfileRepository.addCircumference(
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
)).thenThrow(Exception('Ошибка добавления'));
await profileCubit!.addCircumference(
chestCircumference: 100,
waistCircumference: 80,
hipCircumference: 90,
);
final state = profileCubit!.state;
expect(state, isA<ProfileStateError>());
});
test('addWeight - успешно добавляет вес', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
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: [],
);
when(mockProfileRepository.addWeight(weight: 70.5)).thenAnswer((_) async => {});
const profileDetails = 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: '',
aboutTakingPils: '',
aboutSportHobbies: '',
favoriteFoods: '',
unfavoriteFoods: '',
additionalInfo: '',
isMoodFillable: true,
isBedtimeFillable: true,
activityCoefficient: 1.2,
);
when(mockProfileRepository.getMyProfile()).thenAnswer((_) async => testProfile);
when(mockProfileRepository.getMyProfileDetails()).thenAnswer((_) async => profileDetails);
when(mockProfileRepository.getBlogPostsByAuthorSlug(slug: 'test-user')).thenAnswer((_) async => []);
when(mockProfileRepository.getWeight(period: '1')).thenAnswer((_) async => []);
when(mockProfileRepository.getCircumferences(period: '1')).thenAnswer((_) async => []);
await profileCubit!.addWeight(weight: 70.5);
verify(mockProfileRepository.addWeight(weight: 70.5)).called(1);
});
test('addWeight - обработка ошибки', () async {
profileCubit = ProfileCubit(
profileRepository: mockProfileRepository,
chatRepository: mockChatRepository,
consultantRepository: mockConsultantRepository,
);
when(mockProfileRepository.addWeight(weight: 70.5)).thenThrow(Exception('Ошибка добавления'));
await profileCubit!.addWeight(weight: 70.5);
final state = profileCubit!.state;
expect(state, isA<ProfileStateError>());
});
});
}