refactor(auth): Migrate session storage to flutter_secure_storage

This commit is contained in:
gasaichandesu
2026-06-19 22:58:27 +04:00
parent 8f6ed5504b
commit 07b9e44350
10 changed files with 181 additions and 103 deletions
@@ -0,0 +1,89 @@
import 'dart:convert';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/launcher_session.dart';
import 'package:moonwell_launcher/features/preferences/data/repositories/local_preferences_repository.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
group('LocalPreferencesRepository', () {
setUp(() {
SharedPreferences.setMockInitialValues(<String, Object>{});
FlutterSecureStorage.setMockInitialValues(<String, String>{});
});
Future<LocalPreferencesRepository> createRepository() async {
final preferences = await SharedPreferences.getInstance();
return LocalPreferencesRepository(
preferences: preferences,
secureStorage: const FlutterSecureStorage(),
);
}
test('persists output directory through shared preferences', () async {
final repository = await createRepository();
final uri = Uri.file(r'C:\Games\MoonWell');
await repository.setOutputDir(uri);
expect(await repository.getOutputDir(), uri);
});
test('persists launcher session through secure storage', () async {
final repository = await createRepository();
final session = LauncherSession(
accessToken: 'token',
tokenType: 'Bearer',
expiresAt: DateTime.parse('2030-01-01T00:00:00Z'),
);
await repository.setLauncherSession(session);
final restoredSession = await repository.getLauncherSession();
expect(restoredSession?.accessToken, 'token');
expect(restoredSession?.tokenType, 'Bearer');
expect(
restoredSession?.expiresAt?.toUtc(),
DateTime.parse('2030-01-01T00:00:00Z'),
);
});
test('clears persisted launcher session', () async {
final repository = await createRepository();
await repository.setLauncherSession(
const LauncherSession(
accessToken: 'token',
tokenType: 'Bearer',
expiresAt: null,
),
);
await repository.clearLauncherSession();
expect(await repository.getLauncherSession(), isNull);
});
test(
'removes legacy shared preferences session without restoring it',
() async {
final legacySession = LauncherSession(
accessToken: 'legacy-token',
tokenType: 'Bearer',
expiresAt: DateTime.parse('2030-01-01T00:00:00Z'),
);
SharedPreferences.setMockInitialValues(<String, Object>{
'launcher_session': jsonEncode(legacySession.toJson()),
});
final preferences = await SharedPreferences.getInstance();
final repository = LocalPreferencesRepository(
preferences: preferences,
secureStorage: const FlutterSecureStorage(),
);
expect(await repository.getLauncherSession(), isNull);
expect(preferences.containsKey('launcher_session'), isFalse);
},
);
});
}
@@ -1,52 +0,0 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/launcher_session.dart';
import 'package:moonwell_launcher/features/preferences/data/repositories/shared_prefs_preferences_repository.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
group('SharedPrefsPreferencesRepository', () {
setUp(() {
SharedPreferences.setMockInitialValues(<String, Object>{});
});
test('persists launcher session between reads', () async {
final preferences = await SharedPreferences.getInstance();
final repository = SharedPrefsPreferencesRepository(
preferences: preferences,
);
final session = LauncherSession(
accessToken: 'token',
tokenType: 'Bearer',
expiresAt: DateTime.parse('2030-01-01T00:00:00Z'),
);
await repository.setLauncherSession(session);
final restoredSession = await repository.getLauncherSession();
expect(restoredSession?.accessToken, 'token');
expect(restoredSession?.tokenType, 'Bearer');
expect(
restoredSession?.expiresAt?.toUtc(),
DateTime.parse('2030-01-01T00:00:00Z'),
);
});
test('clears persisted launcher session', () async {
final preferences = await SharedPreferences.getInstance();
final repository = SharedPrefsPreferencesRepository(
preferences: preferences,
);
await repository.setLauncherSession(
LauncherSession(
accessToken: 'token',
tokenType: 'Bearer',
expiresAt: null,
),
);
await repository.clearLauncherSession();
expect(await repository.getLauncherSession(), isNull);
});
});
}