| 1 | import unittest |
| 2 | from pathlib import Path |
| 3 | from unittest.mock import Mock, patch |
| 4 | |
| 5 | from uploader.bilibili_uploader.runtime import ( |
| 6 | build_biliup_runtime_path, |
| 7 | ensure_biliup_binary, |
| 8 | run_biliup_command, |
| 9 | ) |
| 10 | |
| 11 | |
| 12 | class BiliupRuntimeTests(unittest.TestCase): |
| 13 | def test_build_biliup_runtime_path_returns_platform_path(self): |
| 14 | path = build_biliup_runtime_path("Windows") |
| 15 | self.assertTrue(str(path).endswith("biliup.exe")) |
| 16 | |
| 17 | @patch("uploader.bilibili_uploader.runtime.fetch_latest_release") |
| 18 | def test_ensure_biliup_binary_downloads_when_missing(self, mock_release): |
| 19 | mock_release.return_value = { |
| 20 | "tag_name": "v1.0.0", |
| 21 | "asset_url": "https://example.invalid/biliup.exe", |
| 22 | "asset_name": "biliup.exe", |
| 23 | } |
| 24 | with patch("uploader.bilibili_uploader.runtime.read_local_biliup_version", return_value=None): |
| 25 | with patch("pathlib.Path.exists", return_value=False): |
| 26 | with patch("uploader.bilibili_uploader.runtime.download_biliup_asset") as mock_download: |
| 27 | with patch("uploader.bilibili_uploader.runtime.write_local_biliup_version") as mock_write_version: |
| 28 | ensure_biliup_binary(force_check=True) |
| 29 | mock_download.assert_called_once() |
| 30 | mock_write_version.assert_called_once_with("v1.0.0") |
| 31 | |
| 32 | @patch("uploader.bilibili_uploader.runtime.fetch_latest_release") |
| 33 | def test_ensure_biliup_binary_reuses_local_when_up_to_date(self, mock_release): |
| 34 | mock_release.return_value = { |
| 35 | "tag_name": "v1.0.0", |
| 36 | "asset_url": "https://example.invalid/biliup.exe", |
| 37 | "asset_name": "biliup.exe", |
| 38 | } |
| 39 | with patch("uploader.bilibili_uploader.runtime.read_local_biliup_version", return_value="v1.0.0"): |
| 40 | with patch("pathlib.Path.exists", return_value=True): |
| 41 | with patch("uploader.bilibili_uploader.runtime.download_biliup_asset") as mock_download: |
| 42 | with patch("uploader.bilibili_uploader.runtime.write_local_biliup_version") as mock_write_version: |
| 43 | ensure_biliup_binary(force_check=True) |
| 44 | mock_download.assert_not_called() |
| 45 | mock_write_version.assert_not_called() |
| 46 | |
| 47 | @patch("uploader.bilibili_uploader.runtime.subprocess.run") |
| 48 | @patch("uploader.bilibili_uploader.runtime.ensure_biliup_binary") |
| 49 | def test_run_biliup_command_returns_completed_process(self, mock_ensure_binary, mock_run): |
| 50 | mock_ensure_binary.return_value = build_biliup_runtime_path("Windows") |
| 51 | mock_run.return_value = Mock(returncode=0, stdout="ok", stderr="") |
| 52 | result = run_biliup_command(["login"]) |
| 53 | self.assertEqual(result.returncode, 0) |
| 54 | |
| 55 | @patch("uploader.bilibili_uploader.runtime.subprocess.run") |
| 56 | @patch("uploader.bilibili_uploader.runtime.ensure_biliup_binary") |
| 57 | def test_run_biliup_command_login_uses_interactive_stdio(self, mock_ensure_binary, mock_run): |
| 58 | mock_ensure_binary.return_value = Path("C:/mock/biliup.exe") |
| 59 | mock_run.return_value = Mock(returncode=0, stdout="", stderr="") |
| 60 | run_biliup_command(["login"], interactive=True) |
| 61 | _, kwargs = mock_run.call_args |
| 62 | self.assertNotIn("capture_output", kwargs) |
| 63 |