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 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 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