diff --git a/api/src/Dependencies.kt b/api/src/Dependencies.kt new file mode 100644 index 0000000..c77fcd7 --- /dev/null +++ b/api/src/Dependencies.kt @@ -0,0 +1,21 @@ +package be.vandewalleh + +import be.vandewalleh.features.configurationModule +import be.vandewalleh.migrations.Migration +import be.vandewalleh.services.serviceModule +import me.liuwj.ktorm.database.* +import org.kodein.di.Kodein +import org.kodein.di.generic.bind +import org.kodein.di.generic.instance +import org.kodein.di.generic.singleton +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import javax.sql.DataSource + +val mainModule = Kodein.Module("main") { + import(serviceModule) + import(configurationModule) + bind() with singleton { LoggerFactory.getLogger("Application") } + bind() with singleton { Migration(this.kodein) } + bind() with singleton { Database.connect(this.instance()) } +} diff --git a/api/src/NotesApplication.kt b/api/src/NotesApplication.kt index 7774f5f..e52d240 100644 --- a/api/src/NotesApplication.kt +++ b/api/src/NotesApplication.kt @@ -20,15 +20,13 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import javax.sql.DataSource -val kodein = Kodein { - import(serviceModule) - import(configurationModule) - bind() with singleton { LoggerFactory.getLogger("Application") } - bind() with singleton { Migration(this.kodein) } - bind() with singleton { Database.connect(this.instance()) } -} fun main() { + + val kodein = Kodein{ + import(mainModule) + } + val config by kodein.instance() val logger by kodein.instance() logger.info("Running application with configuration $config") @@ -43,7 +41,7 @@ fun serve(kodein: Kodein) { val logger by kodein.instance() val env = applicationEngineEnvironment { module { - module() + module(kodein) } log = logger connector { @@ -55,7 +53,7 @@ fun serve(kodein: Kodein) { } -fun Application.module() { +fun Application.module(kodein: Kodein) { loadFeatures(kodein) routing { diff --git a/api/src/auth/AuthenticationModule.kt b/api/src/auth/AuthenticationModule.kt index cea8b90..33e3441 100644 --- a/api/src/auth/AuthenticationModule.kt +++ b/api/src/auth/AuthenticationModule.kt @@ -1,12 +1,12 @@ package be.vandewalleh.auth -import be.vandewalleh.kodein import io.ktor.application.* import io.ktor.auth.* import io.ktor.auth.jwt.* +import org.kodein.di.Kodein import org.kodein.di.generic.instance -fun Application.authenticationModule() { +fun Application.authenticationModule(kodein: Kodein) { install(Authentication) { jwt { val simpleJwt by kodein.instance(tag = "auth") diff --git a/api/src/features/Features.kt b/api/src/features/Features.kt index 22be429..cea8bd3 100644 --- a/api/src/features/Features.kt +++ b/api/src/features/Features.kt @@ -11,6 +11,6 @@ fun Application.loadFeatures(kodein: Kodein) { corsFeature() } contentNegotiationFeature() - authenticationModule() + authenticationModule(kodein) handleErrors() } diff --git a/api/test/services/UserServiceTest.kt b/api/test/services/UserServiceTest.kt index 3cfc9a4..d9a6c57 100644 --- a/api/test/services/UserServiceTest.kt +++ b/api/test/services/UserServiceTest.kt @@ -1,18 +1,16 @@ package services +import be.vandewalleh.mainModule import be.vandewalleh.migrations.Migration -import be.vandewalleh.services.NotesService import be.vandewalleh.services.UserService -import com.zaxxer.hikari.HikariConfig -import com.zaxxer.hikari.HikariDataSource -import me.liuwj.ktorm.database.* import org.amshove.kluent.* import org.junit.jupiter.api.* import org.kodein.di.Kodein import org.kodein.di.generic.bind import org.kodein.di.generic.instance import org.kodein.di.generic.singleton -import org.testcontainers.containers.MariaDBContainer +import utils.KMariadbContainer +import utils.testContainerDataSource import javax.sql.DataSource @@ -20,28 +18,11 @@ import javax.sql.DataSource @TestMethodOrder(MethodOrderer.OrderAnnotation::class) class UserServiceTest { - class KMariadbContainer : MariaDBContainer() - - private val mariadb = KMariadbContainer().apply { - this.start() - } - - private val hikariConfig = HikariConfig().apply { - jdbcUrl = mariadb.jdbcUrl - username = mariadb.username - password = mariadb.password - } - - private val dataSource = HikariDataSource(hikariConfig) - - private val db = Database.Companion.connect(dataSource) + private val mariadb = KMariadbContainer().apply { start() } private val kodein = Kodein { - bind() with singleton { dataSource } - bind() with singleton { db } - bind() with singleton { Migration(this.kodein) } - bind() with singleton { UserService(this.kodein) } - bind() with singleton { NotesService(this.kodein) } + import(mainModule, allowOverride = true) + bind(overrides = true) with singleton { testContainerDataSource(mariadb) } } private val migration by kodein.instance() diff --git a/api/test/utils/TestContainers.kt b/api/test/utils/TestContainers.kt new file mode 100644 index 0000000..1254a68 --- /dev/null +++ b/api/test/utils/TestContainers.kt @@ -0,0 +1,18 @@ +package utils + +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import org.testcontainers.containers.MariaDBContainer +import javax.sql.DataSource + +class KMariadbContainer : MariaDBContainer() + +fun testContainerDataSource(container: KMariadbContainer): DataSource { + val hikariConfig = HikariConfig().apply { + jdbcUrl = container.jdbcUrl + username = container.username + password = container.password + } + + return HikariDataSource(hikariConfig) +}