From 75f0e95ab8454fd6315c7a1c3ac31f9a36350a8e Mon Sep 17 00:00:00 2001 From: ccornu <ccornu@takima.fr> Date: Tue, 11 Feb 2025 17:23:36 +0100 Subject: [PATCH] feat: change repository function names to avoid redundancy --- .../player/repositories/PlayerRepository.kt | 8 ++-- .../repositories/PlayerRepositoryImpl.kt | 15 +++---- .../kotlin/player/services/PlayerService.kt | 2 +- .../player/services/PlayerServiceImpl.kt | 23 ++++++---- .../kotlin/player/PlayerIntegrationTest.kt | 6 +-- src/test/kotlin/player/PlayerServiceTest.kt | 42 +++++++++---------- 6 files changed, 47 insertions(+), 49 deletions(-) diff --git a/src/main/kotlin/player/repositories/PlayerRepository.kt b/src/main/kotlin/player/repositories/PlayerRepository.kt index 4d19b9c..0aa713a 100644 --- a/src/main/kotlin/player/repositories/PlayerRepository.kt +++ b/src/main/kotlin/player/repositories/PlayerRepository.kt @@ -4,15 +4,15 @@ import betclic.test.player.entities.Player interface PlayerRepository { - suspend fun createNewPlayer(player: Player): Player + suspend fun create(player: Player): Player - suspend fun updatePlayer(player: Player): Player + suspend fun update(player: Player): Player - suspend fun findPlayerByPseudo(pseudo: String): Player? + suspend fun findByPseudo(pseudo: String): Player? suspend fun getRank(player: Player): Int suspend fun findAll(): List<Player> - suspend fun deleteAllPlayers() + suspend fun deleteAll() } \ No newline at end of file diff --git a/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt b/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt index 4e273e4..278a263 100644 --- a/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt +++ b/src/main/kotlin/player/repositories/PlayerRepositoryImpl.kt @@ -5,11 +5,8 @@ import betclic.test.player.entities.PlayerEntity import betclic.test.player.entities.toPlayer import betclic.test.player.entities.toPlayerEntity import dev.andrewohara.dynamokt.DataClassTableSchema -import io.ktor.server.application.* -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.future.await import kotlinx.coroutines.reactive.asFlow -import org.slf4j.LoggerFactory import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient import software.amazon.awssdk.enhanced.dynamodb.Expression import software.amazon.awssdk.enhanced.dynamodb.Key @@ -20,20 +17,18 @@ class PlayerRepositoryImpl(dynamoDbEnhancedClient: DynamoDbEnhancedAsyncClient) private val tableName = PlayerEntity::class.simpleName private val tableSchema = DataClassTableSchema(PlayerEntity::class) private val table = dynamoDbEnhancedClient.table(tableName, tableSchema) - private val logger = LoggerFactory.getLogger(Application::class.java) - override suspend fun createNewPlayer(player: Player) = coroutineScope { + override suspend fun create(player: Player): Player { table.putItem(player.toPlayerEntity()).await() - logger.info("Successfully created new player $player") - return@coroutineScope player + return player } - override suspend fun updatePlayer(player: Player): Player { + override suspend fun update(player: Player): Player { val updatedPlayer = table.updateItem(player.toPlayerEntity()).await() return updatedPlayer.toPlayer() } - override suspend fun findPlayerByPseudo(pseudo: String): Player? { + override suspend fun findByPseudo(pseudo: String): Player? { val foundPlayer = table.getItem( Key.builder().partitionValue(pseudo).build() ).await() @@ -61,7 +56,7 @@ class PlayerRepositoryImpl(dynamoDbEnhancedClient: DynamoDbEnhancedAsyncClient) } - override suspend fun deleteAllPlayers() { + override suspend fun deleteAll() { table.deleteTable() table.createTable().await() diff --git a/src/main/kotlin/player/services/PlayerService.kt b/src/main/kotlin/player/services/PlayerService.kt index cb1dc72..c457780 100644 --- a/src/main/kotlin/player/services/PlayerService.kt +++ b/src/main/kotlin/player/services/PlayerService.kt @@ -10,7 +10,7 @@ interface PlayerService { suspend fun updatePlayer(playerUpdateDTO: PlayerUpdateDTO): Player - suspend fun findPlayerByPseudo(pseudo: String): Player + suspend fun getPlayerByPseudo(pseudo: String): Player suspend fun getPlayerInfoByPseudo(pseudo: String): PlayerInfoDTO diff --git a/src/main/kotlin/player/services/PlayerServiceImpl.kt b/src/main/kotlin/player/services/PlayerServiceImpl.kt index 57eb05a..d58bc5c 100644 --- a/src/main/kotlin/player/services/PlayerServiceImpl.kt +++ b/src/main/kotlin/player/services/PlayerServiceImpl.kt @@ -8,29 +8,34 @@ import betclic.test.player.dtos.toPlayerInfoDTO import betclic.test.player.entities.Player import betclic.test.player.exceptions.AlreadyExistingPlayerException import betclic.test.player.repositories.PlayerRepository +import io.ktor.server.application.* import io.ktor.server.plugins.* +import org.slf4j.LoggerFactory class PlayerServiceImpl(private val playerRepository: PlayerRepository) : PlayerService { + private val logger = LoggerFactory.getLogger(Application::class.java) + //0Transactional override suspend fun createNewPlayer(playerCreationDTO: PlayerCreationDTO): Player { - if (playerRepository.findPlayerByPseudo(playerCreationDTO.pseudo) != null) { + logger.info("Creating new player ") + if (playerRepository.findByPseudo(playerCreationDTO.pseudo) != null) { throw AlreadyExistingPlayerException(playerCreationDTO.pseudo) } - return playerRepository.createNewPlayer(playerCreationDTO.toPlayer()) + return playerRepository.create(playerCreationDTO.toPlayer()) } override suspend fun updatePlayer(playerUpdateDTO: PlayerUpdateDTO): Player { - findPlayerByPseudo(playerUpdateDTO.pseudo) - return playerRepository.updatePlayer(playerUpdateDTO.toPlayer()) + getPlayerByPseudo(playerUpdateDTO.pseudo) + return playerRepository.update(playerUpdateDTO.toPlayer()) } - override suspend fun findPlayerByPseudo(pseudo: String): Player { - val player = playerRepository.findPlayerByPseudo(pseudo) ?: throw NotFoundException("Player $pseudo not found") - return player + override suspend fun getPlayerByPseudo(pseudo: String): Player { + return playerRepository.findByPseudo(pseudo) ?: throw NotFoundException("Player $pseudo not found") } + //transac override suspend fun getPlayerInfoByPseudo(pseudo: String): PlayerInfoDTO { - val player = findPlayerByPseudo(pseudo) + val player = getPlayerByPseudo(pseudo) val rank = playerRepository.getRank(player) return player.toPlayerInfoDTO(rank) } @@ -54,6 +59,6 @@ class PlayerServiceImpl(private val playerRepository: PlayerRepository) : Player } override suspend fun deleteAllPlayers() { - playerRepository.deleteAllPlayers() + playerRepository.deleteAll() } } \ No newline at end of file diff --git a/src/test/kotlin/player/PlayerIntegrationTest.kt b/src/test/kotlin/player/PlayerIntegrationTest.kt index 62a9ff8..f085e32 100644 --- a/src/test/kotlin/player/PlayerIntegrationTest.kt +++ b/src/test/kotlin/player/PlayerIntegrationTest.kt @@ -32,7 +32,7 @@ class PlayerIntegrationTest : BaseIntegrationTest() { assertEquals(HttpStatusCode.Created, response.status) val playerRepository by inject<PlayerRepository>() - val player = playerRepository.findPlayerByPseudo(NAME_1) + val player = playerRepository.findByPseudo(NAME_1) assertThat(player).extracting("pseudo", "pointsNumber") .containsExactly(NAME_1, 0) } @@ -40,13 +40,13 @@ class PlayerIntegrationTest : BaseIntegrationTest() { @Test fun `When calling player update, a player should be updated in DB`() = iTest { val playerRepository by inject<PlayerRepository>() - playerRepository.createNewPlayer(Player(pseudo = NAME_2, pointsNumber = 0)) + playerRepository.create(Player(pseudo = NAME_2, pointsNumber = 0)) val response = client.put("/players") { header(HttpHeaders.ContentType, ContentType.Application.Json) setBody(Json.encodeToString(PlayerUpdateDTO(pseudo = NAME_2, pointsNumber = 30))) } assertEquals(HttpStatusCode.OK, response.status) - val player = playerRepository.findPlayerByPseudo(NAME_2) + val player = playerRepository.findByPseudo(NAME_2) assertThat(player).extracting("pseudo", "pointsNumber") .containsExactly(NAME_2, 30) } diff --git a/src/test/kotlin/player/PlayerServiceTest.kt b/src/test/kotlin/player/PlayerServiceTest.kt index 38de6eb..75b98b6 100644 --- a/src/test/kotlin/player/PlayerServiceTest.kt +++ b/src/test/kotlin/player/PlayerServiceTest.kt @@ -18,8 +18,6 @@ import org.junit.Assert.assertThrows import org.junit.Test class PlayerServiceTest { - - private val playerRepository: PlayerRepository = mockk() private val playerService: PlayerServiceImpl = PlayerServiceImpl(playerRepository) @@ -31,15 +29,15 @@ class PlayerServiceTest { @Test fun `when creating player, should call the repository once`() { - coEvery { playerRepository.createNewPlayer(player1) } returns player1 - coEvery { playerRepository.findPlayerByPseudo(john) } returns null + coEvery { playerRepository.create(player1) } returns player1 + coEvery { playerRepository.findByPseudo(john) } returns null runBlocking { playerService.createNewPlayer(PlayerCreationDTO(pseudo = john)) } - coVerify(exactly = 1) { playerRepository.createNewPlayer(player1) } + coVerify(exactly = 1) { playerRepository.create(player1) } } @Test fun `when creating player that exists, should throw on existing player`() { - coEvery { playerRepository.findPlayerByPseudo(john) } returns player1 + coEvery { playerRepository.findByPseudo(john) } returns player1 assertThrows(AlreadyExistingPlayerException::class.java) { runBlocking { playerService.createNewPlayer(PlayerCreationDTO(pseudo = john)) } } @@ -47,15 +45,15 @@ class PlayerServiceTest { @Test fun `when updating player, should call the repository once`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns player1 - coEvery { playerRepository.updatePlayer(playerToUpdate) } returns playerToUpdate + coEvery { playerRepository.findByPseudo(pseudo = john) } returns player1 + coEvery { playerRepository.update(playerToUpdate) } returns playerToUpdate runBlocking { playerService.updatePlayer(PlayerUpdateDTO(pseudo = john, pointsNumber = 10)) } - coVerify(exactly = 1) { playerRepository.updatePlayer(playerToUpdate) } + coVerify(exactly = 1) { playerRepository.update(playerToUpdate) } } @Test - fun `when updating player that doesn't exist, should throw on not found player`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns null + fun `when updating player that doesn't exist, should throw a not found player`() { + coEvery { playerRepository.findByPseudo(pseudo = john) } returns null assertThrows(NotFoundException::class.java) { runBlocking { playerService.updatePlayer(PlayerUpdateDTO(pseudo = john, pointsNumber = 10)) } } @@ -63,22 +61,22 @@ class PlayerServiceTest { @Test fun `when finding user by pseudo, should call the repository once`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns player1 - runBlocking { playerService.findPlayerByPseudo(pseudo = john) } - coVerify(exactly = 1) { playerRepository.findPlayerByPseudo(john) } + coEvery { playerRepository.findByPseudo(pseudo = john) } returns player1 + runBlocking { playerService.getPlayerByPseudo(pseudo = john) } + coVerify(exactly = 1) { playerRepository.findByPseudo(john) } } @Test - fun `when finding by pseudo, should throw on not found player`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns null + fun `when finding by pseudo without match, should throw a not found player`() { + coEvery { playerRepository.findByPseudo(pseudo = john) } returns null assertThrows(NotFoundException::class.java) { - runBlocking { playerService.findPlayerByPseudo(pseudo = john) } + runBlocking { playerService.getPlayerByPseudo(pseudo = john) } } } @Test fun `when getting player info, should return player with his rank`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns player1 + coEvery { playerRepository.findByPseudo(pseudo = john) } returns player1 coEvery { playerRepository.getRank(player1) } returns 2 val result = runBlocking { playerService.getPlayerInfoByPseudo(pseudo = john) } assertThat(result.pseudo).isEqualTo(john) @@ -86,8 +84,8 @@ class PlayerServiceTest { } @Test - fun `when getting player info on non-existing player, should throw on not found player`() { - coEvery { playerRepository.findPlayerByPseudo(pseudo = john) } returns null + fun `when getting player info on non-existing player, should throw a not found player exception`() { + coEvery { playerRepository.findByPseudo(pseudo = john) } returns null coEvery { playerRepository.getRank(player1) } returns 2 assertThrows(NotFoundException::class.java) { runBlocking { playerService.getPlayerInfoByPseudo(pseudo = john) } @@ -114,8 +112,8 @@ class PlayerServiceTest { @Test fun `when deleting all players, should call the repository once`() { - coEvery { playerRepository.deleteAllPlayers() } just runs + coEvery { playerRepository.deleteAll() } just runs runBlocking { playerService.deleteAllPlayers() } - coVerify(exactly = 1) { playerRepository.deleteAllPlayers() } + coVerify(exactly = 1) { playerRepository.deleteAll() } } } \ No newline at end of file -- GitLab