Add mobile platform capability planning

This commit is contained in:
jwinterm
2026-07-05 20:53:12 -04:00
parent ba620e32ca
commit 6c209b6557
14 changed files with 353 additions and 28 deletions
+5 -1
View File
@@ -14,7 +14,11 @@ class DocsGenTest(unittest.TestCase):
changed = generate_docs(root)
self.assertEqual(
{Path("docs/generated/route-rules.md"), Path("docs/generated/transports.md")},
{
Path("docs/generated/platform-capabilities.md"),
Path("docs/generated/route-rules.md"),
Path("docs/generated/transports.md"),
},
set(changed),
)
self.assertEqual([], generate_docs(root, check=True))
+25
View File
@@ -62,6 +62,31 @@ class PrepareOpenTest(unittest.TestCase):
self.assertEqual(".local/ampb/profiles/clearnet", plan.profile_path)
def test_android_setup_steps_include_foreground_service(self) -> None:
status = TransportStatus(
transport="i2p",
installed=False,
running=False,
endpoint="http://127.0.0.1:4444",
adoptable=False,
manage_supported=True,
note="I2P HTTP proxy",
)
with patch("ampbrowser.plan.inspect_transport", return_value=status):
plan = prepare_open("http://example.b32.i2p/", platform="android")
self.assertEqual("android", plan.browse_plan.platform_capability.platform)
self.assertEqual(
(
"install or enable Android i2p provider",
"start visible Android foreground service",
"start managed Android i2p transport",
"wait for http://127.0.0.1:4444",
),
plan.setup_steps,
)
if __name__ == "__main__":
unittest.main()
+35
View File
@@ -89,6 +89,41 @@ class PlanUrlTest(unittest.TestCase):
self.assertEqual("blocked by policy: tor mode is adopt", plan.action)
self.assertFalse(plan.requires_consent)
def test_android_platform_is_reported_on_plan(self) -> None:
status = TransportStatus(
transport="tor",
installed=False,
running=False,
endpoint="socks5://127.0.0.1:9050",
adoptable=False,
manage_supported=True,
note="Tor SOCKS proxy",
)
with patch("ampbrowser.plan.inspect_transport", return_value=status):
plan = plan_url("http://example.onion/", platform="android")
self.assertEqual("android", plan.platform_capability.platform)
self.assertEqual("planned", plan.platform_capability.manage)
self.assertTrue(plan.requires_consent)
def test_ios_foreground_only_transport_prompt(self) -> None:
status = TransportStatus(
transport="tor",
installed=False,
running=False,
endpoint="socks5://127.0.0.1:9050",
adoptable=False,
manage_supported=True,
note="Tor SOCKS proxy",
)
with patch("ampbrowser.plan.inspect_transport", return_value=status):
plan = plan_url("http://example.onion/", platform="ios")
self.assertEqual("prompt to enable foreground-only transport session", plan.action)
self.assertIn("foreground-only", plan.prompt)
if __name__ == "__main__":
unittest.main()
+29
View File
@@ -0,0 +1,29 @@
from __future__ import annotations
import unittest
from ampbrowser.platforms import capability_for, normalize_platform
class PlatformsTest(unittest.TestCase):
def test_android_tor_is_managed_setup_capable(self) -> None:
capability = capability_for("tor", "android")
self.assertEqual("android", capability.platform)
self.assertEqual("planned", capability.manage)
self.assertTrue(capability.can_manage_setup)
def test_ios_tor_is_foreground_only(self) -> None:
capability = capability_for("tor", "ios")
self.assertEqual("foreground-only", capability.manage)
self.assertTrue(capability.can_manage_setup)
self.assertIn("foreground", capability.note)
def test_unknown_platform_is_rejected(self) -> None:
with self.assertRaises(ValueError):
normalize_platform("watch")
if __name__ == "__main__":
unittest.main()