Skip to content
Snippets Groups Projects
Commit 7c435698 authored by Clément CORNU's avatar Clément CORNU
Browse files

feat: first version of post new player endpoint

parent f2be9fb3
Branches
No related tags found
No related merge requests found
package betclic.test
fun interface HelloService {
fun sayHello()
}
package betclic.test.player
import dev.andrewohara.dynamokt.DynamoKtPartitionKey
import kotlinx.serialization.Serializable
@Serializable
data class Player(
val pseudo: String,
val pointsNumber: Int = 0,
)
data class PlayerEntity(
@DynamoKtPartitionKey
val pseudo: String,
val pointsNumber: Int = 0,
)
fun Player.toPlayerEntity(): PlayerEntity {
return PlayerEntity(
pseudo = pseudo,
pointsNumber = pointsNumber,
)
}
fun PlayerEntity.toPlayer(): Player {
return Player(
pseudo = pseudo,
pointsNumber = pointsNumber,
)
}
\ No newline at end of file
package betclic.test.player
import dev.andrewohara.dynamokt.DataClassTableSchema
import io.ktor.server.application.*
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.future.await
import org.slf4j.LoggerFactory
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient
class PlayerRepository(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)
suspend fun createNewPlayer(player: Player): Unit = coroutineScope {
val saved = table.putItem(player.toPlayerEntity()).await()
logger.info("Successfully created new player $saved")
}
}
\ No newline at end of file
package betclic.test.player
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import org.koin.ktor.ext.inject
fun Application.configureRouting() {
routing {
val playerService by inject<PlayerService>()
post("/player") {
val request = call.receive<String>()
playerService.createNewPlayer(request)
call.respond(HttpStatusCode.Created)
}
}
}
\ No newline at end of file
package betclic.test.player
interface PlayerService {
suspend fun createNewPlayer(pseudo: String)
}
\ No newline at end of file
package betclic.test.player
class PlayerServiceImpl(private val playerRepository: PlayerRepository) : PlayerService {
override suspend fun createNewPlayer(pseudo: String) {
playerRepository.createNewPlayer(Player(pseudo = pseudo))
}
}
\ No newline at end of file
package betclic.test
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlin.test.Test
import kotlin.test.assertEquals
class ApplicationTest {
@Test
fun testRoot() = testApplication {
application {
module()
}
client.get("/").apply {
assertEquals(HttpStatusCode.OK, status)
}
}
}
package betclic.test.player
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.testing.*
import org.junit.Test
import kotlin.test.assertEquals
class PlayerIntegrationTest {
@Test
fun `When calling post player, should return created`() = testApplication {
assertEquals(HttpStatusCode.Created, client.post("/player") {
header(HttpHeaders.ContentType, ContentType.Text.Plain)
setBody("Test d'intégration")
}.status)
}
}
\ No newline at end of file
package betclic.test.player
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.just
import io.mockk.mockk
import io.mockk.runs
import kotlinx.coroutines.runBlocking
import org.junit.Test
class PlayerServiceTest {
private val playerRepository: PlayerRepository = mockk()
private val playerService: PlayerServiceImpl = PlayerServiceImpl(playerRepository)
private val john = "John"
private val player1 = Player(pseudo = john)
@Test
fun `should create a new player`() {
coEvery { playerRepository.createNewPlayer(player1) } just runs
runBlocking { playerService.createNewPlayer(john) }
coVerify(exactly = 1) { playerRepository.createNewPlayer(player1) }
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment