tools

various tools I have been using throughout the years
Log | Files | Refs | README | LICENSE

test_mpd_report_monthly.py (5092B)


      1 import os
      2 import subprocess
      3 import tempfile
      4 import unittest
      5 from pathlib import Path
      6 
      7 HELPER = Path(__file__).resolve().parents[1] / "mpd_report_monthly"
      8 
      9 
     10 class MpdReportMonthlyTest(unittest.TestCase):
     11     def make_fake(self, directory: Path, body: str) -> Path:
     12         fake = directory / "mpd_report"
     13         fake.write_text("#!/bin/sh\nset -eu\n" + body)
     14         fake.chmod(0o755)
     15         return fake
     16 
     17     def run_helper(self, directory: Path, fake: Path, *arguments: str):
     18         environment = os.environ.copy()
     19         environment.update(MPD_REPORT=str(fake), TZ="UTC")
     20         return subprocess.run(
     21             [str(HELPER), "--output-dir", str(directory), *arguments],
     22             text=True,
     23             capture_output=True,
     24             env=environment,
     25             timeout=5,
     26         )
     27 
     28     def test_splits_indexed_results_and_builds_expected_windows(self):
     29         with tempfile.TemporaryDirectory() as name:
     30             directory = Path(name)
     31             arguments_file = directory / "arguments"
     32             fake = self.make_fake(
     33                 directory,
     34                 'printf "%s\\n" "$@" > "$ARGUMENTS_FILE"\n'
     35                 "printf '0\\tArtist\\n1\\tArtist/Album\\n3\\ttrack.flac\\n'\n",
     36             )
     37             environment = os.environ.copy()
     38             environment.update(
     39                 MPD_REPORT=str(fake), ARGUMENTS_FILE=str(arguments_file), TZ="UTC"
     40             )
     41             result = subprocess.run(
     42                 [
     43                     str(HELPER),
     44                     "--output-dir",
     45                     str(directory),
     46                     "7",
     47                     "2026",
     48                     "--",
     49                     "--files",
     50                 ],
     51                 text=True,
     52                 capture_output=True,
     53                 env=environment,
     54                 timeout=5,
     55             )
     56 
     57             self.assertEqual(result.returncode, 0, result.stderr)
     58             self.assertEqual((directory / "1_07_2026.txt").read_text(), "Artist\n")
     59             self.assertEqual(
     60                 (directory / "2_07_2026.txt").read_text(), "Artist/Album\n"
     61             )
     62             self.assertEqual((directory / "3_07_2026.txt").read_text(), "")
     63             self.assertEqual((directory / "4_07_2026.txt").read_text(), "track.flac\n")
     64             self.assertEqual(
     65                 arguments_file.read_text().splitlines(),
     66                 [
     67                     "--files",
     68                     "--output",
     69                     "-",
     70                     "--window",
     71                     "1782864000,1783468800",
     72                     "--window",
     73                     "1783468800,1784073600",
     74                     "--window",
     75                     "1784073600,1784678400",
     76                     "--window",
     77                     "1784678400,1785283200",
     78                 ],
     79             )
     80 
     81     def test_failed_query_does_not_replace_existing_reports(self):
     82         with tempfile.TemporaryDirectory() as name:
     83             directory = Path(name)
     84             report = directory / "1_07_2026.txt"
     85             report.write_text("keep me\n")
     86             fake = self.make_fake(directory, "printf '0\\tpartial\\n'\nexit 1\n")
     87 
     88             result = self.run_helper(directory, fake, "07", "2026")
     89 
     90             self.assertEqual(result.returncode, 1)
     91             self.assertEqual(report.read_text(), "keep me\n")
     92             self.assertFalse((directory / "2_07_2026.txt").exists())
     93 
     94     def test_rejects_windows_owned_by_helper(self):
     95         with tempfile.TemporaryDirectory() as name:
     96             directory = Path(name)
     97             fake = self.make_fake(directory, "exit 0\n")
     98 
     99             result = self.run_helper(
    100                 directory, fake, "07", "2026", "--", "--window", "1,2"
    101             )
    102 
    103             self.assertEqual(result.returncode, 2)
    104             self.assertIn("managed by this helper", result.stderr)
    105 
    106 
    107     def test_uses_current_year_when_year_omitted(self):
    108         from datetime import date
    109         current_year = date.today().year
    110         with tempfile.TemporaryDirectory() as name:
    111             directory = Path(name)
    112             fake = self.make_fake(directory, "printf '0\tWeek1\n'\n")
    113             result = self.run_helper(directory, fake, "01")
    114             self.assertEqual(result.returncode, 0, result.stderr)
    115             expected = directory / f"1_01_{current_year}.txt"
    116             self.assertTrue(expected.exists())
    117             self.assertEqual(expected.read_text(), "Week1\n")
    118 
    119     def test_uses_current_month_when_month_omitted(self):
    120         from datetime import date
    121         current_year = date.today().year
    122         current_month = date.today().month
    123         with tempfile.TemporaryDirectory() as name:
    124             directory = Path(name)
    125             fake = self.make_fake(directory, "printf '0\tWeek1\n'\n")
    126             result = self.run_helper(directory, fake)
    127             self.assertEqual(result.returncode, 0, result.stderr)
    128             expected = directory / f"1_{current_month:02d}_{current_year}.txt"
    129             self.assertTrue(expected.exists())
    130             self.assertEqual(expected.read_text(), "Week1\n")
    131 
    132 if __name__ == "__main__":
    133     unittest.main()