From ea16f06e164942ea53944554f940bb8bd88523e9 Mon Sep 17 00:00:00 2001
From: patman15 <14628713+patman15@users.noreply.github.com>
Date: Fri, 8 Nov 2024 15:12:23 +0100
Subject: [PATCH] add tests

---
 tests/test_const.py      |   2 +-
 tests/test_redodo_bms.py | 155 ++++++++++++++-------------------------
 2 files changed, 55 insertions(+), 102 deletions(-)

diff --git a/tests/test_const.py b/tests/test_const.py
index 06f19c0..736f7ac 100644
--- a/tests/test_const.py
+++ b/tests/test_const.py
@@ -7,4 +7,4 @@ async def test_critical_constants() -> None:
     """Test general constants are not altered for debugging."""
 
     assert UPDATE_INTERVAL == 30  # ensure that update interval is 30 seconds
-    assert len(BMS_TYPES) == 7  # check number of BMS types
+    assert len(BMS_TYPES) == 8  # check number of BMS types
diff --git a/tests/test_redodo_bms.py b/tests/test_redodo_bms.py
index 9328eff..ba145b1 100644
--- a/tests/test_redodo_bms.py
+++ b/tests/test_redodo_bms.py
@@ -5,7 +5,6 @@
 from uuid import UUID
 
 from bleak.backends.characteristic import BleakGATTCharacteristic
-from bleak.exc import BleakError
 from bleak.uuids import normalize_uuid_str
 from custom_components.bms_ble.plugins.redodo_bms import BMS
 
@@ -49,62 +48,6 @@ async def write_gatt_char(
         )
 
 
-# class MockWrongCRCBleakClient(MockRedodoBleakClient):
-#     """Emulate a E&J technology BMS BleakClient that replies with wrong CRC"""
-
-#     def _response(
-#         self, char_specifier: BleakGATTCharacteristic | int | str | UUID, data: Buffer
-#     ) -> bytearray:
-#         if isinstance(char_specifier, str) and normalize_uuid_str(
-#             char_specifier
-#         ) != normalize_uuid_str("fff3"):
-#             return bytearray()
-#         cmd: int = int(bytearray(data)[5])
-#         if cmd == 0x60:
-#             return bytearray(
-#                 b"\x12\x12\x3A\x05\x03\x60\x00\x0A\x02\x13\x00\x00\x71\xC5\x45\x8E\x3D\x00\x01\xCE"
-#                 b"\x02\x22\x0D\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
-#             )  # wrong CRC [0x01CE != 0x02CD] in line 1
-#         if cmd == 0x61:
-#             return bytearray(
-#                 b"\x12\x12\x3A\x05\x03\x61\x00\x0C\x00\x12\x00\x12\x6D\x60\x0B\x7E\x8F\xDB\x18\x20"
-#                 b"\x04\x22\x02\x91\x0D\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
-#             )  # wrong CRC [0x02 != 0x03] in line 2
-#         if cmd == 0x62:
-#             return bytearray(
-#                 b"\x12\x13\x3A\x05\x03\x62\x00\x1D\x0E\x0E\xD7\x0E\xD6\x0E\xD6\x0E\xD5\x0E\xD5\x0E"
-#                 b"\x12\x23\xD6\x0E\xD1\x0E\xD2\x0E\xD5\x0E\xD6\x0E\xD4\x0E\xD8\x0E\xD7\x0E\xDB\x0E"
-#                 b"\x03\x33\x08\x0D\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
-#             )  # wrong CRC [0x0E != 0x0D] in line 2
-#         return bytearray()
-
-
-# class MockInvalidBleakClient(MockRedodoBleakClient):
-#     """Emulate a E&J technology BMS BleakClient replying garbage."""
-
-#     def _response(
-#         self, char_specifier: BleakGATTCharacteristic | int | str | UUID, data: Buffer
-#     ) -> bytearray:
-#         if isinstance(char_specifier, str) and normalize_uuid_str(
-#             char_specifier
-#         ) != normalize_uuid_str("6e400002-b5a3-f393-e0a9-e50e24dcca9e"):
-#             return bytearray()
-#         cmd: int = int(bytearray(data)[3:5], 16)
-#         if cmd == 0x02:
-#             return bytearray(
-#                 b"X0082310080000101C00000880F540F3C0F510FD70F310F2C0F340F3A0FED0FED0000000000000000000000000000000248424242F0000000000000000001ABX"
-#             )  # correct message, wrong SOI
-#         if cmd == 0x10:
-#             return bytearray(
-#                 b":009031001D0000001400080016F4~"
-#             )  # incorrect message, wrong length (1E != 1D)
-#         return bytearray()
-
-#     async def disconnect(self) -> bool:
-#         """Mock disconnect to raise BleakError."""
-#         raise BleakError
-
-
 async def test_update(monkeypatch, reconnect_fixture) -> None:
     """Test Redodo technology BMS data update."""
 
@@ -134,6 +77,10 @@ async def test_update(monkeypatch, reconnect_fixture) -> None:
         "delta_voltage": 0.01,
         "power": -38.108,
         "battery_charging": False,
+        "battery_level": 65,
+        "cycle_capacity": 68.89,
+        "temperature": 23,
+        "cycles": 3,
     }
 
     # query again to check already connected state
@@ -143,58 +90,64 @@ async def test_update(monkeypatch, reconnect_fixture) -> None:
     await bms.disconnect()
 
 
-@pytest.fixture(name="wrong_response", params=[
-        b"x009031001E0000001400080016F4~", # wrong SOI
-        b":009031001E0000001400080016F4x", # wrong EOI
-        b":009031001D0000001400080016F4~", # wrong length
-    ])
+@pytest.fixture(
+    name="wrong_response",
+    params=[
+        bytearray(
+            b"\x00\x00\x65\x01\x93\x55\xaa\x00\x46\x66\x00\x00\xbc\x67\x00\x00\xf5\x0c\xf7\x0c"
+            b"\xfc\x0c\xfb\x0c\xf8\x0c\xf2\x0c\xfa\x0c\xf5\x0c\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfa\xff\xff\x17\x00\x16\x00\x17\x00\x00\x00"
+            b"\x00\x00\xe9\x1a\x04\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x64\x00\x00\x00\x03\x00\x00\x00"
+            b"\x5f\x01\x00\x00\xff"  # wrong CRC
+        ),
+        bytearray(
+            b"\x00\x01\x65\x01\x93\x55\xaa\x00\x46\x66\x00\x00\xbc\x67\x00\x00\xf5\x0c\xf7\x0c"
+            b"\xfc\x0c\xfb\x0c\xf8\x0c\xf2\x0c\xfa\x0c\xf5\x0c\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfa\xff\xff\x17\x00\x16\x00\x17\x00\x00\x00"
+            b"\x00\x00\xe9\x1a\x04\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x64\x00\x00\x00\x03\x00\x00\x00"
+            b"\x5f\x01\x00\x00\xbc"  # wrong SOF
+        ),
+        bytearray(
+            b"\x00\x00\x65\x01\x93\x55\xaa\x00\x46\x66\x00\x00\xbc\x67\x00\x00\xf5\x0c\xf7\x0c"
+            b"\xfc\x0c\xfb\x0c\xf8\x0c\xf2\x0c\xfa\x0c\xf5\x0c\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x65\xfa\xff\xff\x17\x00\x16\x00\x17\x00\x00\x00"
+            b"\x00\x00\xe9\x1a\x04\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+            b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x64\x00\x00\x00\x03\x00\x00\x00"
+            b"\x5f\x01\x00\xbc"  # wrong length
+        ),
+        bytearray(b"\x00"),  # much too short
+    ],
+)
 def response(request):
     """Return all possible BMS variants."""
     return request.param
 
-# async def test_invalid_response(monkeypatch, wrong_response) -> None:
-#     """Test data up date with BMS returning invalid data."""
-
-#     monkeypatch.setattr(
-#         "custom_components.bms_ble.plugins.redodo_bms.BAT_TIMEOUT",
-#         0.1,
-#     )
-
-#     monkeypatch.setattr(
-#         "tests.test_redodo_bms.MockRedodoBleakClient._response",
-#         lambda _s,_c_,d: wrong_response,
-#     )
-
-#     monkeypatch.setattr(
-#         "custom_components.bms_ble.plugins.basebms.BleakClient",
-#         MockEJBleakClient,
-#     )
 
-#     bms = BMS(generate_ble_device("cc:cc:cc:cc:cc:cc", "MockBLEDevice", None, -73))
+async def test_invalid_response(monkeypatch, wrong_response) -> None:
+    """Test data up date with BMS returning invalid data."""
 
-#     result = {}
-#     with pytest.raises(TimeoutError):
-#         result = await bms.async_update()
-
-#     assert not result
-#     await bms.disconnect()
-
-
-# async def test_wrong_crc(monkeypatch, dev_name) -> None:
-#     """Test data update with BMS returning invalid data."""
+    monkeypatch.setattr(
+        "custom_components.bms_ble.plugins.redodo_bms.BAT_TIMEOUT",
+        0.1,
+    )
 
-#     monkeypatch.setattr(
-#         "custom_components.bms_ble.plugins.dpwrcore_bms.BAT_TIMEOUT",
-#         0.1,
-#     )
+    monkeypatch.setattr(
+        "tests.test_redodo_bms.MockRedodoBleakClient._response",
+        lambda _s, _c_, d: wrong_response,
+    )
 
-#     monkeypatch.setattr(
-#         "custom_components.bms_ble.plugins.basebms.BleakClient",
-#         MockWrongCRCBleakClient,
-#     )
+    monkeypatch.setattr(
+        "custom_components.bms_ble.plugins.basebms.BleakClient",
+        MockRedodoBleakClient,
+    )
 
-#     bms = BMS(generate_ble_device("cc:cc:cc:cc:cc:cc", dev_name, None, -73))
+    bms = BMS(generate_ble_device("cc:cc:cc:cc:cc:cc", "MockBLEDevice", None, -73))
 
-#     assert await bms.async_update() == {}
+    result = {}
+    with pytest.raises(TimeoutError):
+        result = await bms.async_update()
 
-#     await bms.disconnect()
+    assert not result
+    await bms.disconnect()