"""测试不绑定数据的列功能"""
import pytest
import os
import tempfile
from openpyxl import load_workbook
from jxls_mcp.models import (
GenerateTemplateRequest,
DataStruct,
DataField
)
from jxls_mcp.services import TemplateGenerator
class TestUnbindedColumns:
"""测试不绑定数据的列"""
def setup_method(self):
"""测试前准备"""
self.temp_dir = tempfile.mkdtemp()
self.generator = TemplateGenerator(self.temp_dir)
def teardown_method(self):
"""测试后清理"""
# 清理临时文件
import shutil
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
def test_json_format_with_unbinded_columns(self):
"""测试JSON格式带有不绑定列的模板生成"""
# 创建包含绑定和不绑定列的数据结构
data_struct = DataStruct(
collectName="employees",
itemVariable="employee",
dataFields=[
DataField(name="序号"), # 不绑定数据
DataField(name="姓名", field="name"), # 绑定数据
DataField(name="年龄", field="age"), # 绑定数据
DataField(name="备注"), # 不绑定数据
]
)
request = GenerateTemplateRequest(
templateName="test_unbinded_json",
dataStruct=data_struct,
dataFormat="json"
)
# 生成模板
response = self.generator.generate_template(request)
# 验证响应
assert response.success is True
assert response.templatePath is not None
assert os.path.exists(response.templatePath)
# 加载生成的Excel文件验证内容
workbook = load_workbook(response.templatePath)
worksheet = workbook.active
# 验证标题行
assert worksheet.cell(1, 1).value == "序号"
assert worksheet.cell(1, 2).value == "姓名"
assert worksheet.cell(1, 3).value == "年龄"
assert worksheet.cell(1, 4).value == "备注"
# 验证数据行:不绑定的列应该为空
assert worksheet.cell(2, 1).value is None # 序号列为空
assert worksheet.cell(2, 2).value == "${employee.name}"
assert worksheet.cell(2, 3).value == "${employee.age}"
assert worksheet.cell(2, 4).value is None # 备注列为空
def test_array_format_with_unbinded_columns(self):
"""测试数组格式带有不绑定列的模板生成"""
# 创建包含绑定和不绑定列的数据结构
data_struct = DataStruct(
collectName="dataList",
itemVariable="row",
dataFields=[
DataField(name="列1", index=0), # 绑定数据
DataField(name="操作"), # 不绑定数据
DataField(name="列3", index=2), # 绑定数据
DataField(name="说明"), # 不绑定数据
]
)
request = GenerateTemplateRequest(
templateName="test_unbinded_array",
dataStruct=data_struct,
dataFormat="array"
)
# 生成模板
response = self.generator.generate_template(request)
# 验证响应
assert response.success is True
assert response.templatePath is not None
assert os.path.exists(response.templatePath)
# 加载生成的Excel文件验证内容
workbook = load_workbook(response.templatePath)
worksheet = workbook.active
# 验证标题行
assert worksheet.cell(1, 1).value == "列1"
assert worksheet.cell(1, 2).value == "操作"
assert worksheet.cell(1, 3).value == "列3"
assert worksheet.cell(1, 4).value == "说明"
# 验证数据行:不绑定的列应该为空
assert worksheet.cell(2, 1).value == "${row[0]}"
assert worksheet.cell(2, 2).value is None # 操作列为空
assert worksheet.cell(2, 3).value == "${row[2]}"
assert worksheet.cell(2, 4).value is None # 说明列为空
def test_all_unbinded_columns(self):
"""测试所有列都不绑定数据的场景"""
# 创建所有列都不绑定的数据结构
data_struct = DataStruct(
collectName="staticData",
itemVariable="item",
dataFields=[
DataField(name="序号"),
DataField(name="操作"),
DataField(name="备注"),
]
)
request = GenerateTemplateRequest(
templateName="test_all_unbinded",
dataStruct=data_struct,
dataFormat="json"
)
# 生成模板
response = self.generator.generate_template(request)
# 验证响应
assert response.success is True
assert response.templatePath is not None
assert os.path.exists(response.templatePath)
# 加载生成的Excel文件验证内容
workbook = load_workbook(response.templatePath)
worksheet = workbook.active
# 验证标题行
assert worksheet.cell(1, 1).value == "序号"
assert worksheet.cell(1, 2).value == "操作"
assert worksheet.cell(1, 3).value == "备注"
# 验证数据行:所有列都应该为空
assert worksheet.cell(2, 1).value is None
assert worksheet.cell(2, 2).value is None
assert worksheet.cell(2, 3).value is None
def test_mixed_binding_validation(self):
"""测试混合绑定时的验证逻辑"""
# JSON格式不应该有index
data_struct = DataStruct(
collectName="data",
itemVariable="item",
dataFields=[
DataField(name="字段1", field="field1"),
DataField(name="字段2", index=1), # 错误:JSON格式不应该有index
]
)
# 应该在创建请求时就抛出验证错误
with pytest.raises(ValueError) as exc_info:
request = GenerateTemplateRequest(
templateName="test_invalid",
dataStruct=data_struct,
dataFormat="json"
)
# 验证错误信息
assert "不应提供index属性" in str(exc_info.value)
def test_sample_data_with_unbinded_columns(self):
"""测试带有示例数据时不绑定列的处理"""
data_struct = DataStruct(
collectName="users",
itemVariable="user",
dataFields=[
DataField(name="ID", field="id"),
DataField(name="姓名", field="name"),
DataField(name="审批意见"), # 不绑定数据
]
)
request = GenerateTemplateRequest(
templateName="test_sample_unbinded",
dataStruct=data_struct,
dataFormat="json",
sampleData=[
{"id": 1, "name": "张三"},
{"id": 2, "name": "李四"}
]
)
# 生成模板
response = self.generator.generate_template(request)
# 验证响应
assert response.success is True
assert response.templatePath is not None
# 加载生成的Excel文件验证内容
workbook = load_workbook(response.templatePath)
worksheet = workbook.active
# 验证数据行
assert worksheet.cell(2, 1).value == "${user.id}"
assert worksheet.cell(2, 2).value == "${user.name}"
assert worksheet.cell(2, 3).value is None # 审批意见列为空