Simon Strandgaard
purge_old_runs() now also deletes files+dirs. Previously it was only dirs that could be purged.
bb28e75
| import unittest | |
| import os | |
| import shutil | |
| import time | |
| from src.purge.purge_old_runs import purge_old_runs | |
| class TestPurgeOldRuns(unittest.TestCase): | |
| def setUp(self): | |
| """Set up test environment before each test.""" | |
| # Create a temporary directory for the runs | |
| self.test_run_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "test_run")) | |
| if os.path.exists(self.test_run_dir): | |
| shutil.rmtree(self.test_run_dir) | |
| os.makedirs(self.test_run_dir, exist_ok=True) | |
| # Create some dummy run directories with different modification times | |
| self.create_dummy_dir("myrun_dir1", hours_old=0.5) | |
| self.create_dummy_dir("myrun_dir2", hours_old=1.5) | |
| self.create_dummy_dir("myrun_dir3", hours_old=2) | |
| self.create_dummy_dir("myrun_dir4", hours_old=0.25) | |
| self.create_dummy_dir("myrun_dir5", hours_old=1) | |
| self.create_dummy_dir("myrun_dir6", hours_old=0) | |
| self.create_dummy_dir("other_dir7", hours_old=1.5) # doesn't have the prefix, so don't delete | |
| self.create_dummy_file("other_file.txt", hours_old=5) # doesn't have the prefix, so don't delete | |
| self.create_dummy_file("myrun_file1.txt", hours_old=0.25) | |
| self.create_dummy_file("myrun_file2.txt", hours_old=1.5) | |
| def tearDown(self): | |
| """Clean up test environment after each test.""" | |
| # Remove the temporary run directory and its contents | |
| if os.path.exists(self.test_run_dir): | |
| shutil.rmtree(self.test_run_dir) | |
| def create_dummy_dir(self, dirname: str, hours_old: float): | |
| """Creates a dummy run directory with a specific modification time.""" | |
| path = os.path.join(self.test_run_dir, dirname) | |
| os.makedirs(path, exist_ok=True) | |
| # Set the modification time of the directory | |
| mtime = time.time() - (hours_old * 3600) # seconds | |
| os.utime(path, (mtime, mtime)) | |
| def create_dummy_file(self, filename: str, hours_old: float): | |
| """Create a dummy file in the test directory.""" | |
| path = os.path.join(self.test_run_dir, filename) | |
| with open(path, "w") as f: | |
| f.write("This is a dummy file.") | |
| # Set the modification time of the file | |
| mtime = time.time() - (hours_old * 3600) # seconds | |
| os.utime(path, (mtime, mtime)) | |
| def test_purge_old_runs(self): | |
| """Tests the purge_old_runs function.""" | |
| max_age_hours = 0.95 | |
| purge_old_runs(self.test_run_dir, max_age_hours=max_age_hours, prefix="myrun_") # Pass the directory | |
| # Check which runs should have been purged | |
| runs_to_keep = ["myrun_dir1", "myrun_dir4", "myrun_dir6", "other_dir7", "other_file.txt", "myrun_file1.txt"] | |
| runs_to_purge = ["myrun_dir2", "myrun_dir3", "myrun_dir5", "myrun_file2.txt"] | |
| for run_id in runs_to_keep: | |
| run_path = os.path.join(self.test_run_dir, run_id) | |
| self.assertTrue(os.path.exists(run_path), f"Run {run_id} should not have been purged.") | |
| for run_id in runs_to_purge: | |
| run_path = os.path.join(self.test_run_dir, run_id) | |
| self.assertFalse(os.path.exists(run_path), f"Run {run_id} should have been purged.") | |
| def test_purge_no_runs(self): | |
| """Test when no runs are older than the max_age_hours.""" | |
| # Set all runs to be very recent. | |
| for item in os.listdir(self.test_run_dir): | |
| item_path = os.path.join(self.test_run_dir, item) | |
| mtime = time.time() # Now | |
| os.utime(item_path, (mtime, mtime)) | |
| max_age_hours = 1.0 | |
| purge_old_runs(self.test_run_dir, max_age_hours=max_age_hours, prefix="myrun_") # Pass the directory | |
| # All runs should still exist, including the one with the wrong prefix. | |
| expected_runs = ["myrun_dir1", "myrun_dir2", "myrun_dir3", "myrun_dir4", "myrun_dir5", "myrun_dir6", "other_dir7", "other_file.txt", "myrun_file1.txt", "myrun_file2.txt"] | |
| for run_id in expected_runs: | |
| run_path = os.path.join(self.test_run_dir, run_id) | |
| self.assertTrue(os.path.exists(run_path), f"Run {run_id} should not have been purged.") | |