Selaa lähdekoodia

add test adv unit test

zerzhang 1 kuukausi sitten
vanhempi
commit
d91baf9ace
1 muutettua tiedostoa jossa 266 lisäystä ja 65 poistoa
  1. 266 65
      tests/test_adv_parser.py

+ 266 - 65
tests/test_adv_parser.py

@@ -1437,71 +1437,6 @@ def test_parse_advertisement_data_keypad():
     )
 
 
-def test_parse_advertisement_data_relay_switch_1pm():
-    """Test parse_advertisement_data for the keypad."""
-    ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
-    adv_data = generate_advertisement_data(
-        manufacturer_data={2409: b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00"},
-        service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b"<\x00\x00\x00"},
-        rssi=-67,
-    )
-    result = parse_advertisement_data(
-        ble_device, adv_data, SwitchbotModel.RELAY_SWITCH_1PM
-    )
-    assert result == SwitchBotAdvertisement(
-        address="aa:bb:cc:dd:ee:ff",
-        data={
-            "data": {
-                "switchMode": True,
-                "sequence_number": 71,
-                "isOn": True,
-                "power": 4.9,
-                "voltage": 0,
-                "current": 0,
-            },
-            "isEncrypted": False,
-            "model": "<",
-            "modelFriendlyName": "Relay Switch 1PM",
-            "modelName": SwitchbotModel.RELAY_SWITCH_1PM,
-            "rawAdvData": b"<\x00\x00\x00",
-        },
-        device=ble_device,
-        rssi=-67,
-        active=True,
-    )
-
-
-def test_parse_advertisement_data_relay_switch_1():
-    """Test parse_advertisement_data for the keypad."""
-    ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
-    adv_data = generate_advertisement_data(
-        manufacturer_data={2409: b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00"},
-        service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": b";\x00\x00\x00"},
-        rssi=-67,
-    )
-    result = parse_advertisement_data(
-        ble_device, adv_data, SwitchbotModel.RELAY_SWITCH_1
-    )
-    assert result == SwitchBotAdvertisement(
-        address="aa:bb:cc:dd:ee:ff",
-        data={
-            "data": {
-                "switchMode": True,
-                "sequence_number": 71,
-                "isOn": True,
-            },
-            "isEncrypted": False,
-            "model": ";",
-            "modelFriendlyName": "Relay Switch 1",
-            "modelName": SwitchbotModel.RELAY_SWITCH_1,
-            "rawAdvData": b";\x00\x00\x00",
-        },
-        device=ble_device,
-        rssi=-67,
-        active=True,
-    )
-
-
 def test_leak_active():
     """Test parse_advertisement_data for the leak detector."""
     ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
@@ -3087,3 +3022,269 @@ def test_blind_tilt_with_empty_data() -> None:
         rssi=-97,
         active=True,
     )
+
+
+@pytest.mark.parametrize(
+    "test_case",
+    [
+        AdvTestCase(
+            b'\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00',
+            b'=\x00\x00\x00',
+            {
+                1: {
+                    'isOn': True,
+                    'power': 0.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+                2: {
+                    'isOn': True,
+                    'power': 7.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+            },
+            '=',
+            'Relay Switch 2PM',
+            SwitchbotModel.RELAY_SWITCH_2PM,
+        ),
+        AdvTestCase(
+            b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
+            b";\x00\x00\x00",
+            {
+                'isOn': True,
+                "sequence_number": 71,
+                'switchMode': True,
+            },
+            ';',
+            'Relay Switch 1',
+            SwitchbotModel.RELAY_SWITCH_1,
+        ),
+        AdvTestCase(
+            b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
+            b"<\x00\x00\x00",
+            {
+                'isOn': True,
+                'power': 4.9,
+                'sequence_number': 71,
+                'switchMode': True,
+            },
+            '<',
+            'Relay Switch 1PM',
+            SwitchbotModel.RELAY_SWITCH_1PM,
+        ),
+        AdvTestCase(
+            b'$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00',
+            b'>\x00\x00\x00',
+            {
+                'door_open': True,
+                'isOn': False,
+                'sequence_number': 15,
+                'switchMode': True,
+            },
+            '>',
+            'Garage Door Opener',
+            SwitchbotModel.GARAGE_DOOR_OPENER,
+        ),
+
+    ],
+)
+def test_adv_active(test_case: AdvTestCase) -> None:
+    """Test with active data."""
+    ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
+    adv_data = generate_advertisement_data(
+        manufacturer_data={2409: test_case.manufacturer_data},
+        service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": test_case.service_data},
+        rssi=-97,
+    )
+    result = parse_advertisement_data(ble_device, adv_data)
+    assert result == SwitchBotAdvertisement(
+        address="aa:bb:cc:dd:ee:ff",
+        data={
+            "rawAdvData": test_case.service_data,
+            "data": test_case.data,
+            "isEncrypted": False,
+            "model": test_case.model,
+            "modelFriendlyName": test_case.modelFriendlyName,
+            "modelName": test_case.modelName,
+        },
+        device=ble_device,
+        rssi=-97,
+        active=True,
+    )
+
+
+@pytest.mark.parametrize(
+    "test_case",
+    [
+        AdvTestCase(
+            b'\xc0N0\xdd\xb9\xf2\x8a\xc1\x00\x00\x00\x00\x00F\x00\x00',
+            b'=\x00\x00\x00',
+            {
+                1: {
+                    'isOn': True,
+                    'power': 0.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+                2: {
+                    'isOn': True,
+                    'power': 7.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+            },
+            '=',
+            'Relay Switch 2PM',
+            SwitchbotModel.RELAY_SWITCH_2PM,
+        ),
+        AdvTestCase(
+            b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
+            b";\x00\x00\x00",
+            {
+                'isOn': True,
+                "sequence_number": 71,
+                'switchMode': True,
+            },
+            ';',
+            'Relay Switch 1',
+            SwitchbotModel.RELAY_SWITCH_1,
+        ),
+        AdvTestCase(
+            b"$X|\x0866G\x81\x00\x00\x001\x00\x00\x00\x00",
+            b"<\x00\x00\x00",
+            {
+                'isOn': True,
+                'power': 4.9,
+                'sequence_number': 71,
+                'switchMode': True,
+            },
+            '<',
+            'Relay Switch 1PM',
+            SwitchbotModel.RELAY_SWITCH_1PM,
+        ),
+        AdvTestCase(
+            b'$X|\x05BN\x0f\x00\x00\x03\x00\x00\x00\x00\x00\x00',
+            b'>\x00\x00\x00',
+            {
+                'door_open': True,
+                'isOn': False,
+                'sequence_number': 15,
+                'switchMode': True,
+            },
+            '>',
+            'Garage Door Opener',
+            SwitchbotModel.GARAGE_DOOR_OPENER,
+        ),
+
+    ],
+)
+def test_adv_passive(test_case: AdvTestCase) -> None:
+    """Test with passive data."""
+    ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
+    adv_data = generate_advertisement_data(
+        manufacturer_data={2409: test_case.manufacturer_data},
+        rssi=-97,
+    )
+    result = parse_advertisement_data(ble_device, adv_data, test_case.modelName)
+    assert result == SwitchBotAdvertisement(
+        address="aa:bb:cc:dd:ee:ff",
+        data={
+            "rawAdvData": None,
+            "data": test_case.data,
+            "isEncrypted": False,
+            "model": test_case.model,
+            "modelFriendlyName": test_case.modelFriendlyName,
+            "modelName": test_case.modelName,
+        },
+        device=ble_device,
+        rssi=-97,
+        active=False,
+    )
+
+@pytest.mark.parametrize(
+    "test_case",
+    [
+        AdvTestCase(
+            None,
+            b'=\x00\x00\x00',
+            {
+                1: {
+                    'isOn': True,
+                    'power': 0.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+                2: {
+                    'isOn': True,
+                    'power': 7.0,
+                    'sequence_number': 138,
+                    'switchMode': True,
+                },
+            },
+            '=',
+            'Relay Switch 2PM',
+            SwitchbotModel.RELAY_SWITCH_2PM,
+        ),
+        AdvTestCase(
+            None,
+            b";\x00\x00\x00",
+            {
+                'isOn': True,
+                "sequence_number": 71,
+                'switchMode': True,
+            },
+            ';',
+            'Relay Switch 1',
+            SwitchbotModel.RELAY_SWITCH_1,
+        ),
+        AdvTestCase(
+            None,
+            b"<\x00\x00\x00",
+            {
+                'isOn': True,
+                'power': 4.9,
+                'sequence_number': 71,
+                'switchMode': True,
+            },
+            '<',
+            'Relay Switch 1PM',
+            SwitchbotModel.RELAY_SWITCH_1PM,
+        ),
+        AdvTestCase(
+            None,
+            b'>\x00\x00\x00',
+            {
+                'door_open': True,
+                'isOn': False,
+                'sequence_number': 15,
+                'switchMode': True,
+            },
+            '>',
+            'Garage Door Opener',
+            SwitchbotModel.GARAGE_DOOR_OPENER,
+        ),
+
+    ],
+)
+def test_adv_with_empty_data(test_case: AdvTestCase) -> None:
+    """Test with empty data."""
+    ble_device = generate_ble_device("aa:bb:cc:dd:ee:ff", "any")
+    adv_data = generate_advertisement_data(
+        manufacturer_data={2409: None},
+        service_data={"0000fd3d-0000-1000-8000-00805f9b34fb": test_case.service_data},
+        rssi=-97,
+    )
+    result = parse_advertisement_data(ble_device, adv_data)
+    assert result == SwitchBotAdvertisement(
+        address="aa:bb:cc:dd:ee:ff",
+        data={
+            "rawAdvData": test_case.service_data,
+            "data": {},
+            "isEncrypted": False,
+            "model": test_case.model,
+        },
+        device=ble_device,
+        rssi=-97,
+        active=True,
+    )