Skip to content
Open
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
3 changes: 1 addition & 2 deletions validator/src/eval_backend/api/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ def _submission_to_schema(submission: Submission) -> SubmissionOut:
submission.trains,
key=lambda run: (run.created_at or _utcnow(), run.id),
)
latest = ordered_evaluations[-1] if ordered_evaluations else None
evaluations = [
EvaluationOut(
id=run.id,
Expand Down Expand Up @@ -140,7 +139,7 @@ def _submission_to_schema(submission: Submission) -> SubmissionOut:
created_at=run.created_at,
deleted_at=run.deleted_at,
)
for run in submission.evaluations
for run in ordered_evaluations
]
trains = [
TrainOut(
Expand Down
57 changes: 57 additions & 0 deletions validator/tests/test_submission_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from __future__ import annotations

from datetime import datetime, timedelta, timezone

from eval_backend.api.routes import _submission_to_schema
from eval_backend.models import EvaluationRun, Submission, TrainRun


def _submission() -> Submission:
now = datetime.now(timezone.utc)
return Submission(
id="sub-order",
source="github_pr",
miner_id="miner-a",
benchmark_names_json=["math500"],
status="completed",
created_at=now,
updated_at=now,
)


def _evaluation(eval_id: int, created_at: datetime) -> EvaluationRun:
return EvaluationRun(id=eval_id, status="completed", created_at=created_at)


def _train(train_id: int, created_at: datetime) -> TrainRun:
return TrainRun(id=train_id, status="completed", created_at=created_at)


def test_submission_schema_orders_evaluations_chronologically() -> None:
base = datetime(2026, 1, 1, tzinfo=timezone.utc)
older = _evaluation(1, base)
newer = _evaluation(2, base + timedelta(hours=1))

submission = _submission()
# Relationship contents can arrive in any order (e.g. DB row order); the
# serialized detail response must still be chronological, like ``trains``.
submission.evaluations = [newer, older]
submission.trains = []

out = _submission_to_schema(submission)

assert [run.id for run in out.evaluations] == [1, 2]


def test_submission_schema_orders_trains_chronologically() -> None:
base = datetime(2026, 1, 1, tzinfo=timezone.utc)
older = _train(1, base)
newer = _train(2, base + timedelta(hours=1))

submission = _submission()
submission.evaluations = []
submission.trains = [newer, older]

out = _submission_to_schema(submission)

assert [run.id for run in out.trains] == [1, 2]
Loading