Skip to content

Commit

Permalink
test updating metadata on update
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisjenx committed Dec 31, 2024
1 parent e1e676f commit e98e0ac
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package com.mercury.sqkon.db

import androidx.test.platform.app.InstrumentationRegistry

actual fun createEntityQueries(): EntityQueries {
return createEntityQueries(
DriverFactory(
context = InstrumentationRegistry.getInstrumentation().targetContext,
name = null // in-memory database
)
internal actual fun driverFactory(): DriverFactory {
return DriverFactory(
context = InstrumentationRegistry.getInstrumentation().targetContext,
name = null // in-memory database
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,22 @@ import kotlin.test.fail
class DeserializationTest {

private val mainScope = MainScope()
private val entityQueries = createEntityQueries()
private val driver = driverFactory().createDriver()
private val entityQueries = EntityQueries(driver)
private val metadataQueries = MetadataQueries(driver)
private val testObjectStorage = keyValueStorage<TestObject>(
"test-object", entityQueries, mainScope
"test-object", entityQueries, metadataQueries, mainScope
)
private val testObjectStorageError = keyValueStorage<UnSerializable>(
"test-object", entityQueries, mainScope, config = KeyValueStorage.Config(
"test-object", entityQueries, metadataQueries, mainScope,
config = KeyValueStorage.Config(
deserializePolicy = KeyValueStorage.Config.DeserializePolicy.ERROR // default
)
)

private val testObjectStorageDelete = keyValueStorage<UnSerializable>(
"test-object", entityQueries, mainScope, config = KeyValueStorage.Config(
"test-object", entityQueries, metadataQueries, mainScope,
config = KeyValueStorage.Config(
deserializePolicy = KeyValueStorage.Config.DeserializePolicy.DELETE
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ import kotlin.time.Duration.Companion.seconds
class KeyValueStorageTest {

private val mainScope = MainScope()
private val entityQueries = createEntityQueries()
private val driver = driverFactory().createDriver()
private val entityQueries = EntityQueries(driver)
private val metadataQueries = MetadataQueries(driver)
private val testObjectStorage = keyValueStorage<TestObject>(
"test-object", entityQueries, mainScope
"test-object", entityQueries, metadataQueries, mainScope
)

@After
Expand Down
89 changes: 89 additions & 0 deletions library/src/commonTest/kotlin/com/mercury/sqkon/db/MetadataTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.mercury.sqkon.db

import app.cash.turbine.test
import com.mercury.sqkon.TestObject
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.Clock
import org.junit.After
import org.junit.Test
import java.lang.Thread.sleep
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
import kotlin.test.assertTrue

class MetadataTest {

private val mainScope = MainScope()
private val driver = driverFactory().createDriver()
private val entityQueries = EntityQueries(driver)
private val metadataQueries = MetadataQueries(driver)
private val testObjectStorage = keyValueStorage<TestObject>(
"test-object", entityQueries, metadataQueries, mainScope
)

@After
fun tearDown() {
mainScope.cancel()
}

@Test
fun updateWrite_onInsert() = runTest {
val expected = (1..20).map { _ -> TestObject() }.associateBy { it.id }
testObjectStorage.insertAll(expected)

testObjectStorage.metadata().test {
sleep(1)
val now = Clock.System.now()
awaitItem().also {
assertEquals("test-object", it.entity_name)
assertNotNull(it.lastWriteAt)
assertNull(it.lastReadAt)
assertTrue { it.lastWriteAt!! <= now }
}
}
}

@Test
fun updateWrite_onUpdate() = runTest {
val expected = (1..20).map { _ -> TestObject() }.associateBy { it.id }
testObjectStorage.insertAll(expected)

testObjectStorage.metadata().test {
val now = Clock.System.now()
sleep(2)
awaitItem()
testObjectStorage.updateAll(expected)
awaitItem().also {
assertEquals("test-object", it.entity_name)
assertNotNull(it.lastWriteAt)
assertNull(it.lastReadAt)
assertTrue { it.lastWriteAt!! > now }
}
}
}

@Test
fun updateRead_onSelect() = runTest {
val expected = (1..20).map { _ -> TestObject() }.associateBy { it.id }
testObjectStorage.insertAll(expected)
sleep(1)
val now = Clock.System.now()
sleep(2)
testObjectStorage.metadata().test {
awaitItem()
testObjectStorage.selectAll().first()
awaitItem().also {
assertEquals("test-object", it.entity_name)
assertNotNull(it.lastWriteAt)
assertNotNull(it.lastReadAt)
assertTrue { it.lastWriteAt!! <= now }
assertTrue { it.lastReadAt!! > now }
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ import kotlin.test.assertNull
class OffsetPagingTest {

private val mainScope = MainScope()
private val entityQueries = createEntityQueries()
private val driver = driverFactory().createDriver()
private val entityQueries = EntityQueries(driver)
private val metadataQueries = MetadataQueries(driver)
private val testObjectStorage = keyValueStorage<TestObject>(
"test-object", entityQueries, mainScope
"test-object", entityQueries, metadataQueries, mainScope
)

@After
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package com.mercury.sqkon.db

expect fun createEntityQueries(): EntityQueries
internal expect fun driverFactory(): DriverFactory
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.mercury.sqkon.db


actual fun createEntityQueries(): EntityQueries {
return createEntityQueries(DriverFactory())
}
internal actual fun driverFactory(): DriverFactory {
return DriverFactory()
}

0 comments on commit e98e0ac

Please sign in to comment.