core/core/exposed/src/jvmTest/kotlin/dev/inmo/postssystem/core/exposed/ExposedContentAPICommonTests.kt

86 lines
3.1 KiB
Kotlin
Raw Normal View History

2020-11-25 08:08:45 +00:00
package dev.inmo.postssystem.core.exposed
2020-11-26 10:54:57 +00:00
import dev.inmo.micro_utils.repos.create
import dev.inmo.micro_utils.repos.deleteById
import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo
import dev.inmo.postssystem.core.content.ContentId
import dev.inmo.postssystem.core.content.api.business.AdapterType
import dev.inmo.postssystem.core.content.api.business.asBusinessContentRepo
import dev.inmo.postssystem.core.content.api.business.content_adapters.text.TextBusinessContentRepoContentAdapter
import dev.inmo.postssystem.core.content.api.business.content_adapters.text.TextContent
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.first
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.transactions.transactionManager
import java.io.File
import java.sql.Connection
2020-04-10 10:30:20 +00:00
import kotlin.test.Test
2020-04-11 07:06:10 +00:00
import kotlin.test.assertEquals
2020-07-30 09:34:32 +00:00
class ExposedContentRepoCommonTests {
private val tempFolder = System.getProperty("java.io.tmpdir")!!
@Test
fun `Test that it is possible to use several different databases at one time`() {
2019-11-10 18:17:23 +00:00
val numberOfDatabases = 8
val databaseFiles = (0 until numberOfDatabases).map {
"$tempFolder/ExposedContentAPICommonTestsDB$it.db"
}
val apis = databaseFiles.map {
2020-04-11 07:06:10 +00:00
File(it).also {
it.delete()
it.deleteOnExit()
}
2020-11-26 10:54:57 +00:00
val database = Database.Companion.connect("jdbc:sqlite:$it", driver = "org.sqlite.JDBC").also {
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE
}
ExposedKeyValueRepo<ContentId, AdapterType>(
database,
{ text("contentId") },
{ text("adapterType") },
"ContentRepo"
).asBusinessContentRepo(
TextBusinessContentRepoContentAdapter(
ExposedKeyValueRepo<ContentId, String>(
database,
{ text("contentId") },
{ text("text") },
"TextContentRepo"
)
)
)
}
val results = apis.mapIndexed { i, api ->
2020-11-26 10:54:57 +00:00
val expectedContent = TextContent(i.toString())
val contents = runBlocking { api.create(TextContent(i.toString())) }
val idsCount = runBlocking { api.count() }
assertEquals(idsCount, 1)
assert(contents.isNotEmpty())
assertEquals(
expectedContent,
contents.first().content
)
contents.first()
}
results.forEachIndexed { i, content ->
apis.forEachIndexed { j, api ->
assert(
runBlocking {
2020-11-26 10:54:57 +00:00
api.getById(content.id) == (if (i != j) null else content)
2019-11-10 18:17:23 +00:00
}
)
2020-11-26 10:54:57 +00:00
runBlocking {
api.deleteById(content.id)
}
}
}
databaseFiles.forEach {
File(it).delete()
}
}
2020-04-10 10:30:20 +00:00
}