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()