forked from eatvio/eatvio_app
refactor(tests): update model instantiation to use const for improved performance
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
import 'package:eatvio_app/features/profile/models/circumference_model.dart';
|
||||
import 'package:eatvio_app/features/profile/models/profile_model.dart';
|
||||
import 'package:eatvio_app/features/profile/models/weight_model.dart';
|
||||
import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
|
||||
import 'package:eatvio_app/features/user_details/presentation/cubit/user_details_cubit.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
|
||||
import 'user_details_cubit_test.mocks.dart';
|
||||
|
||||
@GenerateMocks([ProfileRepository])
|
||||
void main() {
|
||||
group('UserDetailsCubit', () {
|
||||
late UserDetailsCubit cubit;
|
||||
late MockProfileRepository mockProfileRepository;
|
||||
|
||||
setUp(() {
|
||||
mockProfileRepository = MockProfileRepository();
|
||||
cubit = UserDetailsCubit(profileRepository: mockProfileRepository);
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
cubit.close();
|
||||
});
|
||||
|
||||
test('начальное состояние', () {
|
||||
expect(cubit.state.isLoading, isFalse);
|
||||
expect(cubit.state.error, isNull);
|
||||
expect(cubit.state.profileDetails, isNull);
|
||||
expect(cubit.state.weightPoints, isNull);
|
||||
expect(cubit.state.circumferencePoints, isNull);
|
||||
});
|
||||
|
||||
test('getUserDetails - успешная загрузка деталей пользователя', () async {
|
||||
const slug = 'test-user';
|
||||
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: false,
|
||||
isBedtimeFillable: false,
|
||||
activityCoefficient: 1.5,
|
||||
);
|
||||
|
||||
final weightPoints = [
|
||||
WeightModel(
|
||||
id: 1,
|
||||
userId: 1,
|
||||
weight: 70,
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
bmi: 22.9,
|
||||
),
|
||||
];
|
||||
|
||||
final circumferencePoints = [
|
||||
CircumferenceModel(
|
||||
id: 1,
|
||||
userId: 1,
|
||||
chestCircumference: 100,
|
||||
waistCircumference: 80,
|
||||
hipCircumference: 90,
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
),
|
||||
];
|
||||
|
||||
when(mockProfileRepository.getProfileDetailsBySlug(slug))
|
||||
.thenAnswer((_) async => profileDetails);
|
||||
|
||||
when(mockProfileRepository.getWeight(period: '1', slug: slug))
|
||||
.thenAnswer((_) async => weightPoints);
|
||||
|
||||
when(mockProfileRepository.getCircumferences(period: '1', slug: slug))
|
||||
.thenAnswer((_) async => circumferencePoints);
|
||||
|
||||
cubit.getUserDetails(slug);
|
||||
|
||||
// Ждем завершения асинхронных операций
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
|
||||
expect(cubit.state.profileDetails, equals(profileDetails));
|
||||
expect(cubit.state.isLoading, isFalse);
|
||||
verify(mockProfileRepository.getProfileDetailsBySlug(slug)).called(1);
|
||||
});
|
||||
|
||||
test('getUserDetails - обработка ошибки', () async {
|
||||
const slug = 'test-user';
|
||||
final error = Exception('Ошибка загрузки');
|
||||
|
||||
when(mockProfileRepository.getProfileDetailsBySlug(slug))
|
||||
.thenThrow(error);
|
||||
|
||||
cubit.getUserDetails(slug);
|
||||
|
||||
// Ждем завершения асинхронных операций
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
|
||||
expect(cubit.state.error, equals(error.toString()));
|
||||
expect(cubit.state.isLoading, isFalse);
|
||||
});
|
||||
|
||||
test('getChartData - успешная загрузка данных графика', () async {
|
||||
const slug = 'test-user';
|
||||
const period = '1';
|
||||
|
||||
final weightPoints = [
|
||||
WeightModel(
|
||||
id: 1,
|
||||
userId: 1,
|
||||
weight: 70,
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
bmi: 22.9,
|
||||
),
|
||||
WeightModel(
|
||||
id: 2,
|
||||
userId: 1,
|
||||
weight: 71,
|
||||
createdAt: DateTime.now().add(const Duration(days: 1)),
|
||||
updatedAt: DateTime.now().add(const Duration(days: 1)),
|
||||
bmi: 23.2,
|
||||
),
|
||||
];
|
||||
|
||||
final circumferencePoints = [
|
||||
CircumferenceModel(
|
||||
id: 1,
|
||||
userId: 1,
|
||||
chestCircumference: 100,
|
||||
waistCircumference: 80,
|
||||
hipCircumference: 90,
|
||||
createdAt: DateTime.now(),
|
||||
updatedAt: DateTime.now(),
|
||||
),
|
||||
];
|
||||
|
||||
when(mockProfileRepository.getWeight(period: period, slug: slug))
|
||||
.thenAnswer((_) async => weightPoints);
|
||||
|
||||
when(mockProfileRepository.getCircumferences(period: period, slug: slug))
|
||||
.thenAnswer((_) async => circumferencePoints);
|
||||
|
||||
cubit.getChartData(period: period, slug: slug);
|
||||
|
||||
// Ждем завершения асинхронных операций
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
|
||||
expect(cubit.state.weightPoints, equals(weightPoints));
|
||||
expect(cubit.state.circumferencePoints, equals(circumferencePoints));
|
||||
verify(mockProfileRepository.getWeight(period: period, slug: slug)).called(1);
|
||||
verify(mockProfileRepository.getCircumferences(period: period, slug: slug)).called(1);
|
||||
});
|
||||
|
||||
test('getChartData - обработка ошибки', () async {
|
||||
const slug = 'test-user';
|
||||
const period = '1';
|
||||
final error = Exception('Ошибка загрузки');
|
||||
|
||||
when(mockProfileRepository.getWeight(period: period, slug: slug))
|
||||
.thenThrow(error);
|
||||
|
||||
cubit.getChartData(period: period, slug: slug);
|
||||
|
||||
// Ждем завершения асинхронных операций
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
|
||||
expect(cubit.state.error, equals(error.toString()));
|
||||
expect(cubit.state.isLoading, isFalse);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user