update_controller_test.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import 'package:cardash_launcher/data/models/app_entry.dart';
  2. import 'package:cardash_launcher/data/models/media_playback.dart';
  3. import 'package:cardash_launcher/data/models/system_status.dart';
  4. import 'package:cardash_launcher/data/models/update_info.dart';
  5. import 'package:cardash_launcher/data/services/native_bridge.dart';
  6. import 'package:cardash_launcher/data/services/update_service.dart';
  7. import 'package:cardash_launcher/features/settings/update_controller.dart';
  8. import 'package:flutter_test/flutter_test.dart';
  9. class _UpdatePlatform implements LauncherPlatform {
  10. final List<String> opened = [];
  11. final List<String> installed = [];
  12. @override
  13. Future<bool> openUrl(String url) async {
  14. opened.add(url);
  15. return true;
  16. }
  17. @override
  18. Future<UpdateInstallResult> downloadAndInstallUpdate(String url) async {
  19. installed.add(url);
  20. return const UpdateInstallResult(
  21. started: true,
  22. permissionRequired: false,
  23. message: 'Installer opened.',
  24. );
  25. }
  26. @override
  27. Future<List<AppEntry>> listApps() async => const [];
  28. @override
  29. Future<void> launchApp({
  30. required String packageName,
  31. required String activityName,
  32. }) async {}
  33. @override
  34. Future<bool> isDefaultHome() async => true;
  35. @override
  36. Future<bool> requestDefaultHome() async => true;
  37. @override
  38. Future<SystemStatus> getStatus() async => const SystemStatus();
  39. @override
  40. Future<VolumeInfo> getVolume() async => const VolumeInfo();
  41. @override
  42. Future<void> setVolume(int index) async {}
  43. @override
  44. Future<bool> isMusicPlaying() async => false;
  45. @override
  46. Future<bool> sendMediaKey(String action) async => true;
  47. @override
  48. Future<MediaPlayback> getMediaState() async => const MediaPlayback();
  49. @override
  50. Future<bool> openNotificationAccessSettings() async => true;
  51. @override
  52. Future<void> setKeepScreenOn(bool enabled) async {}
  53. }
  54. class _FakeUpdateService extends UpdateService {
  55. _FakeUpdateService(this.result);
  56. final UpdateInfo result;
  57. @override
  58. Future<UpdateInfo> check(String currentVersion) async => result;
  59. }
  60. void main() {
  61. test('compares semantic versions', () {
  62. expect(compareVersions('1.0.1', '1.0.0'), greaterThan(0));
  63. expect(compareVersions('v1.0.0', '1.0.0'), 0);
  64. expect(compareVersions('1.0.0', '1.0.1'), lessThan(0));
  65. });
  66. test('reports an available update and opens the release page', () async {
  67. final platform = _UpdatePlatform();
  68. final service = _FakeUpdateService(
  69. const UpdateInfo(
  70. currentVersion: '1.0.0',
  71. latestVersion: '1.0.1',
  72. available: true,
  73. releasePageUrl: 'https://example.test/releases',
  74. downloadUrl: 'https://example.test/app.apk',
  75. ),
  76. );
  77. final controller = UpdateController(platform, service: service);
  78. addTearDown(controller.dispose);
  79. await controller.check();
  80. expect(controller.updateAvailable, isTrue);
  81. expect(controller.latestVersion, '1.0.1');
  82. expect(await controller.openReleasePage(), isTrue);
  83. expect(platform.opened.single, 'https://example.test/releases');
  84. await controller.installUpdate();
  85. expect(platform.installed.single, 'https://example.test/app.apk');
  86. expect(controller.installMessage, 'Installer opened.');
  87. });
  88. test('reports up to date when no newer release exists', () async {
  89. final service = _FakeUpdateService(
  90. const UpdateInfo(
  91. currentVersion: '1.0.0',
  92. latestVersion: '1.0.0',
  93. available: false,
  94. releasePageUrl: 'https://example.test/releases',
  95. downloadUrl: 'https://example.test/app.apk',
  96. ),
  97. );
  98. final controller = UpdateController(_UpdatePlatform(), service: service);
  99. addTearDown(controller.dispose);
  100. await controller.check();
  101. expect(controller.updateAvailable, isFalse);
  102. expect(controller.error, isNull);
  103. });
  104. }