Refactor main files to streamline initialization

- Removed logging setup from `main_development.dart`.
- Eliminated import of `main_staging.dart` in `main.dart`.
- Removed direct import of `SharedPreferencesService` in `dependencies.dart` to enhance modularity.
pull/2840/head
Abdelrahman 3 weeks ago
parent 4d3768c2be
commit ae6c29f159

@ -28,7 +28,6 @@ import '../data/repositories/user/user_repository_remote.dart';
import '../data/services/api/api_client.dart';
import '../data/services/api/auth_api_client.dart';
import '../data/services/local/local_data_service.dart';
import '../data/services/shared_preferences_service.dart';
import '../domain/use_cases/booking/booking_create_use_case.dart';
import '../domain/use_cases/booking/booking_share_use_case.dart';

@ -7,7 +7,6 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart';
import 'main_development.dart' as development;
import 'main_staging.dart' as staging;
import 'routing/router.dart';
import 'ui/core/localization/applocalization.dart';
import 'ui/core/themes/theme.dart';

@ -17,10 +17,6 @@ Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((record) {
print('${record.time}: [${record.level.name}] ${record.loggerName}: ${record.message}');
});
final sharedPrefsService = await SharedPreferencesService.create();
runApp(

@ -0,0 +1,89 @@
import 'package:compass_app/data/services/shared_preferences_service.dart';
import 'package:compass_app/utils/result.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:shared_preferences/shared_preferences.dart';
// --- Mock ---
class MockSharedPreferencesWithCache extends Mock
implements SharedPreferencesWithCache {}
void main() {
late MockSharedPreferencesWithCache mockPrefs;
late SharedPreferencesService sut;
setUp(() {
mockPrefs = MockSharedPreferencesWithCache();
sut = SharedPreferencesService(mockPrefs);
});
group('fetchToken', () {
test('returns ok with token when prefs has a stored value', () async {
when(() => mockPrefs.getString('TOKEN')).thenReturn('my-token');
final result = await sut.fetchToken();
expect(result, isA<Ok<String?>>());
expect((result as Ok).value, 'my-token');
});
test('returns ok with null when no token is stored', () async {
when(() => mockPrefs.getString('TOKEN')).thenReturn(null);
final result = await sut.fetchToken();
expect(result, isA<Ok<String?>>());
expect((result as Ok).value, isNull);
});
test('returns error when getString throws an Exception', () async {
when(() => mockPrefs.getString('TOKEN'))
.thenThrow(Exception('read error'));
final result = await sut.fetchToken();
expect(result, isA<Error<String?>>());
});
});
group('saveToken', () {
test('calls setString and returns ok when token is not null', () async {
when(() => mockPrefs.setString('TOKEN', 'new-token'))
.thenAnswer((_) async {});
final result = await sut.saveToken('new-token');
expect(result, isA<Ok<void>>());
verify(() => mockPrefs.setString('TOKEN', 'new-token')).called(1);
verifyNever(() => mockPrefs.remove(any()));
});
test('calls remove and returns ok when token is null', () async {
when(() => mockPrefs.remove('TOKEN')).thenAnswer((_) async {});
final result = await sut.saveToken(null);
expect(result, isA<Ok<void>>());
verify(() => mockPrefs.remove('TOKEN')).called(1);
verifyNever(() => mockPrefs.setString(any(), any()));
});
test('returns error when setString throws an Exception', () async {
when(() => mockPrefs.setString('TOKEN', any()))
.thenThrow(Exception('write error'));
final result = await sut.saveToken('bad-token');
expect(result, isA<Error<void>>());
});
test('returns error when remove throws an Exception', () async {
when(() => mockPrefs.remove('TOKEN'))
.thenThrow(Exception('remove error'));
final result = await sut.saveToken(null);
expect(result, isA<Error<void>>());
});
});
}
Loading…
Cancel
Save