transip-client/transip_client/tests/test_adapters.py
Sonny Bakker 84558826fb
All checks were successful
ci/woodpecker/push/tests Pipeline was successful
Adapter refactor
Allows using different ways to retrieve hosts IP address
2025-05-03 13:51:49 +02:00

129 lines
4 KiB
Python

from subprocess import CalledProcessError
from unittest import TestCase
from unittest.mock import MagicMock, patch
from requests.exceptions import Timeout
from requests.models import HTTPError
from transip_client.adapters import IpifyAdapter, OpenDNSAdapter
class IpifyAdapterTestCase(TestCase):
adapter_class = IpifyAdapter
def setUp(self) -> None:
patcher = patch("transip_client.adapters.requests.get")
self.mocked_requests_get = patcher.start()
self.addCleanup(patcher.stop)
def test_simple(self):
self.mocked_requests_get.return_value = MagicMock(text="8.8.8.8")
adapter = self.adapter_class()
self.assertEqual(adapter.get_ip(), "8.8.8.8")
def test_service_unavailable(self):
self.mocked_requests_get.side_effect = Timeout
adapter = self.adapter_class()
with self.assertRaises(OSError) as exception_manager:
adapter.get_ip()
exception = exception_manager.exception
self.assertEqual(
str(exception), f"Unable to retrieve current IP from {adapter.service}"
)
def test_error_response(self):
request_mock = MagicMock()
request_mock.raise_for_status.side_effect = HTTPError
self.mocked_requests_get.return_value = request_mock
adapter = self.adapter_class()
with self.assertRaises(OSError) as exception_manager:
adapter.get_ip()
exception = exception_manager.exception
self.assertEqual(
str(exception), f"Unable to retrieve current IP from {adapter.service}"
)
def test_no_text_content(self):
self.mocked_requests_get.return_value = MagicMock(text="")
adapter = self.adapter_class()
with self.assertRaises(OSError) as exception_manager:
adapter.get_ip()
exception = exception_manager.exception
self.assertEqual(
str(exception),
f"Unable to determine IP from response from {adapter.service}",
)
class OpenDNSAdapterTestCase(TestCase):
def setUp(self) -> None:
patcher = patch("transip_client.adapters.subprocess.check_output")
self.mocked_check_output = patcher.start()
self.addCleanup(patcher.stop)
def test_simple(self):
self.mocked_check_output.return_value = "8.8.8.8\n"
adapter = OpenDNSAdapter()
self.assertEqual(adapter.get_ip(), "8.8.8.8")
def test_retry_next_resolvers(self):
self.mocked_check_output.side_effect = (
CalledProcessError(9, "dig +short myip.opendns.com @resolver1.opendns.com"),
CalledProcessError(9, "dig +short myip.opendns.com @resolver2.opendns.com"),
CalledProcessError(9, "dig +short myip.opendns.com @resolver3.opendns.com"),
"9.9.9.9\n",
)
adapter = OpenDNSAdapter()
self.assertEqual(adapter.get_ip(), "9.9.9.9")
def test_resolvers_exhausted(self):
self.mocked_check_output.side_effect = (
CalledProcessError(9, "dig +short myip.opendns.com @resolver1.opendns.com"),
CalledProcessError(9, "dig +short myip.opendns.com @resolver2.opendns.com"),
CalledProcessError(9, "dig +short myip.opendns.com @resolver3.opendns.com"),
CalledProcessError(9, "dig +short myip.opendns.com @resolver4.opendns.com"),
)
adapter = OpenDNSAdapter()
with self.assertRaises(OSError) as exception_manager:
adapter.get_ip()
self.assertEqual(
str(exception_manager.exception),
"Exhausted all known IP resolvers, unable to retrieve IP",
)
def test_command_error(self):
self.mocked_check_output.side_effect = (
CalledProcessError(1, "dig +short myip.opendns.com @resolver1.opendns.com"),
)
adapter = OpenDNSAdapter()
with self.assertRaises(OSError) as exception_manager:
adapter.get_ip()
self.assertEqual(
str(exception_manager.exception), "Unable to retrieve current IP"
)