Skip to content

Commit 78947dd

Browse files
committed
fix on_attributes_update bacnet tests
1 parent 5686979 commit 78947dd

File tree

1 file changed

+62
-22
lines changed

1 file changed

+62
-22
lines changed

tests/unit/connectors/bacnet/test_on_attribute_updates.py

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,44 +25,75 @@ class BacnetOnAttributeUpdatesTestCase(BacnetBaseTestCase):
2525
async def asyncSetUp(self):
2626
await super().asyncSetUp()
2727
self.connector._AsyncBACnetConnector__application = AsyncMock()
28-
self._loop_thread = Thread(target=self.connector.loop.run_forever, daemon=True)
29-
self._loop_thread.start()
3028

3129
async def asyncTearDown(self):
32-
self.connector.loop.call_soon_threadsafe(self.connector.loop.stop)
33-
self._loop_thread.join(timeout=1)
34-
3530
await super().asyncTearDown()
3631

37-
async def test_retrieve_device_obj_by_name_success(self):
38-
payload = {'device': self.DEVICE_NAME, 'data': {'binaryValue2': True}}
39-
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
32+
async def test_retrieve_device_by_name_success(self):
33+
payload = {"device": self.DEVICE_NAME, "data": {"binaryValue2": True}}
34+
35+
fake_task = MagicMock()
36+
fake_task.done.return_value = True
37+
fake_task.result.return_value = self.device # success
38+
39+
with patch.object(self.connector.loop, "create_task", return_value=fake_task) as ct_mock:
40+
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
41+
42+
ct_mock.assert_called_once()
4043
self.assertIsInstance(device, Device)
4144
self.assertIs(device, self.device)
4245
self.assertEqual(device.name, self.DEVICE_NAME)
4346

4447
async def test_get_device_by_name_missing_device_key(self):
45-
payload = {'data': {'binaryValue2': True}}
48+
payload = {"data": {"binaryValue2": True}}
49+
fake_task = MagicMock()
50+
fake_task.done.return_value = True
51+
fake_task.result.return_value = None
4652

47-
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
53+
with patch.object(self.connector.loop, "create_task", return_value=fake_task), \
54+
self.assertLogs("Bacnet test", level="ERROR") as logcap:
55+
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
4856

4957
self.assertIsNone(device)
58+
self.assertTrue(any("does not contain a device name" in m for m in logcap.output))
5059

51-
async def test_retrieve_device_obj_on_non_existent_device(self):
52-
payload = {'device': 'test emulator device22', 'data': {'binaryValue2': True}}
53-
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
60+
async def test_retrieve_device_on_non_existent_device(self):
61+
payload = {"device": "non-existent-device", "data": {"binaryValue2": True}}
62+
63+
fake_task = MagicMock()
64+
fake_task.done.return_value = True
65+
fake_task.result.return_value = None
66+
67+
with patch.object(self.connector.loop, "create_task", return_value=fake_task) as ct_mock:
68+
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
69+
70+
ct_mock.assert_called_once()
5471
self.assertIsNone(device)
5572

5673
async def test_get_device_by_name_timeout(self):
57-
payload = {'device': self.DEVICE_NAME, 'data': {'binaryValue2': True}}
58-
with patch("asyncio.run_coroutine_threadsafe") as timeout_mock_task:
59-
fake_future = MagicMock()
60-
fake_future.result.side_effect = TimeoutError
61-
fake_future.done.return_value = False
62-
timeout_mock_task.return_value = fake_future
74+
payload = {"device": self.DEVICE_NAME, "data": {"binaryValue2": True}}
75+
fake_task = MagicMock()
76+
fake_task.done.return_value = False
77+
78+
with patch.object(self.connector.loop, "create_task", return_value=fake_task) as ct_mock, \
79+
patch.object(self.connector, "_AsyncBACnetConnector__wait_task_with_timeout",
80+
return_value=(False, None)) as waiter_mock, \
81+
self.assertLogs("Bacnet test", level="DEBUG") as logcap:
6382
device = self.connector._AsyncBACnetConnector__get_device_by_name(payload=payload)
83+
84+
ct_mock.assert_called_once()
85+
waiter_mock.assert_called_once()
6486
self.assertIsNone(device)
65-
fake_future.cancel.assert_called_once()
87+
self.assertTrue(any("look up task failed on timeout" in m for m in logcap.output))
88+
89+
async def test_update_attribute_update_with_device_not_found(self):
90+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
91+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = None
92+
payload = {'device': 'test emulator device22', 'data': {'binaryValue2': True}}
93+
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as create_task_mock, \
94+
self.assertLogs("Bacnet test", level="ERROR") as logcap:
95+
self.connector.on_attributes_update(payload)
96+
create_task_mock.assert_not_called()
6697

6798
async def test_update_when_device_has_no_mapping(self):
6899
payload = {"device": self.device.name, "data": {"binaryValue2": True}}
@@ -71,6 +102,8 @@ async def test_update_when_device_has_no_mapping(self):
71102
'attribute_updates/on_attribute_updates_bacnet_config_empty_section.json'
72103
)
73104
await self.connector._AsyncBACnetConnector__devices.add(self.device)
105+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
106+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = self.device
74107

75108
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as create_task_mock, \
76109
self.assertLogs("Bacnet test", level="ERROR") as logcap:
@@ -86,6 +119,8 @@ async def test_update_incorrect_object_id_mixed(self):
86119
"attribute_updates/on_attribute_updates_bacnet_config_incorrect_object_id.json"
87120
)
88121
await self.connector._AsyncBACnetConnector__devices.add(self.device)
122+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
123+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = self.device
89124

90125
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as ct_mock, \
91126
self.assertLogs("Bacnet test", level="ERROR") as logcap:
@@ -109,6 +144,8 @@ async def test_update_multiple_correct_attribute(self):
109144
"attribute_updates/on_attribute_updates_bacnet_connector_multiple_updates.json"
110145
)
111146
await self.connector._AsyncBACnetConnector__devices.add(self.device)
147+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
148+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = self.device
112149

113150
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as ct_mock:
114151
self.connector.on_attributes_update(content=payload)
@@ -122,6 +159,8 @@ async def test_update_attribute_update_with_incorrect_object_id_datatype(self):
122159
"attribute_updates/on_attribute_updates_bacnet_config_invalid_data_type.json"
123160
)
124161
await self.connector._AsyncBACnetConnector__devices.add(self.device)
162+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
163+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = self.device
125164

126165
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as ct_mock, \
127166
self.assertLogs("Bacnet test", level="ERROR") as logcap:
@@ -130,17 +169,18 @@ async def test_update_attribute_update_with_incorrect_object_id_datatype(self):
130169
ct_mock.assert_not_called()
131170
self.assertTrue(any("for key" in m for m in logcap.output))
132171

133-
async def test_update_continues_when_first_task_raises(self):
172+
async def test_update_continues_when_first_task_failed(self):
134173
payload = {"device": self.device.name, "data": {"binaryValue2": True, "binaryInput1": 56}}
135174
await self.connector._AsyncBACnetConnector__devices.remove(self.device)
136175
self.device = self.create_fake_device(
137176
"attribute_updates/on_attribute_updates_bacnet_connector_multiple_updates.json"
138177
)
139178
await self.connector._AsyncBACnetConnector__devices.add(self.device)
179+
self.connector._AsyncBACnetConnector__get_device_by_name = MagicMock()
180+
self.connector._AsyncBACnetConnector__get_device_by_name.return_value = self.device
140181

141182
with patch.object(self.connector, "_AsyncBACnetConnector__create_task") as ct_mock, \
142183
self.assertLogs("Bacnet test", level="ERROR") as logcap:
143184
ct_mock.side_effect = [Exception(""), None]
144185
self.connector.on_attributes_update(payload)
145186
self.assertEqual(ct_mock.call_count, 2)
146-

0 commit comments

Comments
 (0)