diff --git a/aurweb/models/tu_voteinfo.py b/aurweb/models/tu_voteinfo.py new file mode 100644 index 00000000..2225b4d7 --- /dev/null +++ b/aurweb/models/tu_voteinfo.py @@ -0,0 +1,74 @@ +from sqlalchemy import Column, ForeignKey, Integer +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import backref, relationship + +import aurweb.models.user + +from aurweb.models.declarative import Base + + +class TUVoteInfo(Base): + __tablename__ = "TU_VoteInfo" + + ID = Column(Integer, primary_key=True) + + SubmitterID = Column( + Integer, ForeignKey("Users.ID", ondelete="CASCADE"), + nullable=False) + Submitter = relationship( + "User", backref=backref("tu_voteinfo_set", lazy="dynamic"), + foreign_keys=[SubmitterID]) + + __mapper_args__ = {"primary_key": [ID]} + + def __init__(self, + Agenda: str = None, + User: str = None, + Submitted: int = None, + End: int = None, + Quorum: float = None, + Submitter: aurweb.models.user.User = None, + **kwargs): + super().__init__(**kwargs) + + self.Agenda = Agenda + if self.Agenda is None: + raise IntegrityError( + statement="Column Agenda cannot be null.", + orig="TU_VoteInfo.Agenda", + params=("NULL")) + + self.User = User + if self.User is None: + raise IntegrityError( + statement="Column User cannot be null.", + orig="TU_VoteInfo.User", + params=("NULL")) + + self.Submitted = Submitted + if self.Submitted is None: + raise IntegrityError( + statement="Column Submitted cannot be null.", + orig="TU_VoteInfo.Submitted", + params=("NULL")) + + self.End = End + if self.End is None: + raise IntegrityError( + statement="Column End cannot be null.", + orig="TU_VoteInfo.End", + params=("NULL")) + + if Quorum is None: + raise IntegrityError( + statement="Column Quorum cannot be null.", + orig="TU_VoteInfo.Quorum", + params=("NULL")) + self.Quorum = str(Quorum) + + self.Submitter = Submitter + if not self.Submitter: + raise IntegrityError( + statement="Foreign key SubmitterID cannot be null.", + orig="TU_VoteInfo.SubmitterID", + params=("NULL")) diff --git a/test/test_tu_voteinfo.py b/test/test_tu_voteinfo.py new file mode 100644 index 00000000..e95f174b --- /dev/null +++ b/test/test_tu_voteinfo.py @@ -0,0 +1,111 @@ +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.tu_voteinfo import TUVoteInfo +from aurweb.models.user import User +from aurweb.testing import setup_test_db + +user = None + + +@pytest.fixture(autouse=True) +def setup(): + global user + + setup_test_db("Users", "PackageBases", "TU_VoteInfo") + + tu_type = query(AccountType, + AccountType.AccountType == "Trusted User").first() + user = create(User, Username="test", Email="test@example.org", + RealName="Test User", Passwd="testPassword", + AccountType=tu_type) + + +def test_tu_voteinfo_creation(): + ts = int(datetime.utcnow().timestamp()) + tu_voteinfo = create(TUVoteInfo, + Agenda="Blah blah.", + User=user.Username, + Submitted=ts, End=ts + 5, + Quorum=0.5, + Submitter=user) + assert bool(tu_voteinfo.ID) + assert tu_voteinfo.Agenda == "Blah blah." + assert tu_voteinfo.User == user.Username + assert tu_voteinfo.Submitted == ts + assert tu_voteinfo.End == ts + 5 + assert float(tu_voteinfo.Quorum) == 0.5 + assert tu_voteinfo.Submitter == user + assert tu_voteinfo.Yes == 0 + assert tu_voteinfo.No == 0 + assert tu_voteinfo.Abstain == 0 + assert tu_voteinfo.ActiveTUs == 0 + + assert tu_voteinfo in user.tu_voteinfo_set + + +def test_tu_voteinfo_null_submitter_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + Agenda="Blah blah.", + User=user.Username, + Submitted=0, End=0, + Quorum=0.50) + rollback() + + +def test_tu_voteinfo_null_agenda_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + User=user.Username, + Submitted=0, End=0, + Quorum=0.50, + Submitter=user) + rollback() + + +def test_tu_voteinfo_null_user_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + Agenda="Blah blah.", + Submitted=0, End=0, + Quorum=0.50, + Submitter=user) + rollback() + + +def test_tu_voteinfo_null_submitted_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + Agenda="Blah blah.", + User=user.Username, + End=0, + Quorum=0.50, + Submitter=user) + rollback() + + +def test_tu_voteinfo_null_end_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + Agenda="Blah blah.", + User=user.Username, + Submitted=0, + Quorum=0.50, + Submitter=user) + rollback() + + +def test_tu_voteinfo_null_quorum_raises_exception(): + with pytest.raises(IntegrityError): + create(TUVoteInfo, + Agenda="Blah blah.", + User=user.Username, + Submitted=0, End=0, + Submitter=user) + rollback()