| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- # coding=utf-8
- """
- 插件测试和版本管理视图
- 提供插件测试执行、结果查询、版本历史等 API
- """
- from django.utils.translation import gettext as _
- from rest_framework.request import Request
- from rest_framework.views import APIView
- from common.auth import TokenAuth
- from common.exception.app_exception import AppApiException
- from common.result import result
- from plugin.services.plugin_validator import PluginValidator
- from plugin.services.exception_handler import PluginExceptionHandler
- class PluginTestView(APIView):
- """插件测试管理"""
- authentication_classes = [TokenAuth]
- class Execute(APIView):
- """执行插件测试"""
- authentication_classes = [TokenAuth]
- def post(self, request: Request, plugin_id: str):
- test_input = request.data.get('input', {})
- timeout_ms = request.data.get('timeout_ms')
- try:
- test_record = PluginValidator.execute_test(
- plugin_id=plugin_id,
- test_input=test_input,
- timeout_ms=timeout_ms
- )
- except Exception as e:
- error_resp = PluginExceptionHandler.to_api_response(e)
- raise AppApiException(error_resp['code'], error_resp['message'])
- return result.success({
- 'id': str(test_record.id),
- 'status': test_record.status,
- 'passed': test_record.passed,
- 'error_code': test_record.error_code,
- 'error_message': test_record.error_message,
- 'duration_ms': test_record.duration_ms,
- 'input_data': test_record.input_data,
- 'output_data': test_record.output_data,
- 'create_time': test_record.create_time.isoformat() if test_record.create_time else None,
- })
- class History(APIView):
- """测试历史"""
- authentication_classes = [TokenAuth]
- def get(self, request: Request, plugin_id: str):
- limit = int(request.query_params.get('limit', 20))
- tests = PluginValidator.get_test_history(plugin_id, limit)
- data = [{
- 'id': str(t.id),
- 'version': t.version,
- 'test_type': t.test_type,
- 'status': t.status,
- 'passed': t.passed,
- 'error_code': t.error_code,
- 'error_message': t.error_message,
- 'duration_ms': t.duration_ms,
- 'create_time': t.create_time.isoformat() if t.create_time else None,
- } for t in tests]
- return result.success(data)
- class Detail(APIView):
- """测试详情"""
- authentication_classes = [TokenAuth]
- def get(self, request: Request, plugin_id: str, test_id: str):
- test = PluginValidator.get_test_detail(test_id)
- if not test:
- raise AppApiException(404, _('测试记录不存在'))
- return result.success({
- 'id': str(test.id),
- 'plugin_id': str(test.plugin_id),
- 'version': test.version,
- 'test_type': test.test_type,
- 'status': test.status,
- 'passed': test.passed,
- 'error_code': test.error_code,
- 'error_message': test.error_message,
- 'duration_ms': test.duration_ms,
- 'input_data': test.input_data,
- 'output_data': test.output_data,
- 'create_time': test.create_time.isoformat() if test.create_time else None,
- })
- class ValidateSchema(APIView):
- """验证插件 Schema"""
- authentication_classes = [TokenAuth]
- def post(self, request: Request):
- schema = request.data.get('schema', {})
- is_valid, errors = PluginValidator.validate_schema(schema)
- return result.success({
- 'valid': is_valid,
- 'errors': errors
- })
- class ValidateConfig(APIView):
- """验证插件配置"""
- authentication_classes = [TokenAuth]
- def post(self, request: Request):
- config = request.data.get('config', {})
- schema = request.data.get('schema', {})
- is_valid, errors = PluginValidator.validate_config(config, schema)
- return result.success({
- 'valid': is_valid,
- 'errors': errors
- })
|