From 15aa244b70503ec404da79751da13a9ad20a3aa7 Mon Sep 17 00:00:00 2001
From: ccornu <ccornu@takima.fr>
Date: Mon, 10 Feb 2025 15:49:06 +0100
Subject: [PATCH] feat: fix integration tests

---
 .../docker/dynamodb/shared-local-instance.db  | Bin 0 -> 57344 bytes
 src/main/kotlin/Application.kt                |   2 --
 .../ApiDocumentationConfiguration.kt          |  11 -------
 .../configuration/DynamoDbConfiguration.kt    |  11 ++++++-
 src/main/resources/openapi/documentation.yaml |  23 --------------
 src/test/kotlin/BaseIntegrationTest.kt        |  29 ++++--------------
 src/test/kotlin/TestApplication.kt            |  19 ++++++++++++
 src/test/kotlin/TestInjectionConfiguration.kt |  10 ------
 .../kotlin/player/PlayerIntegrationTest.kt    |   9 +++---
 src/test/resources/application-test.yaml      |   8 +++++
 10 files changed, 47 insertions(+), 75 deletions(-)
 create mode 100644 docker/db/docker/dynamodb/shared-local-instance.db
 delete mode 100644 src/main/kotlin/configuration/ApiDocumentationConfiguration.kt
 delete mode 100644 src/main/resources/openapi/documentation.yaml
 create mode 100644 src/test/kotlin/TestApplication.kt
 delete mode 100644 src/test/kotlin/TestInjectionConfiguration.kt
 create mode 100644 src/test/resources/application-test.yaml

diff --git a/docker/db/docker/dynamodb/shared-local-instance.db b/docker/db/docker/dynamodb/shared-local-instance.db
new file mode 100644
index 0000000000000000000000000000000000000000..d26d270ffd2ecfc6d03c96bea43216035c52cac1
GIT binary patch
literal 57344
zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCU|?ckVBljw01%r6!DV1XV&h^mG3e<8
z@baHv;N|3E;J?7Tj(;)Fb>2?yD?FRHWx4XXesC6XnQ?OA(mpCa8UmvsFd71*Aut*O
zqaiRF0<;W)G+uUbT~)?L_RPGL)QW(d#LCnn*SwO<l1eR)Fi&JYpL39_V~DGQr=N>!
zgn|;X6iBI(g1;ZCsFH$4Mq+VBSYl3Ts%E1jH@mp1Dr1vtNn%n?Dza{5HV@R25Jx8;
zSFFZ)r&cP2xJHC1xVXAGhWdmk_=WoT=qSK#QgHI|cT({4he>3Xq~-=^R;4O<`h~c<
zy9UAa8R#hZCuOB3mv{yH`=RR!2=erG42o3nc8vsk!aKE6Q`4M>P25|RkpUc3#f3SU
zC8_a=r6u`bemt@_;ti2`yp3#}?BargjE&`B&zBUH6mg+=w4_KuBcv!XuQ)NeBr`wH
zGX?BL9R(z@;LP;A#FEmYRIpQZ6r77v6G3WS5=&A;GIQbn(@{WnJCXsODVmzfTx{az
zg1CH8QWS4kQpDY8!U1+|Q!v=IrNyPioG7j>EmqJ7E-6Y)%=L7EIy5*Vu_y(>OD!x-
z%}Y-8E6q(xErNwSJ~u;*3rbDSFG_)W(7zzH2<*d<%7Rp=HOO8IMzKUwvoV?t?CfSm
zu(OMci;LM&oLx-F*|>w$B{e4%dtiI!WtL<n=Ab$zxFoTt1mSH|N!Pp-gj7IcQEFZZ
zYUrVO5)!VOn#%0>Vy?J2-mtisqfws)90X0CkRZq{&Sganf?Uj)14m?VNn%N9F*KAz
zKsnSeF&7r<kjU}OOUs8w4LJdY;w!M7o-Uf2%B*<3l^btZoXgf+#02(MyFb`lDY+@R
z%qZSU$yLxmcQkG{`Xm;YxTGc*r6v}qf^rWcHb63-dDvtiDcL^_rmr|8KP9mep))8o
zF~vEtATc?!q%t%wv!oay6<(BCl8QqP>}aHbb;``i$;?al%};^nXXNrKAh9wawI~Rb
z@QX`8PDjr8$O>WUHJ~WJBo$nwxaNT(6`u0&D-JD4K`T{|)%zw^fV>NJ28wUdl!3iY
zNF8#*0EY)C<!NdvGviAcDY@~6DY>A2IR~hA)MI1=m9LOwpPZJQ#)OhSlG7A4%2JDp
zGxPJnNnDecfq{XM{~H7UH<0d8JQ@O{Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF
z0;3@?d_sVOkx8=5NY6yi0NnrQlVsqN96r7q^~q=mjE2By2#kinXb6mkz-S1JhQMeD
zjE2By2#kgR2_ev&!YH81$^imxIh?Gbtc;AvD|r~Fy!Q@vtyXd@DJjZKDlJJZR<epl
z;)15Gm8_Hsic?Ed@|AQD>OgB)l&qA3m1<*kl-z?oeKLznl&qp59GBGMWP|`@ZMr9D
zIhK-DwG!9@m&&}v+<X@&xV<15IEM&Zb(FkQE1{0?a18cP(ourg<D8#UnwtkT0knw9
zJGBxn>5^EI2-O5ya-~!oTdSiKnwMEvnhJIw)cb?Rbuh=d2YVvi7h4O7wY<`t90=?G
zf6&r<M*a^B{2xe28>31`Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz129
z2=Ftjaw3o8fad=h1O~N}M;$jB0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*
zAwXdWfad>4`~MUM;;8n~5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c<RLIR
z|3AnhXw-S5Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3^7g%B8>|EEGAjv6r<
z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71bJOoDP{|9*ljXG~M1V%$(Gz3ON
zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E1%5CWt9e<}pxs1c(fFd71*Aut*OqaiRF0;3@?
z8UmvsFd71*Aut*OqaiTJLtu3M{~(W`QRj_@z-S1JhQMeDjE2By2#kinXb6mkz-S1J
zhQMeDjD`ReLSS_Mp9+CEYQ$&=jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb24Q
z5Ez~RALJ1<>b%hq7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GZ|Q2#ogssSt>x
pMvR8QXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQJ^X0RS7L`XK-S

literal 0
HcmV?d00001

diff --git a/src/main/kotlin/Application.kt b/src/main/kotlin/Application.kt
index cca5f44..024521d 100644
--- a/src/main/kotlin/Application.kt
+++ b/src/main/kotlin/Application.kt
@@ -1,6 +1,5 @@
 package betclic.test
 
-import betclic.test.configuration.configureHTTP
 import betclic.test.configuration.configureKoin
 import betclic.test.configuration.configureRouting
 import betclic.test.configuration.configureSerialization
@@ -18,7 +17,6 @@ fun Application.module() {
 }
 
 fun Application.configuration() {
-    configureHTTP()
     configureKoin()
     configureSerialization()
     configureRouting()
diff --git a/src/main/kotlin/configuration/ApiDocumentationConfiguration.kt b/src/main/kotlin/configuration/ApiDocumentationConfiguration.kt
deleted file mode 100644
index ed88a96..0000000
--- a/src/main/kotlin/configuration/ApiDocumentationConfiguration.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package betclic.test.configuration
-
-import io.ktor.server.application.*
-import io.ktor.server.plugins.openapi.*
-import io.ktor.server.routing.*
-
-fun Application.configureHTTP() {
-    routing {
-        openAPI(path = "openapi")
-    }
-}
diff --git a/src/main/kotlin/configuration/DynamoDbConfiguration.kt b/src/main/kotlin/configuration/DynamoDbConfiguration.kt
index 59107e3..2ebb6fb 100644
--- a/src/main/kotlin/configuration/DynamoDbConfiguration.kt
+++ b/src/main/kotlin/configuration/DynamoDbConfiguration.kt
@@ -4,12 +4,21 @@ import org.slf4j.LoggerFactory
 import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient
 import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient
 import java.net.URI
+import software.amazon.awssdk.regions.Region
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
 
 class DynamoDbConfiguration {
     private val logger = LoggerFactory.getLogger(DynamoDbConfiguration::class.java)
 
     fun createDynamoDbClient(): DynamoDbAsyncClient {
-        return DynamoDbAsyncClient.builder().endpointOverride(URI("http://localhost:8000")).build()
+        return DynamoDbAsyncClient.builder()
+            .endpointOverride(URI("http://localhost:8000"))
+            .region(Region.US_EAST_1)
+            .credentialsProvider(
+                StaticCredentialsProvider.create(AwsBasicCredentials.create("dummy", "dummy"))
+            )
+            .build()
     }
 
     fun createDataSource(dynamoDbAsyncClient: DynamoDbAsyncClient): DynamoDbEnhancedAsyncClient {
diff --git a/src/main/resources/openapi/documentation.yaml b/src/main/resources/openapi/documentation.yaml
deleted file mode 100644
index 6f48d7b..0000000
--- a/src/main/resources/openapi/documentation.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-openapi: "3.0.3"
-info:
-  title: "Application API"
-  description: "Application API"
-  version: "1.0.0"
-servers:
-  - url: "http://0.0.0.0:8080"
-paths:
-  /:
-    get:
-      description: "Hello World!"
-      responses:
-        "200":
-          description: "OK"
-          content:
-            text/plain:
-              schema:
-                type: "string"
-              examples:
-                Example#1:
-                  value: "Hello World!"
-components:
-  schemas: { }
\ No newline at end of file
diff --git a/src/test/kotlin/BaseIntegrationTest.kt b/src/test/kotlin/BaseIntegrationTest.kt
index 693ffe0..da696fa 100644
--- a/src/test/kotlin/BaseIntegrationTest.kt
+++ b/src/test/kotlin/BaseIntegrationTest.kt
@@ -1,29 +1,12 @@
-import betclic.test.configuration.testDatabaseModule
-import betclic.test.initialize
-import betclic.test.module
+import io.ktor.server.config.*
 import io.ktor.server.testing.*
-import org.koin.core.context.loadKoinModules
 import org.koin.test.KoinTest
-import kotlin.test.AfterTest
-import kotlin.test.BeforeTest
 
 abstract class BaseIntegrationTest : KoinTest {
-
-    protected val application = TestApplication {
-        application {
-            module()
-            // override Database module with testContainers
-            loadKoinModules(testDatabaseModule)
-            initialize()
+    fun iTest(test: suspend ApplicationTestBuilder.() -> Unit) = testApplication {
+        environment {
+            config = ApplicationConfig("application-test.yaml")
         }
+        test()
     }
-
-    @BeforeTest
-    fun setup() {
-    }
-
-    @AfterTest
-    fun tearDown() {
-        TestDynamoDbConfiguration.localStack.stop()
-    }
-}
+}
\ No newline at end of file
diff --git a/src/test/kotlin/TestApplication.kt b/src/test/kotlin/TestApplication.kt
new file mode 100644
index 0000000..0380507
--- /dev/null
+++ b/src/test/kotlin/TestApplication.kt
@@ -0,0 +1,19 @@
+import betclic.test.configuration
+import betclic.test.configuration.DynamoDbMigrationService
+import betclic.test.initialize
+import io.ktor.server.application.*
+import org.koin.core.context.loadKoinModules
+import org.koin.dsl.module
+
+fun Application.module() {
+    configuration()
+    // override Database module with testContainers
+    loadKoinModules(testDatabaseModule)
+    initialize()
+}
+
+val testDatabaseModule = module {
+    single { TestDynamoDbConfiguration.createDynamoDbClient() }
+    single { TestDynamoDbConfiguration.createDataSource(get()) }
+    single { DynamoDbMigrationService() }
+}
\ No newline at end of file
diff --git a/src/test/kotlin/TestInjectionConfiguration.kt b/src/test/kotlin/TestInjectionConfiguration.kt
deleted file mode 100644
index 9401558..0000000
--- a/src/test/kotlin/TestInjectionConfiguration.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package betclic.test.configuration
-
-import TestDynamoDbConfiguration
-import org.koin.dsl.module
-
-val testDatabaseModule = module {
-    single { TestDynamoDbConfiguration.createDynamoDbClient() }
-    single { TestDynamoDbConfiguration.createDataSource(get()) }
-    single { DynamoDbMigrationService() }
-}
\ No newline at end of file
diff --git a/src/test/kotlin/player/PlayerIntegrationTest.kt b/src/test/kotlin/player/PlayerIntegrationTest.kt
index 1fa6f2a..ea7d9bb 100644
--- a/src/test/kotlin/player/PlayerIntegrationTest.kt
+++ b/src/test/kotlin/player/PlayerIntegrationTest.kt
@@ -4,7 +4,6 @@ import BaseIntegrationTest
 import betclic.test.player.PlayerRepository
 import io.ktor.client.request.*
 import io.ktor.http.*
-import io.ktor.server.testing.*
 import org.assertj.core.api.Assertions.assertThat
 import org.junit.Test
 import org.koin.test.inject
@@ -15,16 +14,16 @@ private const val PLAYER_NAME = "Clement"
 
 class PlayerIntegrationTest : BaseIntegrationTest() {
 
-    private val playerRepository: PlayerRepository by inject()
-
     @Test
-    fun `When calling player creation, a player should be saved in DB`() = testApplication {
-        val response = application.client.post("/players") {
+    fun `When calling player creation, a player should be saved in DB`() = iTest {
+        val response = client.post("/players") {
             header(HttpHeaders.ContentType, ContentType.Text.Plain)
             setBody(PLAYER_NAME)
         }
 
         assertEquals(HttpStatusCode.Created, response.status)
+
+        val playerRepository: PlayerRepository by inject()
         val players = playerRepository.findAll()
         assertThat(players).hasSize(1)
         assertThat(players.first()).extracting("pseudo", "pointsNumber")
diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml
new file mode 100644
index 0000000..2e745a4
--- /dev/null
+++ b/src/test/resources/application-test.yaml
@@ -0,0 +1,8 @@
+ktor:
+  application:
+    modules:
+      - betclic.test.TestApplicationKt.module
+  deployment:
+    port: 8081
+  database:
+    dynamodbUrl: "dynamic-test-url"
\ No newline at end of file
-- 
GitLab