mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
Previously, we were running a single ORM query for every single package to check for its voted or notified states. Now, we perform a single ORM query for each of the set of voted or notified packages in relation with the request user. This improves performance drastically at the expense of some manual code additions and set-dependency; i.e. we add a bit more complexity and roundabout way of getting our data. Closes: https://gitlab.archlinux.org/archlinux/aurweb/-/issues/102 Signed-off-by: Kevin Morris <kevr@0cost.org>
100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
from datetime import datetime
|
|
|
|
import pytest
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from aurweb import asgi, db
|
|
from aurweb.models.account_type import USER_ID, AccountType
|
|
from aurweb.models.official_provider import OFFICIAL_BASE, OfficialProvider
|
|
from aurweb.models.package import Package
|
|
from aurweb.models.package_base import PackageBase
|
|
from aurweb.models.package_notification import PackageNotification
|
|
from aurweb.models.package_vote import PackageVote
|
|
from aurweb.models.user import User
|
|
from aurweb.packages import util
|
|
from aurweb.redis import kill_redis
|
|
from aurweb.testing import setup_test_db
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def setup():
|
|
setup_test_db(
|
|
User.__tablename__,
|
|
Package.__tablename__,
|
|
PackageBase.__tablename__,
|
|
PackageVote.__tablename__,
|
|
PackageNotification.__tablename__,
|
|
OfficialProvider.__tablename__
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def maintainer() -> User:
|
|
account_type = db.query(AccountType, AccountType.ID == USER_ID).first()
|
|
with db.begin():
|
|
maintainer = db.create(User, Username="test_maintainer",
|
|
Email="test_maintainer@examepl.org",
|
|
Passwd="testPassword",
|
|
AccountType=account_type)
|
|
yield maintainer
|
|
|
|
|
|
@pytest.fixture
|
|
def package(maintainer: User) -> Package:
|
|
with db.begin():
|
|
pkgbase = db.create(PackageBase, Name="test-pkg",
|
|
Packager=maintainer, Maintainer=maintainer)
|
|
package = db.create(Package, Name=pkgbase.Name, PackageBase=pkgbase)
|
|
yield package
|
|
|
|
|
|
@pytest.fixture
|
|
def client() -> TestClient:
|
|
yield TestClient(app=asgi.app)
|
|
|
|
|
|
def test_package_link(client: TestClient, maintainer: User, package: Package):
|
|
with db.begin():
|
|
db.create(OfficialProvider,
|
|
Name=package.Name,
|
|
Repo="core",
|
|
Provides=package.Name)
|
|
expected = f"{OFFICIAL_BASE}/packages/?q={package.Name}"
|
|
assert util.package_link(package) == expected
|
|
|
|
|
|
def test_updated_packages(maintainer: User, package: Package):
|
|
expected = {
|
|
"Name": package.Name,
|
|
"Version": package.Version,
|
|
"PackageBase": {
|
|
"ModifiedTS": package.PackageBase.ModifiedTS
|
|
}
|
|
}
|
|
|
|
kill_redis() # Kill it here to ensure we're on a fake instance.
|
|
assert util.updated_packages(1, 0) == [expected]
|
|
assert util.updated_packages(1, 600) == [expected]
|
|
kill_redis() # Kill it again, in case other tests use a real instance.
|
|
|
|
|
|
def test_query_voted(maintainer: User, package: Package):
|
|
now = int(datetime.utcnow().timestamp())
|
|
with db.begin():
|
|
db.create(PackageVote, User=maintainer, VoteTS=now,
|
|
PackageBase=package.PackageBase)
|
|
|
|
query = db.query(Package).filter(Package.ID == package.ID).all()
|
|
query_voted = util.query_voted(query, maintainer)
|
|
assert query_voted[package.PackageBase.ID]
|
|
|
|
|
|
def test_query_notified(maintainer: User, package: Package):
|
|
with db.begin():
|
|
db.create(PackageNotification, User=maintainer,
|
|
PackageBase=package.PackageBase)
|
|
|
|
query = db.query(Package).filter(Package.ID == package.ID).all()
|
|
query_notified = util.query_notified(query, maintainer)
|
|
assert query_notified[package.PackageBase.ID]
|