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)