Skip to content

Commit 2043ba4

Browse files
authored
ser/de abstraction (#654)
Ser/de interface created and applied to the projects except kafka
1 parent 179f0e2 commit 2043ba4

File tree

40 files changed

+717
-357
lines changed

40 files changed

+717
-357
lines changed

examples/ktor-example/src/test/kotlin/com/stove/ktor/example/e2e/TestSystemConfig.kt renamed to examples/ktor-example/src/test/kotlin/com/stove/ktor/example/e2e/Stove.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import io.kotest.core.extensions.Extension
1010
import io.kotest.extensions.system.SystemEnvironmentProjectListener
1111
import stove.ktor.example.app.objectMapperRef
1212

13-
class TestSystemConfig : AbstractProjectConfig() {
13+
class Stove : AbstractProjectConfig() {
1414
companion object {
1515
init {
1616
stoveKafkaBridgePortDefault = "50053"

examples/spring-example/src/test/kotlin/com/stove/spring/example/e2e/TestSystemConfig.kt renamed to examples/spring-example/src/test/kotlin/com/stove/spring/example/e2e/Stove.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.trendyol.stove.testing.e2e.wiremock.*
99
import io.kotest.core.config.AbstractProjectConfig
1010
import org.slf4j.*
1111

12-
class TestSystemConfig : AbstractProjectConfig() {
12+
class Stove : AbstractProjectConfig() {
1313
private val logger: Logger = LoggerFactory.getLogger("WireMockMonitor")
1414

1515
@Suppress("LongMethod")

examples/spring-standalone-example/src/test/kotlin/com/stove/spring/standalone/example/e2e/TestSystemConfig.kt renamed to examples/spring-standalone-example/src/test/kotlin/com/stove/spring/standalone/example/e2e/Stove.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import io.kotest.core.config.AbstractProjectConfig
1010
import org.slf4j.*
1111
import stove.spring.standalone.example.infrastructure.ObjectMapperConfig
1212

13-
class TestSystemConfig : AbstractProjectConfig() {
13+
class Stove : AbstractProjectConfig() {
1414
private val logger: Logger = LoggerFactory.getLogger("WireMockMonitor")
1515

1616
@Suppress("LongMethod")

examples/spring-streams-example/src/test/kotlin/com/stove/spring/streams/example/e2e/TestSystemConfig.kt renamed to examples/spring-streams-example/src/test/kotlin/com/stove/spring/streams/example/e2e/Stove.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import com.trendyol.stove.testing.e2e.system.TestSystem.Companion.validate
1010
import io.kotest.core.config.AbstractProjectConfig
1111
import org.apache.kafka.clients.admin.NewTopic
1212

13-
class TestSystemConfig : AbstractProjectConfig() {
13+
class Stove : AbstractProjectConfig() {
1414
@Suppress("LongMethod")
1515
override suspend fun beforeProject(): Unit = TestSystem()
1616
.also {

gradle/libs.versions.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ kotlinx-slf4j = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j", ver
6161
kotlinx-knit = { module = "org.jetbrains.kotlinx:kotlinx-knit", version.ref = "knit" }
6262
kotlinx-io-reactor = { module = "io.projectreactor:reactor-core", version.ref = "io-reactor" }
6363
kotlinx-io-reactor-extensions = { module = "io.projectreactor.kotlin:reactor-kotlin-extensions", version.ref = "io-reactor-extensions" }
64+
kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", version = "1.7.3" }
6465

6566
# Arrow
6667
arrow-core = { module = "io.arrow-kt:arrow-core", version.ref = "arrow" }
@@ -131,10 +132,13 @@ elastic = { module = "co.elastic.clients:elasticsearch-java", version.ref = "ela
131132

132133
# mongo
133134
mongodb-kotlin-coroutine = { module = "org.mongodb:mongodb-driver-kotlin-coroutine", version.ref = "mongodb" }
135+
mongojack = { module = "org.mongojack:mongojack", version = "5.0.2" }
134136

135137
# misc
136138
lettuce-core = { module = "io.lettuce:lettuce-core", version = "6.5.0.RELEASE" }
137139
logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.12" }
140+
logback-core = { module = "ch.qos.logback:logback-core", version = "1.5.12" }
141+
log4j-slf4j2-impl = { module = "org.apache.logging.log4j:log4j-slf4j2-impl", version = "2.24.2" }
138142
r2dbc-mssql = { module = "io.r2dbc:r2dbc-mssql", version.ref = "r2dbc-mssql" }
139143
microsoft-sqlserver-jdbc = { module = "com.microsoft.sqlserver:mssql-jdbc", version = "12.8.1.jre11" }
140144
exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" }
@@ -186,6 +190,8 @@ google-protobuf-kotlin = { module = "com.google.protobuf:protobuf-kotlin", versi
186190
protoc = { module = "com.google.protobuf:protoc", version.ref = "google-protobuf" }
187191
hoplite = { module = "com.sksamuel.hoplite:hoplite-core", version.ref = "hoplite" }
188192
hoplite-yaml = { module = "com.sksamuel.hoplite:hoplite-yaml", version.ref = "hoplite" }
193+
google-gson = { module = "com.google.code.gson:gson", version = "2.11.0" }
194+
189195

190196
caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version = "3.1.8" }
191197
pprint = { module = "io.exoquery:pprint-kotlin", version = "2.0.2" }
@@ -237,5 +243,6 @@ gradle-release = { id = "net.researchgate.release", version.ref = "gradle-releas
237243
nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexusPublish" }
238244
testLogger = { id = "com.adarshr.test-logger", version = "4.0.0" }
239245
protobuf = { id = "com.google.protobuf", version = "0.9.4" }
246+
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
240247

241248

lib/stove-testing-e2e-couchbase/src/main/kotlin/com/trendyol/stove/testing/e2e/couchbase/CouchbaseSystem.kt

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.trendyol.stove.testing.e2e.couchbase
22

33
import com.couchbase.client.kotlin.*
4-
import com.couchbase.client.kotlin.Collection
5-
import com.couchbase.client.kotlin.codec.*
4+
import com.couchbase.client.kotlin.codec.typeRef
65
import com.couchbase.client.kotlin.query.*
7-
import com.fasterxml.jackson.databind.ObjectMapper
86
import com.trendyol.stove.functional.*
97
import com.trendyol.stove.testing.e2e.system.TestSystem
108
import com.trendyol.stove.testing.e2e.system.abstractions.*
9+
import kotlinx.coroutines.flow.*
1110
import kotlinx.coroutines.runBlocking
1211
import org.slf4j.*
1312

@@ -20,10 +19,7 @@ class CouchbaseSystem internal constructor(
2019
internal lateinit var cluster: Cluster
2120

2221
@PublishedApi
23-
internal lateinit var collection: Collection
24-
25-
@PublishedApi
26-
internal val objectMapper: ObjectMapper = context.options.objectMapper
22+
internal lateinit var collection: com.couchbase.client.kotlin.Collection
2723

2824
private lateinit var exposedConfiguration: CouchbaseExposedConfiguration
2925
private val logger: Logger = LoggerFactory.getLogger(javaClass)
@@ -59,17 +55,15 @@ class CouchbaseSystem internal constructor(
5955
query: String,
6056
assertion: (List<T>) -> Unit
6157
): CouchbaseSystem {
62-
val result = cluster.query(
63-
statement = query,
64-
metrics = false,
65-
consistency = QueryScanConsistency.requestPlus()
66-
).execute().rows.map { it.contentAs<T>() }
67-
val objects = result
68-
.map { objectMapper.writeValueAsString(it) }
69-
.map { objectMapper.readValue(it, T::class.java) }
70-
71-
assertion(objects)
72-
return this
58+
val typeRef = typeRef<T>()
59+
return flow {
60+
cluster.query(
61+
statement = query,
62+
metrics = false,
63+
consistency = QueryScanConsistency.requestPlus(),
64+
serializer = context.options.clusterSerDe
65+
).execute { row -> emit(context.options.clusterSerDe.deserialize(row.content, typeRef)) }
66+
}.toList().also(assertion).let { this }
7367
}
7468

7569
@CouchbaseDsl
@@ -174,16 +168,13 @@ class CouchbaseSystem internal constructor(
174168
}
175169
}
176170

177-
private fun createCluster(exposedConfiguration: CouchbaseExposedConfiguration): Cluster {
178-
val jackson = JacksonJsonSerializer(objectMapper)
179-
return Cluster.connect(
180-
exposedConfiguration.hostsWithPort,
181-
exposedConfiguration.username,
182-
exposedConfiguration.password
183-
) {
184-
jsonSerializer = jackson
185-
transcoder = JsonTranscoder(jackson)
186-
}
171+
private fun createCluster(exposedConfiguration: CouchbaseExposedConfiguration): Cluster = Cluster.connect(
172+
exposedConfiguration.hostsWithPort,
173+
exposedConfiguration.username,
174+
exposedConfiguration.password
175+
) {
176+
jsonSerializer = context.options.clusterSerDe
177+
transcoder = context.options.clusterTranscoder
187178
}
188179

189180
companion object {

lib/stove-testing-e2e-couchbase/src/main/kotlin/com/trendyol/stove/testing/e2e/couchbase/Options.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package com.trendyol.stove.testing.e2e.couchbase
22

33
import arrow.core.getOrElse
44
import com.couchbase.client.kotlin.Cluster
5-
import com.fasterxml.jackson.databind.ObjectMapper
5+
import com.couchbase.client.kotlin.codec.*
66
import com.trendyol.stove.testing.e2e.containers.*
77
import com.trendyol.stove.testing.e2e.database.migrations.*
8-
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
8+
import com.trendyol.stove.testing.e2e.serialization.E2eObjectMapperConfig
99
import com.trendyol.stove.testing.e2e.system.*
1010
import com.trendyol.stove.testing.e2e.system.abstractions.*
1111
import com.trendyol.stove.testing.e2e.system.annotations.StoveDsl
@@ -22,7 +22,8 @@ data class CouchbaseExposedConfiguration(
2222
data class CouchbaseSystemOptions(
2323
val defaultBucket: String,
2424
val containerOptions: CouchbaseContainerOptions = CouchbaseContainerOptions(),
25-
val objectMapper: ObjectMapper = StoveObjectMapper.Default,
25+
val clusterSerDe: JsonSerializer = JacksonJsonSerializer(E2eObjectMapperConfig.createObjectMapperWithDefaults()),
26+
val clusterTranscoder: Transcoder = JsonTranscoder(clusterSerDe),
2627
override val configureExposedConfiguration: (CouchbaseExposedConfiguration) -> List<String>
2728
) : SystemOptions, ConfiguresExposedConfiguration<CouchbaseExposedConfiguration> {
2829
internal val migrationCollection: MigrationCollection<Cluster> = MigrationCollection()

lib/stove-testing-e2e-elasticsearch/src/main/kotlin/com/trendyol/stove/testing/e2e/elasticsearch/ElasticsearchSystem.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient
55
import co.elastic.clients.elasticsearch._types.Refresh
66
import co.elastic.clients.elasticsearch._types.query_dsl.Query
77
import co.elastic.clients.elasticsearch.core.*
8-
import co.elastic.clients.json.jackson.JacksonJsonpMapper
98
import co.elastic.clients.transport.rest_client.RestClientTransport
109
import com.trendyol.stove.functional.*
1110
import com.trendyol.stove.testing.e2e.system.TestSystem
@@ -177,7 +176,7 @@ class ElasticsearchSystem internal constructor(
177176
private fun createEsClient(exposedConfiguration: ElasticSearchExposedConfiguration): ElasticsearchClient =
178177
context.options.clientConfigurer.restClientOverrideFn
179178
.getOrElse { { cfg -> restClient(cfg) } }
180-
.let { RestClientTransport(it(exposedConfiguration), JacksonJsonpMapper(context.options.objectMapper)) }
179+
.let { RestClientTransport(it(exposedConfiguration), context.options.jsonpMapper) }
181180
.let { ElasticsearchClient(it) }
182181

183182
private fun restClient(cfg: ElasticSearchExposedConfiguration): RestClient =

lib/stove-testing-e2e-elasticsearch/src/main/kotlin/com/trendyol/stove/testing/e2e/elasticsearch/Extensions.kt

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.trendyol.stove.testing.e2e.elasticsearch
22

33
import arrow.core.getOrElse
4-
import arrow.integrations.jackson.module.registerArrowModule
54
import com.trendyol.stove.testing.e2e.containers.withProvidedRegistry
65
import com.trendyol.stove.testing.e2e.system.*
76
import com.trendyol.stove.testing.e2e.system.abstractions.SystemNotRegisteredException
@@ -13,26 +12,22 @@ import com.trendyol.stove.testing.e2e.system.annotations.StoveDsl
1312
* Provides an [options] class to configure the Elasticsearch container.
1413
* You can configure it by changing the implementation of migrator.
1514
*/
16-
internal fun TestSystem.withElasticsearch(options: ElasticsearchSystemOptions): TestSystem {
17-
options.objectMapper.registerArrowModule()
18-
19-
return withProvidedRegistry(
20-
imageName = options.container.imageWithTag,
21-
registry = options.container.registry,
22-
compatibleSubstitute = options.container.compatibleSubstitute
23-
) { StoveElasticSearchContainer(it) }
24-
.apply {
25-
addExposedPorts(*options.container.exposedPorts.toIntArray())
26-
withPassword(options.container.password)
27-
if (options.container.disableSecurity) {
28-
withEnv("xpack.security.enabled", "false")
29-
}
30-
withReuse(this@withElasticsearch.options.keepDependenciesRunning)
31-
options.container.containerFn(this)
15+
internal fun TestSystem.withElasticsearch(options: ElasticsearchSystemOptions): TestSystem = withProvidedRegistry(
16+
imageName = options.container.imageWithTag,
17+
registry = options.container.registry,
18+
compatibleSubstitute = options.container.compatibleSubstitute
19+
) { StoveElasticSearchContainer(it) }
20+
.apply {
21+
addExposedPorts(*options.container.exposedPorts.toIntArray())
22+
withPassword(options.container.password)
23+
if (options.container.disableSecurity) {
24+
withEnv("xpack.security.enabled", "false")
3225
}
33-
.let { getOrRegister(ElasticsearchSystem(this, ElasticsearchContext(it, options))) }
34-
.let { this }
35-
}
26+
withReuse(this@withElasticsearch.options.keepDependenciesRunning)
27+
options.container.containerFn(this)
28+
}
29+
.let { getOrRegister(ElasticsearchSystem(this, ElasticsearchContext(it, options))) }
30+
.let { this }
3631

3732
internal fun TestSystem.elasticsearch(): ElasticsearchSystem =
3833
getOrNone<ElasticsearchSystem>().getOrElse {

lib/stove-testing-e2e-elasticsearch/src/main/kotlin/com/trendyol/stove/testing/e2e/elasticsearch/Options.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package com.trendyol.stove.testing.e2e.elasticsearch
22

33
import arrow.core.*
44
import co.elastic.clients.elasticsearch.ElasticsearchClient
5-
import com.fasterxml.jackson.databind.ObjectMapper
5+
import co.elastic.clients.json.JsonpMapper
6+
import co.elastic.clients.json.jackson.JacksonJsonpMapper
67
import com.trendyol.stove.testing.e2e.containers.*
78
import com.trendyol.stove.testing.e2e.database.migrations.*
8-
import com.trendyol.stove.testing.e2e.serialization.StoveObjectMapper
9+
import com.trendyol.stove.testing.e2e.serialization.*
910
import com.trendyol.stove.testing.e2e.system.abstractions.*
1011
import com.trendyol.stove.testing.e2e.system.annotations.StoveDsl
1112
import org.apache.http.client.config.RequestConfig
@@ -19,7 +20,7 @@ import kotlin.time.Duration.Companion.minutes
1920
data class ElasticsearchSystemOptions(
2021
val clientConfigurer: ElasticClientConfigurer = ElasticClientConfigurer(),
2122
val container: ElasticContainerOptions = ElasticContainerOptions(),
22-
val objectMapper: ObjectMapper = StoveObjectMapper.Default,
23+
val jsonpMapper: JsonpMapper = JacksonJsonpMapper(StoveSerde.jackson.default),
2324
override val configureExposedConfiguration: (ElasticSearchExposedConfiguration) -> List<String>
2425
) : SystemOptions, ConfiguresExposedConfiguration<ElasticSearchExposedConfiguration> {
2526
internal val migrationCollection: MigrationCollection<ElasticsearchClient> = MigrationCollection()

0 commit comments

Comments
 (0)