11import asyncio
22import logging
3- from unittest import mock
43
5- import asynctest
4+ from asynctest import CoroutineMock , mock
65import pytest
6+ import serial
77
88from zigpy_deconz import api as deconz_api , types as t , uart
99import zigpy_deconz .exception
@@ -32,9 +32,10 @@ async def test_connect(monkeypatch):
3232
3333
3434def test_close (api ):
35- api . _uart . close = mock . MagicMock ()
35+ uart = api . _uart
3636 api .close ()
37- assert api ._uart .close .call_count == 1
37+ assert api ._uart is None
38+ assert uart .close .call_count == 1
3839
3940
4041def test_commands ():
@@ -438,7 +439,7 @@ def test_device_state_network_state(data, network_state):
438439async def test_reconnect_multiple_disconnects (monkeypatch , caplog ):
439440 api = deconz_api .Deconz ()
440441 dev = mock .sentinel .uart
441- connect_mock = asynctest . CoroutineMock ()
442+ connect_mock = CoroutineMock ()
442443 connect_mock .return_value = asyncio .Future ()
443444 connect_mock .return_value .set_result (True )
444445 monkeypatch .setattr (uart , "connect" , connect_mock )
@@ -464,7 +465,7 @@ async def test_reconnect_multiple_disconnects(monkeypatch, caplog):
464465async def test_reconnect_multiple_attempts (monkeypatch , caplog ):
465466 api = deconz_api .Deconz ()
466467 dev = mock .sentinel .uart
467- connect_mock = asynctest . CoroutineMock ()
468+ connect_mock = CoroutineMock ()
468469 connect_mock .return_value = asyncio .Future ()
469470 connect_mock .return_value .set_result (True )
470471 monkeypatch .setattr (uart , "connect" , connect_mock )
@@ -477,9 +478,57 @@ async def test_reconnect_multiple_attempts(monkeypatch, caplog):
477478 connect_mock .reset_mock ()
478479 connect_mock .side_effect = [asyncio .TimeoutError , OSError , connected ]
479480
480- with asynctest . mock .patch ("asyncio.sleep" ):
481+ with mock .patch ("asyncio.sleep" ):
481482 api .connection_lost ("connection lost" )
482483 await api ._conn_lost_task
483484
484485 assert api ._uart is mock .sentinel .uart_reconnect
485486 assert connect_mock .call_count == 3
487+
488+
489+ @pytest .mark .asyncio
490+ @mock .patch .object (deconz_api .Deconz , "device_state" , new_callable = CoroutineMock )
491+ @mock .patch .object (uart , "connect" )
492+ async def test_probe_success (mock_connect , mock_device_state ):
493+ """Test device probing."""
494+
495+ res = await deconz_api .Deconz .probe (mock .sentinel .uart , mock .sentinel .baud )
496+ assert res is True
497+ assert mock_connect .call_count == 1
498+ assert mock_connect .await_count == 1
499+ assert mock_connect .call_args [0 ][0 ] is mock .sentinel .uart
500+ assert mock_device_state .call_count == 1
501+ assert mock_connect .return_value .close .call_count == 1
502+
503+ mock_connect .reset_mock ()
504+ mock_device_state .reset_mock ()
505+ mock_connect .reset_mock ()
506+ res = await deconz_api .Deconz .probe (mock .sentinel .uart , mock .sentinel .baud )
507+ assert res is True
508+ assert mock_connect .call_count == 1
509+ assert mock_connect .await_count == 1
510+ assert mock_connect .call_args [0 ][0 ] is mock .sentinel .uart
511+ assert mock_device_state .call_count == 1
512+ assert mock_connect .return_value .close .call_count == 1
513+
514+
515+ @pytest .mark .asyncio
516+ @mock .patch .object (deconz_api .Deconz , "device_state" , new_callable = CoroutineMock )
517+ @mock .patch .object (uart , "connect" )
518+ @pytest .mark .parametrize (
519+ "exception" ,
520+ (asyncio .TimeoutError , serial .SerialException , zigpy_deconz .exception .CommandError ),
521+ )
522+ async def test_probe_fail (mock_connect , mock_device_state , exception ):
523+ """Test device probing fails."""
524+
525+ mock_device_state .side_effect = exception
526+ mock_device_state .reset_mock ()
527+ mock_connect .reset_mock ()
528+ res = await deconz_api .Deconz .probe (mock .sentinel .uart , mock .sentinel .baud )
529+ assert res is False
530+ assert mock_connect .call_count == 1
531+ assert mock_connect .await_count == 1
532+ assert mock_connect .call_args [0 ][0 ] is mock .sentinel .uart
533+ assert mock_device_state .call_count == 1
534+ assert mock_connect .return_value .close .call_count == 1
0 commit comments