from unittest import mock import pytest from aurweb import aur_logging, config, db, time from aurweb.models import Package, PackageBase, PackageComment, User from aurweb.models.account_type import USER_ID from aurweb.scripts import rendercomment from aurweb.scripts.rendercomment import update_comment_render from aurweb.testing.git import GitRepository logger = aur_logging.get_logger(__name__) aur_location = config.get("options", "aur_location") @pytest.fixture(autouse=True) def setup(db_test, git: GitRepository): config_get = config.get def mock_config_get(section: str, key: str) -> str: if section == "serve" and key == "repo-path": return git.file_lock.path elif section == "options" and key == "commit_uri": return "/cgit/aur.git/log/?h=%s&id=%s" return config_get(section, key) with mock.patch("aurweb.config.get", side_effect=mock_config_get): yield @pytest.fixture def user() -> User: with db.begin(): user = db.create( User, Username="test", Email="test@example.org", Passwd=str(), AccountTypeID=USER_ID, ) yield user @pytest.fixture def pkgbase(user: User) -> PackageBase: now = time.utcnow() with db.begin(): pkgbase = db.create( PackageBase, Packager=user, Name="pkgbase_0", SubmittedTS=now, ModifiedTS=now, ) yield pkgbase @pytest.fixture def package(pkgbase: PackageBase) -> Package: with db.begin(): package = db.create( Package, PackageBase=pkgbase, Name=pkgbase.Name, Version="1.0" ) yield package def create_comment( user: User, pkgbase: PackageBase, comments: str, render: bool = True ): with db.begin(): comment = db.create( PackageComment, User=user, PackageBase=pkgbase, Comments=comments ) if render: update_comment_render(comment) return comment def test_comment_rendering(user: User, pkgbase: PackageBase): text = "Hello world! This is a comment." comment = create_comment(user, pkgbase, text) expected = f"
{text}
" assert comment.RenderedComment == expected def test_rendercomment_main(user: User, pkgbase: PackageBase): text = "Hello world! This is a comment." comment = create_comment(user, pkgbase, text, False) args = ["aurweb-rendercomment", str(comment.ID)] with mock.patch("sys.argv", args): rendercomment.main() db.refresh(comment) expected = f"{text}
" assert comment.RenderedComment == expected def test_markdown_conversion(user: User, pkgbase: PackageBase): text = "*Hello* [world](https://aur.archlinux.org)!" comment = create_comment(user, pkgbase, text) expected = "Hello " 'world!
' assert comment.RenderedComment == expected def test_html_sanitization(user: User, pkgbase: PackageBase): text = '' comment = create_comment(user, pkgbase, text) expected = '<script>alert("XSS!")</script>' assert comment.RenderedComment == expected def test_link_conversion(user: User, pkgbase: PackageBase): text = """\ Visit https://www.archlinux.org/#_test_. Visit *https://www.archlinux.org/*. VisitVisit \
https://www.archlinux.org/#_test_.
Visit https://www.archlinux.org/.
Visit https://www.archlinux.org/.
Visit https://www.archlinux.org/
.
Visit Arch Linux.
Visit Arch Linux.
{commit_hash[:12]}
{commit_hash[:7]}
x.{commit_hash[:12]}.x
{commit_hash}x
0123456789abcdef
{commit_hash}
\
http://example.com/{commit_hash}\
\
FS#1234567.
FS#1234
FS#
XFS#1
FS#1234
\
https://archlinux.org/?test=FS#1234\
\