144 lines
4.9 KiB
Python
144 lines
4.9 KiB
Python
|
import os
|
||
|
import pytest
|
||
|
from unittest.mock import Mock, patch, mock_open
|
||
|
from eos_downloader.logics.download import SoftManager
|
||
|
from eos_downloader.logics.arista_xml_server import EosXmlObject
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def soft_manager():
|
||
|
return SoftManager()
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def mock_eos_object():
|
||
|
mock = Mock(spec=EosXmlObject)
|
||
|
mock.version = "4.28.0F"
|
||
|
mock.filename = "EOS-4.28.0F.swi"
|
||
|
mock.urls = {
|
||
|
"image": "http://example.com/EOS-4.28.0F.swi",
|
||
|
"md5sum": "http://example.com/EOS-4.28.0F.swi.md5",
|
||
|
"sha512sum": "http://example.com/EOS-4.28.0F.swi.sha512",
|
||
|
}
|
||
|
mock.hash_filename = Mock(return_value="EOS-4.28.0F.swi.md5")
|
||
|
return mock
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||
|
def test_soft_manager_init(dry_run):
|
||
|
manager = SoftManager(dry_run=dry_run)
|
||
|
assert manager.dry_run == dry_run
|
||
|
assert manager.file == {"name": None, "md5sum": None, "sha512sum": None}
|
||
|
|
||
|
|
||
|
@patch("requests.get")
|
||
|
@patch("tqdm.tqdm")
|
||
|
def test_download_file_raw(mock_tqdm, mock_requests):
|
||
|
# Setup mock response
|
||
|
mock_response = Mock()
|
||
|
mock_response.headers = {"Content-Length": "1024"}
|
||
|
mock_response.iter_content.return_value = [b"data"]
|
||
|
mock_requests.return_value = mock_response
|
||
|
|
||
|
with patch("builtins.open", mock_open()) as mock_file:
|
||
|
result = SoftManager._download_file_raw("http://test.com/file", "/tmp/file")
|
||
|
assert result == "/tmp/file"
|
||
|
mock_file().write.assert_called_with(b"data")
|
||
|
|
||
|
|
||
|
@patch("os.makedirs")
|
||
|
def test_create_destination_folder(mock_makedirs):
|
||
|
SoftManager._create_destination_folder("/test/path")
|
||
|
mock_makedirs.assert_called_once_with("/test/path", exist_ok=True)
|
||
|
|
||
|
|
||
|
def test_compute_hash_md5sum(soft_manager):
|
||
|
test_data = b"test data"
|
||
|
expected_hash = "eb733a00c0c9d336e65691a37ab54293"
|
||
|
|
||
|
with patch("builtins.open", mock_open(read_data=test_data)):
|
||
|
result = soft_manager._compute_hash_md5sum("test_file", expected_hash)
|
||
|
assert result is True
|
||
|
|
||
|
# Test with incorrect hash
|
||
|
result = soft_manager._compute_hash_md5sum("test_file", "wrong_hash")
|
||
|
assert result is False
|
||
|
|
||
|
|
||
|
# @pytest.mark.parametrize(
|
||
|
# "check_type,valid_hash", [("md5sum", True), ("sha512sum", True)]
|
||
|
# )
|
||
|
# def test_checksum(soft_manager, check_type, valid_hash):
|
||
|
# soft_manager.file = {
|
||
|
# "name": "test.swi",
|
||
|
# "md5sum": "test.swi.md5",
|
||
|
# "sha512sum": "test.swi.sha512",
|
||
|
# }
|
||
|
|
||
|
# mock_hash = "a" * (128 if check_type == "sha512sum" else 32)
|
||
|
|
||
|
# with patch(
|
||
|
# "builtins.open",
|
||
|
# mock_open(read_data=f"{mock_hash if valid_hash else 'wrong'} test.swi"),
|
||
|
# ) as mock_file:
|
||
|
# if valid_hash:
|
||
|
# with patch(
|
||
|
# "hashlib.sha512" if check_type == "sha512sum" else "hashlib.md5"
|
||
|
# ) as mock_hash_func:
|
||
|
# mock_hash_instance = Mock()
|
||
|
# mock_hash_instance.hexdigest.return_value = mock_hash
|
||
|
# mock_hash_func.return_value = mock_hash_instance
|
||
|
# assert soft_manager.checksum(check_type) is True
|
||
|
# else:
|
||
|
# with pytest.raises(ValueError):
|
||
|
# soft_manager.checksum(check_type)
|
||
|
|
||
|
|
||
|
@patch("eos_downloader.logics.download.SoftManager._download_file_raw")
|
||
|
@patch("eos_downloader.helpers.DownloadProgressBar")
|
||
|
def test_download_file(mock_progress_bar, mock_download_raw, soft_manager):
|
||
|
url = "http://test.com/file"
|
||
|
file_path = "/tmp"
|
||
|
filename = "test.swi"
|
||
|
|
||
|
# Test with rich interface
|
||
|
result = soft_manager.download_file(url, file_path, filename, rich_interface=True)
|
||
|
assert result == os.path.join(file_path, filename)
|
||
|
mock_progress_bar.assert_called_once()
|
||
|
|
||
|
|
||
|
@patch("eos_downloader.logics.download.SoftManager.download_file")
|
||
|
def test_downloads(mock_download, soft_manager, mock_eos_object):
|
||
|
result = soft_manager.downloads(
|
||
|
mock_eos_object, "/tmp/downloads", rich_interface=True
|
||
|
)
|
||
|
assert result == "/tmp/downloads"
|
||
|
assert mock_download.call_count == len(mock_eos_object.urls)
|
||
|
|
||
|
|
||
|
@patch("shutil.which")
|
||
|
@patch("os.system")
|
||
|
def test_import_docker(mock_system, mock_which, soft_manager):
|
||
|
mock_which.return_value = "/usr/bin/docker"
|
||
|
|
||
|
# Test with existing file
|
||
|
with patch("os.path.exists", return_value=True):
|
||
|
soft_manager.import_docker("/tmp/test.swi", "arista/ceos", "latest")
|
||
|
mock_system.assert_called_once()
|
||
|
|
||
|
# Test with non-existing file
|
||
|
with patch("os.path.exists", return_value=False):
|
||
|
with pytest.raises(FileNotFoundError):
|
||
|
soft_manager.import_docker("/tmp/nonexistent.swi")
|
||
|
|
||
|
|
||
|
@patch("os.system")
|
||
|
@patch("os.path.exists")
|
||
|
def test_provision_eve(mock_exists, mock_system, soft_manager, mock_eos_object):
|
||
|
mock_exists.return_value = False
|
||
|
|
||
|
with patch("eos_downloader.logics.download.SoftManager.download_file"):
|
||
|
soft_manager.provision_eve(mock_eos_object, noztp=False)
|
||
|
# Check if qemu-img convert and unl_wrapper commands were called
|
||
|
assert mock_system.call_count == 2
|