| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- """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()
|