From 29f292edaadff12a61cae5cf941ebd64efbe182b Mon Sep 17 00:00:00 2001 From: Cian Hughes Date: Wed, 8 Nov 2023 12:28:22 +0000 Subject: [PATCH] Tests created for ip interface --- pyproject.toml | 3 +- tests/test_node_deployer.py | 61 ++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 278dccc..e062866 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,9 +26,10 @@ mkdocs-material = {extras = ["all"], version = "^9.4.8"} ruff = "^0.1.1" black = "^23.10.1" snoop = "^0.4.3" -pytest = "^7.4.3" mypy = "^1.6.1" docker-stubs = {git = "https://github.com/rdozier-work/docker-stubs"} +pytest = "^7.4.3" +hypothesis = "^6.88.3" [tool.poetry.group.docs.dependencies] mkdocs = "^1.5.3" diff --git a/tests/test_node_deployer.py b/tests/test_node_deployer.py index 8c369a9..93b55a3 100644 --- a/tests/test_node_deployer.py +++ b/tests/test_node_deployer.py @@ -4,7 +4,10 @@ import os from pathlib import Path import pickle import shutil +from ipaddress import IPv4Address, IPv6Address +from hypothesis import given +from hypothesis import strategies as st from node_deployer.config import config import tomllib @@ -33,7 +36,7 @@ def cleanup(): atexit.register(cleanup) -from node_deployer import autoignition, create_disk, create_img # noqa: E402 +from node_deployer import ip_interface, autoignition, create_disk, create_img # noqa: E402 with open(config.PROJECT_ROOT / "tests/data/node_deployer/test_args.toml", "rb") as f: @@ -42,6 +45,62 @@ with open(config.PROJECT_ROOT / "tests/data/node_deployer/test_args.toml", "rb") TEST_DATA_DIR = config.PROJECT_ROOT / "tests/data/node_deployer" +class TestIPInterface: + TEST_ATTRS = ( + "compressed", + "exploded", + "is_global", + "is_link_local", + "is_loopback", + "is_multicast", + "is_private", + "is_reserved", + "is_unspecified", + "max_prefixlen", + "packed", + "reverse_pointer", + "version", + ) + + @given(st.ip_addresses(v=4)) + def test_ipv4_parsing(self, ip: IPv4Address): + ip_str = str(ip) + test_result = ip_interface.IPAddress(ip_str) + assert test_result.obj == ip + + @given(st.ip_addresses(v=4)) + def test_ipv4_attr_passthrough(self, ip: IPv4Address): + # Should be able to access all attributes of ipaddress.IPv4Address directly, + # not just a copy of the attribute object at instantiation + ip_addr = ip_interface.IPAddress(str(ip)) + for attr in self.TEST_ATTRS: + assert getattr(ip_addr, attr) is getattr(ip_addr.obj, attr) + + @given(st.ip_addresses(v=4)) + def test_ipv4_bool(self, ip: IPv4Address): + ip_addr = ip_interface.IPAddress(str(ip)) + assert bool(ip_addr) != ip.is_unspecified + + @given(st.ip_addresses(v=6)) + def test_ipv6_parsing(self, ip: IPv6Address): + ip_str = str(ip) + test_result = ip_interface.IPAddress(ip_str) + assert test_result.obj == ip + + @given(st.ip_addresses(v=6)) + def test_ipv6_attr_passthrough(self, ip: IPv6Address): + # Should be able to access all attributes of ipaddress.IPv4Address directly, + # not just a copy of the attribute object at instantiation + ip_addr = ip_interface.IPAddress(str(ip)) + for attr in self.TEST_ATTRS: + assert getattr(ip_addr, attr) is getattr(ip_addr.obj, attr) + + @given(st.ip_addresses(v=6)) + def test_ipv6_bool(self, ip: IPv6Address): + ip_addr = ip_interface.IPAddress(str(ip)) + assert bool(ip_addr) != ip.is_unspecified + + class TestAutoignition: def test_json_to_img(self, tmp_path: Path): tmp_path.mkdir(parents=True, exist_ok=True)