From df693b433fbfbc16316551365661fb8195345eb6 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 27 Jul 2026 19:31:51 +0300 Subject: [PATCH 01/11] Migrate postresql tests to testcontainers --- dataframe-jdbc/build.gradle.kts | 2 + .../io/local/postgresConnectionUrlTest.kt | 61 +++++++++++++------ .../dataframe/io/local/postgresTest.kt | 15 ++++- gradle/libs.versions.toml | 4 ++ 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/dataframe-jdbc/build.gradle.kts b/dataframe-jdbc/build.gradle.kts index 968984f0f3..d560016545 100644 --- a/dataframe-jdbc/build.gradle.kts +++ b/dataframe-jdbc/build.gradle.kts @@ -33,6 +33,8 @@ dependencies { exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") } testImplementation(libs.hikaricp) + testImplementation(libs.testcontainers) + testImplementation(libs.testcontainers.postgresql) } kotlinPublications { diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt index 7f1fa4213b..ba815f1008 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt @@ -8,28 +8,55 @@ import org.jetbrains.kotlinx.dataframe.api.filter import org.jetbrains.kotlinx.dataframe.io.DbConnectionConfig import org.jetbrains.kotlinx.dataframe.io.readDataFrame import org.jetbrains.kotlinx.dataframe.io.readSqlTable +import org.junit.AfterClass +import org.junit.BeforeClass import org.junit.Ignore import org.junit.Test +import org.testcontainers.postgresql.PostgreSQLContainer import java.sql.DriverManager -private const val URL_WITH_LOGIN_PASSWORD = "jdbc:postgresql://localhost:5432/test?" + - "user=postgres&password=pass&connectTimeout=10&tcpKeepAlive=true" - -private const val URL_NO_LOGIN_PASSWORD = "jdbc:postgresql://localhost:5432/test?connectTimeout=10&tcpKeepAlive=true" - -private const val URL_WITH_PASSWORD = - "jdbc:postgresql://localhost:5432/test?password=pass&connectTimeout=10&tcpKeepAlive=true" - -private const val URL_WITH_LOGIN = - "jdbc:postgresql://localhost:5432/test?user=postgres&connectTimeout=10&tcpKeepAlive=true" +// Available image tags: https://hub.docker.com/_/postgres/tags +private const val POSTGRES_IMAGE = "postgres:16-alpine" +private const val USER_NAME = "postgres" +private const val PASSWORD = "pass" +private const val DATABASE_NAME = "test" +private const val URL_PARAMS = "connectTimeout=10&tcpKeepAlive=true" private const val TABLE_NAME = "table1" @Ignore class PostgresConnectionUrlTest { + companion object { + private val postgres: PostgreSQLContainer = PostgreSQLContainer(POSTGRES_IMAGE).apply { + withDatabaseName(DATABASE_NAME) + withUsername(USER_NAME) + withPassword(PASSWORD) + } + + @BeforeClass + @JvmStatic + fun setUpClass() { + postgres.start() + } + + @AfterClass + @JvmStatic + fun tearDownClass() { + postgres.stop() + } + + private val baseUrl: String + get() = "jdbc:postgresql://${postgres.host}:${postgres.firstMappedPort}/$DATABASE_NAME" + private val urlWithLoginPassword: String + get() = "$baseUrl?user=$USER_NAME&password=$PASSWORD&$URL_PARAMS" + private val urlNoLoginPassword: String get() = "$baseUrl?$URL_PARAMS" + private val urlWithPassword: String get() = "$baseUrl?password=$PASSWORD&$URL_PARAMS" + private val urlWithLogin: String get() = "$baseUrl?user=$USER_NAME&$URL_PARAMS" + } + @Test fun `read from table with login and password in connection URL`() { - DriverManager.getConnection(URL_WITH_LOGIN_PASSWORD).use { connection -> + DriverManager.getConnection(urlWithLoginPassword).use { connection -> createTestData(connection) val df1 = DataFrame.readSqlTable(connection, TABLE_NAME).cast() @@ -48,10 +75,10 @@ class PostgresConnectionUrlTest { @Test fun `read from table with login and password in connection URL for DBConfig`() { - DriverManager.getConnection(URL_WITH_LOGIN_PASSWORD).use { connection -> + DriverManager.getConnection(urlWithLoginPassword).use { connection -> createTestData(connection) - val dbConfig = DbConnectionConfig(URL_WITH_LOGIN_PASSWORD) + val dbConfig = DbConnectionConfig(urlWithLoginPassword) val df1 = DataFrame.readSqlTable(dbConfig = dbConfig, TABLE_NAME).cast() val result1 = df1.filter { "id"() == 1 } @@ -68,7 +95,7 @@ class PostgresConnectionUrlTest { @Test fun `read from table without login and password`() { - val dbConfig = DbConnectionConfig(URL_NO_LOGIN_PASSWORD) + val dbConfig = DbConnectionConfig(urlNoLoginPassword) shouldThrow { testReadFromTable(dbConfig) @@ -77,7 +104,7 @@ class PostgresConnectionUrlTest { @Test fun `read from table with password only`() { - val dbConfig = DbConnectionConfig(URL_WITH_PASSWORD) + val dbConfig = DbConnectionConfig(urlWithPassword) shouldThrow { testReadFromTable(dbConfig) @@ -86,7 +113,7 @@ class PostgresConnectionUrlTest { @Test fun `read from table with login only`() { - val dbConfig = DbConnectionConfig(URL_WITH_LOGIN) + val dbConfig = DbConnectionConfig(urlWithLogin) shouldThrow { testReadFromTable(dbConfig) @@ -94,7 +121,7 @@ class PostgresConnectionUrlTest { } private fun testReadFromTable(dbConfig: DbConnectionConfig) { - DriverManager.getConnection(URL_WITH_LOGIN_PASSWORD).use { connection -> + DriverManager.getConnection(urlWithLoginPassword).use { connection -> createTestData(connection) val df2 = dbConfig.readDataFrame(TABLE_NAME).cast() diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt index 0bcb107ef7..7f9f9bc246 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt @@ -27,6 +27,7 @@ import org.postgresql.geometric.PGpolygon import org.postgresql.util.PGInterval import org.postgresql.util.PGmoney import org.postgresql.util.PGobject +import org.testcontainers.postgresql.PostgreSQLContainer import java.math.BigDecimal import java.sql.Connection import java.sql.Date @@ -38,9 +39,11 @@ import java.sql.Types import java.util.UUID import kotlin.reflect.typeOf -private const val BASIC_URL = "jdbc:postgresql://localhost:5432/test" +// Available image tags: https://hub.docker.com/_/postgres/tags +private const val POSTGRES_IMAGE = "postgres:16-alpine" private const val USER_NAME = "postgres" private const val PASSWORD = "pass" +private const val DATABASE_NAME = "test" @DataSchema interface Table1 { @@ -260,12 +263,19 @@ internal fun clearTestData(connection: Connection) { @Ignore class PostgresTest { companion object { + private val postgres: PostgreSQLContainer = PostgreSQLContainer(POSTGRES_IMAGE).apply { + withDatabaseName(DATABASE_NAME) + withUsername(USER_NAME) + withPassword(PASSWORD) + } + private lateinit var connection: Connection @BeforeClass @JvmStatic fun setUpClass() { - connection = DriverManager.getConnection(BASIC_URL, USER_NAME, PASSWORD) + postgres.start() + connection = DriverManager.getConnection(postgres.jdbcUrl, USER_NAME, PASSWORD) createTestData(connection) } @@ -278,6 +288,7 @@ class PostgresTest { } catch (e: SQLException) { e.printStackTrace() } + postgres.stop() } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1d74e7794c..2bac7aa024 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -62,6 +62,7 @@ ktor = "3.5.1" kotlin-compile-testing = "0.7.1" # unused for now hikari = "7.1.0" duckdb = "1.5.4.0" +testcontainers = "2.0.5" buildconfig = "6.0.10" benchmark = "0.4.17" @@ -120,6 +121,9 @@ mysql = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysql" postgresql = { group = "org.postgresql", name = "postgresql", version.ref = "postgresql" } sqlite = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite" } +testcontainers = { group = "org.testcontainers", name = "testcontainers", version.ref = "testcontainers" } +testcontainers-postgresql = { group = "org.testcontainers", name = "testcontainers-postgresql", version.ref = "testcontainers" } + kandy = { group = "org.jetbrains.kotlinx", name = "kandy-lets-plot", version.ref = "kandy" } kandy-geo = { group = "org.jetbrains.kotlinx", name = "kandy-geo", version.ref = "kandy" } kandy-samples-utils = { group = "org.jetbrains.kotlinx", name = "kandy-samples-utils", version.ref = "kandy" } From 13b07476c2fdbdf3aeedb69d8dea81ecccda5913 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 27 Jul 2026 19:45:42 +0300 Subject: [PATCH 02/11] Migrate mysql tests to testcontainers --- dataframe-jdbc/build.gradle.kts | 1 + .../kotlinx/dataframe/io/local/mysqlTest.kt | 22 ++++++++++++++----- gradle/libs.versions.toml | 1 + 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/dataframe-jdbc/build.gradle.kts b/dataframe-jdbc/build.gradle.kts index d560016545..9671e1fdf3 100644 --- a/dataframe-jdbc/build.gradle.kts +++ b/dataframe-jdbc/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { testImplementation(libs.hikaricp) testImplementation(libs.testcontainers) testImplementation(libs.testcontainers.postgresql) + testImplementation(libs.testcontainers.mysql) } kotlinPublications { diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt index cadbc8580b..5820abbc66 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt @@ -18,6 +18,7 @@ import org.junit.AfterClass import org.junit.BeforeClass import org.junit.Ignore import org.junit.Test +import org.testcontainers.mysql.MySQLContainer import java.math.BigDecimal import java.math.BigInteger import java.sql.Connection @@ -27,7 +28,8 @@ import java.util.Date import kotlin.reflect.typeOf import kotlin.time.Instant -private const val URL = "jdbc:mysql://localhost:3307" +// Available image tags: https://hub.docker.com/_/mysql/tags +private const val MYSQL_IMAGE = "mysql:8.0" private const val USER_NAME = "root" private const val PASSWORD = "pass" private const val TEST_DATABASE_NAME = "testKDFdatabase" @@ -116,12 +118,21 @@ interface Table3MySql { @Ignore class MySqlTest { companion object { + private val mysql: MySQLContainer = MySQLContainer(MYSQL_IMAGE).apply { + withUsername(USER_NAME) + withPassword(PASSWORD) + } + private lateinit var connection: Connection + private val rootUrl: String + get() = "jdbc:mysql://${mysql.host}:${mysql.firstMappedPort}" + @BeforeClass @JvmStatic fun setUpClass() { - connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD) + mysql.start() + connection = DriverManager.getConnection(rootUrl, USER_NAME, PASSWORD) connection.createStatement().use { st -> // Drop the test database if it exists @@ -338,6 +349,7 @@ class MySqlTest { } catch (e: SQLException) { e.printStackTrace() } + mysql.stop() } } @@ -496,19 +508,19 @@ class MySqlTest { @Test fun `readAllSqlTables without catalogue should only return tables from URL database`() { val secondDb = "testKDFdatabase2" - val testRootConn = DriverManager.getConnection(URL, USER_NAME, PASSWORD) + val testRootConn = DriverManager.getConnection(rootUrl, USER_NAME, PASSWORD) try { testRootConn.createStatement().use { stmt -> stmt.executeUpdate("DROP DATABASE IF EXISTS $secondDb") stmt.executeUpdate("CREATE DATABASE $secondDb") } - DriverManager.getConnection("$URL/$secondDb", USER_NAME, PASSWORD).use { conn2 -> + DriverManager.getConnection("$rootUrl/$secondDb", USER_NAME, PASSWORD).use { conn2 -> conn2.createStatement().use { stmt -> stmt.executeUpdate("CREATE TABLE onlyInDb2 (id INT PRIMARY KEY, val VARCHAR(50))") } } - DriverManager.getConnection("$URL/$TEST_DATABASE_NAME", USER_NAME, PASSWORD).use { scopedConn -> + DriverManager.getConnection("$rootUrl/$TEST_DATABASE_NAME", USER_NAME, PASSWORD).use { scopedConn -> val tableNames = DataFrame.readAllSqlTables(scopedConn).keys tableNames.none { "onlyInDb2" in it } shouldBe true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2bac7aa024..640d425845 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -123,6 +123,7 @@ sqlite = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite" } testcontainers = { group = "org.testcontainers", name = "testcontainers", version.ref = "testcontainers" } testcontainers-postgresql = { group = "org.testcontainers", name = "testcontainers-postgresql", version.ref = "testcontainers" } +testcontainers-mysql = { group = "org.testcontainers", name = "testcontainers-mysql", version.ref = "testcontainers" } kandy = { group = "org.jetbrains.kotlinx", name = "kandy-lets-plot", version.ref = "kandy" } kandy-geo = { group = "org.jetbrains.kotlinx", name = "kandy-geo", version.ref = "kandy" } From 514283e31a3b99d4c77c755a39e69045f35e4443 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 27 Jul 2026 19:46:17 +0300 Subject: [PATCH 03/11] Migrate mariadb tests to testcontainers --- dataframe-jdbc/build.gradle.kts | 1 + .../kotlinx/dataframe/io/local/mariadbTest.kt | 22 ++++++++++++++----- gradle/libs.versions.toml | 1 + 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/dataframe-jdbc/build.gradle.kts b/dataframe-jdbc/build.gradle.kts index 9671e1fdf3..b12c9c112b 100644 --- a/dataframe-jdbc/build.gradle.kts +++ b/dataframe-jdbc/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { testImplementation(libs.testcontainers) testImplementation(libs.testcontainers.postgresql) testImplementation(libs.testcontainers.mysql) + testImplementation(libs.testcontainers.mariadb) } kotlinPublications { diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt index 7cb7629ce4..84246ead2f 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt @@ -17,6 +17,7 @@ import org.junit.AfterClass import org.junit.BeforeClass import org.junit.Ignore import org.junit.Test +import org.testcontainers.mariadb.MariaDBContainer import java.math.BigDecimal import java.math.BigInteger import java.sql.Blob @@ -27,7 +28,8 @@ import java.util.Date import kotlin.reflect.typeOf import kotlin.time.Instant -private const val URL = "jdbc:mariadb://localhost:3306" +// Available image tags: https://hub.docker.com/_/mariadb/tags +private const val MARIADB_IMAGE = "mariadb:11" private const val USER_NAME = "root" private const val PASSWORD = "pass" private const val TEST_DATABASE_NAME = "testKDFdatabase" @@ -121,12 +123,21 @@ private const val JSON_STRING = @Ignore class MariadbTest { companion object { + private val mariadb: MariaDBContainer = MariaDBContainer(MARIADB_IMAGE).apply { + withUsername(USER_NAME) + withPassword(PASSWORD) + } + private lateinit var connection: Connection + private val rootUrl: String + get() = "jdbc:mariadb://${mariadb.host}:${mariadb.firstMappedPort}" + @BeforeClass @JvmStatic fun setUpClass() { - connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD) + mariadb.start() + connection = DriverManager.getConnection(rootUrl, USER_NAME, PASSWORD) connection.createStatement().use { st -> // Drop the test database if it exists @@ -337,6 +348,7 @@ class MariadbTest { } catch (e: SQLException) { e.printStackTrace() } + mariadb.stop() } } @@ -493,19 +505,19 @@ class MariadbTest { @Test fun `readAllSqlTables without catalogue should only return tables from URL database`() { val secondDb = "testKDFdatabase2" - val testRootConn = DriverManager.getConnection(URL, USER_NAME, PASSWORD) + val testRootConn = DriverManager.getConnection(rootUrl, USER_NAME, PASSWORD) try { testRootConn.createStatement().use { stmt -> stmt.executeUpdate("DROP DATABASE IF EXISTS $secondDb") stmt.executeUpdate("CREATE DATABASE $secondDb") } - DriverManager.getConnection("$URL/$secondDb", USER_NAME, PASSWORD).use { conn2 -> + DriverManager.getConnection("$rootUrl/$secondDb", USER_NAME, PASSWORD).use { conn2 -> conn2.createStatement().use { stmt -> stmt.executeUpdate("CREATE TABLE onlyInDb2 (id INT PRIMARY KEY, val VARCHAR(50))") } } - DriverManager.getConnection("$URL/$TEST_DATABASE_NAME", USER_NAME, PASSWORD).use { scopedConn -> + DriverManager.getConnection("$rootUrl/$TEST_DATABASE_NAME", USER_NAME, PASSWORD).use { scopedConn -> val tableNames = DataFrame.readAllSqlTables(scopedConn).keys tableNames.none { "onlyInDb2" in it } shouldBe true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 640d425845..ffb8a546dc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -124,6 +124,7 @@ sqlite = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite" } testcontainers = { group = "org.testcontainers", name = "testcontainers", version.ref = "testcontainers" } testcontainers-postgresql = { group = "org.testcontainers", name = "testcontainers-postgresql", version.ref = "testcontainers" } testcontainers-mysql = { group = "org.testcontainers", name = "testcontainers-mysql", version.ref = "testcontainers" } +testcontainers-mariadb = { group = "org.testcontainers", name = "testcontainers-mariadb", version.ref = "testcontainers" } kandy = { group = "org.jetbrains.kotlinx", name = "kandy-lets-plot", version.ref = "kandy" } kandy-geo = { group = "org.jetbrains.kotlinx", name = "kandy-geo", version.ref = "kandy" } From 50e731f0398b55ec87a776339db092e50690d3f3 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 27 Jul 2026 19:48:26 +0300 Subject: [PATCH 04/11] Move testcontainers tests under common package --- .../dataframe/io/{local => testcontainers}/mariadbTest.kt | 2 +- .../kotlinx/dataframe/io/{local => testcontainers}/mysqlTest.kt | 2 +- .../io/{local => testcontainers}/postgresConnectionUrlTest.kt | 2 +- .../dataframe/io/{local => testcontainers}/postgresTest.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/{local => testcontainers}/mariadbTest.kt (99%) rename dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/{local => testcontainers}/mysqlTest.kt (99%) rename dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/{local => testcontainers}/postgresConnectionUrlTest.kt (98%) rename dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/{local => testcontainers}/postgresTest.kt (99%) diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt similarity index 99% rename from dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt rename to dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt index 84246ead2f..78068df63c 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mariadbTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt @@ -1,4 +1,4 @@ -package org.jetbrains.kotlinx.dataframe.io.local +package org.jetbrains.kotlinx.dataframe.io.testcontainers import io.kotest.matchers.shouldBe import org.intellij.lang.annotations.Language diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mysqlTest.kt similarity index 99% rename from dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt rename to dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mysqlTest.kt index 5820abbc66..d83a1c166b 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/mysqlTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mysqlTest.kt @@ -1,4 +1,4 @@ -package org.jetbrains.kotlinx.dataframe.io.local +package org.jetbrains.kotlinx.dataframe.io.testcontainers import io.kotest.matchers.shouldBe import kotlinx.datetime.LocalDateTime diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresConnectionUrlTest.kt similarity index 98% rename from dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt rename to dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresConnectionUrlTest.kt index ba815f1008..80120e54b7 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresConnectionUrlTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresConnectionUrlTest.kt @@ -1,4 +1,4 @@ -package org.jetbrains.kotlinx.dataframe.io.local +package org.jetbrains.kotlinx.dataframe.io.testcontainers import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.shouldBe diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresTest.kt similarity index 99% rename from dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt rename to dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresTest.kt index 7f9f9bc246..df92c969cb 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/local/postgresTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/postgresTest.kt @@ -1,4 +1,4 @@ -package org.jetbrains.kotlinx.dataframe.io.local +package org.jetbrains.kotlinx.dataframe.io.testcontainers import io.kotest.matchers.shouldBe import org.intellij.lang.annotations.Language From db02bc8e6fe328a3b1750c98f136a18e3b05ce86 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 27 Jul 2026 20:30:02 +0300 Subject: [PATCH 05/11] Extract image versions in common file & update to latest LTS --- .../dataframe/io/testcontainers/images.kt | 10 ++++++++++ .../dataframe/io/testcontainers/mariadbTest.kt | 18 +++++++++--------- .../dataframe/io/testcontainers/mysqlTest.kt | 18 +++++++++--------- .../postgresConnectionUrlTest.kt | 9 ++++----- .../io/testcontainers/postgresTest.kt | 12 +++++------- 5 files changed, 37 insertions(+), 30 deletions(-) create mode 100644 dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/images.kt diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/images.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/images.kt new file mode 100644 index 0000000000..4f5f834f25 --- /dev/null +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/images.kt @@ -0,0 +1,10 @@ +package org.jetbrains.kotlinx.dataframe.io.testcontainers + +// Available image tags: https://hub.docker.com/_/mariadb/tags +const val MARIADB_IMAGE = "mariadb:12.3.2" + +// Available image tags: https://hub.docker.com/_/mysql/tags +const val MYSQL_IMAGE = "mysql:9.7" + +// Available image tags: https://hub.docker.com/_/postgres/tags +const val POSTGRES_IMAGE = "postgres:18-alpine" diff --git a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt index 78068df63c..2977a9167a 100644 --- a/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt +++ b/dataframe-jdbc/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/testcontainers/mariadbTest.kt @@ -24,12 +24,12 @@ import java.sql.Blob import java.sql.Connection import java.sql.DriverManager import java.sql.SQLException +import java.sql.Time +import java.sql.Timestamp import java.util.Date import kotlin.reflect.typeOf import kotlin.time.Instant -// Available image tags: https://hub.docker.com/_/mariadb/tags -private const val MARIADB_IMAGE = "mariadb:11" private const val USER_NAME = "root" private const val PASSWORD = "pass" private const val TEST_DATABASE_NAME = "testKDFdatabase" @@ -274,9 +274,9 @@ class MariadbTest { st.setDouble(11, i * 10.0) st.setBigDecimal(12, BigDecimal(i * 10)) st.setDate(13, java.sql.Date(System.currentTimeMillis())) - st.setTimestamp(14, java.sql.Timestamp(System.currentTimeMillis())) - st.setTimestamp(15, java.sql.Timestamp(System.currentTimeMillis())) - st.setTime(16, java.sql.Time(System.currentTimeMillis())) + st.setTimestamp(14, Timestamp(System.currentTimeMillis())) + st.setTimestamp(15, Timestamp(System.currentTimeMillis())) + st.setTime(16, Time(System.currentTimeMillis())) st.setInt(17, 2023) st.setString(18, "varcharValue$i") st.setString(19, "charValue$i") @@ -314,9 +314,9 @@ class MariadbTest { st.setDouble(11, i * 20.0) st.setBigDecimal(12, BigDecimal(i * 20)) st.setDate(13, java.sql.Date(System.currentTimeMillis())) - st.setTimestamp(14, java.sql.Timestamp(System.currentTimeMillis())) - st.setTimestamp(15, java.sql.Timestamp(System.currentTimeMillis())) - st.setTime(16, java.sql.Time(System.currentTimeMillis())) + st.setTimestamp(14, Timestamp(System.currentTimeMillis())) + st.setTimestamp(15, Timestamp(System.currentTimeMillis())) + st.setTime(16, Time(System.currentTimeMillis())) st.setInt(17, 2023) st.setString(18, "varcharValue$i") st.setString(19, "charValue$i") @@ -370,7 +370,7 @@ class MariadbTest { schema.columns["dateCol"]!!.type shouldBe typeOf() schema.columns["datetimeCol"]!!.type shouldBe typeOf() schema.columns["timestampCol"]!!.type shouldBe typeOf() - schema.columns["timeCol"]!!.type shouldBe typeOf() + schema.columns["timeCol"]!!.type shouldBe typeOf