From 5de7ff64df0dc33a20999ae7042ff04a77451819 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Thu, 10 Jun 2021 13:55:07 -0700 Subject: [PATCH] add PackageVote SQLAlchemy ORM model Signed-off-by: Kevin Morris --- aurweb/models/package_vote.py | 53 ++++++++++++++++++++++++++++++++ test/test_package_vote.py | 58 +++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 aurweb/models/package_vote.py create mode 100644 test/test_package_vote.py diff --git a/aurweb/models/package_vote.py b/aurweb/models/package_vote.py new file mode 100644 index 00000000..55a9ecbb --- /dev/null +++ b/aurweb/models/package_vote.py @@ -0,0 +1,53 @@ +from sqlalchemy import Column, ForeignKey, Integer +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import backref, relationship + +import aurweb.models.package_base +import aurweb.models.user + +from aurweb.models.declarative import Base + + +class PackageVote(Base): + __tablename__ = "PackageVotes" + + UsersID = Column( + Integer, ForeignKey("Users.ID", ondelete="CASCADE"), + nullable=False) + User = relationship( + "User", backref=backref("package_votes", lazy="dynamic"), + foreign_keys=[UsersID]) + + PackageBaseID = Column( + Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), + nullable=False) + PackageBase = relationship( + "PackageBase", backref=backref("package_votes", lazy="dynamic"), + foreign_keys=[PackageBaseID]) + + __mapper_args__ = {"primary_key": [UsersID, PackageBaseID]} + + def __init__(self, + User: aurweb.models.user.User = None, + PackageBase: aurweb.models.package_base.PackageBase = None, + VoteTS: int = None): + self.User = User + if not self.User: + raise IntegrityError( + statement="Foreign key UsersID cannot be null.", + orig="PackageVotes.UsersID", + params=("NULL")) + + self.PackageBase = PackageBase + if not self.PackageBase: + raise IntegrityError( + statement="Foreign key PackageBaseID cannot be null.", + orig="PackageVotes.PackageBaseID", + params=("NULL")) + + self.VoteTS = VoteTS + if not self.VoteTS: + raise IntegrityError( + statement="Column VoteTS cannot be null.", + orig="PackageVotes.VoteTS", + params=("NULL")) diff --git a/test/test_package_vote.py b/test/test_package_vote.py new file mode 100644 index 00000000..b352bf11 --- /dev/null +++ b/test/test_package_vote.py @@ -0,0 +1,58 @@ +from datetime import datetime + +import pytest + +from sqlalchemy.exc import IntegrityError + +from aurweb.db import create, query, rollback +from aurweb.models.account_type import AccountType +from aurweb.models.package_base import PackageBase +from aurweb.models.package_vote import PackageVote +from aurweb.models.user import User +from aurweb.testing import setup_test_db + +user = pkgbase = None + + +@pytest.fixture(autouse=True) +def setup(): + global user, pkgbase + + setup_test_db("Users", "PackageBases", "PackageVotes") + + account_type = query(AccountType, + AccountType.AccountType == "User").first() + print(account_type.ID) + print(account_type.AccountType) + + user = create(User, Username="test", Email="test@example.org", + RealName="Test User", Passwd="testPassword") + pkgbase = create(PackageBase, Name="test-package", Maintainer=user) + + +def test_package_vote_creation(): + ts = int(datetime.utcnow().timestamp()) + package_vote = create(PackageVote, User=user, PackageBase=pkgbase, + VoteTS=ts) + assert bool(package_vote) + assert package_vote.User == user + assert package_vote.PackageBase == pkgbase + assert package_vote.VoteTS == ts + + +def test_package_vote_null_user_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageVote, PackageBase=pkgbase, VoteTS=1) + rollback() + + +def test_package_vote_null_pkgbase_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageVote, User=user, VoteTS=1) + rollback() + + +def test_package_vote_null_votets_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageVote, User=user, PackageBase=pkgbase) + rollback()