mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
fix: sqlalchemy sessions per request
Best practice for web-apps is to have a session per web request. Instead of having a per worker-thread, we add a middleware that generates a unique ID per request, utilizing scoped_sessions scopefunc (custom function for defining a session scope) in combination with a ContextVar. With this we create a new session per request. Signed-off-by: moson <moson@archlinux.org>
This commit is contained in:
parent
d7ecede2eb
commit
3558c6ae5c
8 changed files with 94 additions and 19 deletions
|
@ -688,6 +688,7 @@ def test_pkgbase_comment_pin_as_co(
|
|||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
|
||||
# Assert that PinnedTS got set.
|
||||
db.refresh(comment)
|
||||
assert comment.PinnedTS > 0
|
||||
|
||||
# Unpin the comment we just pinned.
|
||||
|
@ -698,6 +699,7 @@ def test_pkgbase_comment_pin_as_co(
|
|||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
|
||||
# Let's assert that PinnedTS was unset.
|
||||
db.refresh(comment)
|
||||
assert comment.PinnedTS == 0
|
||||
|
||||
|
||||
|
@ -716,6 +718,7 @@ def test_pkgbase_comment_pin(
|
|||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
|
||||
# Assert that PinnedTS got set.
|
||||
db.refresh(comment)
|
||||
assert comment.PinnedTS > 0
|
||||
|
||||
# Unpin the comment we just pinned.
|
||||
|
@ -726,6 +729,7 @@ def test_pkgbase_comment_pin(
|
|||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
|
||||
# Let's assert that PinnedTS was unset.
|
||||
db.refresh(comment)
|
||||
assert comment.PinnedTS == 0
|
||||
|
||||
|
||||
|
@ -1040,6 +1044,7 @@ def test_pkgbase_flag(
|
|||
request.cookies = cookies
|
||||
resp = request.post(endpoint, data={"comments": "Test"})
|
||||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.Flagger == user
|
||||
assert pkgbase.FlaggerComment == "Test"
|
||||
|
||||
|
@ -1077,6 +1082,7 @@ def test_pkgbase_flag(
|
|||
request.cookies = user2_cookies
|
||||
resp = request.post(endpoint)
|
||||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.Flagger == user
|
||||
|
||||
# Now, test that the 'maintainer' user can.
|
||||
|
@ -1085,6 +1091,7 @@ def test_pkgbase_flag(
|
|||
request.cookies = maint_cookies
|
||||
resp = request.post(endpoint)
|
||||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.Flagger is None
|
||||
|
||||
# Flag it again.
|
||||
|
@ -1098,6 +1105,7 @@ def test_pkgbase_flag(
|
|||
request.cookies = cookies
|
||||
resp = request.post(endpoint)
|
||||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.Flagger is None
|
||||
|
||||
|
||||
|
@ -1170,6 +1178,7 @@ def test_pkgbase_vote(client: TestClient, user: User, package: Package):
|
|||
|
||||
vote = pkgbase.package_votes.filter(PackageVote.UsersID == user.ID).first()
|
||||
assert vote is not None
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.NumVotes == 1
|
||||
|
||||
# Remove vote.
|
||||
|
@ -1181,6 +1190,7 @@ def test_pkgbase_vote(client: TestClient, user: User, package: Package):
|
|||
|
||||
vote = pkgbase.package_votes.filter(PackageVote.UsersID == user.ID).first()
|
||||
assert vote is None
|
||||
db.refresh(pkgbase)
|
||||
assert pkgbase.NumVotes == 0
|
||||
|
||||
|
||||
|
@ -1592,9 +1602,9 @@ def test_pkgbase_merge_post(
|
|||
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||
|
||||
# Save these relationships for later comparison.
|
||||
comments = package.PackageBase.comments.all()
|
||||
notifs = package.PackageBase.notifications.all()
|
||||
votes = package.PackageBase.package_votes.all()
|
||||
comments = [row.__dict__ for row in package.PackageBase.comments.all()]
|
||||
notifs = [row.__dict__ for row in package.PackageBase.notifications.all()]
|
||||
votes = [row.__dict__ for row in package.PackageBase.package_votes.all()]
|
||||
|
||||
# Merge the package into target.
|
||||
endpoint = f"/pkgbase/{package.PackageBase.Name}/merge"
|
||||
|
@ -1612,9 +1622,13 @@ def test_pkgbase_merge_post(
|
|||
|
||||
# Assert that the original comments, notifs and votes we setup
|
||||
# got migrated to target as intended.
|
||||
assert comments == target.comments.all()
|
||||
assert notifs == target.notifications.all()
|
||||
assert votes == target.package_votes.all()
|
||||
db.get_session().refresh(target)
|
||||
assert len(comments) == target.comments.count()
|
||||
assert comments[0]["PackageBaseID"] != target.ID
|
||||
assert len(notifs) == target.notifications.count()
|
||||
assert notifs[0]["PackageBaseID"] != target.ID
|
||||
assert len(votes) == target.package_votes.count()
|
||||
assert votes[0]["PackageBaseID"] != target.ID
|
||||
|
||||
# ...and that the package got deleted.
|
||||
package = db.query(Package).filter(Package.Name == pkgname).first()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue