Add clear DTC codes button to Pi DTC page (FEAT-15)
This commit is contained in:
+47
-1
@@ -1,5 +1,7 @@
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import obd
|
||||
|
||||
from modules import app_obd
|
||||
|
||||
@@ -26,5 +28,49 @@ class CarConnectedFlagTest(unittest.TestCase):
|
||||
mock_set.assert_called_once_with("car_ever_connected", "1")
|
||||
|
||||
|
||||
class ClearDtcCodesTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.original_connection = app_obd.connection
|
||||
self.original_dtc_codes = app_obd.dtc_codes
|
||||
self.original_mil_on = app_obd.mil_on
|
||||
|
||||
def tearDown(self):
|
||||
app_obd.connection = self.original_connection
|
||||
app_obd.dtc_codes = self.original_dtc_codes
|
||||
app_obd.mil_on = self.original_mil_on
|
||||
|
||||
def test_not_connected_returns_not_connected(self):
|
||||
app_obd.connection = None
|
||||
result = app_obd.clear_dtc_codes()
|
||||
self.assertEqual(result["status"], "not_connected")
|
||||
|
||||
def test_connected_clears_ecu_and_resets_state(self):
|
||||
fake_conn = MagicMock()
|
||||
app_obd.connection = fake_conn
|
||||
app_obd.dtc_codes = [{"code": "P0300", "description": "Misfire"}]
|
||||
app_obd.mil_on = True
|
||||
with patch.object(app_obd, "_is_car_connected", return_value=True), \
|
||||
patch("modules.app_sql.clear_dtc_state") as mock_clear, \
|
||||
patch("modules.app_events.socketio.emit") as mock_emit:
|
||||
result = app_obd.clear_dtc_codes()
|
||||
self.assertEqual(result["status"], "cleared")
|
||||
fake_conn.query.assert_called_once_with(obd.commands.CLEAR_DTC)
|
||||
self.assertEqual(app_obd.dtc_codes, [])
|
||||
self.assertFalse(app_obd.mil_on)
|
||||
mock_clear.assert_called_once_with()
|
||||
self.assertTrue(mock_emit.called)
|
||||
|
||||
def test_query_error_returns_error(self):
|
||||
fake_conn = MagicMock()
|
||||
fake_conn.query.side_effect = RuntimeError("boom")
|
||||
app_obd.connection = fake_conn
|
||||
with patch.object(app_obd, "_is_car_connected", return_value=True), \
|
||||
patch.object(app_obd, "_mark_connection_lost") as mock_mark:
|
||||
result = app_obd.clear_dtc_codes()
|
||||
self.assertEqual(result["status"], "error")
|
||||
self.assertIn("boom", result["error"])
|
||||
mock_mark.assert_called_once()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -62,6 +62,22 @@ class DtcPersistenceTest(unittest.TestCase):
|
||||
self.assertEqual(app_sql.count_active_dtcs(), 0)
|
||||
self.assertIs(app_sql.get_persisted_dtc_state()["mil"], False)
|
||||
|
||||
def test_clear_dtc_state_clears_active_and_mil(self):
|
||||
app_sql.save_dtc_state(True, [
|
||||
{"code": "P0300", "description": "Random misfire"},
|
||||
{"code": "P0420", "description": "Catalyst efficiency"},
|
||||
])
|
||||
app_sql.clear_dtc_state()
|
||||
state = app_sql.get_persisted_dtc_state()
|
||||
self.assertIs(state["mil"], False)
|
||||
self.assertEqual(state["codes"], [])
|
||||
self.assertEqual(app_sql.count_active_dtcs(), 0)
|
||||
# History rows are kept but no longer set.
|
||||
rows = self.conn.execute(
|
||||
"SELECT code, IS_SET FROM dtc ORDER BY code"
|
||||
).fetchall()
|
||||
self.assertEqual(rows, [("P0300", 0), ("P0420", 0)])
|
||||
|
||||
def test_first_seen_preserved_while_last_seen_bumps(self):
|
||||
first = datetime(2026, 2, 1, 8, 0, 0)
|
||||
later = datetime(2026, 2, 1, 8, 5, 0)
|
||||
|
||||
Reference in New Issue
Block a user