@@ -1737,3 +1737,151 @@ def test_parse_advertisement_data_relay_switch_1():
17371737 rssi = - 67 ,
17381738 active = True ,
17391739 )
1740+
1741+
1742+ def test_leak_active ():
1743+ """Test parse_advertisement_data for the leak detector."""
1744+ ble_device = generate_ble_device ("aa:bb:cc:dd:ee:ff" , "any" )
1745+ adv_data = generate_advertisement_data (
1746+ manufacturer_data = {2409 : b"\xc4 407Lz\x18 N\x98 g^\x94 Q<\x05 \x00 \x00 \x00 \x00 " },
1747+ service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"&\x00 N" },
1748+ rssi = - 72 ,
1749+ )
1750+ result = parse_advertisement_data (ble_device , adv_data , SwitchbotModel .LEAK )
1751+ assert result == SwitchBotAdvertisement (
1752+ address = "aa:bb:cc:dd:ee:ff" ,
1753+ data = {
1754+ "data" : {
1755+ "leak" : False ,
1756+ "tampered" : False ,
1757+ "battery" : 78 ,
1758+ "low_battery" : False ,
1759+ },
1760+ "isEncrypted" : False ,
1761+ "model" : "3" ,
1762+ "modelFriendlyName" : "Leak Detector" ,
1763+ "modelName" : SwitchbotModel .LEAK ,
1764+ "rawAdvData" : b"&\x00 N" ,
1765+ },
1766+ device = ble_device ,
1767+ rssi = - 72 ,
1768+ active = True ,
1769+ )
1770+
1771+
1772+ def test_leak_passive ():
1773+ """Test parse_advertisement_data for the leak detector."""
1774+ ble_device = generate_ble_device ("aa:bb:cc:dd:ee:ff" , "any" )
1775+ adv_data = generate_advertisement_data (
1776+ manufacturer_data = {2409 : b"\xc4 407Lz\x18 N\x98 g^\x94 Q<\x05 \x00 \x00 \x00 \x00 " },
1777+ rssi = - 72 ,
1778+ )
1779+ result = parse_advertisement_data (ble_device , adv_data , SwitchbotModel .LEAK )
1780+ assert result == SwitchBotAdvertisement (
1781+ address = "aa:bb:cc:dd:ee:ff" ,
1782+ data = {
1783+ "data" : {},
1784+ "isEncrypted" : False ,
1785+ "model" : "3" ,
1786+ "rawAdvData" : None ,
1787+ },
1788+ device = ble_device ,
1789+ rssi = - 72 ,
1790+ active = False ,
1791+ )
1792+
1793+
1794+ def test_leak_no_leak_detected ():
1795+ """Test parse_advertisement_data for the leak detector."""
1796+ ble_device = generate_ble_device ("aa:bb:cc:dd:ee:ff" , "Any" )
1797+ adv_data = generate_advertisement_data (
1798+ manufacturer_data = {
1799+ 2409 : b"\xc4 407LzJd\x98 ga\xc4 \n <\x05 \x00 \x00 \x00 \x00 "
1800+ }, # no leak, batt
1801+ service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"&\x00 d" },
1802+ rssi = - 73 ,
1803+ )
1804+ result = parse_advertisement_data (ble_device , adv_data , SwitchbotModel .LEAK )
1805+ assert result == SwitchBotAdvertisement (
1806+ address = "aa:bb:cc:dd:ee:ff" ,
1807+ data = {
1808+ "data" : {
1809+ "leak" : False ,
1810+ "tampered" : False ,
1811+ "battery" : 100 ,
1812+ "low_battery" : False ,
1813+ },
1814+ "isEncrypted" : False ,
1815+ "model" : "3" ,
1816+ "modelFriendlyName" : "Leak Detector" ,
1817+ "modelName" : SwitchbotModel .LEAK ,
1818+ "rawAdvData" : b"&\x00 d" ,
1819+ },
1820+ device = ble_device ,
1821+ rssi = - 73 ,
1822+ active = True ,
1823+ )
1824+
1825+
1826+ def test_leak_leak_detected ():
1827+ """Test parse_advertisement_data for the leak detector."""
1828+ ble_device = generate_ble_device ("aa:bb:cc:dd:ee:ff" , "Any" )
1829+ adv_data = generate_advertisement_data (
1830+ manufacturer_data = {
1831+ 2409 : b"\xc4 407LzGd\xf9 ga\xc4 \x08 <\x05 \x00 \x00 \x00 \x00 "
1832+ }, # leak, batt
1833+ service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"&\x00 d" },
1834+ rssi = - 73 ,
1835+ )
1836+ result = parse_advertisement_data (ble_device , adv_data , SwitchbotModel .LEAK )
1837+ assert result == SwitchBotAdvertisement (
1838+ address = "aa:bb:cc:dd:ee:ff" ,
1839+ data = {
1840+ "data" : {
1841+ "leak" : True ,
1842+ "tampered" : False ,
1843+ "battery" : 100 ,
1844+ "low_battery" : False ,
1845+ },
1846+ "isEncrypted" : False ,
1847+ "model" : "3" ,
1848+ "modelFriendlyName" : "Leak Detector" ,
1849+ "modelName" : SwitchbotModel .LEAK ,
1850+ "rawAdvData" : b"&\x00 d" ,
1851+ },
1852+ device = ble_device ,
1853+ rssi = - 73 ,
1854+ active = True ,
1855+ )
1856+
1857+
1858+ def test_leak_low_battery ():
1859+ """Test parse_advertisement_data for the leak detector."""
1860+ ble_device = generate_ble_device ("aa:bb:cc:dd:ee:ff" , "Any" )
1861+ adv_data = generate_advertisement_data (
1862+ manufacturer_data = {
1863+ 2409 : b"\xc4 407Lz\x02 \t \x98 \x00 \x00 \x00 \x00 <\x05 \x00 \x00 \x00 \x00 "
1864+ }, # no leak, low battery
1865+ service_data = {"0000fd3d-0000-1000-8000-00805f9b34fb" : b"&\x00 d" },
1866+ rssi = - 73 ,
1867+ )
1868+ result = parse_advertisement_data (ble_device , adv_data , SwitchbotModel .LEAK )
1869+ assert result == SwitchBotAdvertisement (
1870+ address = "aa:bb:cc:dd:ee:ff" ,
1871+ data = {
1872+ "data" : {
1873+ "leak" : False ,
1874+ "tampered" : False ,
1875+ "battery" : 9 ,
1876+ "low_battery" : False ,
1877+ },
1878+ "isEncrypted" : False ,
1879+ "model" : "3" ,
1880+ "modelFriendlyName" : "Leak Detector" ,
1881+ "modelName" : SwitchbotModel .LEAK ,
1882+ "rawAdvData" : b"&\x00 d" ,
1883+ },
1884+ device = ble_device ,
1885+ rssi = - 73 ,
1886+ active = True ,
1887+ )
0 commit comments