From f5129229564b487c6713f216ae03fec68433066b Mon Sep 17 00:00:00 2001 From: Michael Sherman Date: Thu, 19 Feb 2026 13:11:46 -0600 Subject: [PATCH] minimal unit tests for image and volume logic --- tests/test_server.py | 82 +++++++++++++++++++++++++++++++++++++++++++ tests/test_storage.py | 25 +++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 tests/test_storage.py diff --git a/tests/test_server.py b/tests/test_server.py index 35b3596..3449e53 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -1,13 +1,95 @@ from datetime import datetime +from unittest.mock import Mock import pytest +from chi.server import Server + @pytest.fixture() def now(): return datetime(2021, 1, 1, 0, 0, 0, 0) +@pytest.fixture(autouse=True) +def mock_server_deps(mocker): + def _fake_get_image(name): + img = Mock() + img.name = name + return img + + mocker.patch("chi.server.chi.image.get_image", side_effect=_fake_get_image) + mocker.patch("chi.server.get_keypair", return_value=Mock(name="test-key")) + mocker.patch("chi.server.connection") + mocker.patch("chi.server.session") + mocker.patch( + "chi.server.chi_network.get_network", return_value={"name": "sharednet1"} + ) + + +def _nova_server_mock(): + return Mock( + spec=[ + "image", + "flavor", + "networks", + "name", + "key_name", + "id", + "status", + "addresses", + "created", + "hostId", + "host_status", + "hypervisor_hostname", + "is_locked", + ] + ) + + +def test_from_nova_server_no_image(mocker): + mocker.patch("chi.server.get_image_name") + ns = _nova_server_mock() + ns.image = None + ns.flavor = {"original_name": "m1.small"} + ns.networks = {"net1": []} + + server = Server._from_nova_server(ns) + + assert server.image is None + assert server.image_name is None + + +def test_from_nova_server_with_image_dict(mocker): + mock_get_name = mocker.patch( + "chi.server.get_image_name", return_value="CC-Ubuntu22.04" + ) + ns = _nova_server_mock() + ns.image = {"id": "img-123"} + ns.flavor = {"original_name": "m1.small"} + ns.networks = {"net1": []} + + server = Server._from_nova_server(ns) + + mock_get_name.assert_called_once_with("img-123") + assert server.image_name == "CC-Ubuntu22.04" + + +def test_from_nova_server_with_image_string(mocker): + mock_get_name = mocker.patch( + "chi.server.get_image_name", return_value="CC-Ubuntu22.04" + ) + ns = _nova_server_mock() + ns.image = "img-123" + ns.flavor = {"original_name": "m1.small"} + ns.networks = {"net1": []} + + server = Server._from_nova_server(ns) + + mock_get_name.assert_called_once_with("img-123") + assert server.image_name == "CC-Ubuntu22.04" + + def example_create_server(): """Launch a bare metal instance. diff --git a/tests/test_storage.py b/tests/test_storage.py new file mode 100644 index 0000000..0c3664f --- /dev/null +++ b/tests/test_storage.py @@ -0,0 +1,25 @@ +from unittest.mock import Mock + +import cinderclient.exceptions + +from chi.storage import get_volume + + +def test_get_volume_falls_back_to_name_lookup(mocker): + cinder_mock = mocker.patch("chi.storage.cinder")() + cinder_mock.volumes.get.side_effect = cinderclient.exceptions.NotFound(404) + + fake_volume = Mock() + fake_volume.name = "my-vol" + fake_volume.size = 10 + fake_volume.description = None + fake_volume.metadata = {} + fake_volume.volume_type = "ceph-ssd" + fake_volume.id = "vol-123" + fake_volume.status = "available" + cinder_mock.volumes.list.return_value = [fake_volume] + + result = get_volume("my-vol") + + assert result.id == "vol-123" + assert result.name == "my-vol"