MotorSignal-App/test/account_lifecycle_test.dart

79 lines
3.4 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 {
@override Future<void> ensureBackendIdentity() async {}
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');
});
}