diff --git a/mobilerun/portal.py b/mobilerun/portal.py index 822e7fa0..b54ce549 100644 --- a/mobilerun/portal.py +++ b/mobilerun/portal.py @@ -172,11 +172,23 @@ def _portal_apk_asset_priority(asset_name: str) -> tuple[int, str]: lower_name = asset_name.lower() if "unsigned" in lower_name: return (3, lower_name) - if "release" in lower_name or "stable" in lower_name: - return (0, lower_name) if "debug" in lower_name: + return (2, lower_name) + if "release" in lower_name or "stable" in lower_name: return (1, lower_name) - return (2, lower_name) + return (0, lower_name) + + +def _portal_apk_fallback_name(version: str) -> str: + return f"{PORTAL_PACKAGE_NAME}-{version}.apk" + + +def _portal_apk_fallback_url( + version: str, download_base: str, tag: str +) -> tuple[str, str]: + asset_name = _portal_apk_fallback_name(version) + base = _normalize_download_base(download_base).rstrip("/") + return f"{base}/{tag}/{asset_name}", asset_name def _parse_portal_asset_version(asset_name: str) -> str | None: @@ -284,9 +296,9 @@ def _resolve_versioned_portal_apk_asset( if debug: print(f"Failed to resolve release assets for {tag}, using fallback URL: {e}") - asset_name = f"{PORTAL_PACKAGE_NAME}-{tag.removeprefix('v')}-debug.apk" - base = _normalize_download_base(download_base).rstrip("/") - return f"{base}/{tag}/{asset_name}", tag.removeprefix("v"), asset_name + asset_version = tag.removeprefix("v") + asset_url, asset_name = _portal_apk_fallback_url(asset_version, download_base, tag) + return asset_url, asset_version, asset_name def _resolve_latest_portal_apk_asset(debug: bool = False) -> tuple[str, str, str]: diff --git a/tests/test_portal_asset_selection.py b/tests/test_portal_asset_selection.py index c4e99fcf..f4b62344 100644 --- a/tests/test_portal_asset_selection.py +++ b/tests/test_portal_asset_selection.py @@ -102,6 +102,19 @@ def test_latest_release_selects_debug_over_unsigned_release(self): self.assertTrue(asset_url.endswith("/com.mobilerun.portal-0.7.1-debug.apk")) self.assertEqual(asset_version, "0.7.1") + def test_latest_release_selects_canonical_signed_asset_over_debug(self): + asset_url, asset_name, asset_version = _select_portal_apk_asset( + [ + _github_asset("com.mobilerun.portal-0.7.1-release-unsigned.apk"), + _github_asset("com.mobilerun.portal-0.7.1-debug.apk"), + _github_asset("com.mobilerun.portal-0.7.1.apk"), + ] + ) + + self.assertEqual(asset_name, "com.mobilerun.portal-0.7.1.apk") + self.assertTrue(asset_url.endswith("/com.mobilerun.portal-0.7.1.apk")) + self.assertEqual(asset_version, "0.7.1") + def test_mobilerun_portal_named_asset_matches(self): asset_url, asset_name, asset_version = _select_portal_apk_asset( [_github_asset("mobilerun-portal-v0.7.1-release.apk")] @@ -231,6 +244,7 @@ def release_assets(version, debug=False): return [ _github_asset("com.mobilerun.portal-0.7.1-release-unsigned.apk"), _github_asset("com.mobilerun.portal-0.7.1-debug.apk"), + _github_asset("com.mobilerun.portal-0.7.1.apk"), ] portal._get_release_assets_by_tag = release_assets @@ -243,8 +257,8 @@ def release_assets(version, debug=False): finally: portal._get_release_assets_by_tag = original - self.assertEqual(asset_name, "com.mobilerun.portal-0.7.1-debug.apk") - self.assertTrue(asset_url.endswith("/com.mobilerun.portal-0.7.1-debug.apk")) + self.assertEqual(asset_name, "com.mobilerun.portal-0.7.1.apk") + self.assertTrue(asset_url.endswith("/com.mobilerun.portal-0.7.1.apk")) self.assertEqual(asset_version, "0.7.1") def test_versioned_resolution_normalizes_stale_download_base_fallback(self): @@ -263,11 +277,11 @@ def raise_release_error(version, debug=False): finally: portal._get_release_assets_by_tag = original - self.assertEqual(asset_name, "com.mobilerun.portal-0.7.1-debug.apk") + self.assertEqual(asset_name, "com.mobilerun.portal-0.7.1.apk") self.assertEqual( asset_url, "https://github.com/droidrun/mobilerun-portal/releases/download/" - "v0.7.1/com.mobilerun.portal-0.7.1-debug.apk", + "v0.7.1/com.mobilerun.portal-0.7.1.apk", ) self.assertEqual(asset_version, "0.7.1") self.assertEqual( @@ -278,6 +292,10 @@ def raise_release_error(version, debug=False): ) def test_asset_version_parsing_ignores_build_suffixes(self): + self.assertEqual( + _parse_portal_asset_version("com.mobilerun.portal-0.7.1.apk"), + "0.7.1", + ) self.assertEqual( _parse_portal_asset_version("com.mobilerun.portal-0.7.1-debug.apk"), "0.7.1",