test_oa_formula.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. """OA 公式与联动单元测试"""
  2. import unittest
  3. from app.services.oa_formula import (
  4. FormulaError,
  5. apply_formulas_and_linkages,
  6. eval_formula,
  7. )
  8. class TestOaFormula(unittest.TestCase):
  9. def test_arith_and_field_brace(self):
  10. self.assertEqual(eval_formula("{a} + {b}", {"a": 2, "b": 3}), 5)
  11. self.assertEqual(eval_formula("a * 2", {"a": 4}), 8)
  12. def test_if_and_sum(self):
  13. self.assertEqual(eval_formula("IF({days} > 3, 1, 0)", {"days": 5}), 1)
  14. self.assertEqual(eval_formula("IF(days > 3, 1, 0)", {"days": 2}), 0)
  15. self.assertEqual(eval_formula("SUM(1, 2, {x})", {"x": 3}), 6)
  16. def test_illegal_eval_rejected(self):
  17. with self.assertRaises(FormulaError):
  18. eval_formula("__import__('os').system('ls')", {})
  19. with self.assertRaises(FormulaError):
  20. eval_formula("eval('1+1')", {})
  21. def test_div_zero(self):
  22. with self.assertRaises(FormulaError):
  23. eval_formula("1/0", {})
  24. def test_apply_formula_and_linkage(self):
  25. schema = {
  26. "rule": [
  27. {"type": "inputNumber", "field": "days"},
  28. {
  29. "type": "inputNumber",
  30. "field": "total",
  31. "props": {"formula": "{days} * 100"},
  32. },
  33. {
  34. "type": "radio",
  35. "field": "needGm",
  36. "props": {
  37. "linkage": {
  38. "when": "{days} > 3",
  39. "set": {"needGm": "1"},
  40. }
  41. },
  42. },
  43. ]
  44. }
  45. out = apply_formulas_and_linkages(schema, {"days": 5})
  46. self.assertEqual(out["total"], 500)
  47. self.assertEqual(out["needGm"], "1")
  48. out2 = apply_formulas_and_linkages(schema, {"days": 2})
  49. self.assertEqual(out2["total"], 200)
  50. self.assertNotEqual(out2.get("needGm"), "1")
  51. if __name__ == "__main__":
  52. unittest.main()