Просмотр исходного кода

Added validator.check_value_in method and corresponding test

Vsevolod Levitan год назад
Родитель
Сommit
d23084e505
2 измененных файлов с 97 добавлено и 30 удалено
  1. 59 22
      src/validation/validator.py
  2. 38 8
      tests/test_validator.py

+ 59 - 22
src/validation/validator.py

@@ -1,3 +1,4 @@
+from ast import arg
 import re
 from numbers import Number
 from src.errors.argument_exception import argument_exception
@@ -9,7 +10,7 @@ class validator:
         if not hasattr(cls, "instance"):
             cls.instance = super(validator, cls).__new__(cls)
         return cls.instance
-    
+
     def check(self, value, method):
         """
             Валидация аргумента по лямбде
@@ -22,7 +23,7 @@ class validator:
 
         if not method(value):
             raise argument_exception("Аргумент не прошел валидацию по лямбде")
-        
+
         return True
 
     def check_type(self, value, exp_type):
@@ -36,10 +37,12 @@ class validator:
         """
 
         if not isinstance(value, exp_type):
-            raise argument_exception(f"Некорректный тип аргумента ({type(value)}, expected {exp_type})")
+            raise argument_exception(
+                f"Некорректный тип аргумента ({type(value)}, expected {exp_type})"
+            )
 
         return True
-    
+
     def check_type_any(self, value, *types):
         """
             Валидация аргумента по соответствию одному из типов
@@ -59,8 +62,10 @@ class validator:
                 break
 
         if not flag:
-            raise argument_exception("Аргумент не соответствует ни одному из ожидаемых типов "\
-                                     + f"({type(value)}, expected={', '.join(types)})")
+            raise argument_exception(
+                "Аргумент не соответствует ни одному из ожидаемых типов "
+                + f"({type(value)}, expected={', '.join(types)})"
+            )
 
         return True
 
@@ -78,7 +83,9 @@ class validator:
             value = str(value)
 
         if len(value) != length:
-            raise argument_exception(f"Несоответствующая длина аргумента ({len(value)}, expected {length})")
+            raise argument_exception(
+                f"Несоответствующая длина аргумента ({len(value)}, expected {length})"
+            )
 
         return True
 
@@ -95,10 +102,11 @@ class validator:
 
         if value is int:
             value = str(value)
-        
-        if (len(value) > length if inclusive \
-                else len(value) >= length):
-                    raise argument_exception(f"Превышена длина аргумента ({len(value)}, max={length})")
+
+        if len(value) > length if inclusive else len(value) >= length:
+            raise argument_exception(
+                f"Превышена длина аргумента ({len(value)}, max={length})"
+            )
 
         return True
 
@@ -116,13 +124,21 @@ class validator:
         if value is int:
             value = str(value)
 
-        if (len(value) < length if inclusive \
-                else len(value) <= length):
-            raise argument_exception("Недостаточная длина аргумента ({len(value)}, min={length})")
+        if len(value) < length if inclusive else len(value) <= length:
+            raise argument_exception(
+                "Недостаточная длина аргумента ({len(value)}, min={length})"
+            )
 
         return True
 
-    def check_length_bound(self, value, min_length: int, max_length: int, inclusive_min=True, inclusive_max=True):
+    def check_length_bound(
+        self,
+        value,
+        min_length: int,
+        max_length: int,
+        inclusive_min=True,
+        inclusive_max=True,
+    ):
         """
             Валидация аргумента по минимальной и максимальной длинам
         Args:
@@ -158,6 +174,23 @@ class validator:
 
         return True
 
+    def check_value_in(self, value, expected: list):
+        """
+            Валидация аргумента по принадлежности списку
+        Args:
+            value (any): Передаваемый аргумент
+            expected (list): Список допустимых значений
+        Raises:
+            argument_exception: Значение аргумента не принадлежит списку допустимых
+        """
+
+        if value not in expected:
+            raise argument_exception(
+                f"Значение аргумента не принадлежит списку допустимых ({value} not in {"".join(expected)})"
+            )
+
+        return True
+
     def check_regex(self, value, expression: str):
         """
             Валидация аргумента по регулярному выражению
@@ -169,7 +202,9 @@ class validator:
         """
 
         if re.match(expression, value) is None:
-            raise argument_exception(f"Аргумент не соответствует регулярному выражению ({str(value)}, regex: {expression})")
+            raise argument_exception(
+                f"Аргумент не соответствует регулярному выражению ({str(value)}, regex: {expression})"
+            )
 
         return True
 
@@ -183,10 +218,12 @@ class validator:
         """
 
         if not isinstance(value, Number):
-            raise argument_exception(f"Аргумент не является числом (type={type(value)})")
-        
+            raise argument_exception(
+                f"Аргумент не является числом (type={type(value)})"
+            )
+
         return True
-    
+
     def check_collection_all(self, value, method):
         """
             Валидация коллекции по соответствию лямбде
@@ -204,9 +241,9 @@ class validator:
             except argument_exception as exc:
                 raise argument_exception(f"Один из членов коллекции не прошел валидацию \
                                          ({exc.error.error_text} on item #{num})")
-            
+
         return True
-    
+
     def check_collection_types_all(self, value, exp_type):
         """
             Валидация коллекции по соответствию типа
@@ -223,5 +260,5 @@ class validator:
             except argument_exception:
                 raise argument_exception(f"Один из членов коллекции не соответствует типу {exp_type} \
                                          (excepted {exp_type}, got {type(val)} on element #{num})")
-            
+
         return True

+ 38 - 8
tests/test_validator.py

@@ -4,7 +4,6 @@ import unittest
 
 
 class test_validator(unittest.TestCase):
-
     def test_validator_lambda(self):
         """Проверить работоспособность validator.check()"""
         # Подготовка
@@ -65,13 +64,38 @@ class test_validator(unittest.TestCase):
         # Вхождение в максимум
         assert vtor.check_length_bound("abc", 1, 3)
         # Невхождение в максимум
-        self.assertRaises(argument_exception, lambda: vtor.check_length_bound("abc", 1, 2))
+        self.assertRaises(
+            argument_exception, lambda: vtor.check_length_bound("abc", 1, 2)
+        )
         # Невхождение в минимум
-        self.assertRaises(argument_exception, lambda: vtor.check_length_bound("abc", 4, 5))
+        self.assertRaises(
+            argument_exception, lambda: vtor.check_length_bound("abc", 4, 5)
+        )
         # Невхождение в исключительный минимум
-        self.assertRaises(argument_exception, lambda: vtor.check_length_bound("abc", 3, 5, inclusive_min=False))
+        self.assertRaises(
+            argument_exception,
+            lambda: vtor.check_length_bound("abc", 3, 5, inclusive_min=False),
+        )
         # Невхождение в исключительный максимум
-        self.assertRaises(argument_exception, lambda: vtor.check_length_bound("abc", 1, 3, inclusive_max=False))
+        self.assertRaises(
+            argument_exception,
+            lambda: vtor.check_length_bound("abc", 1, 3, inclusive_max=False),
+        )
+
+    def test_validator_value_in(self):
+        """Проверить работоспособность validator.check_value_in()"""
+        # Подготовка
+        vtor = validator()
+        exp = ["alpha", "test", "beta"]
+
+        # Действие
+
+        # Проверка
+
+        # Вхождение в список допустимых
+        assert vtor.check_value_in("test", exp)
+        # Невхождение в список допустимых
+        self.assertRaises(argument_exception, lambda: vtor.check_value_in("gamma", exp))
 
     def test_validator_regex(self):
         """Проверить работоспособность validator.check_regex()"""
@@ -82,7 +106,9 @@ class test_validator(unittest.TestCase):
 
         # Проверка
         assert vtor.check_regex("abc", ".*b[c]+")
-        self.assertRaises(argument_exception, lambda: vtor.check_regex("abc", ".*b[c]+[a]+"))
+        self.assertRaises(
+            argument_exception, lambda: vtor.check_regex("abc", ".*b[c]+[a]+")
+        )
 
     def test_validator_collection_all(self):
         """Проверить работоспособность validator.check_collection_all()"""
@@ -95,7 +121,9 @@ class test_validator(unittest.TestCase):
 
         # Проверка
         assert vtor.check_collection_all(col1, lambda x: x > 4)
-        self.assertRaises(argument_exception, lambda: vtor.check_collection_all(col2, lambda x: x > 4))
+        self.assertRaises(
+            argument_exception, lambda: vtor.check_collection_all(col2, lambda x: x > 4)
+        )
 
     def test_validator_collection_types_all(self):
         """Проверить работоспособность validator.check_collection_types_all()"""
@@ -108,4 +136,6 @@ class test_validator(unittest.TestCase):
 
         # Проверка
         assert vtor.check_collection_types_all(col1, str)
-        self.assertRaises(argument_exception, lambda: vtor.check_collection_types_all(col2, str))
+        self.assertRaises(
+            argument_exception, lambda: vtor.check_collection_types_all(col2, str)
+        )