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