151 lines
5.0 KiB
Python
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()
|