update_controller_test.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. @override
  12. Future<bool> openUrl(String url) async {
  13. opened.add(url);
  14. return true;
  15. }
  16. @override
  17. Future<List<AppEntry>> listApps() async => const [];
  18. @override
  19. Future<void> launchApp({
  20. required String packageName,
  21. required String activityName,
  22. }) async {}
  23. @override
  24. Future<bool> isDefaultHome() async => true;
  25. @override
  26. Future<bool> requestDefaultHome() async => true;
  27. @override
  28. Future<SystemStatus> getStatus() async => const SystemStatus();
  29. @override
  30. Future<VolumeInfo> getVolume() async => const VolumeInfo();
  31. @override
  32. Future<void> setVolume(int index) async {}
  33. @override
  34. Future<bool> isMusicPlaying() async => false;
  35. @override
  36. Future<bool> sendMediaKey(String action) async => true;
  37. @override
  38. Future<MediaPlayback> getMediaState() async => const MediaPlayback();
  39. @override
  40. Future<bool> openNotificationAccessSettings() async => true;
  41. @override
  42. Future<void> setKeepScreenOn(bool enabled) async {}
  43. }
  44. class _FakeUpdateService extends UpdateService {
  45. _FakeUpdateService(this.result);
  46. final UpdateInfo result;
  47. @override
  48. Future<UpdateInfo> check(String currentVersion) async => result;
  49. }
  50. void main() {
  51. test('compares semantic versions', () {
  52. expect(compareVersions('1.0.1', '1.0.0'), greaterThan(0));
  53. expect(compareVersions('v1.0.0', '1.0.0'), 0);
  54. expect(compareVersions('1.0.0', '1.0.1'), lessThan(0));
  55. });
  56. test('reports an available update and opens the release page', () async {
  57. final platform = _UpdatePlatform();
  58. final service = _FakeUpdateService(
  59. const UpdateInfo(
  60. currentVersion: '1.0.0',
  61. latestVersion: '1.0.1',
  62. available: true,
  63. releasePageUrl: 'https://example.test/releases',
  64. downloadUrl: 'https://example.test/app.apk',
  65. ),
  66. );
  67. final controller = UpdateController(platform, service: service);
  68. addTearDown(controller.dispose);
  69. await controller.check();
  70. expect(controller.updateAvailable, isTrue);
  71. expect(controller.latestVersion, '1.0.1');
  72. expect(await controller.openReleasePage(), isTrue);
  73. expect(platform.opened.single, 'https://example.test/releases');
  74. });
  75. test('reports up to date when no newer release exists', () async {
  76. final service = _FakeUpdateService(
  77. const UpdateInfo(
  78. currentVersion: '1.0.0',
  79. latestVersion: '1.0.0',
  80. available: false,
  81. releasePageUrl: 'https://example.test/releases',
  82. downloadUrl: 'https://example.test/app.apk',
  83. ),
  84. );
  85. final controller = UpdateController(_UpdatePlatform(), service: service);
  86. addTearDown(controller.dispose);
  87. await controller.check();
  88. expect(controller.updateAvailable, isFalse);
  89. expect(controller.error, isNull);
  90. });
  91. }