| import os |
| import sys |
|
|
| |
| sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) |
|
|
| from unittest import mock |
|
|
| import pytest |
|
|
| from main import check_dashboard_files, check_env |
|
|
|
|
| class _version_info: |
| def __init__(self, major, minor): |
| self.major = major |
| self.minor = minor |
|
|
| def __eq__(self, other): |
| if isinstance(other, tuple): |
| return (self.major, self.minor) == other[:2] |
| return (self.major, self.minor) == (other.major, other.minor) |
|
|
| def __ge__(self, other): |
| if isinstance(other, tuple): |
| return (self.major, self.minor) >= other[:2] |
| return (self.major, self.minor) >= (other.major, other.minor) |
|
|
| def __le__(self, other): |
| if isinstance(other, tuple): |
| return (self.major, self.minor) <= other[:2] |
| return (self.major, self.minor) <= (other.major, other.minor) |
|
|
| def __gt__(self, other): |
| if isinstance(other, tuple): |
| return (self.major, self.minor) > other[:2] |
| return (self.major, self.minor) > (other.major, other.minor) |
|
|
| def __lt__(self, other): |
| if isinstance(other, tuple): |
| return (self.major, self.minor) < other[:2] |
| return (self.major, self.minor) < (other.major, other.minor) |
|
|
|
|
| def test_check_env(monkeypatch): |
| version_info_correct = _version_info(3, 10) |
| version_info_wrong = _version_info(3, 9) |
| monkeypatch.setattr(sys, "version_info", version_info_correct) |
| with mock.patch("os.makedirs") as mock_makedirs: |
| check_env() |
| |
| |
| assert mock_makedirs.call_count >= 4 |
| |
| for call_args in mock_makedirs.call_args_list: |
| assert call_args[1].get("exist_ok") is True |
|
|
| monkeypatch.setattr(sys, "version_info", version_info_wrong) |
| with pytest.raises(SystemExit): |
| check_env() |
|
|
|
|
| def test_version_info_comparisons(): |
| """Test _version_info comparison operators with tuples and other instances.""" |
| v3_10 = _version_info(3, 10) |
| v3_9 = _version_info(3, 9) |
| v3_11 = _version_info(3, 11) |
|
|
| |
| assert v3_10 == (3, 10) |
| assert v3_10 != (3, 9) |
| assert v3_9 == (3, 9) |
|
|
| |
| assert v3_10 >= (3, 10) |
| assert v3_10 >= (3, 9) |
| assert not (v3_9 >= (3, 10)) |
| assert v3_11 >= (3, 10) |
|
|
| |
| assert v3_10 == _version_info(3, 10) |
| assert v3_10 != v3_9 |
| assert v3_10 == v3_10 |
|
|
| assert v3_10 != v3_11 |
|
|
| |
| assert v3_10 >= v3_10 |
| assert v3_10 >= v3_9 |
| assert not (v3_9 >= v3_10) |
| assert v3_11 >= v3_10 |
|
|
| assert v3_11 >= v3_11 |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_check_dashboard_files_not_exists(monkeypatch): |
| """Tests dashboard download when files do not exist.""" |
| monkeypatch.setattr(os.path, "exists", lambda x: False) |
|
|
| with mock.patch("main.download_dashboard") as mock_download: |
| await check_dashboard_files() |
| mock_download.assert_called_once() |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_check_dashboard_files_exists_and_version_match(monkeypatch): |
| """Tests that dashboard is not downloaded when it exists and version matches.""" |
| |
| monkeypatch.setattr(os.path, "exists", lambda x: True) |
|
|
| |
| with mock.patch("main.get_dashboard_version") as mock_get_version: |
| |
| from main import VERSION |
|
|
| mock_get_version.return_value = f"v{VERSION}" |
|
|
| with mock.patch("main.download_dashboard") as mock_download: |
| await check_dashboard_files() |
| |
| mock_download.assert_not_called() |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_check_dashboard_files_exists_but_version_mismatch(monkeypatch): |
| """Tests that a warning is logged when dashboard version mismatches.""" |
| monkeypatch.setattr(os.path, "exists", lambda x: True) |
|
|
| with mock.patch("main.get_dashboard_version") as mock_get_version: |
| mock_get_version.return_value = "v0.0.1" |
|
|
| with mock.patch("main.logger.warning") as mock_logger_warning: |
| await check_dashboard_files() |
| mock_logger_warning.assert_called_once() |
| call_args, _ = mock_logger_warning.call_args |
| assert "不符" in call_args[0] |
|
|
|
|
| @pytest.mark.asyncio |
| async def test_check_dashboard_files_with_webui_dir_arg(monkeypatch): |
| """Tests that providing a valid webui_dir skips all checks.""" |
| valid_dir = "/tmp/my-custom-webui" |
| monkeypatch.setattr(os.path, "exists", lambda path: path == valid_dir) |
|
|
| with mock.patch("main.download_dashboard") as mock_download: |
| with mock.patch("main.get_dashboard_version") as mock_get_version: |
| result = await check_dashboard_files(webui_dir=valid_dir) |
| assert result == valid_dir |
| mock_download.assert_not_called() |
| mock_get_version.assert_not_called() |
|
|