pin_service_test.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import 'package:cardash_launcher/data/models/slot_assignment.dart';
  2. import 'package:cardash_launcher/data/models/slot_type.dart';
  3. import 'package:cardash_launcher/data/repositories/settings_repository.dart';
  4. import 'package:cardash_launcher/data/services/pin_service.dart';
  5. import 'package:cardash_launcher/data/services/secure_store.dart';
  6. import 'package:flutter_test/flutter_test.dart';
  7. import 'package:shared_preferences/shared_preferences.dart';
  8. class MemorySecureStore implements SecureStore {
  9. final Map<String, String> values = {};
  10. @override
  11. Future<String?> read(String key) async => values[key];
  12. @override
  13. Future<void> write(String key, String value) async => values[key] = value;
  14. @override
  15. Future<void> delete(String key) async => values.remove(key);
  16. }
  17. void main() {
  18. TestWidgetsFlutterBinding.ensureInitialized();
  19. group('settings repository', () {
  20. test('persists and clears a shortcut assignment', () async {
  21. SharedPreferences.setMockInitialValues({});
  22. final prefs = await SharedPreferences.getInstance();
  23. final repository = SettingsRepository(prefs);
  24. const assignment = SlotAssignment(
  25. packageName: 'com.example.waze',
  26. activityName: 'com.example.waze.Main',
  27. label: 'Waze',
  28. );
  29. expect(repository.slot(SlotType.navigation), isNull);
  30. await repository.setSlot(SlotType.navigation, assignment);
  31. final restored = repository.slot(SlotType.navigation);
  32. expect(restored, isNotNull);
  33. expect(restored!.packageName, 'com.example.waze');
  34. expect(restored.label, 'Waze');
  35. await repository.clearSlot(SlotType.navigation);
  36. expect(repository.slot(SlotType.navigation), isNull);
  37. });
  38. test('stores a custom night window', () async {
  39. SharedPreferences.setMockInitialValues({});
  40. final prefs = await SharedPreferences.getInstance();
  41. final repository = SettingsRepository(prefs);
  42. await repository.setNightWindow(
  43. startMinutes: 20 * 60,
  44. endMinutes: 6 * 60,
  45. );
  46. expect(repository.nightStartMinutes, 20 * 60);
  47. expect(repository.nightEndMinutes, 6 * 60);
  48. });
  49. });
  50. group('pin service', () {
  51. test('sets, verifies and clears a four-digit PIN', () async {
  52. final store = MemorySecureStore();
  53. final service = PinService(store, iterations: 50);
  54. await service.setPin('1234');
  55. expect(await service.isPinSet(), isTrue);
  56. expect(await service.verify('1234'), isTrue);
  57. expect(await service.verify('9999'), isFalse);
  58. expect(store.values['cardash.pin.hash'], isNot(contains('1234')));
  59. await service.clearPin();
  60. expect(await service.isPinSet(), isFalse);
  61. });
  62. test('rejects PINs that are not four digits', () {
  63. final service = PinService(MemorySecureStore(), iterations: 10);
  64. expect(() => service.setPin('12'), throwsArgumentError);
  65. expect(() => service.setPin('abcd'), throwsArgumentError);
  66. });
  67. });
  68. }