"""测试数据模型"""
import pytest
from pydantic import ValidationError
from src.jxls_mcp.models import DataField, DataStruct, GenerateTemplateRequest
class TestDataField:
"""测试DataField模型"""
def test_valid_json_field(self):
"""测试有效的JSON字段"""
field = DataField(name="姓名", field="name")
assert field.name == "姓名"
assert field.field == "name"
assert field.index is None
def test_valid_array_field(self):
"""测试有效的数组字段"""
field = DataField(name="列1", index=0)
assert field.name == "列1"
assert field.field is None
assert field.index == 0
def test_both_field_and_index(self):
"""测试同时提供field和index"""
field = DataField(name="测试", field="test", index=0)
assert field.name == "测试"
assert field.field == "test"
assert field.index == 0
def test_missing_field_and_index(self):
"""测试缺少field和index(现在允许这种情况)"""
# 现在允许field和index都为空,表示不绑定数据
field = DataField(name="测试")
assert field.name == "测试"
assert field.field is None
assert field.index is None
def test_negative_index(self):
"""测试负数索引"""
with pytest.raises(ValidationError):
DataField(name="测试", index=-1)
class TestDataStruct:
"""测试DataStruct模型"""
def test_valid_data_struct(self):
"""测试有效的数据结构"""
data_struct = DataStruct(
collectName="employees",
itemVariable="employee",
dataFields=[
DataField(name="姓名", field="name"),
DataField(name="年龄", field="age")
]
)
assert data_struct.collectName == "employees"
assert data_struct.itemVariable == "employee"
assert len(data_struct.dataFields) == 2
def test_empty_collect_name(self):
"""测试空集合名称"""
with pytest.raises(ValidationError):
DataStruct(
collectName="",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
)
def test_empty_item_variable(self):
"""测试空循环变量名"""
with pytest.raises(ValidationError):
DataStruct(
collectName="data",
itemVariable="",
dataFields=[DataField(name="测试", field="test")]
)
def test_empty_data_fields(self):
"""测试空字段数组"""
with pytest.raises(ValidationError):
DataStruct(
collectName="data",
itemVariable="item",
dataFields=[]
)
class TestGenerateTemplateRequest:
"""测试GenerateTemplateRequest模型"""
def test_valid_json_request(self):
"""测试有效的JSON请求"""
request = GenerateTemplateRequest(
templateName="test_template",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
),
dataFormat="json"
)
assert request.templateName == "test_template"
assert request.dataFormat == "json"
def test_valid_array_request(self):
"""测试有效的数组请求"""
request = GenerateTemplateRequest(
templateName="test_template",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", index=0)]
),
dataFormat="array"
)
assert request.templateName == "test_template"
assert request.dataFormat == "array"
def test_json_format_missing_field(self):
"""测试JSON格式缺少field属性"""
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName="test",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", index=0)] # 只有index没有field
),
dataFormat="json"
)
def test_array_format_missing_index(self):
"""测试数组格式缺少index属性"""
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName="test",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")] # 只有field没有index
),
dataFormat="array"
)
def test_unsafe_template_name(self):
"""测试不安全的模板名称"""
unsafe_names = ["test/name", "test\\name", "test:name", "test*name"]
for unsafe_name in unsafe_names:
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName=unsafe_name,
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
),
dataFormat="json"
)
def test_empty_template_name(self):
"""测试空模板名称"""
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName="",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
),
dataFormat="json"
)
def test_long_template_name(self):
"""测试过长的模板名称"""
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName="a" * 101, # 超过100字符
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
),
dataFormat="json"
)
def test_invalid_data_format(self):
"""测试无效的数据格式"""
with pytest.raises(ValidationError):
GenerateTemplateRequest(
templateName="test",
dataStruct=DataStruct(
collectName="data",
itemVariable="item",
dataFields=[DataField(name="测试", field="test")]
),
dataFormat="invalid"
)