]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
datamodel: types: several integer custom types
authorAleš <ales.mrazek@nic.cz>
Mon, 14 Feb 2022 13:16:40 +0000 (14:16 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:54 +0000 (16:17 +0200)
manager/knot_resolver_manager/datamodel/types/__init__.py
manager/knot_resolver_manager/datamodel/types/types.py
manager/tests/unit/datamodel/types/test_base_types.py

index 011a1703af8b075b4290889295e17569ea847f6e..ccb0490c98d9ad6c48728751bc6a950a174f352b 100644 (file)
@@ -2,9 +2,13 @@ from .enums import DNSRecordTypeEnum, PolicyActionEnum, PolicyFlagEnum
 from .types import (
     CheckedPath,
     DomainName,
+    Int0_512,
+    Int0_65535,
     InterfaceName,
     InterfaceOptionalPort,
     InterfacePort,
+    IntNonNegative,
+    IntPositive,
     IPAddress,
     IPAddressOptionalPort,
     IPAddressPort,
@@ -24,9 +28,13 @@ __all__ = [
     "DNSRecordTypeEnum",
     "CheckedPath",
     "DomainName",
+    "Int0_512",
+    "Int0_65535",
     "InterfaceName",
     "InterfaceOptionalPort",
     "InterfacePort",
+    "IntNonNegative",
+    "IntPositive",
     "IPAddress",
     "IPAddressOptionalPort",
     "IPAddressPort",
index c9581a3d4ec6042d2c48b6c39409c49180024a42..ddfe87338317f4943e733ec3beae2b3790545647 100644 (file)
@@ -8,6 +8,24 @@ from knot_resolver_manager.exceptions import SchemaException
 from knot_resolver_manager.utils import CustomValueType
 
 
+class IntNonNegative(IntRangeBase):
+    _min: int = 0
+
+
+class IntPositive(IntRangeBase):
+    _min: int = 1
+
+
+class Int0_512(IntRangeBase):
+    _min: int = 0
+    _max: int = 512
+
+
+class Int0_65535(IntRangeBase):
+    _min: int = 0
+    _max: int = 65_535
+
+
 class PortNumber(IntRangeBase):
     _min: int = 1
     _max: int = 65_535
index e7a55179e1f92a8da0921c02e0a0852c50773dcf..acc8baf395edd0e3b5ce47da829f1f2e25d44f09 100644 (file)
@@ -1,39 +1,38 @@
-import ipaddress
+import random
+import sys
+from typing import List, Optional
 
+import pytest
 from pytest import raises
 
 from knot_resolver_manager.datamodel.types.base_types import IntRangeBase
 from knot_resolver_manager.exceptions import KresManagerException
 
 
-def test_int_range_base():
-    class MinTest(IntRangeBase):
-        _min = 10
+@pytest.mark.parametrize("min,max", [(0, None), (None, 0), (1, 65535), (-65535, -1)])
+def test_int_range_base(min: Optional[int], max: Optional[int]):
+    class Test(IntRangeBase):
+        if min:
+            _min = min
+        if max:
+            _max = max
 
-    assert int(MinTest(10)) == 10
-    assert int(MinTest(20)) == 20
+    if min:
+        assert int(Test(min)) == min
+    if max:
+        assert int(Test(max)) == max
 
-    with raises(KresManagerException):
-        MinTest(9)
+    rmin = min if min else -sys.maxsize - 1
+    rmax = max if max else sys.maxsize
 
-    class MaxTest(IntRangeBase):
-        _max = 25
+    n = 100
+    vals: List[int] = [random.randint(rmin, rmax) for _ in range(n)]
+    assert [str(Test(val)) == f"{val}" for val in vals]
 
-    assert int(MaxTest(20)) == 20
-    assert int(MaxTest(25)) == 25
+    invals: List[int] = []
+    invals.extend([random.randint(rmax + 1, sys.maxsize) for _ in range(n % 2)] if max else [])
+    invals.extend([random.randint(-sys.maxsize - 1, rmin - 1) for _ in range(n % 2)] if max else [])
 
-    with raises(KresManagerException):
-        MaxTest(26)
-
-    class MinMaxTest(IntRangeBase):
-        _min = 10
-        _max = 25
-
-    assert int(MinMaxTest(10)) == 10
-    assert int(MinMaxTest(20)) == 20
-    assert int(MinMaxTest(25)) == 25
-
-    with raises(KresManagerException):
-        MinMaxTest(9)
-    with raises(KresManagerException):
-        MinMaxTest(26)
+    for inval in invals:
+        with raises(KresManagerException):
+            Test(inval)