test: align suite with shipped behavior (WiFi swap, BUG-10 guard, odometer_baseline)

- test_app_trip + test_trip_sql: mock was_car_ever_connected() so trip
  building runs (BUG-10 guard suppresses trips until car ECU reached)
- test_app_settings: include odometer_baseline in valid payload + assert save
- test_yaris_uplink: Hotspot -> Hotspot-local; restore_fallback no longer
  activates AP (reports no_connection); wait timeout writes fallback_restored
- test_app_network: local_hotspot mode removed by WiFi swap -> wifi/no-internet
This commit is contained in:
Mathieu Moran
2026-08-12 19:14:07 -04:00
parent 2e8e42a165
commit 81c7ee25fd
5 changed files with 36 additions and 19 deletions
+3 -3
View File
@@ -55,9 +55,9 @@ class AppNetworkTest(unittest.TestCase):
@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",
return_value="home-wifi\n100 (connected)\n2 (portal)\n192.168.50.220/24",
)
def test_local_hotspot_does_not_claim_internet_or_large_uploads(
def test_no_internet_blocks_large_uploads(
self,
_nmcli,
_ssid,
@@ -65,7 +65,7 @@ class AppNetworkTest(unittest.TestCase):
with patch("builtins.open", side_effect=FileNotFoundError):
status = app_network.get_status()
self.assertEqual(status["mode"], "local_hotspot")
self.assertEqual(status["mode"], "wifi")
self.assertFalse(status["internet_reachable"])
self.assertFalse(status["large_upload_allowed"])
+2
View File
@@ -18,6 +18,7 @@ def valid_payload():
"ntfy_token": "secret-token",
"clear_ntfy_url": False,
"clear_ntfy_token": False,
"odometer_baseline": 0,
"alert_thresholds": {
"temperature_c": 75.5,
"disk_percent": 88,
@@ -66,6 +67,7 @@ class SettingsUpdateTest(unittest.TestCase):
)
self.assertEqual(self.settings["alert_ntfy_token"], "secret-token")
self.assertEqual(self.settings["alert_temperature_c"], "75.5")
self.assertEqual(self.settings["odometer_baseline"], "0.0")
def test_invalid_payload_does_not_save_any_settings(self):
payload = valid_payload()
+12
View File
@@ -1,10 +1,22 @@
import unittest
from datetime import datetime, timedelta
from unittest.mock import patch
from modules import app_trip
class TripBuilderTest(unittest.TestCase):
def setUp(self):
# BUG-10 guard suppresses trips until the car ECU has been reached
# once. Trip-building tests simulate a connected car.
self._car_connected = patch(
"modules.app_obd.was_car_ever_connected", return_value=True
)
self._car_connected.start()
def tearDown(self):
self._car_connected.stop()
def rows_for_route(self, coordinates, speeds=None, start_id=1):
started = datetime(2026, 1, 1, 8)
speeds = speeds or [0] * len(coordinates)
+8
View File
@@ -2,6 +2,7 @@ import os
import tempfile
import unittest
from datetime import datetime, timedelta
from unittest.mock import patch
from modules import app_sql
@@ -15,8 +16,15 @@ class TripSqlTest(unittest.TestCase):
app_sql._last_trip_refresh = 0
app_sql.sql_path = self.path
self.conn = app_sql.get_conn()
# refresh_trips() and build_trip_summaries() suppress trips until the
# car ECU has been reached once (BUG-10 guard). Simulate a connected car.
self._car_connected = patch(
"modules.app_obd.was_car_ever_connected", return_value=True
)
self._car_connected.start()
def tearDown(self):
self._car_connected.stop()
if app_sql._conn is not None:
app_sql._conn.close()
app_sql._conn = None
+11 -16
View File
@@ -70,7 +70,7 @@ class UplinkSelectionTest(unittest.TestCase):
@patch("deploy.yaris_uplink.phone_is_visible", return_value=True)
@patch("deploy.yaris_uplink.activate", return_value=True)
@patch("deploy.yaris_uplink.connection_exists", return_value=True)
@patch("deploy.yaris_uplink.active_connection", return_value="Hotspot")
@patch("deploy.yaris_uplink.active_connection", return_value="Hotspot-local")
def test_phone_is_preferred_over_home_from_local_hotspot(
self,
_active,
@@ -135,25 +135,18 @@ class UplinkSelectionTest(unittest.TestCase):
)
@patch("deploy.yaris_uplink.write_status")
@patch(
"deploy.yaris_uplink.activate",
side_effect=[False, True],
)
def test_local_hotspot_is_restored_when_home_is_unavailable(
@patch("deploy.yaris_uplink.activate", return_value=False)
def test_home_unavailable_reports_no_connection(
self,
activate,
write_status,
):
self.assertTrue(yaris_uplink.restore_fallback())
self.assertEqual(
activate.call_args_list,
[
call("home-wifi"),
call("Hotspot"),
],
activate.assert_called_once_with("home-wifi")
write_status.assert_called_once_with(
"no_connection", "No home WiFi or phone hotspot available."
)
write_status.assert_called_once_with("restored_local_hotspot")
class UplinkWaitTest(unittest.TestCase):
@@ -188,8 +181,10 @@ class UplinkWaitTest(unittest.TestCase):
@patch("deploy.yaris_uplink.write_status")
@patch("deploy.yaris_uplink.active_connection", return_value="home-wifi")
@patch("deploy.yaris_uplink.connection_exists", return_value=True)
def test_wait_timeout_preserves_current_client_connection(
@patch("deploy.yaris_uplink._connect_home_or_idle", return_value=True)
def test_wait_timeout_restores_home_fallback(
self,
_home,
_exists,
_active,
write_status,
@@ -201,14 +196,14 @@ class UplinkWaitTest(unittest.TestCase):
write_status.assert_any_call("waiting_for_phone")
write_status.assert_called_with(
"phone_wait_timed_out_current_connection_preserved",
"phone_wait_timed_out_fallback_restored",
"Phone hotspot did not appear within two minutes.",
)
class UplinkTransitionTest(unittest.TestCase):
@patch("deploy.yaris_uplink.write_status")
@patch("deploy.yaris_uplink.active_connection", return_value="Hotspot")
@patch("deploy.yaris_uplink.active_connection", return_value="Hotspot-local")
def test_records_networkmanager_fallback(self, _active, write_status):
yaris_uplink.record_current_connection()