Files
officialpm_my-tesla/tests/test_cmd_seats.py

107 lines
3.4 KiB
Python

import io
import unittest
from contextlib import redirect_stdout
from unittest import mock
# Import the tesla script as a module
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts"))
import tesla # noqa: E402
class DummyVehicle:
def __init__(self, display_name="Test Car", state="online", vehicle_data=None):
self._display_name = display_name
self._state = state
self._vehicle_data = vehicle_data or {}
self.command_calls = []
def __getitem__(self, k):
if k == "display_name":
return self._display_name
if k == "state":
return self._state
raise KeyError(k)
def get(self, k, default=None):
if k == "display_name":
return self._display_name
if k == "state":
return self._state
return default
def get_vehicle_data(self):
return self._vehicle_data
def command(self, name, **kwargs):
self.command_calls.append((name, kwargs))
class SeatsTests(unittest.TestCase):
def test_parse_seat_heater_names(self):
self.assertEqual(tesla._parse_seat_heater("driver"), 0)
self.assertEqual(tesla._parse_seat_heater("passenger"), 1)
self.assertEqual(tesla._parse_seat_heater("rear-left"), 2)
self.assertEqual(tesla._parse_seat_heater("rear-center"), 3)
self.assertEqual(tesla._parse_seat_heater("rear-right"), 4)
self.assertEqual(tesla._parse_seat_heater("3rd-left"), 5)
self.assertEqual(tesla._parse_seat_heater("3rd-right"), 6)
self.assertEqual(tesla._parse_seat_heater("0"), 0)
with self.assertRaises(ValueError):
tesla._parse_seat_heater("nope")
def test_seats_status_json_is_json_only(self):
vehicle = DummyVehicle(vehicle_data={
"climate_state": {
"seat_heater_left": 3,
"seat_heater_right": 1,
}
})
args = mock.Mock()
args.car = None
args.action = "status"
args.no_wake = True
args.json = True
with mock.patch.object(tesla, "get_tesla"), \
mock.patch.object(tesla, "get_vehicle", return_value=vehicle), \
mock.patch.object(tesla, "require_email", return_value="test@example.com"), \
mock.patch.object(tesla, "_ensure_online_or_exit"):
buf = io.StringIO()
with redirect_stdout(buf):
tesla.cmd_seats(args)
out = buf.getvalue().strip()
self.assertTrue(out.startswith("{"))
self.assertIn('"seat_heater_left"', out)
self.assertIn('"seat_heater_right"', out)
def test_seats_set_calls_endpoint(self):
vehicle = DummyVehicle()
args = mock.Mock()
args.car = None
args.action = "set"
args.seat = "driver"
args.level = "2"
args.yes = True
with mock.patch.object(tesla, "get_tesla"), \
mock.patch.object(tesla, "get_vehicle", return_value=vehicle), \
mock.patch.object(tesla, "require_email", return_value="test@example.com"), \
mock.patch.object(tesla, "wake_vehicle") as wake:
tesla.cmd_seats(args)
wake.assert_called_once()
self.assertEqual(vehicle.command_calls, [("REMOTE_SEAT_HEATER_REQUEST", {"heater": 0, "level": 2})])
if __name__ == "__main__":
unittest.main()