77 lines
3.3 KiB
Dart
77 lines
3.3 KiB
Dart
import 'package:drift/native.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:motorcycle_dash/database/database.dart';
|
|
import 'package:motorcycle_dash/services/auth/account_lifecycle_service.dart';
|
|
import 'package:motorcycle_dash/services/auth/auth_service.dart';
|
|
import 'package:motorcycle_dash/services/auth/auth_state.dart';
|
|
import 'package:motorcycle_dash/services/auth/auth_user.dart';
|
|
import 'package:motorcycle_dash/services/cloud/account_cloud_cleanup_service.dart';
|
|
|
|
class _Auth implements AuthService {
|
|
AuthUser? user = const AuthUser(uid: 'user_a', email: 'a@test.com');
|
|
bool reauthenticated = false;
|
|
bool deleted = false;
|
|
@override bool get isConfigured => true;
|
|
@override bool get isEmailVerified => true;
|
|
@override AuthUser? get currentUser => user;
|
|
@override AuthState get currentState => AuthState.authenticated(user!);
|
|
@override Stream<AuthState> get authStateChanges => Stream.value(currentState);
|
|
@override Future<void> createUserWithEmailAndPassword(String e, String p, {String? displayName}) async {}
|
|
@override Future<void> sendPasswordResetEmail(String email) async {}
|
|
@override Future<void> sendEmailVerification() async {}
|
|
@override Future<void> reloadCurrentUser() async {}
|
|
@override Future<void> signInAnonymously() async {}
|
|
@override Future<void> signInWithEmailAndPassword(String e, String p) async {}
|
|
@override Future<void> signInWithGoogle() async {}
|
|
@override Future<String?> getIdToken([bool forceRefresh = false]) async => 'token';
|
|
@override Future<void> reauthenticate({String? password}) async { reauthenticated = true; }
|
|
@override Future<void> deleteCurrentUser() async { deleted = true; user = null; }
|
|
@override Future<void> signOut() async {}
|
|
@override void dispose() {}
|
|
}
|
|
|
|
class _Cloud implements CloudAccountCleanup {
|
|
bool fail = false;
|
|
bool called = false;
|
|
@override Future<void> deleteCloudData() async { called = true; if (fail) throw StateError('network'); }
|
|
}
|
|
|
|
void main() {
|
|
test('successful deletion preserves rides and clears only deleted owner', () async {
|
|
final db = AppDatabase.forTesting(NativeDatabase.memory());
|
|
addTearDown(db.close);
|
|
final owned = await db.startRide();
|
|
final other = await db.startRide();
|
|
await db.claimRideForCloudOwner(owned, 'user_a');
|
|
await db.claimRideForCloudOwner(other, 'user_b');
|
|
final auth = _Auth();
|
|
final cloud = _Cloud();
|
|
|
|
await AccountLifecycleService(auth: auth, cloud: cloud, db: db).deleteAccount(password: 'secret');
|
|
|
|
expect(auth.reauthenticated, isTrue);
|
|
expect(cloud.called, isTrue);
|
|
expect(auth.deleted, isTrue);
|
|
expect(await db.getCloudOwnerUid(owned), isNull);
|
|
expect(await db.getCloudOwnerUid(other), 'user_b');
|
|
expect(await db.getCloudRideId(owned), isNotNull);
|
|
expect((await db.select(db.rides).get()).length, 2);
|
|
});
|
|
|
|
test('cloud failure does not delete auth or clear ownership', () async {
|
|
final db = AppDatabase.forTesting(NativeDatabase.memory());
|
|
addTearDown(db.close);
|
|
final ride = await db.startRide();
|
|
await db.claimRideForCloudOwner(ride, 'user_a');
|
|
final auth = _Auth();
|
|
final cloud = _Cloud()..fail = true;
|
|
|
|
await expectLater(
|
|
AccountLifecycleService(auth: auth, cloud: cloud, db: db).deleteAccount(),
|
|
throwsStateError,
|
|
);
|
|
expect(auth.deleted, isFalse);
|
|
expect(await db.getCloudOwnerUid(ride), 'user_a');
|
|
});
|
|
}
|