"""Mosaic download outcomes for scans.csv (RunStats / MosaicAttempt).""" from pathlib import Path from unittest.mock import MagicMock from spruce.download_result import ( DownloadResult, PERMANENT_MISSING, TRANSIENT, UNKNOWN, ) from spruce.orchestrator import _download_mosaic _MACHINE = {"label": "M", "option_value": "v", "machine_id": "1"} _CONFIG: dict = { "write_exif": False, "timeout": 10, "request_delay": 0.0, "machine_metadata": {}, } def test_download_mosaic_404_permanent_class(): sess = MagicMock() url = "http://img/RootView_Database/9/mosaic.jpg" sess.mosaic_url.return_value = url sess.download_file.return_value = DownloadResult(0, 404, "404", PERMANENT_MISSING) progress = MagicMock() progress.is_done.return_value = False mpath = Path("/tmp/mosaic_404.jpg") out = _download_mosaic( sess, {}, 9, mpath, progress, _MACHINE, _CONFIG, dry_run=False ) assert out.csv_status == "failed" assert out.error_class == PERMANENT_MISSING assert out.error_code == "404" progress.mark_done.assert_not_called() def test_download_mosaic_503_transient_class(): sess = MagicMock() sess.mosaic_url.return_value = "http://x/m.jpg" sess.download_file.return_value = DownloadResult(0, 503, "err", TRANSIENT) progress = MagicMock() progress.is_done.return_value = False out = _download_mosaic( sess, {}, 1, Path("/tmp/m.jpg"), progress, _MACHINE, _CONFIG, dry_run=False, ) assert out.error_class == TRANSIENT assert out.error_code == "503" def test_download_mosaic_empty_body_unknown(): sess = MagicMock() sess.mosaic_url.return_value = "http://x/m.jpg" sess.download_file.return_value = DownloadResult( 0, 200, "0 bytes in response body", UNKNOWN ) progress = MagicMock() progress.is_done.return_value = False out = _download_mosaic( sess, {}, 1, Path("/tmp/m.jpg"), progress, _MACHINE, _CONFIG, dry_run=False, ) assert out.error_class == UNKNOWN assert "bytes" in out.error or out.error