From 541c978ac4a7bdec79e1ce7359c23d0ff42723fd Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Fri, 11 Jun 2021 19:14:33 -0700 Subject: [PATCH] add PackageRequest SQLAlchemy ORM model Signed-off-by: Kevin Morris --- aurweb/models/package_request.py | 93 ++++++++++++++++++++++++ test/test_package_request.py | 119 +++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 aurweb/models/package_request.py create mode 100644 test/test_package_request.py diff --git a/aurweb/models/package_request.py b/aurweb/models/package_request.py new file mode 100644 index 00000000..00f46ce2 --- /dev/null +++ b/aurweb/models/package_request.py @@ -0,0 +1,93 @@ +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.request_type +import aurweb.models.user + +from aurweb.models.declarative import Base + + +class PackageRequest(Base): + __tablename__ = "PackageRequests" + + ID = Column(Integer, primary_key=True) + + ReqTypeID = Column( + Integer, ForeignKey("RequestTypes.ID", ondelete="NO ACTION"), + nullable=False) + RequestType = relationship( + "RequestType", backref=backref("package_requests", lazy="dynamic"), + foreign_keys=[ReqTypeID]) + + UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) + User = relationship( + "User", backref=backref("package_requests", lazy="dynamic"), + foreign_keys=[UsersID]) + + PackageBaseID = Column( + Integer, ForeignKey("PackageBases.ID", ondelete="SET NULL"), + nullable=False) + PackageBase = relationship( + "PackageBase", backref=backref("requests", lazy="dynamic"), + foreign_keys=[PackageBaseID]) + + ClosedUID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) + Closer = relationship( + "User", backref=backref("closed_requests", lazy="dynamic"), + foreign_keys=[ClosedUID]) + + __mapper_args__ = {"primary_key": [ID]} + + def __init__(self, + RequestType: aurweb.models.request_type.RequestType = None, + PackageBase: aurweb.models.package_base.PackageBase = None, + PackageBaseName: str = None, + User: aurweb.models.user.User = None, + Comments: str = None, + ClosureComment: str = None, + **kwargs): + super().__init__(**kwargs) + + self.RequestType = RequestType + if not self.RequestType: + raise IntegrityError( + statement="Foreign key ReqTypeID cannot be null.", + orig="PackageRequests.ReqTypeID", + params=("NULL")) + + self.PackageBase = PackageBase + if not self.PackageBase: + raise IntegrityError( + statement="Foreign key PackageBaseID cannot be null.", + orig="PackageRequests.PackageBaseID", + params=("NULL")) + + self.PackageBaseName = PackageBaseName + if not self.PackageBaseName: + raise IntegrityError( + statement="Column PackageBaseName cannot be null.", + orig="PackageRequests.PackageBaseName", + params=("NULL")) + + self.User = User + if not self.User: + raise IntegrityError( + statement="Foreign key UsersID cannot be null.", + orig="PackageRequests.UsersID", + params=("NULL")) + + self.Comments = Comments + if self.Comments is None: + raise IntegrityError( + statement="Column Comments cannot be null.", + orig="PackageRequests.Comments", + params=("NULL")) + + self.ClosureComment = ClosureComment + if self.ClosureComment is None: + raise IntegrityError( + statement="Column ClosureComment cannot be null.", + orig="PackageRequests.ClosureComment", + params=("NULL")) diff --git a/test/test_package_request.py b/test/test_package_request.py new file mode 100644 index 00000000..fc839836 --- /dev/null +++ b/test/test_package_request.py @@ -0,0 +1,119 @@ +from datetime import datetime + +import pytest + +from sqlalchemy.exc import IntegrityError + +from aurweb.db import create, query, rollback +from aurweb.models.package_base import PackageBase +from aurweb.models.package_request import PackageRequest +from aurweb.models.request_type import RequestType +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("PackageRequests", "PackageBases", "Users") + + 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_request_creation(): + request_type = query(RequestType, RequestType.Name == "merge").first() + assert request_type.Name == "merge" + + package_request = create(PackageRequest, RequestType=request_type, + User=user, PackageBase=pkgbase, + PackageBaseName=pkgbase.Name, + Comments=str(), ClosureComment=str()) + + assert bool(package_request.ID) + assert package_request.RequestType == request_type + assert package_request.User == user + assert package_request.PackageBase == pkgbase + assert package_request.PackageBaseName == pkgbase.Name + assert package_request.Comments == str() + assert package_request.ClosureComment == str() + + # Make sure that everything is cross-referenced with relationships. + assert package_request in request_type.package_requests + assert package_request in user.package_requests + assert package_request in pkgbase.requests + + +def test_package_request_closed(): + request_type = query(RequestType, RequestType.Name == "merge").first() + assert request_type.Name == "merge" + + ts = int(datetime.utcnow().timestamp()) + package_request = create(PackageRequest, RequestType=request_type, + User=user, PackageBase=pkgbase, + PackageBaseName=pkgbase.Name, + Closer=user, ClosedTS=ts, + Comments=str(), ClosureComment=str()) + + assert package_request.Closer == user + assert package_request.ClosedTS == ts + + # Test relationships. + assert package_request in user.closed_requests + + +def test_package_request_null_request_type_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageRequest, User=user, PackageBase=pkgbase, + PackageBaseName=pkgbase.Name, + Comments=str(), ClosureComment=str()) + rollback() + + +def test_package_request_null_user_raises_exception(): + request_type = query(RequestType, RequestType.Name == "merge").first() + with pytest.raises(IntegrityError): + create(PackageRequest, RequestType=request_type, PackageBase=pkgbase, + PackageBaseName=pkgbase.Name, + Comments=str(), ClosureComment=str()) + rollback() + + +def test_package_request_null_package_base_raises_exception(): + request_type = query(RequestType, RequestType.Name == "merge").first() + with pytest.raises(IntegrityError): + create(PackageRequest, RequestType=request_type, + User=user, PackageBaseName=pkgbase.Name, + Comments=str(), ClosureComment=str()) + rollback() + + +def test_package_request_null_package_base_name_raises_exception(): + request_type = query(RequestType, RequestType.Name == "merge").first() + with pytest.raises(IntegrityError): + create(PackageRequest, RequestType=request_type, + User=user, PackageBase=pkgbase, + Comments=str(), ClosureComment=str()) + rollback() + + +def test_package_request_null_comments_raises_exception(): + request_type = query(RequestType, RequestType.Name == "merge").first() + with pytest.raises(IntegrityError): + create(PackageRequest, RequestType=request_type, + User=user, PackageBase=pkgbase, PackageBaseName=pkgbase.Name, + ClosureComment=str()) + rollback() + + +def test_package_request_null_closure_comment_raises_exception(): + request_type = query(RequestType, RequestType.Name == "merge").first() + with pytest.raises(IntegrityError): + create(PackageRequest, RequestType=request_type, + User=user, PackageBase=pkgbase, PackageBaseName=pkgbase.Name, + Comments=str()) + rollback()