feat(tests): move to pytest
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import pytest
|
||||
|
||||
from scores.models import Score, Version
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def version(db) -> Version:
|
||||
version = Version.objects.create(name="default")
|
||||
other = Version.objects.create(name="other")
|
||||
|
||||
Score.objects.create(username="legrems", points=120, version=version)
|
||||
Score.objects.create(username="Legrems", points=119, version=version)
|
||||
Score.objects.create(username="legrems", points=50, version=version)
|
||||
Score.objects.create(username="alice", points=200, version=version)
|
||||
# Same user, different version: must not collide across versions.
|
||||
Score.objects.create(username="legrems", points=999, version=other)
|
||||
|
||||
return version
|
||||
|
||||
|
||||
def best(version: Version) -> list[Score]:
|
||||
return list(Score.objects.filter(version=version).best_per_username().with_rank())
|
||||
|
||||
|
||||
def test_keeps_only_highest_per_case_insensitive_username(version: Version) -> None:
|
||||
results = best(version)
|
||||
|
||||
assert len(results) == 2
|
||||
by_name = {s.username.lower(): s for s in results}
|
||||
assert by_name["legrems"].points == 120
|
||||
assert by_name["alice"].points == 200
|
||||
|
||||
|
||||
def test_ranks_recomputed_over_deduplicated_set(version: Version) -> None:
|
||||
ranks = {s.username.lower(): s.rank for s in best(version)}
|
||||
|
||||
assert ranks["alice"] == 1
|
||||
assert ranks["legrems"] == 2
|
||||
|
||||
|
||||
def test_lower_scores_remain_in_db(version: Version) -> None:
|
||||
assert Score.objects.filter(version=version).count() == 4
|
||||
@@ -1,38 +0,0 @@
|
||||
from django.test import TestCase
|
||||
|
||||
from scores.models import Score, Version
|
||||
|
||||
|
||||
class BestPerUsernameTests(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls) -> None:
|
||||
cls.version = Version.objects.create(name="default")
|
||||
cls.other = Version.objects.create(name="other")
|
||||
|
||||
Score.objects.create(username="legrems", points=120, version=cls.version)
|
||||
Score.objects.create(username="Legrems", points=119, version=cls.version)
|
||||
Score.objects.create(username="legrems", points=50, version=cls.version)
|
||||
Score.objects.create(username="alice", points=200, version=cls.version)
|
||||
# Same user, different version: must not collide across versions.
|
||||
Score.objects.create(username="legrems", points=999, version=cls.other)
|
||||
|
||||
def _best(self) -> list[Score]:
|
||||
return list(Score.objects.filter(version=self.version).best_per_username().with_rank())
|
||||
|
||||
def test_keeps_only_highest_per_case_insensitive_username(self) -> None:
|
||||
results = self._best()
|
||||
|
||||
self.assertEqual(len(results), 2)
|
||||
by_name = {s.username.lower(): s for s in results}
|
||||
self.assertEqual(by_name["legrems"].points, 120)
|
||||
self.assertEqual(by_name["alice"].points, 200)
|
||||
|
||||
def test_ranks_recomputed_over_deduplicated_set(self) -> None:
|
||||
results = self._best()
|
||||
ranks = {s.username.lower(): s.rank for s in results}
|
||||
|
||||
self.assertEqual(ranks["alice"], 1)
|
||||
self.assertEqual(ranks["legrems"], 2)
|
||||
|
||||
def test_lower_scores_remain_in_db(self) -> None:
|
||||
self.assertEqual(Score.objects.filter(version=self.version).count(), 4)
|
||||
Reference in New Issue
Block a user