Files
zkxw/backend/tests/test_oa_formula.py
T
2026-07-15 16:20:48 +08:00

63 lines
2.0 KiB
Python

"""OA 公式与联动单元测试"""
import unittest
from app.services.oa_formula import (
FormulaError,
apply_formulas_and_linkages,
eval_formula,
)
class TestOaFormula(unittest.TestCase):
def test_arith_and_field_brace(self):
self.assertEqual(eval_formula("{a} + {b}", {"a": 2, "b": 3}), 5)
self.assertEqual(eval_formula("a * 2", {"a": 4}), 8)
def test_if_and_sum(self):
self.assertEqual(eval_formula("IF({days} > 3, 1, 0)", {"days": 5}), 1)
self.assertEqual(eval_formula("IF(days > 3, 1, 0)", {"days": 2}), 0)
self.assertEqual(eval_formula("SUM(1, 2, {x})", {"x": 3}), 6)
def test_illegal_eval_rejected(self):
with self.assertRaises(FormulaError):
eval_formula("__import__('os').system('ls')", {})
with self.assertRaises(FormulaError):
eval_formula("eval('1+1')", {})
def test_div_zero(self):
with self.assertRaises(FormulaError):
eval_formula("1/0", {})
def test_apply_formula_and_linkage(self):
schema = {
"rule": [
{"type": "inputNumber", "field": "days"},
{
"type": "inputNumber",
"field": "total",
"props": {"formula": "{days} * 100"},
},
{
"type": "radio",
"field": "needGm",
"props": {
"linkage": {
"when": "{days} > 3",
"set": {"needGm": "1"},
}
},
},
]
}
out = apply_formulas_and_linkages(schema, {"days": 5})
self.assertEqual(out["total"], 500)
self.assertEqual(out["needGm"], "1")
out2 = apply_formulas_and_linkages(schema, {"days": 2})
self.assertEqual(out2["total"], 200)
self.assertNotEqual(out2.get("needGm"), "1")
if __name__ == "__main__":
unittest.main()