Hello to everyone, I just started learning kotlin ...
# getting-started
a
Hello to everyone, I just started learning kotlin and writing a simple ktor application, I was trying to use testcontainer to test my exposed database layer but I don't understand why this code is not working:
Copy code
package it.adami.services.blog.repository

import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.shouldBe
import it.adami.services.blog.model.User
import it.adami.services.blog.model.UserStatus
import it.adami.services.blog.repository.ExposedUserRepository
import it.adami.services.blog.repository.TestDatabase
import it.adami.services.blog.repository.UserRepository
import kotlinx.coroutines.runBlocking
import java.time.Instant
import javax.sql.DataSource
import kotlin.test.BeforeTest
import org.jetbrains.exposed.sql.Database

class ExposedUserRepositoryTest : AnnotationSpec() {

    private lateinit var dataSource: DataSource
    private lateinit var repository: UserRepository

    @BeforeTest
    fun setUp() {
        println("here") // Ensure setUp() is being executed
        // Initialize the database connection via TestDatabase
        dataSource = TestDatabase.setup()  // Ensure this is called first

        // Make sure the database connection is active
        Database.connect(dataSource)

        // Initialize the repository
        repository = ExposedUserRepository()
    }

    @Test
    fun `create user successfully`() = runBlocking {
        val user = User(
            id = -1,
            name = "test",
            surname = "test",
            email = "<mailto:test@test.it|test@test.it>",
            password = "test",
            status = UserStatus.PENDING,
            createdAt = Instant.now(),
            updatedAt = Instant.now()
        )
        val result = repository.create(user)
        result shouldBe null  // Kotest matcher to verify the result
    }
}
It seems that setUp() is not called, Am i missing someghing?
r
You should be using
@BeforeEach
or
@BeforeAll
not
@BeforeTest
kotlin.test.BeforeTest
is not intended to work with
io.kotest.core.spec.style.AnnotationSpec
, they are different libraries. See https://kotest.io/docs/framework/testing-styles.html#annotation-spec
a
Yeah, finally i fixed that using WordSpec:
Copy code
package it.adami.services.blog.repository

import io.kotest.core.spec.style.WordSpec
import io.kotest.matchers.shouldNotBe
import it.adami.services.blog.model.User
import it.adami.services.blog.model.UserStatus
import org.jetbrains.exposed.sql.transactions.transaction
import java.time.Instant

class ExposedUserRepositoryTest : WordSpec({

    lateinit var repository: UserRepository

    beforeTest {
        TestDatabase.setup()
        repository = ExposedUserRepository()
    }

    afterTest {
        transaction {
            exec("TRUNCATE TABLE users;")
        }
    }

    "ExposedUserRepository" should {
        "create successfully a user and return a new id" {
            val user = User(
                id = -1,
                name = "test",
                surname = "test",
                email = "<mailto:test@test.it|test@test.it>",
                password = "test",
                status = UserStatus.PENDING,
                createdAt = Instant.now(),
                updatedAt = Instant.now()
            )
            val result = repository.create(user)
            result shouldNotBe  null
        }
    }

})
thanks for the help!
r
BTW there's a #CT0G9SD7Z channel where you will get better kotest support
a
Thank you!