forked from eatvio/eatvio_app
feat(test): update oauth handling and improve preferences management
This commit is contained in:
73
test/core/cubit/base_cubit_test.dart
Normal file
73
test/core/cubit/base_cubit_test.dart
Normal 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');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
98
test/core/cubit/marketing/marketing_cubit_test.dart
Normal file
98
test/core/cubit/marketing/marketing_cubit_test.dart
Normal 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);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user