forked from eatvio/eatvio_app
Merge pull request 'feat(tests)' (#876) from misha/eatvio_app:main into main
Reviewed-on: eatvio/eatvio_app#876
This commit is contained in:
@@ -965,5 +965,116 @@ void main() {
|
||||
|
||||
verify(mockDiaryRepository.deletePhoto(photo: photo, diaryId: 1, mealId: 1)).called(1);
|
||||
});
|
||||
|
||||
test('setSelectedDay - возвращает true даже если getDiary возвращает null', () async {
|
||||
diaryCubit = DiaryCubit(
|
||||
diaryRepository: mockDiaryRepository,
|
||||
glossaryRepository: mockGlossaryRepository,
|
||||
profileRepository: mockProfileRepository,
|
||||
dietRepository: mockDietRepository,
|
||||
chatRepository: mockChatRepository,
|
||||
settingsRepository: mockSettingsRepository,
|
||||
);
|
||||
when(mockDiaryRepository.createDiaryDay(day: anyNamed('day'))).thenThrow(
|
||||
DioException(
|
||||
requestOptions: RequestOptions(path: ''),
|
||||
response: Response(requestOptions: RequestOptions(path: ''), statusCode: 500),
|
||||
),
|
||||
);
|
||||
|
||||
final result = await diaryCubit!.setSelectedDay(DateTime(2024, 1, 20));
|
||||
|
||||
// fetchDiaryV2 возвращает true когда getDiary() == null, так как эмитит состояние ошибки
|
||||
expect(result, true);
|
||||
expect(diaryCubit!.state, isA<DiaryStateError>());
|
||||
});
|
||||
|
||||
test('fetchDiaryV2 - обрабатывает случай когда diaryEntity == null и нет диеты', () async {
|
||||
diaryCubit = DiaryCubit(
|
||||
diaryRepository: mockDiaryRepository,
|
||||
glossaryRepository: mockGlossaryRepository,
|
||||
profileRepository: mockProfileRepository,
|
||||
dietRepository: mockDietRepository,
|
||||
chatRepository: mockChatRepository,
|
||||
settingsRepository: mockSettingsRepository,
|
||||
);
|
||||
// toEntity() возвращает null когда id == null
|
||||
const diaryDayWithoutEntity = DiaryDayModel(
|
||||
id: null,
|
||||
date: '2024-01-15',
|
||||
closed: 0,
|
||||
comment: '',
|
||||
typeOfDiary: TypeOfDiaryModel(hasChosenDiet: false, hasChosenPlan: false, diaryState: null),
|
||||
meals: [],
|
||||
chosenPlanId: null,
|
||||
dayOfChosenDiet: null,
|
||||
diet: null,
|
||||
);
|
||||
when(mockDiaryRepository.createDiaryDay(day: anyNamed('day'))).thenAnswer((_) async => Future.value());
|
||||
when(mockDiaryRepository.getDiaryDayV2(day: anyNamed('day'))).thenAnswer((_) async => diaryDayWithoutEntity);
|
||||
|
||||
final result = await diaryCubit!.fetchDiaryV2(needLoading: false);
|
||||
|
||||
// Если diaryEntity == null (id == null) и нет диеты, fetchDiaryV2 возвращает false
|
||||
// и эмитит предыдущее состояние (loading)
|
||||
expect(result, false);
|
||||
expect(diaryCubit!.state, const DiaryState.loading());
|
||||
});
|
||||
|
||||
test('fetchDiaryV2 - обрабатывает случай когда diaryEntity == null но есть диета', () async {
|
||||
diaryCubit = DiaryCubit(
|
||||
diaryRepository: mockDiaryRepository,
|
||||
glossaryRepository: mockGlossaryRepository,
|
||||
profileRepository: mockProfileRepository,
|
||||
dietRepository: mockDietRepository,
|
||||
chatRepository: mockChatRepository,
|
||||
settingsRepository: mockSettingsRepository,
|
||||
);
|
||||
// id должен быть null, чтобы toEntity() вернул null и код пошел по ветке setDiaryForDietOnly
|
||||
const diaryDayWithDiet = DiaryDayModel(
|
||||
id: null,
|
||||
date: '2024-01-15',
|
||||
closed: 0,
|
||||
comment: '',
|
||||
typeOfDiary: TypeOfDiaryModel(hasChosenDiet: true, hasChosenPlan: false, diaryState: null),
|
||||
meals: [],
|
||||
chosenPlanId: null,
|
||||
dayOfChosenDiet: 1,
|
||||
diet: DiaryDietModel(id: 1, duration: 7, name: 'Test Diet'),
|
||||
);
|
||||
when(mockDiaryRepository.createDiaryDay(day: anyNamed('day'))).thenAnswer((_) async => Future.value());
|
||||
when(mockDiaryRepository.getDiaryDayV2(day: anyNamed('day'))).thenAnswer((_) async => diaryDayWithDiet);
|
||||
when(mockDietRepository.getDiet(1)).thenAnswer(
|
||||
(_) async => const Diet(
|
||||
id: 1,
|
||||
slug: 'test-diet',
|
||||
name: 'Test Diet',
|
||||
image: '',
|
||||
duration: 7,
|
||||
state: DietState.active,
|
||||
type: DietType(),
|
||||
details: '',
|
||||
dailySchedule: {
|
||||
1: {
|
||||
1: {1: DailySchedule(name: 'Яблоко', portion: Portion.grams, quantity: 1)},
|
||||
},
|
||||
},
|
||||
author: Author(authorSlug: 'test', authorName: 'Test', authorProfileIcon: '', authorIsMe: false),
|
||||
totalLikes: 0,
|
||||
totalViews: 0,
|
||||
totalComments: 0,
|
||||
wasLikedByMe: false,
|
||||
isFavorite: false,
|
||||
dailyNutrition: [],
|
||||
),
|
||||
);
|
||||
|
||||
final result = await diaryCubit!.fetchDiaryV2(needLoading: false);
|
||||
await Future.delayed(const Duration(milliseconds: 100));
|
||||
|
||||
expect(result, true);
|
||||
// setDiaryForDietOnly сначала эмитит loading, затем loadedTomorrowWithDiet
|
||||
expect(diaryCubit!.state, isA<DiaryStateLoadedTomorrowWithDiet>());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import 'package:eatvio_app/core/app_config.dart';
|
||||
import 'package:eatvio_app/core/app_initializer.dart';
|
||||
import 'package:eatvio_app/core/locator_service.dart';
|
||||
import 'package:eatvio_app/core/theme/theme_helper.dart';
|
||||
import 'package:eatvio_app/features/diary/presentation/pages/barcode_scanner_screen.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() {
|
||||
group('BarcodeScannerScreen smoke', () {
|
||||
setUpAll(() async {
|
||||
dotenv.loadFromString(envString: 'DEV_BASE_URL=http://localhost\nBASE_URL=http://localhost');
|
||||
});
|
||||
|
||||
setUp(() async {
|
||||
await sl.reset();
|
||||
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
|
||||
});
|
||||
|
||||
Widget wrap(Widget child) {
|
||||
return MaterialApp(
|
||||
theme: ThemeHelper().themeData(),
|
||||
home: child,
|
||||
);
|
||||
}
|
||||
|
||||
testWidgets('renders barcode scanner screen', (tester) async {
|
||||
await tester.pumpWidget(wrap(const BarcodeScannerScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.byType(BarcodeScannerScreen), findsOneWidget);
|
||||
expect(find.text('Сканирование штрихкода'), findsOneWidget);
|
||||
expect(find.text('Наведите камеру на штрихкод'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('displays barcode scanner UI elements', (tester) async {
|
||||
await tester.pumpWidget(wrap(const BarcodeScannerScreen()));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Найденный штрихкод'), findsOneWidget);
|
||||
expect(find.text('Наведите камеру на штрихкод'), findsOneWidget);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user