76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
from io import BytesIO
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
from openpyxl import load_workbook
|
|
|
|
from finance.exporting import build_formula_workbook
|
|
from finance.formula_columns import validate_column
|
|
from finance.formula_views import design_column
|
|
from finance.views import APIError
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
|
|
def custom_column():
|
|
return {
|
|
"name": "收入成本差",
|
|
"meaning": "实际收入减成本",
|
|
"scope": "按所选分组及本期、基期计算",
|
|
"missing": "结果不可用(#N/A);零分母不可用",
|
|
"expression": {
|
|
"operator": "subtract",
|
|
"left": {"metric": "revenue"},
|
|
"right": {"metric": "cost"},
|
|
},
|
|
}
|
|
|
|
|
|
def test_design_column_requires_alternating_messages_and_completed_response(workspace, settings):
|
|
ds, *_ = workspace
|
|
settings.AI_ENABLED = True
|
|
settings.OPENAI_API_KEY = "test-key"
|
|
settings.OPENAI_MODEL = "test-model"
|
|
ctx = {"current": ["2026-08"], "baseline": ["2025-08"], "filters": {}, "group": "department"}
|
|
with pytest.raises(APIError, match="顺序"):
|
|
design_column([{"role": "assistant", "content": "需要补充"}], ds, ctx)
|
|
with pytest.raises(APIError, match="顺序"):
|
|
design_column([{"role": "user", "content": "新增列"}, {"role": "user", "content": "再补充"}], ds, ctx)
|
|
|
|
response = type(
|
|
"Response",
|
|
(),
|
|
{
|
|
"raise_for_status": lambda self: None,
|
|
"json": lambda self: {"status": "in_progress", "output": []},
|
|
},
|
|
)()
|
|
with patch("finance.formula_views.httpx.Client") as client:
|
|
client.return_value.__enter__.return_value.post.return_value = response
|
|
with pytest.raises(APIError, match="未创建工作簿"):
|
|
design_column([{"role": "user", "content": "新增列"}], ds, ctx)
|
|
|
|
|
|
def test_formula_labels_from_ai_are_written_as_plain_text(workspace):
|
|
ds, member, *_ = workspace
|
|
definition = custom_column()
|
|
definition["name"] = '=HYPERLINK("https://invalid")'
|
|
validate_column(definition)
|
|
output = BytesIO()
|
|
build_formula_workbook(
|
|
ds,
|
|
member,
|
|
{
|
|
"start": "2026-08",
|
|
"end": "2026-08",
|
|
"comparison": "yoy",
|
|
"group": "department",
|
|
"custom_columns": [definition],
|
|
},
|
|
output,
|
|
)
|
|
workbook = load_workbook(BytesIO(output.getvalue()), data_only=False)
|
|
summary = workbook["分析汇总"]
|
|
cell = next(cell for row in summary.iter_rows() for cell in row if cell.value == definition["name"])
|
|
assert cell.data_type == "s"
|