Skip to content

Commit 41527a9

Browse files
author
Oleksandr Dzhychko
committed
build(model-server): use Testcontainers for tests with PostgreSQL
1 parent 937657b commit 41527a9

File tree

6 files changed

+55
-46
lines changed

6 files changed

+55
-46
lines changed

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ dokka = "1.9.20"
4040
detekt = "1.23.6"
4141
xmlunit = "2.10.0"
4242
kotest = "5.9.1"
43+
testcontainers = "1.20.1"
4344

4445
[libraries]
4546

@@ -130,3 +131,6 @@ detekt-api = { group = "io.gitlab.arturbosch.detekt", name= "detekt-api", versio
130131
detekt-test = { group = "io.gitlab.arturbosch.detekt", name= "detekt-test", version.ref = "detekt" }
131132

132133
jimfs = { group = "com.google.jimfs", name = "jimfs", version = "1.3.0" }
134+
135+
testcontainers = { group = "org.testcontainers", name = "testcontainers", version.ref = "testcontainers" }
136+
testcontainers-postgresql = { group = "org.testcontainers", name = "postgresql", version.ref = "testcontainers" }

model-server-test/build.gradle.kts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
11
plugins {
22
`modelix-kotlin-jvm-with-junit`
3-
alias(libs.plugins.docker.compose)
43
}
54

65
dependencies {
76
testImplementation(kotlin("test"))
87
testImplementation(project(":model-server"))
9-
}
10-
11-
tasks.test {
12-
dependsOn(":model-server:compileTestKotlin")
13-
doFirst {
14-
val db = dockerCompose.servicesInfos.getValue("db")
15-
systemProperty("jdbc.url", "jdbc:postgresql://${db.host}:${db.port}/")
16-
}
17-
}
18-
19-
dockerCompose {
20-
isRequiredBy(tasks.test)
21-
setProjectName("model-server-test-started-from-gradle")
8+
testImplementation(libs.testcontainers)
9+
testImplementation(libs.testcontainers.postgresql)
2210
}

model-server-test/docker-compose.yaml

Lines changed: 0 additions & 11 deletions
This file was deleted.

model-server-test/src/test/kotlin/IgnitePostgresRepositoryRemovalTest.kt

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,51 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
import org.junit.jupiter.api.AfterAll
1716
import org.junit.jupiter.api.Test
1817
import org.junit.jupiter.api.assertDoesNotThrow
1918
import org.modelix.model.lazy.RepositoryId
2019
import org.modelix.model.server.store.IgniteStoreClient
2120
import org.modelix.model.server.store.ObjectInRepository
21+
import org.testcontainers.containers.PostgreSQLContainer
22+
import org.testcontainers.utility.DockerImageName
2223
import java.sql.Connection
2324
import java.sql.DriverManager
25+
import java.util.Properties
2426
import kotlin.test.AfterTest
27+
import kotlin.test.BeforeTest
2528
import kotlin.test.assertEquals
2629
import kotlin.test.assertFalse
2730
import kotlin.test.assertTrue
2831

2932
class IgnitePostgresRepositoryRemovalTest {
30-
private val store = IgniteStoreClient()
33+
private lateinit var postgres: PostgreSQLContainer<*>
34+
private lateinit var store: IgniteStoreClient
35+
private lateinit var dbConnection: Connection
3136

3237
private val toDelete = RepositoryId("repository-removal-toDelete")
3338
private val existing = RepositoryId("repository-removal-existing")
3439

40+
@BeforeTest
41+
fun beforeTest() {
42+
postgres = PostgreSQLContainer(DockerImageName.parse("postgres:16.2-alpine"))
43+
.withDatabaseName("modelix")
44+
.withUsername("modelix")
45+
.withPassword("modelix")
46+
.withExposedPorts(5432)
47+
postgres.start()
48+
49+
val jdbcProperties = Properties()
50+
jdbcProperties.setProperty("jdbc.url", "jdbc:postgresql://${postgres.host}:${postgres.firstMappedPort}/")
51+
52+
store = IgniteStoreClient(jdbcProperties)
53+
54+
dbConnection = DriverManager.getConnection(System.getProperty("jdbc.url"), "modelix", "modelix")
55+
}
56+
3557
@AfterTest
36-
fun cleanup() {
37-
dbConnection.prepareStatement("DELETE FROM modelix.model WHERE repository IN ( ? , ? )").use {
38-
it.setString(1, toDelete.id)
39-
it.setString(2, existing.id)
40-
}
41-
store.putAll(store.getAll().keys.associateWith { null })
42-
store.close()
58+
fun afterTest() {
59+
store.dispose()
60+
postgres.stop()
4361
}
4462

4563
@Test
@@ -118,14 +136,4 @@ class IgnitePostgresRepositoryRemovalTest {
118136
store.removeRepositoryObjects(RepositoryId("invalid"))
119137
}
120138
}
121-
122-
companion object {
123-
val dbConnection: Connection = DriverManager.getConnection(System.getProperty("jdbc.url"), "modelix", "modelix")
124-
125-
@JvmStatic
126-
@AfterAll
127-
fun closeDbConnection() {
128-
dbConnection.close()
129-
}
130-
}
131139
}

model-server-test/src/test/kotlin/IgnitePostgresTest.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,43 @@ import org.modelix.model.lazy.RepositoryId
1717
import org.modelix.model.persistent.HashUtil
1818
import org.modelix.model.server.store.IgniteStoreClient
1919
import org.modelix.model.server.store.ObjectInRepository
20+
import org.testcontainers.containers.PostgreSQLContainer
21+
import org.testcontainers.utility.DockerImageName
22+
import org.testcontainers.utility.MountableFile
23+
import java.util.Properties
2024
import kotlin.test.AfterTest
2125
import kotlin.test.BeforeTest
2226
import kotlin.test.Test
2327
import kotlin.test.assertEquals
2428
import kotlin.test.assertTrue
2529

2630
class IgnitePostgresTest {
27-
lateinit var store: IgniteStoreClient
31+
private lateinit var postgres: PostgreSQLContainer<*>
32+
private lateinit var store: IgniteStoreClient
2833

2934
@BeforeTest
3035
fun beforeTest() {
31-
store = IgniteStoreClient()
36+
postgres = PostgreSQLContainer(DockerImageName.parse("postgres:16.2-alpine"))
37+
.withDatabaseName("modelix")
38+
.withUsername("modelix")
39+
.withPassword("modelix")
40+
.withCopyFileToContainer(
41+
MountableFile.forClasspathResource("/legacy-database.sql"),
42+
"/docker-entrypoint-initdb.d/initdb.sql",
43+
)
44+
.withExposedPorts(5432)
45+
postgres.start()
46+
47+
val jdbcProperties = Properties()
48+
jdbcProperties.setProperty("jdbc.url", "jdbc:postgresql://${postgres.host}:${postgres.firstMappedPort}/")
49+
50+
store = IgniteStoreClient(jdbcProperties)
3251
}
3352

3453
@AfterTest
3554
fun afterTest() {
3655
store.dispose()
56+
postgres.stop()
3757
}
3858

3959
@Test
File renamed without changes.

0 commit comments

Comments
 (0)