Skip to content

Commit a07c213

Browse files
authored
Merge pull request #306 from driessamyn/feature/add-mariadb-compat
feat: add MariaDB as a compatibility-tested database
2 parents 59bde3b + 35df6b6 commit a07c213

6 files changed

Lines changed: 80 additions & 20 deletions

File tree

.github/workflows/build-and-test.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ on:
44
branches: [ main ]
55
pull_request:
66
branches: [ main, feature/* ]
7+
types: [ opened, synchronize, reopened, labeled ]
8+
schedule:
9+
- cron: '0 0 * * *'
10+
workflow_dispatch:
711

812
permissions:
913
checks: write
@@ -76,6 +80,7 @@ jobs:
7680
integration-test:
7781
name: Integration tests
7882
runs-on: ubuntu-latest
83+
if: github.event_name == 'push' || github.event_name == 'pull_request'
7984
needs:
8085
- build
8186
strategy:
@@ -112,3 +117,39 @@ jobs:
112117
check_name: ${{ matrix.db }} Integration Tests
113118
files: |
114119
**/build/test-results/integrationTest/TEST-*.xml
120+
121+
compatibility-test:
122+
name: Compatibility tests
123+
runs-on: ubuntu-latest
124+
needs:
125+
- build
126+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || contains(github.event.pull_request.labels.*.name, 'run-compat-tests')
127+
strategy:
128+
matrix:
129+
db: [ MARIADB ]
130+
steps:
131+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
132+
with:
133+
fetch-depth: 0
134+
- name: Set up JDK 17
135+
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654
136+
with:
137+
java-version: '17'
138+
distribution: 'zulu'
139+
cache: 'gradle'
140+
- name: Compatibility tests
141+
run: ./gradlew integrationTest -Ddb=${{ matrix.db }}
142+
- name: Upload Test Report
143+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
144+
if: always()
145+
with:
146+
name: ${{ matrix.db }}-compat-test-results
147+
path: '**/build/test-results/integrationTest/TEST-*.xml'
148+
retention-days: 1
149+
- name: Publish Test Results
150+
uses: EnricoMi/publish-unit-test-result-action@c950f6fb443cb5af20a377fd0dfaa78838901040
151+
if: always()
152+
with:
153+
check_name: ${{ matrix.db }} Compatibility Tests
154+
files: |
155+
**/build/test-results/integrationTest/TEST-*.xml

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Kapper is a lightweight, Dapper-inspired ORM (Object-Relational Mapping) library
2121
![Oracle](https://img.shields.io/badge/oracle-F80000.svg?style=for-the-badge&logo=oracle&logoColor=white)
2222
![MSSQL](https://img.shields.io/badge/mssql-%23CC2927.svg?style=for-the-badge&logo=microsoftsqlserver&logoColor=white)
2323
![DuckDB](https://img.shields.io/badge/duckdb-FFF000.svg?style=for-the-badge&logo=duckdb&logoColor=black)
24+
![MariaDB](https://img.shields.io/badge/mariadb-003545.svg?style=for-the-badge&logo=mariadb&logoColor=white)
2425

2526
See [Kapper](https://driessamyn.github.io/kapper/) for more information.
2627

core/src/integrationTest/kotlin/net/samyn/kapper/AbstractDbTests.kt

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.junit.jupiter.params.provider.Arguments.arguments
1212
import org.junit.jupiter.params.provider.MethodSource
1313
import org.testcontainers.containers.JdbcDatabaseContainer
1414
import org.testcontainers.containers.MSSQLServerContainer
15+
import org.testcontainers.containers.MariaDBContainer
1516
import org.testcontainers.containers.MySQLContainer
1617
import org.testcontainers.containers.PostgreSQLContainer
1718
import org.testcontainers.oracle.OracleContainer
@@ -52,6 +53,10 @@ abstract class AbstractDbTests {
5253
.also { it.start() }
5354
}
5455

56+
private val mariadb by lazy {
57+
MariaDBContainer("mariadb:11.7").also { it.start() }
58+
}
59+
5560
private val msSqlServer by lazy {
5661
MSSQLServerContainer("mcr.microsoft.com/mssql/server:2017-CU12")
5762
.acceptLicense()
@@ -63,29 +68,37 @@ abstract class AbstractDbTests {
6368
}
6469
}
6570

66-
private val connections = ConcurrentHashMap<DbFlavour, Connection>()
71+
private val connections = ConcurrentHashMap<String, Connection>()
6772

6873
private fun getConnection(container: JdbcDatabaseContainer<*>): Connection {
6974
Class.forName(container.driverClassName)
7075
return DriverManager.getConnection(container.jdbcUrl, container.username, container.password)
7176
}
7277

73-
val dbs =
78+
// Use string keys so that MariaDB (which resolves to DbFlavour.MYSQL) can be a separate entry
79+
private val selectedDb = System.getProperty("db", "").trim().uppercase()
80+
private val allDbs =
7481
mapOf(
75-
DbFlavour.POSTGRESQL to { getConnection(postgresql) },
76-
DbFlavour.MYSQL to { getConnection(mysql) },
77-
DbFlavour.SQLITE to { DriverManager.getConnection("jdbc:sqlite::memory:") },
78-
DbFlavour.DUCKDB to { DriverManager.getConnection("jdbc:duckdb:") },
79-
DbFlavour.MSSQLSERVER to { getConnection(msSqlServer) },
80-
DbFlavour.ORACLE to { getConnection(oracle) },
81-
).filter {
82-
// by default run against SQLite, PG and DuckDB only
83-
// this allows parallel runs for different int tests.
84-
when (System.getProperty("db", "").uppercase()) {
85-
"" -> it.key == DbFlavour.SQLITE || it.key == DbFlavour.POSTGRESQL || it.key == DbFlavour.DUCKDB
86-
"ALL" -> true
87-
else -> it.key == DbFlavour.valueOf(System.getProperty("db").uppercase())
88-
}
82+
"POSTGRESQL" to { getConnection(postgresql) },
83+
"MYSQL" to { getConnection(mysql) },
84+
"SQLITE" to { DriverManager.getConnection("jdbc:sqlite::memory:") },
85+
"DUCKDB" to { DriverManager.getConnection("jdbc:duckdb:") },
86+
"MSSQLSERVER" to { getConnection(msSqlServer) },
87+
"ORACLE" to { getConnection(oracle) },
88+
"MARIADB" to { getConnection(mariadb) },
89+
)
90+
91+
val dbs =
92+
when (selectedDb) {
93+
"" -> allDbs.filterKeys { it == "SQLITE" || it == "POSTGRESQL" || it == "DUCKDB" }
94+
"ALL" -> allDbs
95+
else ->
96+
mapOf(
97+
selectedDb to
98+
requireNotNull(allDbs[selectedDb]) {
99+
"Unsupported db '$selectedDb'. Expected one of ${allDbs.keys.sorted().joinToString()}"
100+
},
101+
)
89102
}
90103

91104
@JvmStatic
@@ -96,7 +109,7 @@ abstract class AbstractDbTests {
96109
connections
97110
.map {
98111
println(" ${it.key}")
99-
arguments(named(it.key.toString(), it.value))
112+
arguments(named(it.key, it.value))
100113
}
101114
println("--------------------------------")
102115
return connections

core/src/main/kotlin/net/samyn/kapper/internal/DbFlavourFunc.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ fun Connection.getDbFlavour(): DbFlavour {
1010
return when {
1111
productName.contains("postgres", ignoreCase = true) ||
1212
productName.contains("enterprisedb", ignoreCase = true) -> DbFlavour.POSTGRESQL
13-
productName.contains("mysql", ignoreCase = true) -> DbFlavour.MYSQL
13+
productName.contains("mysql", ignoreCase = true) ||
14+
productName.contains("mariadb", ignoreCase = true) -> DbFlavour.MYSQL
1415
productName.contains("sqlite", ignoreCase = true) -> DbFlavour.SQLITE
1516
productName.contains("oracle", ignoreCase = true) -> DbFlavour.ORACLE
1617
productName.contains("sql server", ignoreCase = true) ||

core/src/test/kotlin/net/samyn/kapper/internal/DbFlavourTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class DbFlavourTest {
3333
"MySQL Server",
3434
"MySQL Community Server",
3535
"MySQL Enterprise Server",
36+
"MariaDB",
3637
],
3738
)
3839
fun `when databaseProductName is mysql then getDbFlavour returns MYSQL`(value: String) {
@@ -132,7 +133,6 @@ class DbFlavourTest {
132133
"IDS",
133134

134135
// Other common databases
135-
"MariaDB",
136136
"H2",
137137
"HSQL Database Engine",
138138
"HSQLDB",

gradle/libs.versions.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ kotlin = "2.2.21"
88
kotlinx-coroutines = "1.10.2"
99
mockito = "5.20.0"
1010
mockk = "1.14.9"
11+
mariadb-driver = "3.5.3"
1112
mssql-server-driver = "13.2.1.jre11"
1213
mysql-driver = "9.6.0"
1314
oracle-driver = "23.26.0.0.0"
@@ -34,6 +35,7 @@ kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-t
3435
# mockito only to be used from Java code (API usability test)
3536
mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" }
3637
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
38+
mariadb-driver = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "mariadb-driver" }
3739
mssql-server-driver = { module = "com.microsoft.sqlserver:mssql-jdbc", version.ref = "mssql-server-driver" }
3840
mysql-driver = { module = "com.mysql:mysql-connector-j", version.ref = "mysql-driver" }
3941
oracle-driver = { module = "com.oracle.database.jdbc:ojdbc11", version.ref = "oracle-driver" }
@@ -47,6 +49,7 @@ test-containers-junit = { module = "org.testcontainers:junit-jupiter", version.r
4749
test-containers-mssqlserver = { module = "org.testcontainers:mssqlserver", version.ref = "test-containers" }
4850
test-containers-mysql = { module = "org.testcontainers:mysql", version.ref = "test-containers" }
4951
test-containers-oracle = { module = "org.testcontainers:oracle-free", version.ref = "test-containers" }
52+
test-containers-mariadb = { module = "org.testcontainers:mariadb", version.ref = "test-containers" }
5053
test-containers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "test-containers" }
5154

5255
# Example dependencies
@@ -76,12 +79,13 @@ jmh = ["jmh-core", "jmh-generator-annprocess"]
7679
test = ["junit-jupiter", "mockk", "kotest-assertions-core"]
7780
test-containers = [
7881
"test-containers-junit",
82+
"test-containers-mariadb",
7983
"test-containers-mysql",
8084
"test-containers-postgresql",
8185
"test-containers-mssqlserver",
8286
"test-containers-oracle"
8387
]
84-
test-dbs = ["mysql-driver", "postgresql-driver", "sqlite-jdbc", "duckdb-jdbc", "mssql-server-driver", "oracle-driver"]
88+
test-dbs = ["mariadb-driver", "mysql-driver", "postgresql-driver", "sqlite-jdbc", "duckdb-jdbc", "mssql-server-driver", "oracle-driver"]
8589

8690
# Example bundles
8791
hibernate = ["hibernate-core", "hibernate-validator", "glassfish-jakarta"]

0 commit comments

Comments
 (0)