import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:kooltap/app/app_lifecycle_lock.dart'; void main() { late DateTime now; late int lockCount; AppLifecycleLockObserver observer({bool Function()? shouldLock}) { return AppLifecycleLockObserver( onLock: () => lockCount++, shouldLock: shouldLock, clock: () => now, ); } setUp(() { now = DateTime(2026, 1, 1, 20); lockCount = 0; }); test('locks when the app returns after the grace period', () { final lock = observer(); lock.didChangeAppLifecycleState(AppLifecycleState.inactive); lock.didChangeAppLifecycleState(AppLifecycleState.hidden); lock.didChangeAppLifecycleState(AppLifecycleState.paused); now = now.add(const Duration(seconds: 30)); lock.didChangeAppLifecycleState(AppLifecycleState.resumed); expect(lockCount, 1); }); test('does not lock after a short trip to the background', () { final lock = observer(); lock.didChangeAppLifecycleState(AppLifecycleState.paused); now = now.add(const Duration(seconds: 10)); lock.didChangeAppLifecycleState(AppLifecycleState.resumed); expect(lockCount, 0); }); test('does not lock when only inactive', () { final lock = observer(); lock.didChangeAppLifecycleState(AppLifecycleState.inactive); now = now.add(const Duration(minutes: 5)); lock.didChangeAppLifecycleState(AppLifecycleState.resumed); expect(lockCount, 0); }); test('does not lock when auto-lock is disabled', () { final lock = observer(shouldLock: () => false); lock.didChangeAppLifecycleState(AppLifecycleState.paused); now = now.add(const Duration(minutes: 5)); lock.didChangeAppLifecycleState(AppLifecycleState.resumed); expect(lockCount, 0); }); }