Files
musicdl-catalog-sync-suite/catalog-sync/tests/catalogsync/test_catalog_export.py
T

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"