diff --git a/aurweb/models/package_comment.py b/aurweb/models/package_comment.py new file mode 100644 index 00000000..42a0661d --- /dev/null +++ b/aurweb/models/package_comment.py @@ -0,0 +1,72 @@ +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 PackageComment(Base): + __tablename__ = "PackageComments" + + ID = Column(Integer, primary_key=True) + + PackageBaseID = Column( + Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), + nullable=False) + PackageBase = relationship( + "PackageBase", backref=backref("comments", lazy="dynamic"), + foreign_keys=[PackageBaseID]) + + UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) + User = relationship( + "User", backref=backref("package_comments", lazy="dynamic"), + foreign_keys=[UsersID]) + + EditedUsersID = Column( + Integer, ForeignKey("Users.ID", ondelete="SET NULL")) + Editor = relationship( + "User", backref=backref("edited_comments", lazy="dynamic"), + foreign_keys=[EditedUsersID]) + + DelUsersID = Column( + Integer, ForeignKey("Users.ID", ondelete="SET NULL")) + Deleter = relationship( + "User", backref=backref("deleted_comments", lazy="dynamic"), + foreign_keys=[DelUsersID]) + + __mapper_args__ = {"primary_key": [ID]} + + def __init__(self, + PackageBase: aurweb.models.package_base.PackageBase = None, + User: aurweb.models.user.User = None, + **kwargs): + super().__init__(**kwargs) + + self.PackageBase = PackageBase + if not self.PackageBase: + raise IntegrityError( + statement="Foreign key PackageBaseID cannot be null.", + orig="PackageComments.PackageBaseID", + params=("NULL")) + + self.User = User + if not self.User: + raise IntegrityError( + statement="Foreign key UsersID cannot be null.", + orig="PackageComments.UsersID", + params=("NULL")) + + if self.Comments is None: + raise IntegrityError( + statement="Column Comments cannot be null.", + orig="PackageComments.Comments", + params=("NULL")) + + if self.RenderedComment is None: + raise IntegrityError( + statement="Column RenderedComment cannot be null.", + orig="PackageComments.RenderedComment", + params=("NULL")) diff --git a/test/test_package_comment.py b/test/test_package_comment.py new file mode 100644 index 00000000..fb734071 --- /dev/null +++ b/test/test_package_comment.py @@ -0,0 +1,63 @@ +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_comment import PackageComment +from aurweb.models.user import User +from aurweb.testing import setup_test_db + +user = pkgbase = None + + +@pytest.fixture(autouse=True) +def setup(): + setup_test_db("PackageBases", "PackageComments", "Users") + + global user, pkgbase + + account_type = query(AccountType, + AccountType.AccountType == "User").first() + user = create(User, Username="test", Email="test@example.org", + RealName="Test User", Passwd="testPassword", + AccountType=account_type) + pkgbase = create(PackageBase, Name="test-package", Maintainer=user) + + +def test_package_comment_creation(): + package_comment = create(PackageComment, + PackageBase=pkgbase, + User=user, + Comments="Test comment.", + RenderedComment="Test rendered comment.") + assert bool(package_comment.ID) + + +def test_package_comment_null_package_base_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageComment, User=user, Comments="Test comment.", + RenderedComment="Test rendered comment.") + rollback() + + +def test_package_comment_null_user_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageComment, PackageBase=pkgbase, Comments="Test comment.", + RenderedComment="Test rendered comment.") + rollback() + + +def test_package_comment_null_comments_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageComment, PackageBase=pkgbase, User=user, + RenderedComment="Test rendered comment.") + rollback() + + +def test_package_comment_null_renderedcomment_raises_exception(): + with pytest.raises(IntegrityError): + create(PackageComment, PackageBase=pkgbase, User=user, + Comments="Test comment.") + rollback()