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 get authStateChanges => Stream.value(currentState); @override Future createUserWithEmailAndPassword(String e, String p, {String? displayName}) async {} @override Future sendPasswordResetEmail(String email) async {} @override Future sendEmailVerification() async {} @override Future reloadCurrentUser() async {} @override Future signInAnonymously() async {} @override Future signInWithEmailAndPassword(String e, String p) async {} @override Future signInWithGoogle() async {} @override Future getIdToken([bool forceRefresh = false]) async => 'token'; @override Future reauthenticate({String? password}) async { reauthenticated = true; } @override Future deleteCurrentUser() async { deleted = true; user = null; } @override Future signOut() async {} @override void dispose() {} } class _Cloud implements CloudAccountCleanup { bool fail = false; bool called = false; @override Future 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'); }); }