import os import subprocess import tempfile from pathlib import Path from unittest.mock import patch from musicdl.catalogsync.catalog_export import run_catalog_export_command def test_run_catalog_export_command_skips_when_command_missing() -> None: with patch.dict(os.environ, {}, clear=True): result = run_catalog_export_command({}) assert result.status == "skipped" assert result.returncode is None assert result.stdout == "" assert result.stderr == "" def test_run_catalog_export_command_succeeds_with_config_values() -> None: command = "python -c \"print('export ok')\"" with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir: workdir = str(Path(tmpdir)) with patch.dict( os.environ, { "CATALOG_EXPORT_COMMAND": "python -c \"raise SystemExit(9)\"", "CATALOG_EXPORT_WORKDIR": "C:/ignored", }, clear=False, ): with patch( "musicdl.catalogsync.catalog_export.subprocess.run", return_value=subprocess.CompletedProcess( args=command, returncode=0, stdout="export ok\n", stderr="", ), ) as mocked_run: result = run_catalog_export_command( { "CATALOG_EXPORT_COMMAND": command, "CATALOG_EXPORT_WORKDIR": workdir, } ) mocked_run.assert_called_once_with( command, shell=True, cwd=workdir, capture_output=True, text=True, check=False, ) assert result.status == "succeeded" assert result.returncode == 0 assert result.stdout == "export ok\n" assert result.stderr == "" def test_run_catalog_export_command_fails_with_env_values() -> None: command = "python -c \"import sys; sys.stderr.write('boom')\"" with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir: workdir = str(Path(tmpdir)) with patch.dict( os.environ, { "CATALOG_EXPORT_COMMAND": command, "CATALOG_EXPORT_WORKDIR": workdir, }, clear=False, ): with patch( "musicdl.catalogsync.catalog_export.subprocess.run", return_value=subprocess.CompletedProcess( args=command, returncode=5, stdout="", stderr="boom", ), ) as mocked_run: result = run_catalog_export_command({}) mocked_run.assert_called_once_with( command, shell=True, cwd=workdir, capture_output=True, text=True, check=False, ) assert result.status == "failed" assert result.returncode == 5 assert result.stdout == "" assert result.stderr == "boom" def test_run_catalog_export_command_fails_when_subprocess_raises() -> None: command = "python -c \"print('never runs')\"" with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir: workdir = str(Path(tmpdir)) with patch.dict( os.environ, { "CATALOG_EXPORT_COMMAND": command, "CATALOG_EXPORT_WORKDIR": workdir, }, clear=False, ): with patch( "musicdl.catalogsync.catalog_export.subprocess.run", side_effect=OSError("bad cwd"), ) as mocked_run: result = run_catalog_export_command({}) mocked_run.assert_called_once_with( command, shell=True, cwd=workdir, capture_output=True, text=True, check=False, ) assert result.status == "failed" assert result.command == command assert result.workdir == workdir assert result.returncode is None assert result.stdout == "" assert result.stderr == "bad cwd"