test_gateway_api.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. from __future__ import annotations
  2. import unittest
  3. from unittest.mock import patch
  4. from data_collector_mcp import gateway_api
  5. class GatewayApiTests(unittest.TestCase):
  6. def test_modbus_point_collect_test_posts_gateway_payload(self) -> None:
  7. response = {"code": 0, "msg": "success", "data": {"points": []}}
  8. with patch(
  9. "data_collector_mcp.gateway_api.find_project_config",
  10. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  11. ), patch(
  12. "data_collector_mcp.gateway_api.request_json",
  13. return_value=response,
  14. ) as request_json:
  15. result = gateway_api.modbus_point_collect_test(
  16. "dev-01",
  17. ip="192.168.1.10",
  18. port=502,
  19. slave_id=1,
  20. points=[{"function_code": 3, "address": 7, "type": "int16"}],
  21. )
  22. self.assertEqual(result, response)
  23. request_json.assert_called_once_with(
  24. "POST",
  25. "http://gateway.test/api/dc-gateway/modbus/read_points",
  26. json_payload={
  27. "device_type": "ModbusTCP",
  28. "ip": "192.168.1.10",
  29. "port": 502,
  30. "word_byte_order": "ABCD",
  31. "address_base": 0,
  32. "slave_id": 1,
  33. "points": [{"function_code": 3, "address": 7, "type": "int16"}],
  34. },
  35. )
  36. def test_modbus_point_collect_test_keeps_custom_word_byte_order(self) -> None:
  37. with patch(
  38. "data_collector_mcp.gateway_api.find_project_config",
  39. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  40. ), patch(
  41. "data_collector_mcp.gateway_api.request_json",
  42. return_value={"code": 0},
  43. ) as request_json:
  44. gateway_api.modbus_point_collect_test(
  45. "dev-01",
  46. ip="192.168.1.10",
  47. port=502,
  48. slave_id=1,
  49. word_byte_order="DCBA",
  50. address_base=1,
  51. points=[{"function_code": 4, "address": 0, "type": "float32"}],
  52. )
  53. payload = request_json.call_args.kwargs["json_payload"]
  54. self.assertEqual(payload["word_byte_order"], "DCBA")
  55. self.assertEqual(payload["address_base"], 1)
  56. def test_bacnet_point_collect_test_posts_gateway_payload(self) -> None:
  57. response = {"code": 0, "msg": "success", "data": {"points": []}}
  58. with patch(
  59. "data_collector_mcp.gateway_api.find_project_config",
  60. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  61. ), patch(
  62. "data_collector_mcp.gateway_api.request_json",
  63. return_value=response,
  64. ) as request_json:
  65. result = gateway_api.bacnet_point_collect_test(
  66. "dev-01",
  67. ip="192.168.1.20",
  68. bacnet_device_id=12345,
  69. points=[{"object_type": "AnalogInput", "object_id": 1}],
  70. )
  71. self.assertEqual(result, response)
  72. request_json.assert_called_once_with(
  73. "POST",
  74. "http://gateway.test/api/dc-gateway/bacnet/read_points",
  75. json_payload={
  76. "ip": "192.168.1.20",
  77. "bacnet_device_id": 12345,
  78. "port": 47808,
  79. "points": [{"object_type": "AnalogInput", "object_id": 1}],
  80. },
  81. )
  82. def test_bacnet_point_collect_test_normalizes_object_type(self) -> None:
  83. with patch(
  84. "data_collector_mcp.gateway_api.find_project_config",
  85. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  86. ), patch(
  87. "data_collector_mcp.gateway_api.request_json",
  88. return_value={"code": 0},
  89. ) as request_json:
  90. gateway_api.bacnet_point_collect_test(
  91. "dev-01",
  92. ip="192.168.1.20",
  93. bacnet_device_id=12345,
  94. points=[{"object_type": "analog-input", "object_id": 1}],
  95. )
  96. payload = request_json.call_args.kwargs["json_payload"]
  97. self.assertEqual(payload["points"][0]["object_type"], "AnalogInput")
  98. def test_bacnet_point_search_posts_gateway_payload(self) -> None:
  99. response = {"code": 0, "msg": "success", "data": {"points": []}}
  100. with patch(
  101. "data_collector_mcp.gateway_api.find_project_config",
  102. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  103. ), patch(
  104. "data_collector_mcp.gateway_api.request_json",
  105. return_value=response,
  106. ) as request_json:
  107. result = gateway_api.bacnet_point_search(
  108. "dev-01",
  109. ip="192.168.1.20",
  110. bacnet_device_id=12345,
  111. port=47809,
  112. )
  113. self.assertEqual(result, response)
  114. request_json.assert_called_once_with(
  115. "POST",
  116. "http://gateway.test/api/dc-gateway/bacnet/search_points",
  117. json_payload={
  118. "ip": "192.168.1.20",
  119. "bacnet_device_id": 12345,
  120. "port": 47809,
  121. },
  122. )
  123. def test_s7_raw_read_posts_gateway_payload(self) -> None:
  124. response = {"code": 0, "msg": "success", "data": {"communication": []}}
  125. with patch(
  126. "data_collector_mcp.gateway_api.find_project_config",
  127. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  128. ), patch(
  129. "data_collector_mcp.gateway_api.request_json",
  130. return_value=response,
  131. ) as request_json:
  132. result = gateway_api.s7_raw_read(
  133. "dev-01",
  134. ip="192.168.1.10",
  135. rock=0,
  136. slot=1,
  137. read={"area": "DB", "db": 1, "start": 0, "size": 4},
  138. )
  139. self.assertEqual(result, response)
  140. request_json.assert_called_once_with(
  141. "POST",
  142. "http://gateway.test/api/dc-gateway/s7/read",
  143. json_payload={
  144. "device_type": "S7-1200",
  145. "ip": "192.168.1.10",
  146. "port": 102,
  147. "rock": 0,
  148. "slot": 1,
  149. "tsap_conn_type": "PG",
  150. "read": {"area": "DB", "db": 1, "start": 0, "size": 4},
  151. },
  152. )
  153. def test_s7_point_collect_test_posts_gateway_payload(self) -> None:
  154. response = {"code": 0, "msg": "success", "data": {"points": []}}
  155. with patch(
  156. "data_collector_mcp.gateway_api.find_project_config",
  157. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  158. ), patch(
  159. "data_collector_mcp.gateway_api.request_json",
  160. return_value=response,
  161. ) as request_json:
  162. result = gateway_api.s7_point_collect_test(
  163. "dev-01",
  164. ip="192.168.1.10",
  165. port=1102,
  166. rock=0,
  167. slot=1,
  168. tsap_conn_type="OP",
  169. points=[{"area": "DB", "db": 1, "start": 0, "type": "float32"}],
  170. )
  171. self.assertEqual(result, response)
  172. request_json.assert_called_once_with(
  173. "POST",
  174. "http://gateway.test/api/dc-gateway/s7/read_points",
  175. json_payload={
  176. "device_type": "S7-1200",
  177. "ip": "192.168.1.10",
  178. "port": 1102,
  179. "rock": 0,
  180. "slot": 1,
  181. "tsap_conn_type": "OP",
  182. "points": [{"area": "DB", "db": 1, "start": 0, "type": "float32"}],
  183. },
  184. )
  185. def test_s7_point_collect_test_defaults_smart200_tsap_to_pg(self) -> None:
  186. with patch(
  187. "data_collector_mcp.gateway_api.find_project_config",
  188. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  189. ), patch(
  190. "data_collector_mcp.gateway_api.request_json",
  191. return_value={"code": 0},
  192. ) as request_json:
  193. gateway_api.s7_point_collect_test(
  194. "dev-01",
  195. ip="192.168.1.10",
  196. rock=0,
  197. slot=1,
  198. device_type="S7-Smart200",
  199. points=[{"area": "V", "start": 0, "type": "int16"}],
  200. )
  201. payload = request_json.call_args.kwargs["json_payload"]
  202. self.assertEqual(payload["device_type"], "S7-Smart200")
  203. self.assertEqual(payload["tsap_conn_type"], "PG")
  204. def test_s7_connect_scan_posts_ip_only(self) -> None:
  205. response = {"code": 0, "msg": "success", "data": {"available": []}}
  206. with patch(
  207. "data_collector_mcp.gateway_api.find_project_config",
  208. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  209. ), patch(
  210. "data_collector_mcp.gateway_api.request_json",
  211. return_value=response,
  212. ) as request_json:
  213. result = gateway_api.s7_connect_scan("dev-01", ip="192.168.1.10")
  214. self.assertEqual(result, response)
  215. request_json.assert_called_once_with(
  216. "POST",
  217. "http://gateway.test/api/dc-gateway/s7/connect_scan",
  218. json_payload={"ip": "192.168.1.10"},
  219. )
  220. if __name__ == "__main__":
  221. unittest.main()