test_s7_schema.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import unittest
  2. from pydantic import ValidationError
  3. from app.schemas.s7 import S7ConnectScanRequest, S7PointReadRequest, S7RawReadRequest
  4. class S7SchemaTest(unittest.TestCase):
  5. def test_device_type_port_and_connection_type_defaults(self):
  6. request = S7RawReadRequest(
  7. ip="127.0.0.1",
  8. rock=0,
  9. slot=1,
  10. read={"area": "db", "db": 1, "start": 0, "size": 4},
  11. )
  12. self.assertEqual("S7-1200", request.device_type)
  13. self.assertEqual(102, request.port)
  14. self.assertEqual("PG", request.tsap_conn_type)
  15. self.assertEqual("DB", request.read.area)
  16. def test_tsap_conn_type_is_case_insensitive(self):
  17. request = S7RawReadRequest(
  18. ip="127.0.0.1",
  19. rock=0,
  20. slot=1,
  21. tsap_conn_type="basic",
  22. read={"area": "m", "start": 0, "size": 1},
  23. )
  24. self.assertEqual("BASIC", request.tsap_conn_type)
  25. self.assertEqual("M", request.read.area)
  26. def test_device_type_is_case_insensitive(self):
  27. request = S7RawReadRequest(
  28. device_type="s7-smart200",
  29. ip="127.0.0.1",
  30. rock=0,
  31. slot=1,
  32. read={"area": "v", "start": 0, "size": 1},
  33. )
  34. self.assertEqual("S7-Smart200", request.device_type)
  35. self.assertEqual("V", request.read.area)
  36. def test_v_area_requires_smart200_device_type(self):
  37. with self.assertRaises(ValidationError) as context:
  38. S7RawReadRequest(
  39. device_type="S7-1200",
  40. ip="127.0.0.1",
  41. rock=0,
  42. slot=1,
  43. read={"area": "V", "start": 0, "size": 1},
  44. )
  45. self.assertIn("V area is only supported", str(context.exception))
  46. def test_db_area_requires_positive_db_number(self):
  47. with self.assertRaises(ValidationError) as context:
  48. S7RawReadRequest(
  49. ip="127.0.0.1",
  50. rock=0,
  51. slot=1,
  52. read={"area": "DB", "db": 0, "start": 0, "size": 1},
  53. )
  54. self.assertIn("db must be greater than 0", str(context.exception))
  55. def test_bit_is_only_allowed_for_bool_points(self):
  56. with self.assertRaises(ValidationError) as context:
  57. S7PointReadRequest(
  58. ip="127.0.0.1",
  59. rock=0,
  60. slot=1,
  61. points=[{"area": "DB", "db": 1, "start": 0, "type": "int16", "bit": 0}],
  62. )
  63. self.assertIn("bit is only supported for bool points", str(context.exception))
  64. def test_connect_scan_request_only_requires_ip(self):
  65. request = S7ConnectScanRequest(ip="127.0.0.1")
  66. self.assertEqual("127.0.0.1", request.ip)
  67. if __name__ == "__main__":
  68. unittest.main()