diff --git a/src/logic/database/DatabaseCleaner.py b/src/logic/database/DatabaseCleaner.py index 97f88923b1816e6a8fb7a5b58fb0b196976a5c13..0ee3e571ad026d73e07367f3459bde0101327f16 100644 --- a/src/logic/database/DatabaseCleaner.py +++ b/src/logic/database/DatabaseCleaner.py @@ -14,8 +14,9 @@ LOGGER = logging.getLogger(Constants.APP_NAME) class DatabaseCleaner: MIN_DATE = datetime(year=1970, month=1, day=1).date() - def __init__(self, retentionPolicies: List[RetentionPolicy]): + def __init__(self, retentionPolicies: List[RetentionPolicy], forceBackupAfterCleanup: bool): self._policies = retentionPolicies + self._forceBackupAfterCleanup = forceBackupAfterCleanup def clean(self, db: Session, currentDate: datetime.date): LOGGER.info('Performing database cleanup...') @@ -33,7 +34,8 @@ class DatabaseCleaner: LOGGER.info('Database cleanup done') - # TODO: force backup? + if self._forceBackupAfterCleanup: + Crud.BACKUP_SERVICE.backup() @staticmethod def _cleanup_measurements_for_sensor(sensor: Schemas.Sensor, db: Session, diff --git a/src/test/DatabaseCleanerTest.py b/src/test/DatabaseCleanerTest.py index c1a2dfed272e41d0841292218b529e7697bf9b2b..b511d4b8922b2a75d0c20cd62ef7368f73ab6134 100644 --- a/src/test/DatabaseCleanerTest.py +++ b/src/test/DatabaseCleanerTest.py @@ -220,7 +220,7 @@ class TestDatabaseCleaner(unittest.TestCase): database = Mock() from logic.database.DatabaseCleaner import DatabaseCleaner - DatabaseCleaner([]).clean(database, CURRENT_DATE_TIME) + DatabaseCleaner([], False).clean(database, CURRENT_DATE_TIME) mockedCrud.get_measurements_for_sensor.assert_not_called() @@ -238,7 +238,7 @@ class TestDatabaseCleaner(unittest.TestCase): from logic.database.DatabaseCleaner import RetentionPolicy policy = RetentionPolicy(numberOfMeasurementsPerDay=4, ageInDays=1) - DatabaseCleaner([policy]).clean(database, datetime(year=2021, month=8, day=19).date()) + DatabaseCleaner([policy], False).clean(database, datetime(year=2021, month=8, day=19).date()) mockedCrud.delete_multiple_measurements.assert_called_once_with(database, {3}) @@ -261,7 +261,7 @@ class TestDatabaseCleaner(unittest.TestCase): from logic.database.DatabaseCleaner import RetentionPolicy policy = RetentionPolicy(numberOfMeasurementsPerDay=4, ageInDays=1) - DatabaseCleaner([policy]).clean(database, datetime(year=2021, month=8, day=19).date()) + DatabaseCleaner([policy], False).clean(database, datetime(year=2021, month=8, day=19).date()) calls = mockedCrud.delete_multiple_measurements.call_args_list self.assertEqual(2, len(calls)) @@ -284,9 +284,28 @@ class TestDatabaseCleaner(unittest.TestCase): policy1 = RetentionPolicy(numberOfMeasurementsPerDay=4, ageInDays=1) policy2 = RetentionPolicy(numberOfMeasurementsPerDay=2, ageInDays=1) - DatabaseCleaner([policy1, policy2]).clean(database, datetime(year=2021, month=8, day=19).date()) + DatabaseCleaner([policy1, policy2], False).clean(database, datetime(year=2021, month=8, day=19).date()) calls = mockedCrud.delete_multiple_measurements.call_args_list self.assertEqual(2, len(calls)) self.assertEqual((database, {3}), calls[0].args) self.assertEqual((database, {3, 4}), calls[1].args) + + def test_forceBackupAfterCleanup(self): + mockedCrud = Mock() + + with patch.dict('sys.modules', **{'logic.database.Crud': mockedCrud}): + mockedCrud.DATE_FORMAT = '%Y-%m-%d %H:%M:%S' + mockedCrud.get_measurements_for_sensor.return_value = [] + mockedCrud.get_sensors.return_value = [Schemas.Sensor(id=1, name="myTempSensor", + type="temperature", device_id=1)] + mockedCrud.get_first_measurement_for_sensor.return_value = self.FIRST_MEASUREMENT + + database = Mock() + from logic.database.DatabaseCleaner import DatabaseCleaner + from logic.database.DatabaseCleaner import RetentionPolicy + + policy = RetentionPolicy(numberOfMeasurementsPerDay=4, ageInDays=1) + DatabaseCleaner([policy], True).clean(database, datetime(year=2021, month=8, day=19).date()) + + mockedCrud.BACKUP_SERVICE.backup.assert_called_once()