1
0

test_lock_nano_adv.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import pytest
  2. from switchbot import SwitchbotModel, parse_advertisement_data
  3. from switchbot.adv_parsers.lock import process_lock_nano
  4. from switchbot.const.lock import LockStatus
  5. from switchbot.devices.lock import SwitchbotLock
  6. from .test_adv_parser import generate_advertisement_data, generate_ble_device
  7. @pytest.mark.parametrize("pairing", [0, 1])
  8. def test_nano_discovery(pairing):
  9. service_data = bytes([0, 0x80, 95, pairing, 0x12, 0x24, 0x88])
  10. manufacturer_data = bytes.fromhex("b0e9fe112233 2a 88 fe df 73")
  11. advertisement = generate_advertisement_data(
  12. manufacturer_data={2409: manufacturer_data},
  13. service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": service_data},
  14. rssi=-60,
  15. )
  16. result = parse_advertisement_data(
  17. generate_ble_device("aa:bb:cc:dd:ee:ff", "Lock Nano"), advertisement
  18. )
  19. assert result.data["modelName"] == SwitchbotModel.LOCK_NANO
  20. assert result.data["data"] == {
  21. "sequence_number": 42,
  22. "calibration": True,
  23. "status": LockStatus.UNLOCKED,
  24. "auto_lock_paused": True,
  25. "night_latch": True,
  26. "battery": 95,
  27. "charging_status": 1,
  28. "battery_charging": True,
  29. "unlocked_alarm": True,
  30. "low_temperature_alarm": True,
  31. "power_alarm": True,
  32. "battery_status": 1,
  33. "charging_fault": True,
  34. }
  35. @pytest.mark.parametrize(
  36. ("flags", "battery", "expected"),
  37. [
  38. (0, 95, 0),
  39. (0, 223, 1),
  40. (1, 95, 2),
  41. (1, 223, 3),
  42. ],
  43. )
  44. def test_nano_charging_status(flags, battery, expected):
  45. manufacturer_data = bytes.fromhex("b0e9fe112233 01 80") + bytes([flags, battery, 0])
  46. result = process_lock_nano(None, manufacturer_data)
  47. assert result["charging_status"] == expected
  48. assert result["battery_charging"] == (expected == 1)
  49. assert result["battery"] == 95
  50. @pytest.mark.parametrize("manufacturer_data", [None, b"", bytes(6), bytes(10)])
  51. def test_nano_truncated_advertisement(manufacturer_data):
  52. assert process_lock_nano(None, manufacturer_data) == {}
  53. @pytest.mark.parametrize(("alarm_byte", "expected"), [(0, 0), (2, 1), (4, 2)])
  54. def test_nano_battery_status(alarm_byte, expected):
  55. result = process_lock_nano(None, bytes(10) + bytes([alarm_byte]))
  56. assert result["battery_status"] == expected
  57. assert not result["charging_fault"]
  58. def test_nano_connected_layout():
  59. assert SwitchbotLock._parse_lock_data(
  60. bytes.fromhex("88 10 64 00 00 80"), SwitchbotModel.LOCK_NANO
  61. ) == {
  62. "calibration": True,
  63. "status": LockStatus.UNLOCKED,
  64. "unlocked_alarm": False,
  65. "auto_lock_paused": False,
  66. }