From b8dd2c0d24467320433c74d2f017b9c54f9cb025 Mon Sep 17 00:00:00 2001 From: Aidan Follestad Date: Sat, 1 Dec 2018 18:21:14 -0800 Subject: [PATCH] Instrumentation tests for ServerModelStore --- dependencies.gradle | 1 + engine/build.gradle | 5 + .../nocknock/engine/ServerModelStoreTest.kt | 119 ++++++++++++++++++ .../nocknock/engine/db/ServerModelDbHelper.kt | 5 + .../nocknock/engine/db/ServerModelStore.kt | 5 +- 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 engine/src/androidTest/java/com/afollestad/nocknock/engine/ServerModelStoreTest.kt diff --git a/dependencies.gradle b/dependencies.gradle index 46a4a43..2879f24 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -23,6 +23,7 @@ ext.versions = [ rxkPrefs : '1.2.0', timber : '4.7.1', + testRunner : '1.0.2', junit : '4.12', mockito : '2.23.0', mockitoKotlin : '2.0.0-RC1', diff --git a/engine/build.gradle b/engine/build.gradle index c26b99b..7267354 100644 --- a/engine/build.gradle +++ b/engine/build.gradle @@ -10,6 +10,8 @@ android { targetSdkVersion versions.compileSdk versionCode versions.publishVersionCode versionName versions.publishVersion + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } } @@ -32,6 +34,9 @@ dependencies { testImplementation 'org.mockito:mockito-core:' + versions.mockito testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:' + versions.mockitoKotlin testImplementation 'com.google.truth:truth:' + versions.truth + + androidTestImplementation 'com.android.support.test:runner:' + versions.testRunner + androidTestImplementation 'com.google.truth:truth:' + versions.truth } apply from: '../spotless.gradle' \ No newline at end of file diff --git a/engine/src/androidTest/java/com/afollestad/nocknock/engine/ServerModelStoreTest.kt b/engine/src/androidTest/java/com/afollestad/nocknock/engine/ServerModelStoreTest.kt new file mode 100644 index 0000000..eebf2f3 --- /dev/null +++ b/engine/src/androidTest/java/com/afollestad/nocknock/engine/ServerModelStoreTest.kt @@ -0,0 +1,119 @@ +/* + * Licensed under Apache-2.0 + * + * Designed and developed by Aidan Follestad (@afollestad) + */ +package com.afollestad.nocknock.engine + +import android.app.Application +import android.support.test.runner.AndroidJUnit4 +import com.afollestad.nocknock.data.ServerModel +import com.afollestad.nocknock.data.ServerStatus.CHECKING +import com.afollestad.nocknock.data.ServerStatus.ERROR +import com.afollestad.nocknock.data.ValidationMode.JAVASCRIPT +import com.afollestad.nocknock.data.ValidationMode.STATUS_CODE +import com.afollestad.nocknock.data.ValidationMode.TERM_SEARCH +import com.afollestad.nocknock.engine.db.RealServerModelStore +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.runBlocking +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import android.support.test.InstrumentationRegistry.getTargetContext as context + +@RunWith(AndroidJUnit4::class) +class ServerModelStoreTest { + + private lateinit var store: RealServerModelStore + + @Before fun setup() { + store = RealServerModelStore(context().applicationContext as Application) + store.db() + .wipe() + } + + @Test fun get() = runBlocking { + // Put some fake data to retrieve + store.put(fakeModel(1)) + val model2 = store.put(fakeModel(2)) + + val model = store.get(2) + .single() + assertThat(model).isEqualTo(model2.copy(id = 2)) + } + + @Test fun getAll() = runBlocking { + // Put some fake data to retrieve + val model1 = store.put(fakeModel(1)) + val model2 = store.put(fakeModel(2)) + + val models = store.get() + assertThat(models.size).isEqualTo(2) + assertThat(models[0]).isEqualTo(model1.copy(id = 1)) + assertThat(models[1]).isEqualTo(model2.copy(id = 2)) + } + + @Test fun update() = runBlocking { + store.put( + ServerModel( + name = "Wakanda Forever", + url = "https://www.wakanda.gov", + status = ERROR, + checkInterval = 5, + lastCheck = 10, + reason = "Body doesn't contain your term.", + validationMode = TERM_SEARCH, + validationContent = "Vibranium", + disabled = false + ) + ) + store.put(fakeModel(2)) + + val originalModel1 = store.get(id = 1) + .single() + + val defaultJs = "var responseObj = JSON.parse(response);\\nreturn responseObj.success === true;" + val newModel1 = originalModel1.copy( + name = "HYDRA", + url = "https://www.hyrda.dict", + status = CHECKING, + checkInterval = 10, + lastCheck = 20, + reason = "Evaluation failed.", + validationMode = JAVASCRIPT, + validationContent = defaultJs, + disabled = true + ) + assertThat(store.update(newModel1)).isEqualTo(1) + + val newModels = store.get() + assertThat(newModels.size).isEqualTo(2) + assertThat(newModels.first()).isEqualTo(newModel1) + } + + @Test fun delete() = runBlocking { + // Put some fake data to delete + val model1 = store.put(fakeModel(1)) + val model2 = store.put(fakeModel(2)) + + assertThat(store.delete(model1)).isEqualTo(1) + + val newModels = store.get() + assertThat(newModels.single()).isEqualTo(model2) + } + + @Test fun deleteAll() = runBlocking { + // Put some fake data to delete + store.put(fakeModel(1)) + store.put(fakeModel(2)) + + store.deleteAll() + assertThat(store.get()).isEmpty() + } + + private fun fakeModel(index: Int) = ServerModel( + name = "Model $index", + url = "https://hello.com/$index", + validationMode = STATUS_CODE + ) +} diff --git a/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelDbHelper.kt b/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelDbHelper.kt index 42bc88a..4caaca1 100644 --- a/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelDbHelper.kt +++ b/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelDbHelper.kt @@ -52,4 +52,9 @@ class ServerModelDbHelper(context: Context) : SQLiteOpenHelper( oldVersion: Int, newVersion: Int ) = onUpgrade(db, oldVersion, newVersion) + + fun wipe() { + this.writableDatabase.execSQL(SQL_DELETE_ENTRIES) + onCreate(this.writableDatabase) + } } diff --git a/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelStore.kt b/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelStore.kt index cd40c5a..e96ed70 100644 --- a/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelStore.kt +++ b/engine/src/main/java/com/afollestad/nocknock/engine/db/ServerModelStore.kt @@ -12,9 +12,10 @@ import com.afollestad.nocknock.data.ServerModel.Companion.COLUMN_ID import com.afollestad.nocknock.data.ServerModel.Companion.DEFAULT_SORT_ORDER import com.afollestad.nocknock.data.ServerModel.Companion.TABLE_NAME import com.afollestad.nocknock.utilities.ext.diffFrom +import org.jetbrains.annotations.TestOnly +import javax.inject.Inject import timber.log.Timber.d as log import timber.log.Timber.w as warn -import javax.inject.Inject /** @author Aidan Follestad (@afollestad) */ interface ServerModelStore { @@ -128,6 +129,8 @@ class RealServerModelStore @Inject constructor(app: Application) : ServerModelSt return dbHelper.writableDatabase.delete(TABLE_NAME, null, null) } + @TestOnly fun db() = dbHelper + private fun readModels(cursor: Cursor): List { val results = mutableListOf() while (cursor.moveToNext()) {