test_gateway_api.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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_raw_read_posts_gateway_payload(self) -> None:
  7. response = {"code": 0, "msg": "success", "data": {"communication": []}}
  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_raw_read(
  16. "dev-01",
  17. ip="192.168.1.10",
  18. port=502,
  19. slave_id=1,
  20. read={"function_code": 3, "address": 0, "quantity": 4},
  21. )
  22. self.assertEqual(result, response)
  23. request_json.assert_called_once_with(
  24. "POST",
  25. "http://gateway.test/api/dc-gateway/modbus/read",
  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. "read": {"function_code": 3, "address": 0, "quantity": 4},
  34. },
  35. )
  36. def test_modbus_point_collect_test_posts_gateway_payload(self) -> None:
  37. response = {"code": 0, "msg": "success", "data": {"points": []}}
  38. with patch(
  39. "data_collector_mcp.gateway_api.find_project_config",
  40. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  41. ), patch(
  42. "data_collector_mcp.gateway_api.request_json",
  43. return_value=response,
  44. ) as request_json:
  45. result = gateway_api.modbus_point_collect_test(
  46. "dev-01",
  47. ip="192.168.1.10",
  48. port=502,
  49. slave_id=1,
  50. points=[{"function_code": 3, "address": 7, "type": "int16"}],
  51. )
  52. self.assertEqual(result, response)
  53. request_json.assert_called_once_with(
  54. "POST",
  55. "http://gateway.test/api/dc-gateway/modbus/read_points",
  56. json_payload={
  57. "device_type": "ModbusTCP",
  58. "ip": "192.168.1.10",
  59. "port": 502,
  60. "word_byte_order": "ABCD",
  61. "address_base": 0,
  62. "slave_id": 1,
  63. "points": [{"function_code": 3, "address": 7, "type": "int16"}],
  64. },
  65. )
  66. def test_modbus_point_collect_test_keeps_custom_word_byte_order(self) -> None:
  67. with patch(
  68. "data_collector_mcp.gateway_api.find_project_config",
  69. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  70. ), patch(
  71. "data_collector_mcp.gateway_api.request_json",
  72. return_value={"code": 0},
  73. ) as request_json:
  74. gateway_api.modbus_point_collect_test(
  75. "dev-01",
  76. ip="192.168.1.10",
  77. port=502,
  78. slave_id=1,
  79. word_byte_order="DCBA",
  80. address_base=1,
  81. points=[{"function_code": 4, "address": 0, "type": "float32"}],
  82. )
  83. payload = request_json.call_args.kwargs["json_payload"]
  84. self.assertEqual(payload["word_byte_order"], "DCBA")
  85. self.assertEqual(payload["address_base"], 1)
  86. def test_bacnet_point_collect_test_posts_gateway_payload(self) -> None:
  87. response = {"code": 0, "msg": "success", "data": {"points": []}}
  88. with patch(
  89. "data_collector_mcp.gateway_api.find_project_config",
  90. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  91. ), patch(
  92. "data_collector_mcp.gateway_api.request_json",
  93. return_value=response,
  94. ) as request_json:
  95. result = gateway_api.bacnet_point_collect_test(
  96. "dev-01",
  97. ip="192.168.1.20",
  98. bacnet_device_id=12345,
  99. points=[{"object_type": "AnalogInput", "object_id": 1}],
  100. )
  101. self.assertEqual(result, response)
  102. request_json.assert_called_once_with(
  103. "POST",
  104. "http://gateway.test/api/dc-gateway/bacnet/read_points",
  105. json_payload={
  106. "ip": "192.168.1.20",
  107. "bacnet_device_id": 12345,
  108. "port": 47808,
  109. "points": [{"object_type": "AnalogInput", "object_id": 1}],
  110. },
  111. )
  112. def test_bacnet_point_collect_test_normalizes_object_type(self) -> None:
  113. with patch(
  114. "data_collector_mcp.gateway_api.find_project_config",
  115. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  116. ), patch(
  117. "data_collector_mcp.gateway_api.request_json",
  118. return_value={"code": 0},
  119. ) as request_json:
  120. gateway_api.bacnet_point_collect_test(
  121. "dev-01",
  122. ip="192.168.1.20",
  123. bacnet_device_id=12345,
  124. points=[{"object_type": "analog-input", "object_id": 1}],
  125. )
  126. payload = request_json.call_args.kwargs["json_payload"]
  127. self.assertEqual(payload["points"][0]["object_type"], "AnalogInput")
  128. def test_bacnet_point_search_posts_gateway_payload(self) -> None:
  129. response = {"code": 0, "msg": "success", "data": {"points": []}}
  130. with patch(
  131. "data_collector_mcp.gateway_api.find_project_config",
  132. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  133. ), patch(
  134. "data_collector_mcp.gateway_api.request_json",
  135. return_value=response,
  136. ) as request_json:
  137. result = gateway_api.bacnet_point_search(
  138. "dev-01",
  139. ip="192.168.1.20",
  140. bacnet_device_id=12345,
  141. port=47809,
  142. )
  143. self.assertEqual(result, response)
  144. request_json.assert_called_once_with(
  145. "POST",
  146. "http://gateway.test/api/dc-gateway/bacnet/search_points",
  147. json_payload={
  148. "ip": "192.168.1.20",
  149. "bacnet_device_id": 12345,
  150. "port": 47809,
  151. },
  152. )
  153. def test_bacnet_bbmd_whois_posts_without_body(self) -> None:
  154. response = {"code": 0, "msg": "success", "data": {"bbmd": {}, "devices": []}}
  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.bacnet_bbmd_whois("dev-01")
  163. self.assertEqual(result, response)
  164. request_json.assert_called_once_with(
  165. "POST",
  166. "http://gateway.test/api/dc-gateway/bacnet/bbmd/whois",
  167. json_payload=None,
  168. )
  169. def test_s7_raw_read_posts_gateway_payload(self) -> None:
  170. response = {"code": 0, "msg": "success", "data": {"communication": []}}
  171. with patch(
  172. "data_collector_mcp.gateway_api.find_project_config",
  173. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  174. ), patch(
  175. "data_collector_mcp.gateway_api.request_json",
  176. return_value=response,
  177. ) as request_json:
  178. result = gateway_api.s7_raw_read(
  179. "dev-01",
  180. ip="192.168.1.10",
  181. rock=0,
  182. slot=1,
  183. read={"area": "DB", "db": 1, "start": 0, "size": 4},
  184. )
  185. self.assertEqual(result, response)
  186. request_json.assert_called_once_with(
  187. "POST",
  188. "http://gateway.test/api/dc-gateway/s7/read",
  189. json_payload={
  190. "device_type": "S7-1200",
  191. "ip": "192.168.1.10",
  192. "port": 102,
  193. "rock": 0,
  194. "slot": 1,
  195. "tsap_conn_type": "PG",
  196. "read": {"area": "DB", "db": 1, "start": 0, "size": 4},
  197. },
  198. )
  199. def test_s7_point_collect_test_posts_gateway_payload(self) -> None:
  200. response = {"code": 0, "msg": "success", "data": {"points": []}}
  201. with patch(
  202. "data_collector_mcp.gateway_api.find_project_config",
  203. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  204. ), patch(
  205. "data_collector_mcp.gateway_api.request_json",
  206. return_value=response,
  207. ) as request_json:
  208. result = gateway_api.s7_point_collect_test(
  209. "dev-01",
  210. ip="192.168.1.10",
  211. port=1102,
  212. rock=0,
  213. slot=1,
  214. tsap_conn_type="OP",
  215. points=[{"area": "DB", "db": 1, "start": 0, "type": "float32"}],
  216. )
  217. self.assertEqual(result, response)
  218. request_json.assert_called_once_with(
  219. "POST",
  220. "http://gateway.test/api/dc-gateway/s7/read_points",
  221. json_payload={
  222. "device_type": "S7-1200",
  223. "ip": "192.168.1.10",
  224. "port": 1102,
  225. "rock": 0,
  226. "slot": 1,
  227. "tsap_conn_type": "OP",
  228. "points": [{"area": "DB", "db": 1, "start": 0, "type": "float32"}],
  229. },
  230. )
  231. def test_s7_point_collect_test_defaults_smart200_tsap_to_pg(self) -> None:
  232. with patch(
  233. "data_collector_mcp.gateway_api.find_project_config",
  234. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  235. ), patch(
  236. "data_collector_mcp.gateway_api.request_json",
  237. return_value={"code": 0},
  238. ) as request_json:
  239. gateway_api.s7_point_collect_test(
  240. "dev-01",
  241. ip="192.168.1.10",
  242. rock=0,
  243. slot=1,
  244. device_type="S7-Smart200",
  245. points=[{"area": "V", "start": 0, "type": "int16"}],
  246. )
  247. payload = request_json.call_args.kwargs["json_payload"]
  248. self.assertEqual(payload["device_type"], "S7-Smart200")
  249. self.assertEqual(payload["tsap_conn_type"], "PG")
  250. def test_s7_connect_scan_posts_ip_only(self) -> None:
  251. response = {"code": 0, "msg": "success", "data": {"available": []}}
  252. with patch(
  253. "data_collector_mcp.gateway_api.find_project_config",
  254. return_value={"project_key": "dev-01", "base_url": "http://gateway.test"},
  255. ), patch(
  256. "data_collector_mcp.gateway_api.request_json",
  257. return_value=response,
  258. ) as request_json:
  259. result = gateway_api.s7_connect_scan("dev-01", ip="192.168.1.10")
  260. self.assertEqual(result, response)
  261. request_json.assert_called_once_with(
  262. "POST",
  263. "http://gateway.test/api/dc-gateway/s7/connect_scan",
  264. json_payload={"ip": "192.168.1.10"},
  265. )
  266. if __name__ == "__main__":
  267. unittest.main()