plugin_test_view.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # coding=utf-8
  2. """
  3. 插件测试和版本管理视图
  4. 提供插件测试执行、结果查询、版本历史等 API
  5. """
  6. from django.utils.translation import gettext as _
  7. from rest_framework.request import Request
  8. from rest_framework.views import APIView
  9. from common.auth import TokenAuth
  10. from common.exception.app_exception import AppApiException
  11. from common.result import result
  12. from plugin.services.plugin_validator import PluginValidator
  13. from plugin.services.exception_handler import PluginExceptionHandler
  14. class PluginTestView(APIView):
  15. """插件测试管理"""
  16. authentication_classes = [TokenAuth]
  17. class Execute(APIView):
  18. """执行插件测试"""
  19. authentication_classes = [TokenAuth]
  20. def post(self, request: Request, plugin_id: str):
  21. test_input = request.data.get('input', {})
  22. timeout_ms = request.data.get('timeout_ms')
  23. try:
  24. test_record = PluginValidator.execute_test(
  25. plugin_id=plugin_id,
  26. test_input=test_input,
  27. timeout_ms=timeout_ms
  28. )
  29. except Exception as e:
  30. error_resp = PluginExceptionHandler.to_api_response(e)
  31. raise AppApiException(error_resp['code'], error_resp['message'])
  32. return result.success({
  33. 'id': str(test_record.id),
  34. 'status': test_record.status,
  35. 'passed': test_record.passed,
  36. 'error_code': test_record.error_code,
  37. 'error_message': test_record.error_message,
  38. 'duration_ms': test_record.duration_ms,
  39. 'input_data': test_record.input_data,
  40. 'output_data': test_record.output_data,
  41. 'create_time': test_record.create_time.isoformat() if test_record.create_time else None,
  42. })
  43. class History(APIView):
  44. """测试历史"""
  45. authentication_classes = [TokenAuth]
  46. def get(self, request: Request, plugin_id: str):
  47. limit = int(request.query_params.get('limit', 20))
  48. tests = PluginValidator.get_test_history(plugin_id, limit)
  49. data = [{
  50. 'id': str(t.id),
  51. 'version': t.version,
  52. 'test_type': t.test_type,
  53. 'status': t.status,
  54. 'passed': t.passed,
  55. 'error_code': t.error_code,
  56. 'error_message': t.error_message,
  57. 'duration_ms': t.duration_ms,
  58. 'create_time': t.create_time.isoformat() if t.create_time else None,
  59. } for t in tests]
  60. return result.success(data)
  61. class Detail(APIView):
  62. """测试详情"""
  63. authentication_classes = [TokenAuth]
  64. def get(self, request: Request, plugin_id: str, test_id: str):
  65. test = PluginValidator.get_test_detail(test_id)
  66. if not test:
  67. raise AppApiException(404, _('测试记录不存在'))
  68. return result.success({
  69. 'id': str(test.id),
  70. 'plugin_id': str(test.plugin_id),
  71. 'version': test.version,
  72. 'test_type': test.test_type,
  73. 'status': test.status,
  74. 'passed': test.passed,
  75. 'error_code': test.error_code,
  76. 'error_message': test.error_message,
  77. 'duration_ms': test.duration_ms,
  78. 'input_data': test.input_data,
  79. 'output_data': test.output_data,
  80. 'create_time': test.create_time.isoformat() if test.create_time else None,
  81. })
  82. class ValidateSchema(APIView):
  83. """验证插件 Schema"""
  84. authentication_classes = [TokenAuth]
  85. def post(self, request: Request):
  86. schema = request.data.get('schema', {})
  87. is_valid, errors = PluginValidator.validate_schema(schema)
  88. return result.success({
  89. 'valid': is_valid,
  90. 'errors': errors
  91. })
  92. class ValidateConfig(APIView):
  93. """验证插件配置"""
  94. authentication_classes = [TokenAuth]
  95. def post(self, request: Request):
  96. config = request.data.get('config', {})
  97. schema = request.data.get('schema', {})
  98. is_valid, errors = PluginValidator.validate_config(config, schema)
  99. return result.success({
  100. 'valid': is_valid,
  101. 'errors': errors
  102. })