diff --git a/aurweb/scripts/pkgmaint.py b/aurweb/scripts/pkgmaint.py index 36da126f..b3992e5c 100755 --- a/aurweb/scripts/pkgmaint.py +++ b/aurweb/scripts/pkgmaint.py @@ -1,19 +1,27 @@ #!/usr/bin/env python3 -import time +from datetime import datetime -import aurweb.db +from sqlalchemy import and_ + +from aurweb import db +from aurweb.models import PackageBase + + +def _main(): + # One day behind. + limit_to = int(datetime.utcnow().timestamp()) - 86400 + + query = db.query(PackageBase).filter( + and_(PackageBase.SubmittedTS < limit_to, + PackageBase.PackagerUID.is_(None))) + db.delete_all(query) def main(): - conn = aurweb.db.Connection() - - limit_to = int(time.time()) - 86400 - conn.execute("DELETE FROM PackageBases WHERE " + - "SubmittedTS < ? AND PackagerUID IS NULL", [limit_to]) - - conn.commit() - conn.close() + db.get_engine() + with db.begin(): + _main() if __name__ == '__main__': diff --git a/test/t2300-pkgmaint.t b/test/t2300-pkgmaint.t deleted file mode 100755 index 997f95b0..00000000 --- a/test/t2300-pkgmaint.t +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -test_description='pkgmaint tests' - -. "$(dirname "$0")/setup.sh" - -test_expect_success 'Test package base cleanup script.' ' - now=$(date -d now +%s) && - threedaysago=$(date -d "3 days ago" +%s) && - cat <<-EOD | sqlite3 aur.db && - INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1, "foobar", 1, $now, 0, ""); - INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (2, "foobar2", 2, $threedaysago, 0, ""); - INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (3, "foobar3", NULL, $now, 0, ""); - INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (4, "foobar4", NULL, $threedaysago, 0, ""); - EOD - cover "$PKGMAINT" && - cat <<-EOD >expected && - foobar - foobar2 - foobar3 - EOD - echo "SELECT Name FROM PackageBases;" | sqlite3 aur.db >actual && - test_cmp actual expected -' - -test_done diff --git a/test/test_pkgmaint.py b/test/test_pkgmaint.py new file mode 100644 index 00000000..921a6330 --- /dev/null +++ b/test/test_pkgmaint.py @@ -0,0 +1,65 @@ +from datetime import datetime +from typing import List + +import pytest + +from aurweb import db +from aurweb.models import Package, PackageBase, User +from aurweb.models.account_type import USER_ID +from aurweb.scripts import pkgmaint + + +@pytest.fixture(autouse=True) +def setup(db_test): + return + + +@pytest.fixture +def user() -> User: + with db.begin(): + user = db.create(User, Username="test", Email="test@example.org", + Passwd="testPassword", AccountTypeID=USER_ID) + yield user + + +@pytest.fixture +def packages(user: User) -> List[Package]: + output = [] + + now = int(datetime.utcnow().timestamp()) + with db.begin(): + for i in range(5): + pkgbase = db.create(PackageBase, Name=f"pkg_{i}", + SubmittedTS=now, + ModifiedTS=now) + pkg = db.create(Package, PackageBase=pkgbase, + Name=f"pkg_{i}", Version=f"{i}.0") + output.append(pkg) + yield output + + +def test_pkgmaint_noop(packages: List[Package]): + assert len(packages) == 5 + pkgmaint.main() + packages = db.query(Package).all() + assert len(packages) == 5 + + +def test_pkgmaint(packages: List[Package]): + assert len(packages) == 5 + + # Modify the first package so it's out of date and gets deleted. + with db.begin(): + # Reduce SubmittedTS by a day + 10 seconds. + packages[0].PackageBase.SubmittedTS -= (86400 + 10) + + # Run pkgmaint. + pkgmaint.main() + + # Query package objects again and assert that the + # first package was deleted but all others are intact. + packages = db.query(Package).all() + assert len(packages) == 4 + expected = ["pkg_1", "pkg_2", "pkg_3", "pkg_4"] + for i, pkgname in enumerate(expected): + assert packages[i].Name == pkgname