Add IPFS dry-run adapter support

This commit is contained in:
jwinterm
2026-07-05 21:05:46 -04:00
parent a8cb056225
commit 3a51468d29
24 changed files with 169 additions and 33 deletions
+12 -2
View File
@@ -8,7 +8,7 @@ from ampbrowser.transports import inspect_transport
class AdaptersTest(unittest.TestCase):
def test_known_adapters_are_registered(self) -> None:
self.assertEqual({"tor", "i2p", "reticulum", "gemini"}, set(ADAPTERS))
self.assertEqual({"tor", "i2p", "ipfs", "reticulum", "gemini"}, set(ADAPTERS))
def test_gemini_adapter_is_builtin_ready(self) -> None:
status = inspect_transport("gemini")
@@ -23,7 +23,17 @@ class AdaptersTest(unittest.TestCase):
self.assertIsNotNone(adapter)
self.assertEqual("stop only AMPB-owned Tor daemon", adapter.stop_policy)
self.assertEqual(("install Tor provider", "start managed Tor daemon", "wait for socks5://127.0.0.1:9050"), adapter.setup_steps(installed=False, platform="desktop"))
self.assertEqual(
("install Tor provider", "start managed Tor daemon", "wait for socks5://127.0.0.1:9050"),
adapter.setup_steps(installed=False, platform="desktop"),
)
def test_ipfs_adapter_declares_gateway_not_anonymity(self) -> None:
adapter = adapter_for("ipfs")
self.assertIsNotNone(adapter)
self.assertEqual("http://127.0.0.1:8080", adapter.endpoint)
self.assertIn("not an anonymity layer", adapter.note)
if __name__ == "__main__":
+1 -1
View File
@@ -11,7 +11,7 @@ class CandidateTransportsTest(unittest.TestCase):
self.assertIn("ipfs", by_name)
self.assertIn("yggdrasil", by_name)
self.assertEqual("next-evaluate", by_name["ipfs"].status)
self.assertEqual("active-dry-run", by_name["ipfs"].status)
self.assertEqual("next-evaluate", by_name["yggdrasil"].status)
def test_nostr_is_not_classified_as_page_transport(self) -> None:
+20
View File
@@ -90,6 +90,26 @@ class PrepareOpenTest(unittest.TestCase):
plan.setup_steps,
)
def test_ipfs_desktop_setup_uses_gateway_adapter(self) -> None:
status = TransportStatus(
transport="ipfs",
installed=False,
running=False,
endpoint="http://127.0.0.1:8080",
adoptable=False,
manage_supported=True,
note="IPFS local gateway",
)
with patch("ampbrowser.plan.inspect_transport", return_value=status):
plan = prepare_open("ipfs://bafyexample", consent=True)
self.assertEqual("setup-approved", plan.status)
self.assertEqual(
("install IPFS/Kubo provider", "start managed IPFS gateway", "wait for http://127.0.0.1:8080"),
plan.setup_steps,
)
if __name__ == "__main__":
unittest.main()
+18
View File
@@ -107,6 +107,24 @@ class PlanUrlTest(unittest.TestCase):
self.assertEqual("planned", plan.platform_capability.manage)
self.assertTrue(plan.requires_consent)
def test_ipfs_missing_gateway_prompts_before_setup(self) -> None:
status = TransportStatus(
transport="ipfs",
installed=False,
running=False,
endpoint="http://127.0.0.1:8080",
adoptable=False,
manage_supported=True,
note="IPFS local gateway",
)
with patch("ampbrowser.plan.inspect_transport", return_value=status):
plan = plan_url("ipfs://bafyexample")
self.assertEqual("ipfs", plan.route.transport)
self.assertEqual("prompt to install and start managed transport", plan.action)
self.assertTrue(plan.requires_consent)
def test_ios_foreground_only_transport_prompt(self) -> None:
status = TransportStatus(
transport="tor",
+6
View File
@@ -20,6 +20,12 @@ class PlatformsTest(unittest.TestCase):
self.assertTrue(capability.can_manage_setup)
self.assertIn("foreground", capability.note)
def test_ipfs_android_is_gateway_first_planned(self) -> None:
capability = capability_for("ipfs", "android")
self.assertEqual("planned", capability.manage)
self.assertIn("gateway-first", capability.note)
def test_unknown_platform_is_rejected(self) -> None:
with self.assertRaises(ValueError):
normalize_platform("watch")
+18
View File
@@ -31,6 +31,24 @@ class RouteUrlTest(unittest.TestCase):
self.assertEqual("gemini", route.transport)
self.assertEqual("gemini", route.profile)
def test_routes_ipfs_scheme(self) -> None:
route = route_url("ipfs://bafyexample")
self.assertEqual("ipfs", route.transport)
self.assertEqual("ipfs", route.profile)
def test_routes_ipns_scheme(self) -> None:
route = route_url("ipns://wownero.example")
self.assertEqual("ipfs", route.transport)
self.assertEqual("ipfs", route.profile)
def test_routes_ipfs_gateway_path(self) -> None:
route = route_url("/ipfs/bafyexample")
self.assertEqual("ipfs://bafyexample", route.normalized)
self.assertEqual("ipfs", route.transport)
def test_routes_reticulum_family_scheme(self) -> None:
route = route_url("rns://wownero")