1- from unittest import mock
1+ import asyncio
22
33import pytest
4+ import serial
45import serial_asyncio
6+ from asynctest import CoroutineMock , mock
7+
8+ import zigpy_zigate .config as config
9+ import zigpy_zigate .uart
510from zigpy_zigate import api as zigate_api
611
12+ DEVICE_CONFIG = config .SCHEMA_DEVICE ({config .CONF_DEVICE_PATH : "/dev/null" })
13+
714
815@pytest .fixture
916def api ():
10- api = zigate_api .ZiGate ()
17+ api = zigate_api .ZiGate (DEVICE_CONFIG )
1118 api ._uart = mock .MagicMock ()
1219 return api
1320
@@ -19,19 +26,68 @@ def test_set_application(api):
1926
2027@pytest .mark .asyncio
2128async def test_connect (monkeypatch ):
22- api = zigate_api .ZiGate ()
23- portmock = mock .MagicMock ()
29+ api = zigate_api .ZiGate (DEVICE_CONFIG )
2430
2531 async def mock_conn (loop , protocol_factory , ** kwargs ):
2632 protocol = protocol_factory ()
2733 loop .call_soon (protocol .connection_made , None )
2834 return None , protocol
29- monkeypatch .setattr (serial_asyncio , 'create_serial_connection' , mock_conn )
3035
31- await api .connect (portmock , 115200 )
36+ monkeypatch .setattr (serial_asyncio , "create_serial_connection" , mock_conn )
37+
38+ await api .connect ()
3239
3340
3441def test_close (api ):
3542 api ._uart .close = mock .MagicMock ()
43+ uart = api ._uart
3644 api .close ()
37- assert api ._uart .close .call_count == 1
45+ assert uart .close .call_count == 1
46+ assert api ._uart is None
47+
48+
49+ @pytest .mark .asyncio
50+ @mock .patch .object (zigpy_zigate .uart , "connect" )
51+ async def test_api_new (conn_mck ):
52+ """Test new class method."""
53+ api = await zigate_api .ZiGate .new (DEVICE_CONFIG , mock .sentinel .application )
54+ assert isinstance (api , zigate_api .ZiGate )
55+ assert conn_mck .call_count == 1
56+ assert conn_mck .await_count == 1
57+
58+
59+ @pytest .mark .asyncio
60+ @mock .patch .object (zigate_api .ZiGate , "set_raw_mode" , new_callable = CoroutineMock )
61+ @mock .patch .object (zigpy_zigate .uart , "connect" )
62+ async def test_probe_success (mock_connect , mock_raw_mode ):
63+ """Test device probing."""
64+
65+ res = await zigate_api .ZiGate .probe (DEVICE_CONFIG )
66+ assert res is True
67+ assert mock_connect .call_count == 1
68+ assert mock_connect .await_count == 1
69+ assert mock_connect .call_args [0 ][0 ] == DEVICE_CONFIG
70+ assert mock_raw_mode .call_count == 1
71+ assert mock_connect .return_value .close .call_count == 1
72+
73+
74+ @pytest .mark .asyncio
75+ @mock .patch .object (zigate_api .ZiGate , "set_raw_mode" , side_effect = asyncio .TimeoutError )
76+ @mock .patch .object (zigpy_zigate .uart , "connect" )
77+ @pytest .mark .parametrize (
78+ "exception" ,
79+ (asyncio .TimeoutError , serial .SerialException , zigate_api .NoResponseError ),
80+ )
81+ async def test_probe_fail (mock_connect , mock_raw_mode , exception ):
82+ """Test device probing fails."""
83+
84+ mock_raw_mode .side_effect = exception
85+ mock_connect .reset_mock ()
86+ mock_raw_mode .reset_mock ()
87+ res = await zigate_api .ZiGate .probe (DEVICE_CONFIG )
88+ assert res is False
89+ assert mock_connect .call_count == 1
90+ assert mock_connect .await_count == 1
91+ assert mock_connect .call_args [0 ][0 ] == DEVICE_CONFIG
92+ assert mock_raw_mode .call_count == 1
93+ assert mock_connect .return_value .close .call_count == 1
0 commit comments