131 lines
4.0 KiB
Python
131 lines
4.0 KiB
Python
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"
|