Test rework to cover more database/driver versions / jdbc url resolved on Database.connect, instead of lazy field.

This commit is contained in:
Tapac
2018-04-08 21:34:20 +03:00
parent 5b38155195
commit 0e9e8982c8
2 changed files with 13 additions and 11 deletions

View File

@@ -12,7 +12,7 @@ import java.util.*
import java.util.concurrent.ConcurrentHashMap
import javax.sql.DataSource
class Database private constructor(val connector: () -> Connection) {
class Database private constructor(val url: String , val connector: () -> Connection) {
internal val metadata: DatabaseMetaData get() = TransactionManager.currentOrNull()?.connection?.metaData ?: with(connector()) {
try {
@@ -23,8 +23,6 @@ class Database private constructor(val connector: () -> Connection) {
}
}
val url: String by lazy { metadata.url }
var dialect : DatabaseDialect = run {
val name = url.removePrefix("jdbc:").substringBefore(':')
dialects[name.toLowerCase()]?.invoke() ?: error("No dialect registered for $name. URL=$url")
@@ -81,7 +79,10 @@ class Database private constructor(val connector: () -> Connection) {
private fun doConnect(getNewConnection: () -> Connection, setupConnection: (Connection) -> Unit = {},
manager: (Database) -> TransactionManager = { ThreadLocalTransactionManager(it, DEFAULT_ISOLATION_LEVEL) }
): Database {
return Database {
val newConnection = getNewConnection()
val url = newConnection.metaData.url!!
newConnection.close()
return Database(url) {
getNewConnection().apply { setupConnection(this) }
}.apply {
TransactionManager.registerManager(this, manager(this))
@@ -99,6 +100,7 @@ class Database private constructor(val connector: () -> Connection) {
): Database {
return doConnect( getNewConnection, manager = manager )
}
fun connect(url: String, driver: String, user: String = "", password: String = "", setupConnection: (Connection) -> Unit = {},
manager: (Database) -> TransactionManager = { ThreadLocalTransactionManager(it, DEFAULT_ISOLATION_LEVEL) }): Database {
Class.forName(driver).newInstance()

View File

@@ -14,12 +14,11 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.sqlite.SQLiteConnection
import org.sqlite.SQLiteDataSource
import org.sqlite.jdbc4.JDBC4DatabaseMetaData
import java.io.PrintWriter
import java.sql.Connection
import java.sql.DriverManager
import java.sql.SQLException
import java.sql.SQLTransientException
import java.sql.*
import java.util.logging.Logger
import javax.sql.DataSource
import kotlin.concurrent.thread
@@ -123,7 +122,7 @@ class ConnectionExceptions {
fail("Should have thrown an exception")
} catch (e : SQLException){
assertThat(e.toString(), Matchers.containsString("BROKEN_SQL_THAT_CAUSES_EXCEPTION"))
assertEquals(5, wrappingDataSource.connections.size)
assertEquals(6, wrappingDataSource.connections.size)
wrappingDataSource.connections.forEach {
assertFalse(it.commitCalled)
assertTrue(it.rollbackCalled)
@@ -155,8 +154,9 @@ class ConnectionExceptions {
}
fail("Should have thrown an exception")
} catch (e: CommitException) {
assertEquals(5, wrappingDataSource.connections.size)
wrappingDataSource.connections.forEach {
// + 1 b/c preparing Database instance required 1 connection
assertEquals(5 + 1, wrappingDataSource.connections.size)
wrappingDataSource.connections.drop(1).forEach {
assertTrue(it.commitCalled)
assertTrue(it.closeCalled)
}