Implement first routes & tests

install Koin
install kotest
declare first events
create EventStream
This commit is contained in:
2024-02-28 23:31:55 +01:00
parent 5434c59129
commit 43b5f27e50
21 changed files with 422 additions and 72 deletions

View File

@@ -0,0 +1,25 @@
package eventDemo.app.actions
import eventDemo.plugins.UUIDSerializer
import io.ktor.client.HttpClient
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.testing.ApplicationTestBuilder
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import java.util.UUID
fun ApplicationTestBuilder.httpClient(): HttpClient {
return createClient {
install(ContentNegotiation) {
json(
Json {
serializersModule =
SerializersModule {
contextual(UUID::class) { UUIDSerializer }
}
},
)
}
}
}

View File

@@ -0,0 +1,61 @@
package eventDemo.app.actions
import eventDemo.app.Card
import eventDemo.app.EventStream
import eventDemo.app.GameId
import eventDemo.app.PlayCardEvent
import eventDemo.module
import io.kotest.core.spec.style.FunSpec
import io.ktor.client.call.body
import io.ktor.client.request.accept
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.http.ContentType.Application.Json
import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType
import io.ktor.server.testing.testApplication
import org.koin.core.context.stopKoin
import org.koin.ktor.ext.inject
import kotlin.test.assertEquals
class PutCardTest : FunSpec({
test("/game/{id}/card") {
testApplication {
val client = httpClient()
application {
stopKoin()
module()
}
val id = GameId().toString()
client.post("/game/$id/card") {
contentType(Json)
accept(Json)
setBody(Card.Simple(1, Card.Color.Blue))
}.apply {
assertEquals(status, HttpStatusCode.OK)
}
}
}
test("/game/{id}/card/last") {
testApplication {
val client = httpClient()
val id = GameId()
val card = Card.Simple(1, Card.Color.Blue)
application {
stopKoin()
module()
val eventStream by inject<EventStream<GameId>>()
eventStream.publish(
PlayCardEvent(id, card),
)
}
client.get("/game/$id/card/last").apply {
assertEquals(HttpStatusCode.OK, status)
assertEquals(card, this.call.body<Card>())
}
}
}
})

View File

@@ -1,23 +0,0 @@
package io.github.flecomte
import io.github.flecomte.plugins.configureRouting
import io.ktor.client.request.get
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
import io.ktor.server.testing.testApplication
import kotlin.test.Test
import kotlin.test.assertEquals
class ApplicationTest {
@Test
fun testRoot() =
testApplication {
application {
configureRouting()
}
client.get("/").apply {
assertEquals(HttpStatusCode.OK, status)
assertEquals("Hello World!", bodyAsText())
}
}
}