update ktlint
This commit is contained in:
6
.editorconfig
Normal file
6
.editorconfig
Normal file
@@ -0,0 +1,6 @@
|
||||
[*.{kt,kts}]
|
||||
ktlint_code_style = ktlint_official
|
||||
ktlint_standard = enabled
|
||||
ktlint_experimental = enabled
|
||||
ktlint_standard_string-template-indent = disabled
|
||||
ktlint_standard_multiline-expression-wrapping = disabled
|
||||
@@ -10,7 +10,9 @@ sealed interface AggregateId {
|
||||
|
||||
@JvmInline
|
||||
@Serializable(with = GameIdSerializer::class)
|
||||
value class GameId(override val id: UUID = UUID.randomUUID()) : AggregateId {
|
||||
value class GameId(
|
||||
override val id: UUID = UUID.randomUUID(),
|
||||
) : AggregateId {
|
||||
constructor(id: String) : this(UUID.fromString(id))
|
||||
|
||||
override fun toString(): String = id.toString()
|
||||
|
||||
@@ -8,9 +8,7 @@ data class Game(
|
||||
val id: GameId,
|
||||
) {
|
||||
companion object {
|
||||
fun new(): Game {
|
||||
return Game(GameId())
|
||||
}
|
||||
fun new(): Game = Game(GameId())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@ import java.util.UUID
|
||||
|
||||
@JvmInline
|
||||
@Serializable(with = CommandIdSerializer::class)
|
||||
value class CommandId(private val id: UUID = UUID.randomUUID()) {
|
||||
value class CommandId(
|
||||
private val id: UUID = UUID.randomUUID(),
|
||||
) {
|
||||
constructor(id: String) : this(UUID.fromString(id))
|
||||
|
||||
override fun toString(): String = id.toString()
|
||||
|
||||
@@ -18,11 +18,7 @@ class CommandStream {
|
||||
commands.forEach { sendRequest(it) }
|
||||
}
|
||||
|
||||
fun readNext(): Command? {
|
||||
return commandBus.firstOrNull()
|
||||
}
|
||||
fun readNext(): Command? = commandBus.firstOrNull()
|
||||
|
||||
fun <U : Command> readNext(commandClass: Class<U>): U? {
|
||||
return commandBus.filterIsInstance(commandClass).firstOrNull()
|
||||
}
|
||||
fun <U : Command> readNext(commandClass: Class<U>): U? = commandBus.filterIsInstance(commandClass).firstOrNull()
|
||||
}
|
||||
|
||||
@@ -21,11 +21,7 @@ class EventStream<ID : AggregateId> {
|
||||
fun <U : Event<ID>> read(
|
||||
aggregateId: ID,
|
||||
eventClass: Class<U>,
|
||||
): U? {
|
||||
return eventBus.get(aggregateId)?.filterIsInstance(eventClass)?.firstOrNull()
|
||||
}
|
||||
): U? = eventBus.get(aggregateId)?.filterIsInstance(eventClass)?.firstOrNull()
|
||||
}
|
||||
|
||||
inline fun <reified U : Event<ID>, ID : AggregateId> EventStream<ID>.read(aggregateId: ID): U? {
|
||||
return this.read(aggregateId, U::class.java)
|
||||
}
|
||||
inline fun <reified U : Event<ID>, ID : AggregateId> EventStream<ID>.read(aggregateId: ID): U? = this.read(aggregateId, U::class.java)
|
||||
|
||||
@@ -26,14 +26,20 @@ class Game(
|
||||
) {
|
||||
@Serializable
|
||||
@Resource("card")
|
||||
class Card(val game: Game) {
|
||||
class Card(
|
||||
val game: Game,
|
||||
) {
|
||||
@Serializable
|
||||
@Resource("")
|
||||
class PutCard(val card: Card)
|
||||
class PutCard(
|
||||
val card: Card,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
@Resource("last")
|
||||
class LastCard(val card: Card)
|
||||
class LastCard(
|
||||
val card: Card,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +53,8 @@ fun Routing.card() {
|
||||
}
|
||||
|
||||
get<Game.Card.LastCard> {
|
||||
eventStream.read<PlayCardEvent, GameId>(it.card.game.id)
|
||||
eventStream
|
||||
.read<PlayCardEvent, GameId>(it.card.game.id)
|
||||
?.let { it1 -> call.respond<Card>(it1.card) }
|
||||
?: call.response.status(HttpStatusCode.BadRequest)
|
||||
}
|
||||
|
||||
@@ -19,7 +19,9 @@ import org.koin.ktor.ext.inject
|
||||
@Resource("/command")
|
||||
class CommandRoute {
|
||||
@Resource("send")
|
||||
class Send(val commandRoute: CommandRoute) {
|
||||
class Send(
|
||||
val commandRoute: CommandRoute,
|
||||
) {
|
||||
@Serializable
|
||||
data class Response(
|
||||
val id: CommandId,
|
||||
@@ -29,7 +31,9 @@ class CommandRoute {
|
||||
}
|
||||
|
||||
@Resource("next")
|
||||
class Next(val commandRoute: CommandRoute)
|
||||
class Next(
|
||||
val commandRoute: CommandRoute,
|
||||
)
|
||||
}
|
||||
|
||||
fun Routing.command() {
|
||||
|
||||
@@ -20,7 +20,9 @@ fun Application.configureHTTP() {
|
||||
}
|
||||
}
|
||||
|
||||
class BadRequestException(val httpError: HttpErrorBadRequest) : Exception()
|
||||
class BadRequestException(
|
||||
val httpError: HttpErrorBadRequest,
|
||||
) : Exception()
|
||||
|
||||
class HttpErrorBadRequest(
|
||||
statusCode: HttpStatusCode,
|
||||
|
||||
@@ -21,7 +21,8 @@ fun Application.configureSockets() {
|
||||
masking = false
|
||||
}
|
||||
routing {
|
||||
webSocket("/ws") { // websocketSession
|
||||
webSocket("/ws") {
|
||||
// websocketSession
|
||||
for (frame in incoming) {
|
||||
if (frame is Frame.Text) {
|
||||
val text = frame.readText()
|
||||
|
||||
@@ -22,48 +22,48 @@ import org.koin.java.KoinJavaComponent.getKoin
|
||||
import org.koin.ktor.ext.inject
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class CardTest : FunSpec({
|
||||
test("/game/{id}/card") {
|
||||
testApplication {
|
||||
val client = httpClient()
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
}
|
||||
val id = GameId()
|
||||
val card: Card = Card.Simple(1, Card.Color.Blue)
|
||||
client.post("/game/$id/card") {
|
||||
contentType(Json)
|
||||
accept(Json)
|
||||
setBody(card)
|
||||
}.apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
class CardTest :
|
||||
FunSpec({
|
||||
test("/game/{id}/card") {
|
||||
testApplication {
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
}
|
||||
val id = GameId()
|
||||
val card: Card = Card.Simple(1, Card.Color.Blue)
|
||||
httpClient()
|
||||
.post("/game/$id/card") {
|
||||
contentType(Json)
|
||||
accept(Json)
|
||||
setBody(card)
|
||||
}.apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
|
||||
val eventStream = getKoin().get<EventStream<GameId>>()
|
||||
assertEquals(PlayCardEvent(id, card), eventStream.read<PlayCardEvent, GameId>(id))
|
||||
val eventStream = getKoin().get<EventStream<GameId>>()
|
||||
assertEquals(PlayCardEvent(id, card), eventStream.read<PlayCardEvent, GameId>(id))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test("/game/{id}/card/last") {
|
||||
testApplication {
|
||||
val client = httpClient()
|
||||
val id = GameId()
|
||||
val card: Card = Card.Simple(1, Card.Color.Blue)
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
val eventStream by inject<EventStream<GameId>>()
|
||||
eventStream.publish(
|
||||
PlayCardEvent(GameId(), Card.Simple(2, Card.Color.Yellow)),
|
||||
PlayCardEvent(id, card),
|
||||
)
|
||||
}
|
||||
test("/game/{id}/card/last") {
|
||||
testApplication {
|
||||
val id = GameId()
|
||||
val card: Card = Card.Simple(1, Card.Color.Blue)
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
val eventStream by inject<EventStream<GameId>>()
|
||||
eventStream.publish(
|
||||
PlayCardEvent(GameId(), Card.Simple(2, Card.Color.Yellow)),
|
||||
PlayCardEvent(id, card),
|
||||
)
|
||||
}
|
||||
|
||||
client.get("/game/$id/card/last").apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
assertEquals(card, this.call.body<Card>())
|
||||
httpClient().get("/game/$id/card/last").apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
assertEquals(card, this.call.body<Card>())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -22,47 +22,49 @@ import org.koin.java.KoinJavaComponent.getKoin
|
||||
import org.koin.ktor.ext.inject
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class CommandTest : FunSpec({
|
||||
test("/command/send") {
|
||||
testApplication {
|
||||
val client = httpClient()
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
}
|
||||
val command = PlayCardCommand(Game.new(), Card.Simple(1, Card.Color.Blue))
|
||||
client.post("/command/send") {
|
||||
contentType(Json)
|
||||
accept(Json)
|
||||
setBody(command)
|
||||
}.apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
class CommandTest :
|
||||
FunSpec({
|
||||
test("/command/send") {
|
||||
testApplication {
|
||||
val client = httpClient()
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
}
|
||||
val command = PlayCardCommand(Game.new(), Card.Simple(1, Card.Color.Blue))
|
||||
client
|
||||
.post("/command/send") {
|
||||
contentType(Json)
|
||||
accept(Json)
|
||||
setBody(command)
|
||||
}.apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
|
||||
val commandStream = getKoin().get<CommandStream>()
|
||||
assertEquals(command, commandStream.readNext())
|
||||
val commandStream = getKoin().get<CommandStream>()
|
||||
assertEquals(command, commandStream.readNext())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test("/command/next") {
|
||||
testApplication {
|
||||
val command =
|
||||
PlayCardCommand(
|
||||
Game.new(),
|
||||
Card.Simple(1, Card.Color.Blue),
|
||||
)
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
test("/command/next") {
|
||||
testApplication {
|
||||
val command =
|
||||
PlayCardCommand(
|
||||
Game.new(),
|
||||
Card.Simple(1, Card.Color.Blue),
|
||||
)
|
||||
application {
|
||||
stopKoin()
|
||||
module()
|
||||
|
||||
val commandStream by inject<CommandStream>()
|
||||
commandStream.sendRequest(command)
|
||||
}
|
||||
val commandStream by inject<CommandStream>()
|
||||
commandStream.sendRequest(command)
|
||||
}
|
||||
|
||||
httpClient().get("/command/next").apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
assertEquals(command, this.call.body<Command>())
|
||||
httpClient().get("/command/next").apply {
|
||||
assertEquals(HttpStatusCode.OK, status, message = bodyAsText())
|
||||
assertEquals(command, this.call.body<Command>())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -9,8 +9,8 @@ import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.modules.SerializersModule
|
||||
import java.util.UUID
|
||||
|
||||
fun ApplicationTestBuilder.httpClient(): HttpClient {
|
||||
return createClient {
|
||||
fun ApplicationTestBuilder.httpClient(): HttpClient =
|
||||
createClient {
|
||||
install(ContentNegotiation) {
|
||||
json(
|
||||
Json {
|
||||
@@ -22,4 +22,3 @@ fun ApplicationTestBuilder.httpClient(): HttpClient {
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user