44from asynctest import CoroutineMock , mock
55import pytest
66import serial
7+ import zigpy .config
78
89from zigpy_deconz import api as deconz_api , types as t , uart
910import zigpy_deconz .exception
11+ import zigpy_deconz .zigbee .application
12+
13+ DEVICE_CONFIG = {zigpy .config .CONF_DEVICE_PATH : "/dev/null" }
1014
1115
1216@pytest .fixture
1317def api ():
14- api = deconz_api .Deconz ()
18+ controller = mock .MagicMock (
19+ spec_set = zigpy_deconz .zigbee .application .ControllerApplication
20+ )
21+ api = deconz_api .Deconz (controller , {zigpy .config .CONF_DEVICE_PATH : "/dev/null" })
1522 api ._uart = mock .MagicMock ()
1623 return api
1724
1825
19- def test_set_application (api ):
20- api .set_application (mock .sentinel .app )
21- assert api ._app == mock .sentinel .app
22-
23-
2426@pytest .mark .asyncio
25- async def test_connect (monkeypatch ):
26- api = deconz_api .Deconz ()
27- dev = mock .MagicMock ()
28- monkeypatch .setattr (
29- uart , "connect" , mock .MagicMock (side_effect = asyncio .coroutine (mock .MagicMock ()))
27+ async def test_connect ():
28+ controller = mock .MagicMock (
29+ spec_set = zigpy_deconz .zigbee .application .ControllerApplication
3030 )
31- await api .connect (dev , 115200 )
31+ api = deconz_api .Deconz (controller , {zigpy .config .CONF_DEVICE_PATH : "/dev/null" })
32+
33+ with mock .patch .object (uart , "connect" , new = CoroutineMock ()) as conn_mck :
34+ await api .connect ()
35+ assert conn_mck .call_count == 1
36+ assert conn_mck .await_count == 1
37+ assert api ._uart == conn_mck .return_value
3238
3339
3440def test_close (api ):
@@ -437,14 +443,13 @@ def test_device_state_network_state(data, network_state):
437443
438444@pytest .mark .asyncio
439445async def test_reconnect_multiple_disconnects (monkeypatch , caplog ):
440- api = deconz_api .Deconz ()
441- dev = mock .sentinel .uart
446+ api = deconz_api .Deconz (None , DEVICE_CONFIG )
442447 connect_mock = CoroutineMock ()
443448 connect_mock .return_value = asyncio .Future ()
444449 connect_mock .return_value .set_result (True )
445450 monkeypatch .setattr (uart , "connect" , connect_mock )
446451
447- await api .connect (dev , 115200 )
452+ await api .connect ()
448453
449454 caplog .set_level (logging .DEBUG )
450455 connected = asyncio .Future ()
@@ -463,14 +468,13 @@ async def test_reconnect_multiple_disconnects(monkeypatch, caplog):
463468
464469@pytest .mark .asyncio
465470async def test_reconnect_multiple_attempts (monkeypatch , caplog ):
466- api = deconz_api .Deconz ()
467- dev = mock .sentinel .uart
471+ api = deconz_api .Deconz (None , DEVICE_CONFIG )
468472 connect_mock = CoroutineMock ()
469473 connect_mock .return_value = asyncio .Future ()
470474 connect_mock .return_value .set_result (True )
471475 monkeypatch .setattr (uart , "connect" , connect_mock )
472476
473- await api .connect (dev , 115200 )
477+ await api .connect ()
474478
475479 caplog .set_level (logging .DEBUG )
476480 connected = asyncio .Future ()
@@ -492,22 +496,22 @@ async def test_reconnect_multiple_attempts(monkeypatch, caplog):
492496async def test_probe_success (mock_connect , mock_device_state ):
493497 """Test device probing."""
494498
495- res = await deconz_api .Deconz .probe (mock . sentinel . uart , mock . sentinel . baud )
499+ res = await deconz_api .Deconz .probe (DEVICE_CONFIG )
496500 assert res is True
497501 assert mock_connect .call_count == 1
498502 assert mock_connect .await_count == 1
499- assert mock_connect .call_args [0 ][0 ] is mock . sentinel . uart
503+ assert mock_connect .call_args [0 ][0 ] is DEVICE_CONFIG
500504 assert mock_device_state .call_count == 1
501505 assert mock_connect .return_value .close .call_count == 1
502506
503507 mock_connect .reset_mock ()
504508 mock_device_state .reset_mock ()
505509 mock_connect .reset_mock ()
506- res = await deconz_api .Deconz .probe (mock . sentinel . uart , mock . sentinel . baud )
510+ res = await deconz_api .Deconz .probe (DEVICE_CONFIG )
507511 assert res is True
508512 assert mock_connect .call_count == 1
509513 assert mock_connect .await_count == 1
510- assert mock_connect .call_args [0 ][0 ] is mock . sentinel . uart
514+ assert mock_connect .call_args [0 ][0 ] is DEVICE_CONFIG
511515 assert mock_device_state .call_count == 1
512516 assert mock_connect .return_value .close .call_count == 1
513517
@@ -525,10 +529,37 @@ async def test_probe_fail(mock_connect, mock_device_state, exception):
525529 mock_device_state .side_effect = exception
526530 mock_device_state .reset_mock ()
527531 mock_connect .reset_mock ()
528- res = await deconz_api .Deconz .probe (mock . sentinel . uart , mock . sentinel . baud )
532+ res = await deconz_api .Deconz .probe (DEVICE_CONFIG )
529533 assert res is False
530534 assert mock_connect .call_count == 1
531535 assert mock_connect .await_count == 1
532- assert mock_connect .call_args [0 ][0 ] is mock . sentinel . uart
536+ assert mock_connect .call_args [0 ][0 ] is DEVICE_CONFIG
533537 assert mock_device_state .call_count == 1
534538 assert mock_connect .return_value .close .call_count == 1
539+
540+
541+ @pytest .mark .parametrize (
542+ "value, name" ,
543+ (
544+ (0x00 , "SUCCESS" ),
545+ (0xA0 , "APS_ASDU_TOO_LONG" ),
546+ (0x01 , "MAC_PAN_AT_CAPACITY" ),
547+ (0xC9 , "NWK_UNSUPPORTED_ATTRIBUTE" ),
548+ (0xFE , "undefined_0xfe" ),
549+ ),
550+ )
551+ def test_tx_status (value , name ):
552+ """Test tx status undefined values."""
553+ i = deconz_api .TXStatus (value )
554+ assert i == value
555+ assert i .value == value
556+ assert i .name == name
557+
558+ extra = b"\xaa \55 "
559+ data = t .uint8_t (value ).serialize ()
560+ status , rest = deconz_api .TXStatus .deserialize (data + extra )
561+ assert rest == extra
562+ assert isinstance (status , deconz_api .TXStatus )
563+ assert status == value
564+ assert status .value == value
565+ assert status .name == name
0 commit comments