63 lines
2.0 KiB
Python
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()
|