Skip to content

Commit

Permalink
Added AbstractContainerExtension
Browse files Browse the repository at this point in the history
  • Loading branch information
sksamuel committed Jun 18, 2023
1 parent d4a7647 commit 0f6a1ab
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,45 +3,22 @@ package io.kotest.extensions.testcontainers.elastic
import co.elastic.clients.elasticsearch.ElasticsearchClient
import co.elastic.clients.json.jackson.JacksonJsonpMapper
import co.elastic.clients.transport.rest_client.RestClientTransport
import io.kotest.core.extensions.MountableExtension
import io.kotest.core.listeners.AfterProjectListener
import io.kotest.core.listeners.AfterSpecListener
import io.kotest.core.spec.Spec
import io.kotest.extensions.testcontainers.AbstractContainerExtension
import io.kotest.extensions.testcontainers.TestContainerLifecycleMode
import org.apache.http.HttpHost
import org.elasticsearch.client.RestClient
import org.testcontainers.elasticsearch.ElasticsearchContainer
import org.testcontainers.utility.DockerImageName

class ElasticsearchContainerExtension(
private val container: ElasticsearchContainer,
private val mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AfterProjectListener,
AfterSpecListener,
MountableExtension<ElasticsearchContainer, ElasticsearchContainer>,
AutoCloseable {
container: ElasticsearchContainer,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AbstractContainerExtension<ElasticsearchContainer>(container, mode) {

constructor(
image: DockerImageName,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project
) : this(ElasticsearchContainer(image), mode)

override suspend fun afterProject() {
if (container.isRunning) close()
}

override suspend fun afterSpec(spec: Spec) {
if (mode == TestContainerLifecycleMode.Spec && container.isRunning) close()
}

override fun mount(configure: ElasticsearchContainer.() -> Unit): ElasticsearchContainer {
container.start()
return container
}

override fun close() {
container.stop()
}
}

fun ElasticsearchContainer.client(): ElasticsearchClient {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.kotest.extensions.testcontainers.kafka

import io.kotest.core.extensions.MountableExtension
import io.kotest.core.listeners.AfterProjectListener
import io.kotest.core.listeners.AfterSpecListener
import io.kotest.core.spec.Spec
import io.kotest.extensions.testcontainers.AbstractContainerExtension
import io.kotest.extensions.testcontainers.TestContainerLifecycleMode
import org.apache.kafka.clients.CommonClientConfigs
import org.apache.kafka.clients.consumer.ConsumerConfig
Expand All @@ -18,35 +15,14 @@ import org.testcontainers.utility.DockerImageName
import java.util.Properties

class KafkaContainerExtension(
private val container: KafkaContainer,
private val mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AfterProjectListener,
AfterSpecListener,
MountableExtension<KafkaContainer, KafkaContainer>,
AutoCloseable {
container: KafkaContainer,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AbstractContainerExtension<KafkaContainer>(container, mode) {

constructor(
image: DockerImageName,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project
) : this(KafkaContainer(image), mode)

override suspend fun afterProject() {
if (container.isRunning) close()
}

override suspend fun afterSpec(spec: Spec) {
if (mode == TestContainerLifecycleMode.Spec && container.isRunning) close()
}

override fun mount(configure: KafkaContainer.() -> Unit): KafkaContainer {
container.configure()
container.start()
return container
}

override fun close() {
container.stop()
}
}

fun KafkaContainer.producer(configure: Properties.() -> Unit = {}): KafkaProducer<Bytes, Bytes> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.common.utils.Bytes
import org.testcontainers.containers.KafkaContainer
import org.testcontainers.utility.DockerImageName
import java.time.Duration

class KafkaTestContainerExtensionTest : FunSpec({

val container =
install(KafkaContainerExtension(KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:5.4.3"))))
val container = install(KafkaContainerExtension(DockerImageName.parse("confluentinc/cp-kafka:5.4.3")))

test("happy path") {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
package io.kotest.extensions.testcontainers.localstack

import io.kotest.core.extensions.MountableExtension
import io.kotest.core.listeners.AfterProjectListener
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import io.kotest.extensions.testcontainers.AbstractContainerExtension
import io.kotest.extensions.testcontainers.TestContainerLifecycleMode
import org.testcontainers.containers.localstack.LocalStackContainer
import org.testcontainers.utility.DockerImageName

class LocalStackContainerExtension(
private val container: LocalStackContainer,
) : AfterProjectListener, MountableExtension<LocalStackContainer, LocalStackContainer> {
container: LocalStackContainer,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AbstractContainerExtension<LocalStackContainer>(container, mode) {

constructor() : this(LocalStackContainer(DockerImageName.parse("localstack/localstack:0.11.3")))

override suspend fun afterProject() {
if (container.isRunning) withContext(Dispatchers.IO) { container.stop() }
}

override fun mount(configure: LocalStackContainer.() -> Unit): LocalStackContainer {
container.configure()
container.start()
return container
}
constructor(
image: DockerImageName,
mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project
) : this(LocalStackContainer(image), mode)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.kotest.extensions.testcontainers

import io.kotest.core.extensions.MountableExtension
import io.kotest.core.listeners.AfterProjectListener
import io.kotest.core.listeners.AfterSpecListener
import io.kotest.core.spec.Spec
import org.testcontainers.containers.GenericContainer

abstract class AbstractContainerExtension<T : GenericContainer<T>>(
private val container: T,
private val mode: TestContainerLifecycleMode = TestContainerLifecycleMode.Project,
) : AfterProjectListener,
AfterSpecListener,
MountableExtension<T, T>,
AutoCloseable {

override fun mount(configure: T.() -> Unit): T {
container.start()
container.configure()
return container
}

final override suspend fun afterProject() {
if (container.isRunning) close()
}

final override suspend fun afterSpec(spec: Spec) {
if (mode == TestContainerLifecycleMode.Spec && container.isRunning) close()
}

final override fun close() {
container.stop()
}
}

0 comments on commit 0f6a1ab

Please sign in to comment.