test_vacuum.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from unittest.mock import AsyncMock
  2. import pytest
  3. from bleak.backends.device import BLEDevice
  4. from switchbot import SwitchBotAdvertisement
  5. from switchbot.devices import vacuum
  6. from switchbot.adv_parser import SUPPORTED_TYPES
  7. from .test_adv_parser import generate_ble_device
  8. common_params = [
  9. (b".\x00d", ".", 2),
  10. (b'z\x00\x00', ".", 2),
  11. (b'3\x00\x00', ".", 2),
  12. (b'(\x00', "(", 1),
  13. (b'}\x00', "(", 1),
  14. ]
  15. def create_device_for_command_testing(protocol_version: int, rawAdvData: bytes, model: str):
  16. ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
  17. device = vacuum.SwitchbotVacuum(ble_device)
  18. device.update_from_advertisement(make_advertisement_data(ble_device, protocol_version, rawAdvData, model))
  19. device._send_command = AsyncMock()
  20. device.update = AsyncMock()
  21. return device
  22. def make_advertisement_data(ble_device: BLEDevice, protocol_version: int, rawAdvData: bytes, model: str):
  23. """Set advertisement data with defaults."""
  24. if protocol_version == 1:
  25. return SwitchBotAdvertisement(
  26. address="aa:bb:cc:dd:ee:ff",
  27. data={
  28. "rawAdvData": rawAdvData,
  29. "data": {
  30. "sequence_number": 2,
  31. 'dusbin_connected': False,
  32. 'dustbin_bound': False,
  33. 'network_connected': True,
  34. "battery": 100,
  35. "work_status": 0,
  36. },
  37. "isEncrypted": False,
  38. "model": model,
  39. "modelFriendlyName": SUPPORTED_TYPES[model]["modelFriendlyName"],
  40. "modelName": SUPPORTED_TYPES[model]["modelName"],
  41. },
  42. device=ble_device,
  43. rssi=-97,
  44. active=True,
  45. )
  46. else:
  47. return SwitchBotAdvertisement(
  48. address="aa:bb:cc:dd:ee:ff",
  49. data={
  50. "rawAdvData": rawAdvData,
  51. "data": {
  52. "soc_version": "1.1.083",
  53. "step": 0,
  54. "mqtt_connected": True,
  55. "battery": 100,
  56. "work_status": 15,
  57. },
  58. "isEncrypted": False,
  59. "model": model,
  60. "modelFriendlyName": SUPPORTED_TYPES[model]["modelFriendlyName"],
  61. "modelName": SUPPORTED_TYPES[model]["modelName"],
  62. },
  63. device=ble_device,
  64. rssi=-97,
  65. active=True,
  66. )
  67. @pytest.mark.asyncio
  68. @pytest.mark.parametrize(
  69. "rawAdvData,model",
  70. [
  71. (b".\x00d", "."),
  72. (b'z\x00\x00', 'z'),
  73. (b'3\x00\x00', "3")
  74. ]
  75. )
  76. async def test_status_from_proceess_adv(rawAdvData, model, protocol_version=2):
  77. device = create_device_for_command_testing(protocol_version, rawAdvData, model)
  78. assert device.get_soc_version() == "1.1.083"
  79. assert device.get_last_step() == 0
  80. assert device.get_mqtt_connnect_status() is True
  81. assert device.get_battery() == 100
  82. assert device.get_work_status() == 15
  83. @pytest.mark.asyncio
  84. @pytest.mark.parametrize(
  85. "rawAdvData,model",
  86. [
  87. (b'(\x00', "("),
  88. (b'}\x00', "}")
  89. ]
  90. )
  91. async def test_status_from_proceess_adv_k(rawAdvData, model, protocol_version=1):
  92. device = create_device_for_command_testing(protocol_version, rawAdvData, model)
  93. assert device.get_dustbin_bound_status() is False
  94. assert device.get_dustbin_connnected_status() is False
  95. assert device.get_network_connected_status() is True
  96. assert device.get_battery() == 100
  97. assert device.get_work_status() == 0
  98. @pytest.mark.asyncio
  99. @pytest.mark.parametrize(
  100. "rawAdvData,model,protocol_version",
  101. common_params
  102. )
  103. async def test_clean_up(rawAdvData, model, protocol_version):
  104. device = create_device_for_command_testing(protocol_version, rawAdvData, model)
  105. await device.clean_up(protocol_version)
  106. device._send_command.assert_awaited_once_with(vacuum.COMMAND_CLEAN_UP[protocol_version])
  107. @pytest.mark.asyncio
  108. @pytest.mark.parametrize(
  109. "rawAdvData,model,protocol_version",
  110. common_params
  111. )
  112. async def test_return_to_dock(rawAdvData, model, protocol_version):
  113. device = create_device_for_command_testing(protocol_version, rawAdvData, model)
  114. await device.return_to_dock(protocol_version)
  115. device._send_command.assert_awaited_once_with(vacuum.COMMAND_RETURN_DOCK[protocol_version])
  116. @pytest.mark.asyncio
  117. @pytest.mark.parametrize(
  118. "rawAdvData,model,protocol_version",
  119. common_params
  120. )
  121. async def test_get_basic_info_returns_none_when_no_data(rawAdvData, model, protocol_version):
  122. device = create_device_for_command_testing(protocol_version, rawAdvData, model)
  123. device._get_basic_info = AsyncMock(return_value=None)
  124. assert await device.get_basic_info() is None