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