Add phone hotspot uplink
Prefer a configured phone hotspot for outbound synchronization, preserve secure write-only credentials, and recover through home WiFi or the local Pi hotspot. Co-authored-by: Copilot <[email protected]>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import json
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, mock_open, patch
|
||||
|
||||
from modules import app_network
|
||||
|
||||
|
||||
class AppNetworkTest(unittest.TestCase):
|
||||
@patch("modules.app_network.subprocess.run")
|
||||
@patch(
|
||||
"modules.app_network._helper_command",
|
||||
return_value=["sudo", "helper", "configure"],
|
||||
)
|
||||
def test_configuration_secret_is_sent_only_over_stdin(
|
||||
self,
|
||||
_helper_command,
|
||||
run,
|
||||
):
|
||||
run.return_value = MagicMock(returncode=0, stdout="", stderr="")
|
||||
|
||||
app_network.configure_phone_hotspot("My Phone", "private-password")
|
||||
|
||||
command = run.call_args.args[0]
|
||||
self.assertNotIn("private-password", command)
|
||||
self.assertEqual(
|
||||
json.loads(run.call_args.kwargs["input"]),
|
||||
{"ssid": "My Phone", "password": "private-password"},
|
||||
)
|
||||
|
||||
@patch("modules.app_network.subprocess.run")
|
||||
def test_connection_request_is_nonblocking(self, run):
|
||||
run.return_value = MagicMock(returncode=0, stdout="", stderr="")
|
||||
|
||||
app_network.request_phone_connection()
|
||||
|
||||
self.assertIn("--no-block", run.call_args.args[0])
|
||||
self.assertIn("yaris-uplink-wait.service", run.call_args.args[0])
|
||||
self.assertEqual(run.call_args.kwargs["timeout"], 5)
|
||||
|
||||
@patch("modules.app_network._phone_ssid", return_value="My Phone")
|
||||
@patch(
|
||||
"modules.app_network._nmcli",
|
||||
return_value="phone-hotspot\n100 (connected)\n4 (full)\n172.20.10.2/28",
|
||||
)
|
||||
def test_status_reports_phone_uplink_without_secret(self, _nmcli, _ssid):
|
||||
with patch("builtins.open", mock_open(read_data='{"action":"connected_phone"}')):
|
||||
status = app_network.get_status()
|
||||
|
||||
self.assertEqual(status["mode"], "phone")
|
||||
self.assertEqual(status["phone_ssid"], "My Phone")
|
||||
self.assertTrue(status["internet_reachable"])
|
||||
self.assertTrue(status["large_upload_allowed"])
|
||||
self.assertNotIn("password", status)
|
||||
|
||||
@patch("modules.app_network._phone_ssid", return_value="")
|
||||
@patch(
|
||||
"modules.app_network._nmcli",
|
||||
return_value="Hotspot\n100 (connected)\n2 (portal)\n10.42.0.1/24",
|
||||
)
|
||||
def test_local_hotspot_does_not_claim_internet_or_large_uploads(
|
||||
self,
|
||||
_nmcli,
|
||||
_ssid,
|
||||
):
|
||||
with patch("builtins.open", side_effect=FileNotFoundError):
|
||||
status = app_network.get_status()
|
||||
|
||||
self.assertEqual(status["mode"], "local_hotspot")
|
||||
self.assertFalse(status["internet_reachable"])
|
||||
self.assertFalse(status["large_upload_allowed"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user