Files
ffx/tests/unit/test_configure_workstation_script.py
2026-04-12 11:44:32 +02:00

151 lines
5.0 KiB
Python

from __future__ import annotations
import json
import os
from pathlib import Path
import stat
import subprocess
import sys
import tempfile
import textwrap
import unittest
REPO_ROOT = Path(__file__).resolve().parents[2]
SCRIPT_PATH = REPO_ROOT / "tools" / "configure_workstation.sh"
BUNDLE_PYTHON = Path.home() / ".local" / "share" / "ffx.venv" / "bin" / "python"
class ConfigureWorkstationScriptTests(unittest.TestCase):
def setUp(self):
self.tempdir = tempfile.TemporaryDirectory()
self.home_dir = Path(self.tempdir.name) / "home"
self.home_dir.mkdir()
self.stub_bin_dir = Path(self.tempdir.name) / "bin"
self.stub_bin_dir.mkdir()
for command_name in ("git", "python3", "ffmpeg", "ffprobe", "cpulimit"):
self.write_stub_command(command_name)
def tearDown(self):
self.tempdir.cleanup()
def write_stub_command(self, name: str, body: str = "") -> None:
script_path = self.stub_bin_dir / name
script_path.write_text(
"#!/usr/bin/env bash\n"
+ body
+ "\n",
encoding="utf-8",
)
script_path.chmod(script_path.stat().st_mode | stat.S_IXUSR)
def run_script(self, **env_overrides: str) -> subprocess.CompletedProcess[str]:
if not BUNDLE_PYTHON.is_file():
self.skipTest(f"Missing bundle Python at {BUNDLE_PYTHON}")
env = {
**os.environ,
"HOME": str(self.home_dir),
"PATH": f"{self.stub_bin_dir}:{os.environ.get('PATH', '')}",
"FFX_PYTHON": str(BUNDLE_PYTHON),
**env_overrides,
}
return subprocess.run(
["bash", str(SCRIPT_PATH)],
capture_output=True,
cwd=REPO_ROOT,
env=env,
text=True,
)
def test_script_seeds_default_config_from_template(self):
completed = self.run_script()
self.assertEqual(
0,
completed.returncode,
f"STDOUT:\n{completed.stdout}\nSTDERR:\n{completed.stderr}",
)
config_path = self.home_dir / ".local" / "etc" / "ffx.json"
self.assertTrue(config_path.exists())
config_data = json.loads(config_path.read_text(encoding="utf-8"))
self.assertEqual(
{
"databasePath": str(self.home_dir / ".local" / "var" / "ffx" / "ffx.db"),
"logDirectory": str(self.home_dir / ".local" / "var" / "log"),
"subtitlesDirectory": str(
self.home_dir / ".local" / "var" / "sync" / "subtitles"
),
"defaultIndexSeasonDigits": 2,
"defaultIndexEpisodeDigits": 2,
"defaultIndicatorSeasonDigits": 2,
"defaultIndicatorEpisodeDigits": 2,
"metadata": {
"signature": {"RECODED_WITH": "FFX"},
"remove": [
"VERSION-eng",
"creation_time",
"NAME",
],
"streams": {
"remove": [
"BPS",
"NUMBER_OF_FRAMES",
"NUMBER_OF_BYTES",
"_STATISTICS_WRITING_APP",
"_STATISTICS_WRITING_DATE_UTC",
"_STATISTICS_TAGS",
"BPS-eng",
"DURATION-eng",
"NUMBER_OF_FRAMES-eng",
"NUMBER_OF_BYTES-eng",
"_STATISTICS_WRITING_APP-eng",
"_STATISTICS_WRITING_DATE_UTC-eng",
"_STATISTICS_TAGS-eng",
]
},
},
},
config_data,
)
def test_script_honors_custom_template_override(self):
custom_template_path = Path(self.tempdir.name) / "custom-config.j2"
custom_template_path.write_text(
textwrap.dedent(
"""
{
"databasePath": {{ database_path_json }},
"marker": "from-template",
"subtitlesDirectory": {{ subtitles_directory_json }}
}
"""
).lstrip(),
encoding="utf-8",
)
completed = self.run_script(FFX_CONFIG_TEMPLATE=str(custom_template_path))
self.assertEqual(
0,
completed.returncode,
f"STDOUT:\n{completed.stdout}\nSTDERR:\n{completed.stderr}",
)
config_path = self.home_dir / ".local" / "etc" / "ffx.json"
config_data = json.loads(config_path.read_text(encoding="utf-8"))
self.assertEqual("from-template", config_data["marker"])
self.assertEqual(
str(self.home_dir / ".local" / "var" / "ffx" / "ffx.db"),
config_data["databasePath"],
)
if __name__ == "__main__":
unittest.main()