mirror of
https://github.com/Xevion/contest-assistant.git
synced 2025-12-08 14:06:42 -06:00
Proper basic tests for db.Submission methods
Testing for Submission.increment, Submission.decrement with exceptions Randomized database generation fixture with query test
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
import datetime
|
import random
|
||||||
from itertools import count
|
from itertools import count
|
||||||
|
from typing import Generator
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from sqlalchemy.orm import Session, sessionmaker
|
from sqlalchemy.orm import Session, sessionmaker
|
||||||
|
|
||||||
from bot.models import Guild, Period, Submission
|
from bot import exceptions
|
||||||
|
from bot.models import Guild, Period, PeriodStates, Submission
|
||||||
from main import load_db
|
from main import load_db
|
||||||
|
|
||||||
numbers = count()
|
numbers = count()
|
||||||
@@ -17,68 +19,94 @@ def SessionClass():
|
|||||||
engine.dispose()
|
engine.dispose()
|
||||||
|
|
||||||
|
|
||||||
class TestDatabase(object):
|
@pytest.fixture(scope='function')
|
||||||
@pytest.fixture()
|
def session(SessionClass: sessionmaker):
|
||||||
def session(self, SessionClass) -> Session:
|
s: Session = SessionClass()
|
||||||
session = SessionClass()
|
try:
|
||||||
yield session
|
yield s
|
||||||
session.commit()
|
finally:
|
||||||
session.close()
|
s.close()
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def guild(self, session) -> Guild:
|
def test_submission_increment(session: Session):
|
||||||
|
sub = Submission(id=1, user=1)
|
||||||
|
session.bulk_save_objects([sub])
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
with pytest.raises(exceptions.SelfVoteException):
|
||||||
|
sub.increment(1)
|
||||||
|
sub.increment(2)
|
||||||
|
assert sub.votes == [2]
|
||||||
|
with pytest.raises(exceptions.DatabaseDoubleVoteException):
|
||||||
|
sub.increment(2)
|
||||||
|
|
||||||
|
|
||||||
|
def test_submission_decrement(session: Session) -> None:
|
||||||
|
sub = Submission(id=1, user=1)
|
||||||
|
session.add(sub)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
sub.votes = [1]
|
||||||
|
sub.decrement(1)
|
||||||
|
assert sub.votes == []
|
||||||
|
with pytest.raises(exceptions.DatabaseNoVoteException):
|
||||||
|
sub.decrement(1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_advance_state(session: Session) -> None:
|
||||||
|
guild = Guild(id=1)
|
||||||
|
per = Period(id=1, guild=guild)
|
||||||
|
session.add(per)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
assert per.state == PeriodStates.READY
|
||||||
|
per.advance_state()
|
||||||
|
assert per.state == PeriodStates.SUBMISSIONS
|
||||||
|
per.advance_state()
|
||||||
|
assert per.state == PeriodStates.PAUSED
|
||||||
|
per.advance_state()
|
||||||
|
assert per.state == PeriodStates.VOTING
|
||||||
|
per.advance_state()
|
||||||
|
assert per.state == PeriodStates.FINISHED
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def database(SessionClass: sessionmaker):
|
||||||
|
session: Session = SessionClass()
|
||||||
|
|
||||||
|
def users(user_ids) -> Generator[int, None, None]:
|
||||||
|
index = 0
|
||||||
|
random.shuffle(user_ids)
|
||||||
|
while True:
|
||||||
|
if index >= len(user_ids):
|
||||||
|
random.shuffle(user_ids)
|
||||||
|
index = 0
|
||||||
|
yield user_ids[index]
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
user_ids = [next(numbers) for _ in range(50)]
|
||||||
guild = Guild(id=next(numbers), submission_channel=next(numbers))
|
guild = Guild(id=next(numbers), submission_channel=next(numbers))
|
||||||
session.add(guild)
|
users = users(user_ids)
|
||||||
session.commit()
|
|
||||||
yield guild
|
|
||||||
session.delete(guild)
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
@pytest.fixture()
|
for _ in range(3):
|
||||||
def period(self, session: Session, guild: Guild):
|
for state in PeriodStates:
|
||||||
period = Period(id=next(numbers), guild=guild)
|
period = Period(id=next(numbers), guild=guild)
|
||||||
|
while period.active and period.state != state:
|
||||||
|
period.advance_state()
|
||||||
|
|
||||||
|
for _ in range(50):
|
||||||
|
s = Submission(id=next(numbers), user=next(users), period=period)
|
||||||
|
session.add(s)
|
||||||
|
|
||||||
session.add(period)
|
session.add(period)
|
||||||
|
session.add(guild)
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
yield period
|
|
||||||
session.delete(period)
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def submission(self, session: Session, period: Period) -> Submission:
|
|
||||||
submission = Submission(id=next(numbers), user=next(numbers), timestamp=datetime.datetime.utcnow(), period=period)
|
|
||||||
session.add(submission)
|
|
||||||
session.commit()
|
|
||||||
yield submission
|
|
||||||
session.delete(submission)
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("session", "guild", "submission", "period")
|
|
||||||
class TestSubmissions(TestDatabase):
|
|
||||||
def test_submission_base(self, session) -> None:
|
|
||||||
period = Period(id=next(numbers))
|
|
||||||
session.add(period)
|
|
||||||
submission = Submission(id=next(numbers), user=next(numbers), timestamp=datetime.datetime.utcnow(), period=period)
|
|
||||||
session.add(submission)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("session", "guild", "submission", "period")
|
|
||||||
class TestGuilds(TestDatabase):
|
|
||||||
def test_guild_base(self, session: Session, guild: Guild) -> None:
|
|
||||||
for guild in session.query(Guild).all():
|
|
||||||
print(guild)
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("session", "guild", "submission", "period")
|
|
||||||
class TestPeriods(TestDatabase):
|
|
||||||
@pytest.fixture()
|
|
||||||
def session(self, SessionClass) -> Session:
|
|
||||||
session = SessionClass()
|
|
||||||
yield session
|
yield session
|
||||||
session.commit()
|
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
def test_period_base(self, session: SessionClass, period: Period) -> None:
|
|
||||||
session.commit()
|
def test_database(database: Session) -> None:
|
||||||
pass
|
database.query(Guild).all()
|
||||||
|
print(database.query(Period).all())
|
||||||
|
print(database.query(Submission).all())
|
||||||
|
|||||||
Reference in New Issue
Block a user