membership unit test checks joinability and player limit; post.create() checks allow_post

This commit is contained in:
Nikolai 2021-06-09 21:40:34 -07:00
parent 5497ef4b0b
commit 06ec2e168e
4 changed files with 40 additions and 11 deletions

View File

@ -39,22 +39,20 @@ def create(
# get reference to lexicon for next few checks # get reference to lexicon for next few checks
lex: Lexicon = db( lex: Lexicon = db(
select(Lexicon) select(Lexicon).where(Lexicon.id == lexicon_id)
.where(Lexicon.id == lexicon_id)
).scalar_one_or_none() ).scalar_one_or_none()
if not lex:
raise ArgumentError("could not find lexicon")
# Verify lexicon is joinable; current no Lexicons are joinable so this is commented out # Verify lexicon is joinable
if not lex.joinable: if not lex.joinable:
raise ArgumentError("Can't join: Lexicon is not joinable") raise ArgumentError("Can't join: Lexicon is not joinable")
# Verify lexicon is not full # Verify lexicon is not full
if lex.player_limit: if lex.player_limit is not None:
if ( if (
db( db(select(func.count()).where(Membership.lexicon_id == lexicon_id)).scalar()
select(func.count()) >= lex.player_limit
.where(Membership.lexicon_id == lexicon_id)
).scalar()
>= lex.player_limit
): ):
raise ArgumentError("Can't join: Lexicon is full") raise ArgumentError("Can't join: Lexicon is full")

View File

@ -4,9 +4,10 @@ Post query interface
import re import re
from sqlalchemy import select, func from sqlalchemy import select
from amanuensis.db import DbContext, Post from amanuensis.db import DbContext, Post
from amanuensis.db.models import Lexicon
from amanuensis.errors import ArgumentError from amanuensis.errors import ArgumentError
@ -34,6 +35,14 @@ def create(
if not body.strip(): if not body.strip():
raise ArgumentError("Post body cannot be empty.") raise ArgumentError("Post body cannot be empty.")
# Check that the lexicon allows posting
if not (
db(select(Lexicon).where(Lexicon.id == lexicon_id))
.scalar_one_or_none()
.allow_post
):
raise ArgumentError("Lexicon does not allow posting.")
new_post = Post(lexicon_id=lexicon_id, user_id=user_id, body=body) new_post = Post(lexicon_id=lexicon_id, user_id=user_id, body=body)
db.session.add(new_post) db.session.add(new_post)
db.session.commit() db.session.commit()

View File

@ -51,6 +51,7 @@ def make_lexicon(db: DbContext):
updated_kwargs = {**default_kwargs, **kwargs} updated_kwargs = {**default_kwargs, **kwargs}
lex = lexiq.create(db, **updated_kwargs) lex = lexiq.create(db, **updated_kwargs)
lex.joinable = True lex.joinable = True
db.session.commit()
return lex return lex
return lexicon_factory return lexicon_factory

View File

@ -15,7 +15,15 @@ def test_create_membership(db: DbContext, make):
new_lexicon: Lexicon = make.lexicon() new_lexicon: Lexicon = make.lexicon()
assert new_lexicon.id, "Failed to create lexicon" assert new_lexicon.id, "Failed to create lexicon"
# Add the user to the lexicon as an editor # Joining doesn't work when joinable is false
new_lexicon.joinable = False
db.session.commit()
with pytest.raises(ArgumentError):
memq.create(db, new_user.id, new_lexicon.id, True)
# Joining works when joinable is true
new_lexicon.joinable = True
db.session.commit()
mem: Membership = memq.create(db, new_user.id, new_lexicon.id, True) mem: Membership = memq.create(db, new_user.id, new_lexicon.id, True)
assert mem, "Failed to create membership" assert mem, "Failed to create membership"
@ -38,3 +46,16 @@ def test_create_membership(db: DbContext, make):
# Check that joining twice is not allowed # Check that joining twice is not allowed
with pytest.raises(ArgumentError): with pytest.raises(ArgumentError):
memq.create(db, new_user.id, new_lexicon.id, False) memq.create(db, new_user.id, new_lexicon.id, False)
# Check that joining full lexicon not allowed
new_lexicon.player_limit = 1
db.session.commit()
two_user: User = make.user()
with pytest.raises(ArgumentError):
memq.create(db, two_user.id, new_lexicon.id, False)
new_lexicon.player_limit = 2
db.session.commit()
mem2: Membership = memq.create(db, two_user.id, new_lexicon.id, False)
assert mem2, "Failed to join lexicon with open player slots"