Skip to content

Commit

Permalink
Move BLOB tests to own source files (#2053)
Browse files Browse the repository at this point in the history
  • Loading branch information
obabichevjb committed Apr 25, 2024
1 parent 9067a60 commit d3c5dbc
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 148 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import org.jetbrains.exposed.exceptions.ExposedSQLException
import org.jetbrains.exposed.exceptions.UnsupportedByDialectException
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.plus
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
import org.jetbrains.exposed.sql.tests.DatabaseTestsBase
import org.jetbrains.exposed.sql.tests.TestDB
import org.jetbrains.exposed.sql.tests.currentDialectTest
Expand All @@ -20,15 +19,12 @@ import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.vendors.H2Dialect
import org.jetbrains.exposed.sql.vendors.MysqlDialect
import org.jetbrains.exposed.sql.vendors.OracleDialect
import org.jetbrains.exposed.sql.vendors.PostgreSQLDialect
import org.jetbrains.exposed.sql.vendors.SQLServerDialect
import org.jetbrains.exposed.sql.vendors.SQLiteDialect
import org.junit.Assume
import org.junit.Test
import org.postgresql.util.PGobject
import java.util.*
import kotlin.random.Random
import kotlin.test.assertContentEquals
import kotlin.test.assertNotNull
import kotlin.test.expect

Expand Down Expand Up @@ -601,124 +597,6 @@ class DDLTests : DatabaseTestsBase() {
}
}

@Test
fun testBlob() {
val t = object : Table("t1") {
val id = integer("id").autoIncrement()
val b = blob("blob")

override val primaryKey = PrimaryKey(id)
}

withTables(t) {
val shortBytes = "Hello there!".toByteArray()
val longBytes = Random.nextBytes(1024)
val shortBlob = ExposedBlob(shortBytes)
val longBlob = ExposedBlob(longBytes)

val id1 = t.insert {
it[t.b] = shortBlob
} get (t.id)

val id2 = t.insert {
it[t.b] = longBlob
} get (t.id)

val id3 = t.insert {
it[t.b] = blobParam(ExposedBlob(shortBytes))
} get (t.id)

val readOn1 = t.selectAll().where { t.id eq id1 }.first()[t.b]
val text1 = String(readOn1.bytes)
val text2 = readOn1.inputStream.bufferedReader().readText()

assertEquals("Hello there!", text1)
assertEquals("Hello there!", text2)

val readOn2 = t.selectAll().where { t.id eq id2 }.first()[t.b]
val bytes1 = readOn2.bytes
val bytes2 = readOn2.inputStream.readBytes()

assertTrue(longBytes.contentEquals(bytes1))
assertTrue(longBytes.contentEquals(bytes2))

val bytes3 = t.selectAll().where { t.id eq id3 }.first()[t.b].inputStream.readBytes()
assertTrue(shortBytes.contentEquals(bytes3))
}
}

@Test
fun testBlobDefault() {
val defaultBlobStr = "test"
val defaultBlob = ExposedBlob(defaultBlobStr.encodeToByteArray())

val testTable = object : Table("TestTable") {
val number = integer("number")
val blobWithDefault = blob("blobWithDefault")
.default(defaultBlob)
}

withDb { testDb ->
when (testDb) {
TestDB.MYSQL -> {
expectException<ExposedSQLException> {
SchemaUtils.create(testTable)
}
}
else -> {
SchemaUtils.create(testTable)

testTable.insert {
it[number] = 1
}
assertEquals(defaultBlobStr, String(testTable.selectAll().first()[testTable.blobWithDefault].bytes))

SchemaUtils.drop(testTable)
}
}
}
}

@Test
fun testBlobAsOid() {
val defaultBytes = "test".toByteArray()
val defaultBlob = ExposedBlob(defaultBytes)
val tester = object : Table("blob_tester") {
val blobCol = blob("blob_col", useObjectIdentifier = true).default(defaultBlob)
}

withDb {
if (currentDialectTest !is PostgreSQLDialect) {
expectException<IllegalStateException> {
SchemaUtils.create(tester)
}
} else {
assertEquals("oid", tester.blobCol.descriptionDdl().split(" ")[1])
SchemaUtils.create(tester)

tester.insert {}

val result1 = tester.selectAll().single()[tester.blobCol]
assertContentEquals(defaultBytes, result1.bytes)

tester.insert {
defaultBlob.inputStream.reset()
it[blobCol] = defaultBlob
}
tester.insert {
defaultBlob.inputStream.reset()
it[blobCol] = blobParam(defaultBlob, useObjectIdentifier = true)
}

val result2 = tester.selectAll()
assertEquals(3, result2.count())
assertTrue(result2.all { it[tester.blobCol].bytes.contentEquals(defaultBytes) })

SchemaUtils.drop(tester)
}
}
}

@Test
fun testBinaryWithoutLength() {
val tableWithBinary = object : Table("TableWithBinary") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.dao.id.LongIdTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
import org.jetbrains.exposed.sql.tests.DatabaseTestsBase
import org.jetbrains.exposed.sql.tests.TestDB
import org.jetbrains.exposed.sql.tests.currentDialectTest
Expand All @@ -34,7 +33,6 @@ object EntityTestsData {
}

val x = bool("x").default(true)
val blob = blob("content").nullable()

override val primaryKey = PrimaryKey(id)
}
Expand Down Expand Up @@ -90,7 +88,6 @@ object EntityTestsData {
class YEntity(id: EntityID<String>) : Entity<String>(id) {
var x by YTable.x
val b: BEntity? by BEntity.backReferencedOn(XTable.y1)
var content by YTable.blob

companion object : EntityClass<String, YEntity>(YTable)
}
Expand Down Expand Up @@ -125,28 +122,6 @@ class EntityTests : DatabaseTestsBase() {
}
}

@Test
fun testBlobField() {
withTables(EntityTestsData.YTable) {
val y1 = EntityTestsData.YEntity.new {
x = false
content = ExposedBlob("foo".toByteArray())
}

flushCache()
var y2 = EntityTestsData.YEntity.reload(y1)!!
assertEquals(String(y2.content!!.bytes), "foo")

y2.content = null
flushCache()
y2 = EntityTestsData.YEntity.reload(y1)!!
assertNull(y2.content)

y2.content = ExposedBlob("foo2".toByteArray())
flushCache()
}
}

@Test
fun testTextFieldOutsideTheTransaction() {
val objectsToVerify = arrayListOf<Pair<Human, TestDB>>()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.jetbrains.exposed.sql.tests.shared.entities

import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.flushCache
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.IdTable
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
import org.jetbrains.exposed.sql.tests.DatabaseTestsBase
import org.jetbrains.exposed.sql.tests.shared.assertEquals
import org.jetbrains.exposed.sql.tests.shared.entities.EntityTestsData.YTable
import org.junit.Test
import java.util.*
import kotlin.test.assertNull

class EntityWithBlobTests : DatabaseTestsBase() {

object BlobTable : IdTable<String>("YTable") {
override val id: Column<EntityID<String>> = varchar("uuid", 36).entityId().clientDefault {
EntityID(UUID.randomUUID().toString(), YTable)
}

val blob = blob("content").nullable()

override val primaryKey = PrimaryKey(id)
}

class BlobEntity(id: EntityID<String>) : Entity<String>(id) {
var content by BlobTable.blob

companion object : EntityClass<String, BlobEntity>(BlobTable)
}

@Test
fun testBlobField() {
withTables(BlobTable) {
val y1 = BlobEntity.new {
content = ExposedBlob("foo".toByteArray())
}

flushCache()
var y2 = BlobEntity.reload(y1)!!
assertEquals(String(y2.content!!.bytes), "foo")

y2.content = null
flushCache()
y2 = BlobEntity.reload(y1)!!
assertNull(y2.content)

y2.content = ExposedBlob("foo2".toByteArray())
flushCache()
}
}
}
Loading

0 comments on commit d3c5dbc

Please sign in to comment.