compliance/tests/test_load_schema_from_file.py
2025-05-16 15:18:02 +08:00

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()