tools

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

test_mpd_report_daily.py (6210B)


      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_daily"
      8 
      9 
     10 class MpdReportDailyTest(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\\tDay1\\n1\\tDay2\\n30\\tDay31\\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                     "07",
     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 / "01_07_2026.txt").read_text(), "Day1\n")
     59             self.assertEqual((directory / "02_07_2026.txt").read_text(), "Day2\n")
     60             self.assertEqual((directory / "03_07_2026.txt").read_text(), "")
     61             self.assertEqual((directory / "31_07_2026.txt").read_text(), "Day31\n")
     62 
     63             arguments = arguments_file.read_text().splitlines()
     64             self.assertEqual(arguments[:3], ["--files", "--output", "-"])
     65             windows = arguments[3:]
     66             self.assertEqual(len(windows), 31 * 2)
     67             self.assertEqual(windows[0], "--window")
     68             self.assertEqual(windows[1], "1782864000,1782950400")
     69             self.assertEqual(windows[-2], "--window")
     70             self.assertEqual(windows[-1], "1785456000,1785542400")
     71 
     72     def test_failed_query_does_not_replace_existing_reports(self):
     73         with tempfile.TemporaryDirectory() as name:
     74             directory = Path(name)
     75             report = directory / "01_07_2026.txt"
     76             report.write_text("keep me\n")
     77             fake = self.make_fake(directory, "printf '0\\tpartial\\n'\nexit 1\n")
     78 
     79             result = self.run_helper(directory, fake, "07", "2026")
     80 
     81             self.assertEqual(result.returncode, 1)
     82             self.assertEqual(report.read_text(), "keep me\n")
     83             self.assertFalse((directory / "02_07_2026.txt").exists())
     84 
     85     def test_rejects_windows_owned_by_helper(self):
     86         with tempfile.TemporaryDirectory() as name:
     87             directory = Path(name)
     88             fake = self.make_fake(directory, "exit 0\n")
     89 
     90             result = self.run_helper(
     91                 directory, fake, "07", "2026", "--", "--window", "1,2"
     92             )
     93 
     94             self.assertEqual(result.returncode, 2)
     95             self.assertIn("managed by this helper", result.stderr)
     96 
     97     def test_february_non_leap_year(self):
     98         with tempfile.TemporaryDirectory() as name:
     99             directory = Path(name)
    100             arguments_file = directory / "arguments"
    101             fake = self.make_fake(
    102                 directory,
    103                 'printf "%s\\n" "$@" > "$ARGUMENTS_FILE"\n'
    104                 "printf '27\\tLastDay\\n'\n",
    105             )
    106             environment = os.environ.copy()
    107             environment.update(
    108                 MPD_REPORT=str(fake), ARGUMENTS_FILE=str(arguments_file), TZ="UTC"
    109             )
    110             result = subprocess.run(
    111                 [
    112                     str(HELPER),
    113                     "--output-dir",
    114                     str(directory),
    115                     "02",
    116                     "2025",
    117                     "--",
    118                 ],
    119                 text=True,
    120                 capture_output=True,
    121                 env=environment,
    122                 timeout=5,
    123             )
    124 
    125             self.assertEqual(result.returncode, 0, result.stderr)
    126             self.assertEqual((directory / "28_02_2025.txt").read_text(), "LastDay\n")
    127             arguments = arguments_file.read_text().splitlines()
    128             windows = arguments[2:]
    129             self.assertEqual(len(windows), 28 * 2)
    130 
    131 
    132     def test_uses_current_year_when_year_omitted(self):
    133         from datetime import date
    134         current_year = date.today().year
    135         with tempfile.TemporaryDirectory() as name:
    136             directory = Path(name)
    137             fake = self.make_fake(directory, "printf '0\tToday\n'\n")
    138             result = self.run_helper(directory, fake, "01")
    139             self.assertEqual(result.returncode, 0, result.stderr)
    140             expected = directory / f"01_01_{current_year}.txt"
    141             self.assertTrue(expected.exists())
    142             self.assertEqual(expected.read_text(), "Today\n")
    143 
    144     def test_uses_current_month_when_month_omitted(self):
    145         from datetime import date
    146         current_year = date.today().year
    147         current_month = date.today().month
    148         with tempfile.TemporaryDirectory() as name:
    149             directory = Path(name)
    150             fake = self.make_fake(directory, "printf '0\tToday\n'\n")
    151             result = self.run_helper(directory, fake)
    152             self.assertEqual(result.returncode, 0, result.stderr)
    153             expected = directory / f"01_{current_month:02d}_{current_year}.txt"
    154             self.assertTrue(expected.exists())
    155             self.assertEqual(expected.read_text(), "Today\n")
    156 
    157 if __name__ == "__main__":
    158     unittest.main()