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,73 @@
import 'package:eatvio_app/core/cubit/base_cubit.dart';
import 'package:flutter_test/flutter_test.dart';
// Простой тестовый cubit для проверки BaseCubit
class TestState {
final String? value;
TestState({this.value});
}
class TestCubit extends BaseCubit<TestState> {
TestCubit() : super(TestState());
void testHandleError(Object error, [StackTrace? stackTrace]) {
handleError(error, stackTrace);
}
Future<String?> testSafeExecute() async {
return await safeExecute(() async => 'success');
}
Future<String?> testSafeExecuteWithError() async {
return await safeExecute(() async => throw Exception('Test error'));
}
Future<String?> testSafeExecuteWithState() async {
return await safeExecuteWithState<String>(
() async => 'result',
loadingState: TestState(value: 'loading'),
successState: (result) => TestState(value: result),
errorState: (error) => TestState(value: 'error'),
);
}
}
void main() {
group('BaseCubit', () {
late TestCubit testCubit;
setUp(() {
testCubit = TestCubit();
});
tearDown(() async {
if (!testCubit.isClosed) {
await testCubit.close();
}
});
test('handleError - обрабатывает ошибку без исключений', () {
expect(() => testCubit.testHandleError(Exception('Test error')), returnsNormally);
});
test('safeExecute - успешно выполняет операцию', () async {
final result = await testCubit.testSafeExecute();
expect(result, 'success');
});
test('safeExecute - возвращает null при ошибке', () async {
final result = await testCubit.testSafeExecuteWithError();
expect(result, isNull);
});
test('safeExecuteWithState - устанавливает состояния правильно', () async {
final result = await testCubit.testSafeExecuteWithState();
expect(result, 'result');
expect(testCubit.state.value, 'result');
});
});
}

View File

@@ -0,0 +1,98 @@
import 'package:eatvio_app/core/cubit/marketing/marketing_cubit.dart';
import 'package:eatvio_app/core/cubit/marketing/marketing_cubit_state.dart';
import 'package:eatvio_app/core/prefs.dart';
import 'package:eatvio_app/core/prefs_keys.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'marketing_cubit_test.mocks.dart';
@GenerateNiceMocks([MockSpec<Prefs>()])
void main() {
group('MarketingCubit', () {
late MarketingCubit marketingCubit;
late MockPrefs mockPrefs;
setUp(() async {
SharedPreferences.setMockInitialValues({});
mockPrefs = MockPrefs();
marketingCubit = MarketingCubit(mockPrefs);
});
tearDown(() async {
if (!marketingCubit.isClosed) {
await marketingCubit.close();
}
});
test('начальное состояние - MarketingCubitState', () {
expect(marketingCubit.state, const MarketingCubitState());
});
test('checkRegistrationDate - возвращает false если registrationDate отсутствует', () async {
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenReturn(null);
final result = await marketingCubit.checkRegistrationDate();
expect(result, isFalse);
verify(mockPrefs.getInt(PrefsKeys.registrationDate)).called(1);
});
test('checkRegistrationDate - возвращает false если маркетинговый bottom sheet уже был показан', () async {
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenReturn(DateTime.now().millisecondsSinceEpoch);
when(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).thenReturn(true);
final result = await marketingCubit.checkRegistrationDate();
expect(result, isFalse);
verify(mockPrefs.getInt(PrefsKeys.registrationDate)).called(1);
verify(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).called(1);
});
test('checkRegistrationDate - возвращает false если прошло менее 14 дней', () async {
final registrationDate = DateTime.now().subtract(const Duration(days: 10));
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenReturn(registrationDate.millisecondsSinceEpoch);
when(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).thenReturn(false);
final result = await marketingCubit.checkRegistrationDate();
expect(result, isFalse);
verify(mockPrefs.getInt(PrefsKeys.registrationDate)).called(1);
verify(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).called(1);
verifyNever(mockPrefs.setBool(any, any));
});
test('checkRegistrationDate - возвращает true если прошло 14 дней или больше', () async {
final registrationDate = DateTime.now().subtract(const Duration(days: 14));
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenReturn(registrationDate.millisecondsSinceEpoch);
when(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).thenReturn(false);
when(mockPrefs.setBool(PrefsKeys.marketingBottomSheetHasBeenShown, true)).thenAnswer((_) async => Future.value());
final result = await marketingCubit.checkRegistrationDate();
expect(result, isTrue);
verify(mockPrefs.getInt(PrefsKeys.registrationDate)).called(1);
verify(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).called(1);
verify(mockPrefs.setBool(PrefsKeys.marketingBottomSheetHasBeenShown, true)).called(1);
});
test('checkRegistrationDate - устанавливает флаг после показа bottom sheet', () async {
final registrationDate = DateTime.now().subtract(const Duration(days: 15));
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenReturn(registrationDate.millisecondsSinceEpoch);
when(mockPrefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown)).thenReturn(false);
when(mockPrefs.setBool(PrefsKeys.marketingBottomSheetHasBeenShown, true)).thenAnswer((_) async => Future.value());
await marketingCubit.checkRegistrationDate();
verify(mockPrefs.setBool(PrefsKeys.marketingBottomSheetHasBeenShown, true)).called(1);
});
test('checkRegistrationDate - пробрасывает исключение', () async {
when(mockPrefs.getInt(PrefsKeys.registrationDate)).thenThrow(Exception('Ошибка чтения'));
expect(() => marketingCubit.checkRegistrationDate(), throwsException);
});
});
}