From 8fea58409c0d99f5145e64bc4605dfd4a7c47bee Mon Sep 17 00:00:00 2001
From: ccornu <ccornu@takima.fr>
Date: Tue, 11 Feb 2025 10:05:41 +0100
Subject: [PATCH] feat: handle same points number edge case

---
 src/main/kotlin/player/services/PlayerServiceImpl.kt |  8 +++++++-
 src/test/kotlin/player/PlayerServiceTest.kt          | 10 ++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/main/kotlin/player/services/PlayerServiceImpl.kt b/src/main/kotlin/player/services/PlayerServiceImpl.kt
index 22f92a7..57eb05a 100644
--- a/src/main/kotlin/player/services/PlayerServiceImpl.kt
+++ b/src/main/kotlin/player/services/PlayerServiceImpl.kt
@@ -37,11 +37,17 @@ class PlayerServiceImpl(private val playerRepository: PlayerRepository) : Player
 
     override suspend fun getPlayersRanked(): List<PlayerInfoDTO> {
         val allPlayers = playerRepository.findAll()
+        var currentRank = 1
+        var previousPoints = 0
         return allPlayers.sortedByDescending { it.pointsNumber }.mapIndexed { index, player ->
+            if (previousPoints != player.pointsNumber) {
+                currentRank = index + 1
+            }
+            previousPoints = player.pointsNumber
             PlayerInfoDTO(
                 pseudo = player.pseudo,
                 pointsNumber = player.pointsNumber,
-                ranking = index + 1
+                ranking = currentRank,
             )
         }
 
diff --git a/src/test/kotlin/player/PlayerServiceTest.kt b/src/test/kotlin/player/PlayerServiceTest.kt
index e4aaa14..38de6eb 100644
--- a/src/test/kotlin/player/PlayerServiceTest.kt
+++ b/src/test/kotlin/player/PlayerServiceTest.kt
@@ -102,6 +102,16 @@ class PlayerServiceTest {
         assertThat(result.last().ranking).isEqualTo(2)
     }
 
+    @Test
+    fun `when getting all players with two players with the same points number, should return the same rank`() {
+        val player2WithSamePoints = player2.copy(pointsNumber = 30)
+        val player3WithSamePoints = Player(pseudo = "Charlie", pointsNumber = 30)
+        coEvery { playerRepository.findAll() } returns listOf(player1, player2WithSamePoints, player3WithSamePoints)
+        val result = runBlocking { playerService.getPlayersRanked() }
+        assertThat(result.first().ranking).isEqualTo(result[1].ranking)
+        assertThat(result.last().ranking).isNotEqualTo(2)
+    }
+
     @Test
     fun `when deleting all players, should call the repository once`() {
         coEvery { playerRepository.deleteAllPlayers() } just runs
-- 
GitLab