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