database integration test working
This commit is contained in:
parent
86d965a7f1
commit
2d0d38f70f
7 changed files with 111 additions and 10 deletions
|
@ -13,9 +13,16 @@ dependencies {
|
||||||
testImplementation "org.skyscreamer:jsonassert:1.5.0"
|
testImplementation "org.skyscreamer:jsonassert:1.5.0"
|
||||||
testImplementation "org.hamcrest:hamcrest-all:1.3"
|
testImplementation "org.hamcrest:hamcrest-all:1.3"
|
||||||
|
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0-alpha04'
|
|
||||||
androidTestImplementation "androidx.test.ext:junit:$androidx_junit"
|
// newer integration test libraries might not work
|
||||||
androidTestImplementation "androidx.test:rules:$androidx_rules"
|
// https://stackoverflow.com/questions/64700104/attribute-androidforcequeryable-not-found-in-android-studio-when-running-espres
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'
|
||||||
|
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||||
|
androidTestImplementation 'androidx.test:rules:1.3.0'
|
||||||
|
androidTestImplementation 'androidx.test:runner:1.3.0'
|
||||||
|
|
||||||
|
|
||||||
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.omnipod.dash.history
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.test.core.app.ApplicationProvider
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import com.github.guepardoapps.kulid.ULID
|
||||||
|
import info.nightscout.androidaps.plugins.pump.omnipod.common.definition.OmnipodCommandType
|
||||||
|
import info.nightscout.androidaps.plugins.pump.omnipod.dash.history.database.DashHistoryDatabase
|
||||||
|
import info.nightscout.androidaps.plugins.pump.omnipod.dash.history.database.HistoryRecordDao
|
||||||
|
import info.nightscout.androidaps.plugins.pump.omnipod.dash.history.mapper.HistoryMapper
|
||||||
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Rule
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class DashHistoryTest {
|
||||||
|
|
||||||
|
private lateinit var dao: HistoryRecordDao
|
||||||
|
private lateinit var database: DashHistoryDatabase
|
||||||
|
private lateinit var dashHistory: DashHistory
|
||||||
|
|
||||||
|
@get:Rule
|
||||||
|
val schedulerRule = RxSchedulerRule(Schedulers.trampoline())
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
val context = ApplicationProvider.getApplicationContext<Context>()
|
||||||
|
database = Room.inMemoryDatabaseBuilder(
|
||||||
|
context, DashHistoryDatabase::class.java).build()
|
||||||
|
dao = database.historyRecordDao()
|
||||||
|
dashHistory = DashHistory(dao, HistoryMapper())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testInsertSomething() { // needs to be camel case as runs on Android
|
||||||
|
dashHistory.getRecords().test().apply {
|
||||||
|
assertValue { it.isEmpty() }
|
||||||
|
}
|
||||||
|
|
||||||
|
dashHistory.createRecord(commandType = OmnipodCommandType.SET_BOLUS).test().apply {
|
||||||
|
assertValue { ULID.isValid(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
dashHistory.getRecords().test().apply {
|
||||||
|
assertValue { it.size == 1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun tearDown() {
|
||||||
|
database.close()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package info.nightscout.androidaps.plugins.pump.omnipod.dash.history
|
||||||
|
|
||||||
|
import io.reactivex.Scheduler
|
||||||
|
import io.reactivex.android.plugins.RxAndroidPlugins
|
||||||
|
import io.reactivex.plugins.RxJavaPlugins
|
||||||
|
import org.junit.rules.TestRule
|
||||||
|
import org.junit.runner.Description
|
||||||
|
import org.junit.runners.model.Statement
|
||||||
|
|
||||||
|
// TODO: move to core before the big merge
|
||||||
|
class RxSchedulerRule(val scheduler: Scheduler) : TestRule {
|
||||||
|
|
||||||
|
override fun apply(base: Statement, description: Description) =
|
||||||
|
object : Statement() {
|
||||||
|
override fun evaluate() {
|
||||||
|
RxAndroidPlugins.reset()
|
||||||
|
RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.reset()
|
||||||
|
RxJavaPlugins.setIoSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.setNewThreadSchedulerHandler { scheduler }
|
||||||
|
RxJavaPlugins.setComputationSchedulerHandler { scheduler }
|
||||||
|
|
||||||
|
try {
|
||||||
|
base.evaluate()
|
||||||
|
} finally {
|
||||||
|
RxJavaPlugins.reset()
|
||||||
|
RxAndroidPlugins.reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,9 +20,9 @@ class DashHistory @Inject constructor(
|
||||||
private val historyMapper: HistoryMapper
|
private val historyMapper: HistoryMapper
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun markSuccess(id: String): Completable = dao.markResolved(id, ResolvedResult.SUCCESS, currentTimeMillis())
|
fun markSuccess(id: String): Completable = dao.markResolved(id, ResolvedResult.SUCCESS, currentTimeMillis()) // TODO pass time
|
||||||
|
|
||||||
fun markFailure(id: String): Completable = dao.markResolved(id, ResolvedResult.FAILURE, currentTimeMillis())
|
fun markFailure(id: String): Completable = dao.markResolved(id, ResolvedResult.FAILURE, currentTimeMillis()) // TODO pass time
|
||||||
|
|
||||||
fun createRecord(
|
fun createRecord(
|
||||||
commandType: OmnipodCommandType,
|
commandType: OmnipodCommandType,
|
||||||
|
@ -33,10 +33,14 @@ class DashHistory @Inject constructor(
|
||||||
resolvedAt: Long? = null
|
resolvedAt: Long? = null
|
||||||
): Single<String> {
|
): Single<String> {
|
||||||
val id = ULID.random()
|
val id = ULID.random()
|
||||||
|
|
||||||
|
// TODO: verify that on OmnipodCommandType.SET_BOLUS bolusRecord is not null?
|
||||||
|
// TODO: verify that on SET_TEMPORARY_BASAL tempBasalRecord is not null
|
||||||
|
|
||||||
return dao.save(
|
return dao.save(
|
||||||
HistoryRecordEntity(
|
HistoryRecordEntity(
|
||||||
id = id,
|
id = id,
|
||||||
createdAt = currentTimeMillis(),
|
createdAt = currentTimeMillis(), // TODO pass time (as date, keep createdAt)
|
||||||
commandType = commandType,
|
commandType = commandType,
|
||||||
tempBasalRecord = tempBasalRecord,
|
tempBasalRecord = tempBasalRecord,
|
||||||
bolusRecord = bolusRecord,
|
bolusRecord = bolusRecord,
|
||||||
|
|
|
@ -4,6 +4,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.common.definition.Omnipod
|
||||||
|
|
||||||
data class HistoryRecord(
|
data class HistoryRecord(
|
||||||
val id: String, // ULID
|
val id: String, // ULID
|
||||||
|
// TODO add date
|
||||||
val createdAt: Long,
|
val createdAt: Long,
|
||||||
val commandType: OmnipodCommandType,
|
val commandType: OmnipodCommandType,
|
||||||
val initialResult: InitialResult,
|
val initialResult: InitialResult,
|
||||||
|
|
|
@ -21,10 +21,10 @@ class Converters {
|
||||||
fun fromInitialResult(initialResult: InitialResult) = initialResult.name
|
fun fromInitialResult(initialResult: InitialResult) = initialResult.name
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun toResolvedResult(s: String) = enumValueOf<ResolvedResult>(s)
|
fun toResolvedResult(s: String?) = s?.let { enumValueOf<ResolvedResult>(it) }
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun fromResolvedResult(resolvedResult: ResolvedResult) = resolvedResult.name
|
fun fromResolvedResult(resolvedResult: ResolvedResult?) = resolvedResult?.name
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun toOmnipodCommandType(s: String) = enumValueOf<OmnipodCommandType>(s)
|
fun toOmnipodCommandType(s: String) = enumValueOf<OmnipodCommandType>(s)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import androidx.room.Database
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
||||||
import androidx.room.RoomDatabase
|
import androidx.room.RoomDatabase
|
||||||
import androidx.room.TypeConverters
|
import androidx.room.TypeConverters
|
||||||
|
import androidx.room.migration.Migration
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
entities = [HistoryRecordEntity::class],
|
entities = [HistoryRecordEntity::class],
|
||||||
|
@ -20,12 +21,10 @@ abstract class DashHistoryDatabase : RoomDatabase() {
|
||||||
|
|
||||||
const val VERSION = 1
|
const val VERSION = 1
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
fun build(context: Context) =
|
fun build(context: Context) =
|
||||||
Room.databaseBuilder(context.applicationContext, DashHistoryDatabase::class.java, "omnipod_dash_history_database.db")
|
Room.databaseBuilder(context.applicationContext, DashHistoryDatabase::class.java, "omnipod_dash_history_database.db")
|
||||||
.fallbackToDestructiveMigration()
|
.fallbackToDestructiveMigration()
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue