diff --git a/apps_config.json b/apps_config.json index 3dd1825..a0477b4 100644 --- a/apps_config.json +++ b/apps_config.json @@ -16,6 +16,76 @@ "asset_pattern": "grupetto-*.apk", "description": "Sends bike data via BLE and provides a data metrics overlay" }, + "QZ Standard Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug.apk", + "asset_name": "android-debug.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for standard Android devices." + }, + "QZ NordicTrack Treadmill Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-nordictrack-treadmill.apk", + "asset_name": "android-debug-nordictrack-treadmill.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for NordicTrack/iFIT treadmills using the gRPC integration." + }, + "QZ NordicTrack Bike Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-nordictrack-bike.apk", + "asset_name": "android-debug-nordictrack-bike.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for NordicTrack/iFIT bikes using the gRPC integration." + }, + "QZ NordicTrack Rower Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-nordictrack-rower.apk", + "asset_name": "android-debug-nordictrack-rower.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for NordicTrack/iFIT rowers using the gRPC integration." + }, + "QZ FitPro Treadmill Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-fitpro-treadmill.apk", + "asset_name": "android-debug-fitpro-treadmill.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ FitPro nightly build for direct USB-HID NordicTrack/iFIT treadmill access." + }, + "QZ FitPro Bike Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-fitpro-bike.apk", + "asset_name": "android-debug-fitpro-bike.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ FitPro nightly build for direct USB-HID NordicTrack/iFIT bike access." + }, + "QZ FitPro Elliptical Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-fitpro-elliptical.apk", + "asset_name": "android-debug-fitpro-elliptical.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ FitPro nightly build for direct USB-HID NordicTrack/iFIT elliptical access." + }, + "QZ FitPro Rower Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-fitpro-rower.apk", + "asset_name": "android-debug-fitpro-rower.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ FitPro nightly build for direct USB-HID NordicTrack/iFIT rower access." + }, + "QZ Peloton Bike Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-peloton-bike.apk", + "asset_name": "android-debug-peloton-bike.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for Peloton Bike using the Grupetto integration." + }, + "QZ Peloton Bike+ Nightly": { + "category": "Fitness", + "url": "https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/android-debug-peloton-bike-plus.apk", + "asset_name": "android-debug-peloton-bike-plus.apk", + "package_id": "org.cagnulen.qdomyoszwift", + "description": "Latest QZ nightly build for Peloton Bike+ using the Grupetto integration." + }, "Google Text-to-Speech": { "category": "Accessibility", "recommendation_id": "google-tts", diff --git a/test/qz_catalog_test.dart b/test/qz_catalog_test.dart new file mode 100644 index 0000000..47123fd --- /dev/null +++ b/test/qz_catalog_test.dart @@ -0,0 +1,46 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:openpelo/services/config_service.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test( + 'catalog exposes every QZ nightly APK variant through latest URLs', + () async { + final apps = await ConfigService().loadApps(); + final qz = { + for (final entry in apps.entries) + if (entry.key.startsWith('QZ ')) entry.key: entry.value, + }; + + expect( + qz.keys, + containsAll([ + 'QZ Standard Nightly', + 'QZ NordicTrack Treadmill Nightly', + 'QZ NordicTrack Bike Nightly', + 'QZ NordicTrack Rower Nightly', + 'QZ FitPro Treadmill Nightly', + 'QZ FitPro Bike Nightly', + 'QZ FitPro Elliptical Nightly', + 'QZ FitPro Rower Nightly', + 'QZ Peloton Bike Nightly', + 'QZ Peloton Bike+ Nightly', + ]), + ); + expect(qz, hasLength(10)); + + for (final app in qz.values) { + expect( + app.url, + startsWith( + 'https://github.com/cagnulein/qdomyos-zwift/releases/latest/download/', + ), + ); + expect(app.assetName, endsWith('.apk')); + expect(app.packageId, 'org.cagnulen.qdomyoszwift'); + expect(app.category, 'Fitness'); + } + }, + ); +}