Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/db/model/logging_event.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import json

import sqlalchemy as sa
from sqlalchemy import ForeignKey

Expand All @@ -22,6 +24,6 @@ def to_dict(self):
"timestamp": self.timestamp,
"source": self.source,
"type": self.type,
"payload": str(self.payload),
"payload": self.payload,
"exercise_id": self.exercise_id,
}
4 changes: 2 additions & 2 deletions tests/test_exercise.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from app.db.database import get_session
from app.main import app
from tests.util.db_util import create_test_tables, get_override_dependency, insert_all_records, DB_URI
from tests.util.db_util import create_test_tables, get_override_dependency, insert_demo_data, DB_URI
from tests.util.demo_data import EXERCISES


Expand All @@ -17,7 +17,7 @@ def setup_class(self):
self.async_session = async_sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)

asyncio.run(create_test_tables(self.engine))
asyncio.run(insert_all_records(self.async_session))
asyncio.run(insert_demo_data(self.async_session))

def test_get_exercise(self):
app.dependency_overrides[get_session] = get_override_dependency(self.engine)
Expand Down
4 changes: 2 additions & 2 deletions tests/test_grading_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from app.db.database import get_session
from app.main import app
from app.mq.message_queue import get_mq_channel
from tests.util.db_util import create_test_tables, get_override_dependency, insert_all_records, DB_URI
from tests.util.db_util import create_test_tables, get_override_dependency, insert_demo_data, DB_URI


def setup_mocks():
Expand All @@ -27,7 +27,7 @@ def setup_method(self):
self.async_session = async_sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)

asyncio.run(create_test_tables(self.engine))
asyncio.run(insert_all_records(self.async_session))
asyncio.run(insert_demo_data(self.async_session))

def test_post_submission(self):
channel_mock, exchange_mock = setup_mocks()
Expand Down
35 changes: 35 additions & 0 deletions tests/test_logging_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import asyncio

from fastapi.testclient import TestClient
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker

from app.api.schema.logging_event import LoggingEventRead
from app.db.database import get_session
from app.main import app
from tests.util.db_util import insert_demo_data, DB_URI, create_test_tables, get_override_dependency
from tests.util.demo_data import LOGGING_EVENTS


class TestLoggingEvent:

def setup_class(self):
self.engine = create_async_engine(DB_URI, echo=True, future=True)
self.async_session = async_sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)

asyncio.run(create_test_tables(self.engine))
asyncio.run(insert_demo_data(self.async_session))

def test_get_logging_events(self):
app.dependency_overrides[get_session] = get_override_dependency(self.engine)
client = TestClient(app)

response = client.get("/logging-events/logging-test-tan")

assert response.status_code == 200
assert len(response.json()) == 2

assert response.json()[0] == LoggingEventRead(**LOGGING_EVENTS[0]).model_dump(mode='json')
assert response.json()[1] == LoggingEventRead(**LOGGING_EVENTS[1]).model_dump(mode='json')



13 changes: 4 additions & 9 deletions tests/test_tan.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,26 @@

from app.db.database import get_session
from app.main import app
from tests.util.db_util import insert_tan, create_test_tables, get_override_dependency
from tests.util.db_util import create_test_tables, get_override_dependency, insert_demo_data

DB_URI = "sqlite+aiosqlite:///:memory:"


async def insert_test_data(session_factory: async_sessionmaker):
async with session_factory() as session:
await insert_tan(session, {"code": "123456"})


class TestTan:
def setup_method(self):
self.engine = create_async_engine(DB_URI, echo=True, future=True)
self.async_session = async_sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)

asyncio.run(create_test_tables(self.engine))
asyncio.run(insert_test_data(self.async_session))
asyncio.run(insert_demo_data(self.async_session))

def test_get_tan(self):
app.dependency_overrides[get_session] = get_override_dependency(self.engine)
client = TestClient(app)

response = client.get("/tans/123456")
response = client.get("/tans/test-tan-1")

assert response.json() == {"code": "123456", "valid_from": None, "valid_to": None}
assert response.json() == {"code": "test-tan-1", "valid_from": '2025-10-07T18:00:00', "valid_to": None}
assert response.status_code == 200

def test_get_none_existing_tan(self):
Expand Down
19 changes: 16 additions & 3 deletions tests/util/db_util.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import json

from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine, async_sessionmaker

from app.db.database import Base
from app.db.model import Exercise, Tan
from app.db.model import Exercise, Tan, LoggingEvent
from app.db.model.exercise import ExerciseProgress, Competition, TestCase
from tests.util.demo_data import COMPETITIONS, TANS, EXERCISES, EXERCISE_PROGRESS_ENTRIES, EXERCISE_TEST_CASES
from tests.util.demo_data import COMPETITIONS, TANS, EXERCISES, EXERCISE_PROGRESS_ENTRIES, EXERCISE_TEST_CASES, \
LOGGING_EVENTS

DB_URI = "sqlite+aiosqlite:///:memory:"

Expand All @@ -21,14 +24,17 @@ async def create_test_tables(engine: AsyncEngine):
await conn.run_sync(Base.metadata.create_all)


async def insert_all_records(session_factory: async_sessionmaker):
async def insert_demo_data(session_factory: async_sessionmaker):
async with session_factory() as session:
for competition in COMPETITIONS:
await insert_competition(session, competition)

for tan in TANS:
await insert_tan(session, tan)

for logging_event in LOGGING_EVENTS:
await insert_logging_event(session, logging_event)

for exercise in EXERCISES:
await insert_exercise(session, exercise)

Expand Down Expand Up @@ -58,6 +64,13 @@ async def insert_tan(session: AsyncSession, tan: dict) -> None:
await session.commit()


async def insert_logging_event(session: AsyncSession, logging_event: dict) -> None:
logging_event["payload"] = json.dumps(logging_event["payload"])
logging_event = LoggingEvent(**logging_event)
session.add(logging_event)
await session.commit()


async def insert_competition(session: AsyncSession, competition: dict) -> None:
competition = Competition(**competition)
session.add(competition)
Expand Down
26 changes: 26 additions & 0 deletions tests/util/demo_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,32 @@
"code": "test-tan-3",
"competition_id": 1,
"valid_from": datetime(2025, 10, 7, 18, 0, 0),
},
{
"code": "logging-test-tan",
"competition_id": 1,
"valid_from": datetime(2025, 10, 7, 18, 0, 0),
}
]

LOGGING_EVENTS = [
{
"id": 1,
"tan_code": "logging-test-tan",
"timestamp": datetime(2025, 10, 7, 18, 0, 1),
"source": "button",
"type": "click",
"payload": {"msg": "first logging message", "data": [1, 2, 3, 4, 5]},
"exercise_id": 1
},
{
"id": 2,
"tan_code": "logging-test-tan",
"timestamp": datetime(2025, 10, 7, 18, 0, 2),
"source": "button",
"type": "click",
"payload": {"msg": "second logging message", "data": [5, 4, 3, 2, 1]},
"exercise_id": 1
}
]

Expand Down