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 3555558bd9
4 changed files with 36 additions and 9 deletions

View File

@ -39,8 +39,7 @@ 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()
# Verify lexicon is joinable; current no Lexicons are joinable so this is commented out # Verify lexicon is joinable; current no Lexicons are joinable so this is commented out
@ -50,11 +49,8 @@ def create(
# Verify lexicon is not full # Verify lexicon is not full
if lex.player_limit: if lex.player_limit:
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"