mirror of
https://github.com/Xevion/contest-assistant.git
synced 2025-12-06 07:14:36 -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 typing import Generator
|
||||
|
||||
import pytest
|
||||
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
|
||||
|
||||
numbers = count()
|
||||
@@ -17,68 +19,94 @@ def SessionClass():
|
||||
engine.dispose()
|
||||
|
||||
|
||||
class TestDatabase(object):
|
||||
@pytest.fixture()
|
||||
def session(self, SessionClass) -> Session:
|
||||
session = SessionClass()
|
||||
yield session
|
||||
session.commit()
|
||||
session.close()
|
||||
|
||||
@pytest.fixture()
|
||||
def guild(self, session) -> Guild:
|
||||
guild = Guild(id=next(numbers), submission_channel=next(numbers))
|
||||
session.add(guild)
|
||||
session.commit()
|
||||
yield guild
|
||||
session.delete(guild)
|
||||
session.close()
|
||||
|
||||
@pytest.fixture()
|
||||
def period(self, session: Session, guild: Guild):
|
||||
period = Period(id=next(numbers), guild=guild)
|
||||
session.add(period)
|
||||
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.fixture(scope='function')
|
||||
def session(SessionClass: sessionmaker):
|
||||
s: Session = SessionClass()
|
||||
try:
|
||||
yield s
|
||||
finally:
|
||||
s.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)
|
||||
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)
|
||||
|
||||
|
||||
@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
|
||||
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)
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("session", "guild", "submission", "period")
|
||||
class TestPeriods(TestDatabase):
|
||||
@pytest.fixture()
|
||||
def session(self, SessionClass) -> Session:
|
||||
session = SessionClass()
|
||||
yield session
|
||||
session.commit()
|
||||
session.close()
|
||||
def test_advance_state(session: Session) -> None:
|
||||
guild = Guild(id=1)
|
||||
per = Period(id=1, guild=guild)
|
||||
session.add(per)
|
||||
session.commit()
|
||||
|
||||
def test_period_base(self, session: SessionClass, period: Period) -> None:
|
||||
session.commit()
|
||||
pass
|
||||
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))
|
||||
users = users(user_ids)
|
||||
|
||||
for _ in range(3):
|
||||
for state in PeriodStates:
|
||||
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(guild)
|
||||
|
||||
session.commit()
|
||||
yield session
|
||||
session.close()
|
||||
|
||||
|
||||
def test_database(database: Session) -> None:
|
||||
database.query(Guild).all()
|
||||
print(database.query(Period).all())
|
||||
print(database.query(Submission).all())
|
||||
|
||||
Reference in New Issue
Block a user