diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py index 4b362e7b47..e46e37b518 100644 --- a/frappe/tests/test_utils.py +++ b/frappe/tests/test_utils.py @@ -1155,3 +1155,35 @@ class TestRounding(FrappeTestCase): def test_default_rounding(self): self.assertEqual(frappe.get_system_settings("rounding_method"), "Banker's Rounding") + + +class TestTypingValidations(FrappeTestCase): + def test_validate_argument_types(self): + from frappe.utils.typing_validations import FrappeTypeError, validate_argument_types + + @validate_argument_types + def test_simple_types(a: int, b: float, c: bool): + return a, b, c + + @validate_argument_types + def test_sequence(a: str, b: list[dict] | None = None, c: dict[str, int] | None = None): + return a, b, c + + self.assertEqual(test_simple_types(True, 2.0, True), (1, 2.0, True)) + self.assertEqual(test_simple_types(1, 2, 1), (1, 2.0, True)) + self.assertEqual(test_simple_types(1.0, 2, 1), (1, 2.0, True)) + self.assertEqual(test_simple_types(1, 2, "1"), (1, 2.0, True)) + + with self.assertRaises(FrappeTypeError): + test_simple_types(1, 2, "a") + with self.assertRaises(FrappeTypeError): + test_simple_types(1, 2, None) + + self.assertEqual(test_sequence("a", [{"a": 1}], {"a": 1}), ("a", [{"a": 1}], {"a": 1})) + self.assertEqual(test_sequence("a", None, None), ("a", None, None)) + self.assertEqual(test_sequence("a", [{"a": 1}], None), ("a", [{"a": 1}], None)) + self.assertEqual(test_sequence("a", None, {"a": 1}), ("a", None, {"a": 1})) + self.assertEqual(test_sequence("a", [{"a": 1}], {"a": "1.0"}), ("a", [{"a": 1}], {"a": 1})) + + with self.assertRaises(FrappeTypeError): + test_sequence("a", [{"a": 1}], True)