From cd93d0967f0ddad61414fb8fff7445e4efcbd3a3 Mon Sep 17 00:00:00 2001 From: seiwailai Date: Wed, 12 May 2021 01:04:02 +0800 Subject: [PATCH] validator: Add generic check_or. Added generic check_or function and tests. Fixes part of #17914. Co-authored-by: Gaurav Pandey --- zerver/lib/validator.py | 12 ++++++++++++ zerver/tests/test_decorators.py | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/zerver/lib/validator.py b/zerver/lib/validator.py index 2a8a758221..1af7c10d60 100644 --- a/zerver/lib/validator.py +++ b/zerver/lib/validator.py @@ -582,3 +582,15 @@ def check_string_or_int(var_name: str, val: object) -> Union[str, int]: return val raise ValidationError(_("{var_name} is not a string or integer").format(var_name=var_name)) + + +def check_or(sub_validator1: Validator[Any], sub_validator2: Validator[Any]) -> Validator[Any]: + def f(var_name: str, val: object) -> Validator[Any]: + try: + return sub_validator1(var_name, val) + except ValidationError: + pass + + return sub_validator2(var_name, val) + + return f diff --git a/zerver/tests/test_decorators.py b/zerver/tests/test_decorators.py index 65207c98b1..88024cabdc 100644 --- a/zerver/tests/test_decorators.py +++ b/zerver/tests/test_decorators.py @@ -70,6 +70,7 @@ from zerver.lib.validator import ( check_int_in, check_list, check_none_or, + check_or, check_short_string, check_string, check_string_fixed_length, @@ -991,6 +992,25 @@ class ValidatorTestCase(ZulipTestCase): with self.assertRaisesRegex(ValidationError, r"x is not a string or integer"): check_string_or_int("x", x) + def test_check_or(self) -> None: + x: Any = "valid" + check_or(check_string_in(["valid"]), check_url)("x", x) + + x = "http://zulip-bots.example.com/" + check_or(check_string_in(["valid"]), check_url)("x", x) + + x = "invalid" + with self.assertRaisesRegex(ValidationError, r"x is not a URL"): + check_or(check_string_in(["valid"]), check_url)("x", x) + + x = "http://127.0.0" + with self.assertRaisesRegex(ValidationError, r"x is not a URL"): + check_or(check_string_in(["valid"]), check_url)("x", x) + + x = 1 + with self.assertRaisesRegex(ValidationError, r"x is not a string"): + check_or(check_string_in(["valid"]), check_url)("x", x) + class DeactivatedRealmTest(ZulipTestCase): def test_send_deactivated_realm(self) -> None: