diff --git a/exposed/src/test/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPICommonTests.kt b/exposed/src/test/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPICommonTests.kt new file mode 100644 index 00000000..d8e18040 --- /dev/null +++ b/exposed/src/test/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPICommonTests.kt @@ -0,0 +1,64 @@ +package com.insanusmokrassar.postssystem.core.exposed + +import com.insanusmokrassar.postssystem.core.post.SimplePost +import kotlinx.coroutines.runBlocking +import org.jetbrains.exposed.sql.Database +import org.jetbrains.exposed.sql.transactions.transactionManager +import org.junit.jupiter.api.* +import java.io.File +import java.sql.Connection + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +class ExposedPostsAPICommonTests { + private val tempFolder = System.getProperty("java.io.tmpdir")!! + + private val numberOfDatabases = 8 + private lateinit var databaseFiles: List + private lateinit var apis: List + + @BeforeAll + fun prepare() { + databaseFiles = (0 until numberOfDatabases).map { + File("$tempFolder/ExposedPostsAPICommonTestsDB$it.db") + } + apis = databaseFiles.map { + ExposedPostsAPI( + Database.Companion.connect("jdbc:sqlite:${it.absolutePath}", driver = "org.sqlite.JDBC").also { + it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE + } + ) + } + } + + @Test + fun `Test that it is possible to use several different databases at one time`() { + val posts = apis.mapIndexed { i, api -> + val content = runBlocking { api.createPost(SimplePost(listOf(i.toString()))) } + assert(content != null) + assert(runBlocking { api.getPostsIds().size == 1 }) + content!! + } + + posts.forEachIndexed { i, post -> + apis.forEachIndexed { j, api -> + assert( + runBlocking { + api.getPostById(post.id) == (if (i != j) null else post) + } + ) + assert( + runBlocking { + api.deletePost(post.id) == (i == j) + } + ) + } + } + } + + @AfterAll + fun `Close and delete databases`() { + databaseFiles.forEach { + it.delete() + } + } +}