test_bacnet_service.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import asyncio
  2. import unittest
  3. from app.schemas.bacnet import BacnetPointReadRequest
  4. from app.services import bacnet_service
  5. class FailingBacnetContext:
  6. async def __aenter__(self):
  7. return self
  8. async def __aexit__(self, exc_type, exc, tb):
  9. return False
  10. async def read(self, _args):
  11. raise RuntimeError("timeout")
  12. class BacnetServiceTest(unittest.TestCase):
  13. def test_read_points_returns_clear_no_response_error(self):
  14. original_start = bacnet_service.BAC0.start
  15. original_local_ip = bacnet_service.local_bacnet_ip
  16. original_local_port = bacnet_service.get_free_udp_port
  17. bacnet_service.BAC0.start = lambda **_kwargs: FailingBacnetContext()
  18. bacnet_service.local_bacnet_ip = lambda _ip, _port: "127.0.0.1/24"
  19. bacnet_service.get_free_udp_port = lambda: 47809
  20. self.addCleanup(setattr, bacnet_service.BAC0, "start", original_start)
  21. self.addCleanup(setattr, bacnet_service, "local_bacnet_ip", original_local_ip)
  22. self.addCleanup(setattr, bacnet_service, "get_free_udp_port", original_local_port)
  23. response = bacnet_service.read_points(
  24. BacnetPointReadRequest(
  25. ip="192.168.1.10",
  26. bacnet_device_id=12345,
  27. points=[{"object_type": "analogInput", "object_id": 1}],
  28. )
  29. )
  30. self.assertEqual(1, response["code"])
  31. self.assertIn("no response from BACnet device 192.168.1.10:47808", response["msg"])
  32. self.assertEqual([], response["data"]["points"])
  33. def test_ignores_cancelled_broadcast_endpoint_callback(self):
  34. class Loop:
  35. default_handler_called = False
  36. def default_exception_handler(self, _context):
  37. self.default_handler_called = True
  38. loop = Loop()
  39. bacnet_service.ignore_cancelled_bacnet_broadcast_endpoint(
  40. loop,
  41. {
  42. "message": "Exception in callback IPv4DatagramServer.set_broadcast_transport_protocol()",
  43. "exception": asyncio.CancelledError(),
  44. },
  45. )
  46. self.assertFalse(loop.default_handler_called)
  47. if __name__ == "__main__":
  48. unittest.main()