213 lines
7.8 KiB
Python
213 lines
7.8 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
测试从文件加载 JSON Schema 功能
|
|
|
|
这个测试脚本验证系统能够正确地从文件系统加载 JSON Schema 定义,
|
|
并使用这些 Schema 进行数据验证。
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import unittest
|
|
import json
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
# 添加项目根目录到 Python 路径
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
|
|
|
from ddms_compliance_suite.json_schema_validator.validator import JSONSchemaValidator
|
|
from ddms_compliance_suite.rule_repository.repository import RuleRepository
|
|
from ddms_compliance_suite.models.config_models import RuleRepositoryConfig
|
|
from ddms_compliance_suite.models.rule_models import TargetType
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class TestLoadSchemaFromFile(unittest.TestCase):
|
|
"""测试从文件加载 JSON Schema 功能"""
|
|
|
|
def setUp(self):
|
|
"""测试前的设置"""
|
|
# 创建规则仓库配置
|
|
config = RuleRepositoryConfig(
|
|
storage={"type": "filesystem", "path": "./rules"},
|
|
preload_rules=True
|
|
)
|
|
|
|
# 初始化规则仓库
|
|
self.rule_repository = RuleRepository(config)
|
|
|
|
# 创建 JSON Schema 验证器
|
|
self.schema_validator = JSONSchemaValidator()
|
|
|
|
def test_load_well_schema(self):
|
|
"""测试加载井数据 Schema"""
|
|
# 从仓库加载 Schema
|
|
well_schema = self.rule_repository.get_schema_for_target(
|
|
TargetType.API_RESPONSE, "getWellData"
|
|
)
|
|
|
|
# 验证 Schema 是否已加载
|
|
self.assertIsNotNone(well_schema, "无法加载井数据 Schema")
|
|
self.assertIsInstance(well_schema, dict, "Schema 不是字典类型")
|
|
self.assertIn("properties", well_schema, "Schema 缺少 properties 字段")
|
|
|
|
# 验证 Schema 中的必要字段
|
|
self.assertIn("wellName", well_schema["properties"], "Schema 缺少 wellName 字段")
|
|
self.assertIn("wellID", well_schema["properties"], "Schema 缺少 wellID 字段")
|
|
|
|
logger.info("成功加载井数据 Schema")
|
|
|
|
# 测试使用加载的 Schema 验证数据
|
|
valid_data = {
|
|
"wellName": "测试井-01",
|
|
"wellID": "W0123456789",
|
|
"status": "active",
|
|
"coordinates": {
|
|
"longitude": 116.3833,
|
|
"latitude": 39.9167
|
|
}
|
|
}
|
|
|
|
result = self.schema_validator.validate(valid_data, well_schema)
|
|
self.assertTrue(result.is_valid, f"验证失败: {result.errors}")
|
|
|
|
# 测试无效数据
|
|
invalid_data = {
|
|
"wellName": "测试井-01",
|
|
# 缺少 wellID
|
|
"status": "active",
|
|
"coordinates": {
|
|
"longitude": 116.3833,
|
|
"latitude": 39.9167
|
|
}
|
|
}
|
|
|
|
result = self.schema_validator.validate(invalid_data, well_schema)
|
|
self.assertFalse(result.is_valid, "验证应该失败但成功了")
|
|
self.assertGreater(len(result.errors), 0, "应该有验证错误")
|
|
|
|
def test_load_seismic_schema(self):
|
|
"""测试加载地震体数据 Schema"""
|
|
# 从仓库加载 Schema
|
|
seismic_schema = self.rule_repository.get_schema_for_target(
|
|
TargetType.DATA_OBJECT, "Seismic"
|
|
)
|
|
|
|
# 验证 Schema 是否已加载
|
|
self.assertIsNotNone(seismic_schema, "无法加载地震体数据 Schema")
|
|
self.assertIsInstance(seismic_schema, dict, "Schema 不是字典类型")
|
|
self.assertIn("properties", seismic_schema, "Schema 缺少 properties 字段")
|
|
|
|
# 验证 Schema 中的必要字段
|
|
self.assertIn("projectId", seismic_schema["properties"], "Schema 缺少 projectId 字段")
|
|
self.assertIn("dimensions", seismic_schema["properties"], "Schema 缺少 dimensions 字段")
|
|
|
|
logger.info("成功加载地震体数据 Schema")
|
|
|
|
# 测试使用加载的 Schema 验证数据
|
|
valid_data = {
|
|
"projectId": "testPrj1",
|
|
"surveyId": "20230117135924_2",
|
|
"seismicName": "西部地震体-01",
|
|
"dsType": 1,
|
|
"dimensions": [
|
|
{
|
|
"dimensionNo": 1,
|
|
"dimensionName": "inline",
|
|
"serviceMin": 100,
|
|
"serviceMax": 500,
|
|
"serviceSpan": 1
|
|
}
|
|
]
|
|
}
|
|
|
|
result = self.schema_validator.validate(valid_data, seismic_schema)
|
|
self.assertTrue(result.is_valid, f"验证失败: {result.errors}")
|
|
|
|
# 测试无效数据 - 缺少必要字段
|
|
invalid_data = {
|
|
"projectId": "testPrj1",
|
|
# 缺少 surveyId
|
|
"seismicName": "西部地震体-01",
|
|
"dsType": 1
|
|
# 缺少 dimensions
|
|
}
|
|
|
|
result = self.schema_validator.validate(invalid_data, seismic_schema)
|
|
self.assertFalse(result.is_valid, "验证应该失败但成功了")
|
|
self.assertGreater(len(result.errors), 0, "应该有验证错误")
|
|
|
|
# 测试属性体无效数据 - 缺少 baseSeismicId
|
|
invalid_attribute_data = {
|
|
"projectId": "testPrj1",
|
|
"surveyId": "20230117135924_2",
|
|
"seismicName": "属性体",
|
|
"dsType": 2, # 属性体类型
|
|
"dimensions": [
|
|
{
|
|
"dimensionNo": 1,
|
|
"dimensionName": "inline",
|
|
"serviceMin": 100,
|
|
"serviceMax": 500,
|
|
"serviceSpan": 1
|
|
}
|
|
]
|
|
# 缺少 baseSeismicId
|
|
}
|
|
|
|
result = self.schema_validator.validate(invalid_attribute_data, seismic_schema)
|
|
self.assertFalse(result.is_valid, "属性体验证应该失败但成功了")
|
|
self.assertGreater(len(result.errors), 0, "应该有验证错误")
|
|
|
|
def test_load_api_response_schema(self):
|
|
"""测试加载 API 响应 Schema"""
|
|
# 从仓库加载 Schema
|
|
api_schema = self.rule_repository.get_schema_for_target(
|
|
TargetType.API_RESPONSE, "SeismicAPIResponse"
|
|
)
|
|
|
|
# 验证 Schema 是否已加载
|
|
self.assertIsNotNone(api_schema, "无法加载 API 响应 Schema")
|
|
self.assertIsInstance(api_schema, dict, "Schema 不是字典类型")
|
|
self.assertIn("properties", api_schema, "Schema 缺少 properties 字段")
|
|
|
|
# 验证 Schema 中的必要字段
|
|
self.assertIn("code", api_schema["properties"], "Schema 缺少 code 字段")
|
|
self.assertIn("flag", api_schema["properties"], "Schema 缺少 flag 字段")
|
|
self.assertIn("msg", api_schema["properties"], "Schema 缺少 msg 字段")
|
|
|
|
logger.info("成功加载 API 响应 Schema")
|
|
|
|
# 测试使用加载的 Schema 验证数据
|
|
valid_data = {
|
|
"code": "0",
|
|
"flag": True,
|
|
"msg": "操作成功",
|
|
"result": "20230601123456_1"
|
|
}
|
|
|
|
result = self.schema_validator.validate(valid_data, api_schema)
|
|
self.assertTrue(result.is_valid, f"验证失败: {result.errors}")
|
|
|
|
# 测试无效数据
|
|
invalid_data = {
|
|
"code": "0",
|
|
"flag": True,
|
|
# 缺少 msg
|
|
"result": "20230601123456_1"
|
|
}
|
|
|
|
result = self.schema_validator.validate(invalid_data, api_schema)
|
|
self.assertFalse(result.is_valid, "验证应该失败但成功了")
|
|
self.assertGreater(len(result.errors), 0, "应该有验证错误")
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |