Groundwork for tags

This commit is contained in:
Aidan Follestad 2019-01-07 21:31:38 -08:00
commit 2756fc9fc7
10 changed files with 77 additions and 23 deletions

View file

@ -66,6 +66,9 @@ dependencies {
// afollestad // afollestad
implementation 'com.afollestad.material-dialogs:core:' + versions.materialDialogs implementation 'com.afollestad.material-dialogs:core:' + versions.materialDialogs
// Misc
implementation 'com.github.okdroid:checkablechipview:' + versions.chipView
// Debugging // Debugging
implementation 'com.jakewharton.timber:timber:' + versions.timber implementation 'com.jakewharton.timber:timber:' + versions.timber
implementation("com.crashlytics.sdk.android:crashlytics:${versions.fabric}") { implementation("com.crashlytics.sdk.android:crashlytics:${versions.fabric}") {

View file

@ -23,6 +23,7 @@ import android.content.Context.NOTIFICATION_SERVICE
import androidx.room.Room.databaseBuilder import androidx.room.Room.databaseBuilder
import com.afollestad.nocknock.data.AppDatabase import com.afollestad.nocknock.data.AppDatabase
import com.afollestad.nocknock.data.Database1to2Migration import com.afollestad.nocknock.data.Database1to2Migration
import com.afollestad.nocknock.data.Database2to3Migration
import com.afollestad.nocknock.notifications.Qualifiers.MAIN_ACTIVITY_CLASS import com.afollestad.nocknock.notifications.Qualifiers.MAIN_ACTIVITY_CLASS
import com.afollestad.nocknock.ui.main.MainActivity import com.afollestad.nocknock.ui.main.MainActivity
import com.afollestad.nocknock.utilities.ext.systemService import com.afollestad.nocknock.utilities.ext.systemService
@ -38,7 +39,10 @@ val mainModule = module {
single { single {
databaseBuilder(get(), AppDatabase::class.java, "NockNock.db") databaseBuilder(get(), AppDatabase::class.java, "NockNock.db")
.addMigrations(Database1to2Migration()) .addMigrations(
Database1to2Migration(),
Database2to3Migration()
)
.build() .build()
} }

View file

@ -83,6 +83,7 @@ fun fakeModel(id: Long) = Site(
id = id, id = id,
name = "Test", name = "Test",
url = "https://test.com", url = "https://test.com",
tags = "",
settings = fakeSettingsModel(id), settings = fakeSettingsModel(id),
lastResult = fakeResultModel(id), lastResult = fakeResultModel(id),
retryPolicy = fakeRetryPolicy(id) retryPolicy = fakeRetryPolicy(id)

View file

@ -4,7 +4,7 @@
<application> <application>
<uses-library <uses-library
android:name="android.test.runner" android:name="androidx.test.runner"
android:required="false"/> android:required="false"/>
</application> </application>
</manifest> </manifest>

View file

@ -59,9 +59,7 @@ class AppDatabaseTest() {
@After @After
@Throws(IOException::class) @Throws(IOException::class)
fun destroy() { fun destroy() = db.close()
db.close()
}
// SiteDao // SiteDao
@ -69,6 +67,7 @@ class AppDatabaseTest() {
val model1 = Site( val model1 = Site(
name = "Test 1", name = "Test 1",
url = "https://test1.com", url = "https://test1.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -79,6 +78,7 @@ class AppDatabaseTest() {
val model2 = Site( val model2 = Site(
name = "Test 2", name = "Test 2",
url = "https://test2.com", url = "https://test2.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -96,6 +96,7 @@ class AppDatabaseTest() {
val model = Site( val model = Site(
name = "Test", name = "Test",
url = "https://test.com", url = "https://test.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -111,6 +112,7 @@ class AppDatabaseTest() {
val initialModel = Site( val initialModel = Site(
name = "Test 1", name = "Test 1",
url = "https://test1.com", url = "https://test1.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -135,6 +137,7 @@ class AppDatabaseTest() {
val model1 = Site( val model1 = Site(
name = "Test 1", name = "Test 1",
url = "https://test1.com", url = "https://test1.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -145,6 +148,7 @@ class AppDatabaseTest() {
val model2 = Site( val model2 = Site(
name = "Test 2", name = "Test 2",
url = "https://test2.com", url = "https://test2.com",
tags = "",
settings = null, settings = null,
lastResult = null, lastResult = null,
retryPolicy = null retryPolicy = null
@ -292,7 +296,7 @@ class AppDatabaseTest() {
val newId = retryDao.insert(model) val newId = retryDao.insert(model)
assertThat(newId).isEqualTo(1) assertThat(newId).isEqualTo(1)
val finalModel = resultsDao.forSite(newId) val finalModel = retryDao.forSite(newId)
.single() .single()
assertThat(finalModel).isEqualTo(model.copy(siteId = newId)) assertThat(finalModel).isEqualTo(model.copy(siteId = newId))
} }
@ -348,6 +352,25 @@ class AppDatabaseTest() {
assertThat(allSites[2]).isEqualTo(MOCK_MODEL_3) assertThat(allSites[2]).isEqualTo(MOCK_MODEL_3)
} }
@Test fun extension_put_and_allSites_withTag() {
val model1 = MOCK_MODEL_1.copy(tags = "one,two,three")
val model2 = MOCK_MODEL_2.copy(tags = "four,five,six")
val model3 = MOCK_MODEL_3.copy(tags = "seven,eight,nine")
db.putSite(model1)
db.putSite(model2)
db.putSite(model3)
val allSites1 = db.allSites(forTag = "one")
assertThat(allSites1.single()).isEqualTo(model1)
val allSites2 = db.allSites(forTag = "five")
assertThat(allSites2.single()).isEqualTo(model2)
val allSites3 = db.allSites(forTag = "nine")
assertThat(allSites3.single()).isEqualTo(model3)
}
@Test fun extension_put_getSite() { @Test fun extension_put_getSite() {
db.putSite(MOCK_MODEL_1) db.putSite(MOCK_MODEL_1)
db.putSite(MOCK_MODEL_2) db.putSite(MOCK_MODEL_2)

View file

@ -62,6 +62,7 @@ fun fakeModel(id: Long) = Site(
id = id, id = id,
name = "Test", name = "Test",
url = "https://test.com", url = "https://test.com",
tags = "",
settings = fakeSettingsModel(id), settings = fakeSettingsModel(id),
lastResult = fakeResultModel(id), lastResult = fakeResultModel(id),
retryPolicy = fakeRetryPolicy(id) retryPolicy = fakeRetryPolicy(id)

View file

@ -52,9 +52,16 @@ abstract class AppDatabase : RoomDatabase() {
* *
* @author Aidan Follestad (@afollestad) * @author Aidan Follestad (@afollestad)
*/ */
fun AppDatabase.allSites(): List<Site> { fun AppDatabase.allSites(forTag: String = ""): List<Site> {
return siteDao().all() val lowercaseTag = forTag.toLowerCase()
.map { var all = siteDao().all()
if (!forTag.isEmpty()) {
all = all.filter {
forTag.isEmpty() ||
it.tags.toLowerCase().split(",").contains(lowercaseTag)
}
}
return all.map {
val settings = siteSettingsDao().forSite(it.id) val settings = siteSettingsDao().forSite(it.id)
.single() .single()
val lastResult = validationResultsDao().forSite(it.id) val lastResult = validationResultsDao().forSite(it.id)

View file

@ -31,3 +31,15 @@ class Database1to2Migration : Migration(1, 2) {
) )
} }
} }
/**
* Migrates the database from version 2 to 3.
*
* @author Aidan Follestad (@afollestad)
*/
class Database2to3Migration : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE `sites` ADD COLUMN tags TEXT NOT NULL")
}
}

View file

@ -31,8 +31,10 @@ data class Site(
@PrimaryKey(autoGenerate = true) var id: Long = 0, @PrimaryKey(autoGenerate = true) var id: Long = 0,
/** The site's user-given name. */ /** The site's user-given name. */
var name: String, var name: String,
/** The URl at which validation attempts are made to. */ /** The URL at which validation attempts are made to. */
var url: String, var url: String,
/** Comma separated tags for this site. */
var tags: String,
/** Settings for the site. */ /** Settings for the site. */
@Ignore var settings: SiteSettings?, @Ignore var settings: SiteSettings?,
/** The last validation attempt result for the site, if any. */ /** The last validation attempt result for the site, if any. */
@ -41,7 +43,7 @@ data class Site(
@Ignore var retryPolicy: RetryPolicy? @Ignore var retryPolicy: RetryPolicy?
) : CanNotifyModel { ) : CanNotifyModel {
constructor() : this(0, "", "", null, null, null) constructor() : this(0, "", "", "", null, null, null)
override fun notifyId(): Int = id.toInt() override fun notifyId(): Int = id.toInt()

View file

@ -15,6 +15,7 @@ ext.versions = [
// Misc // Misc
okHttp : '3.12.1', okHttp : '3.12.1',
rhino : '1.7.10', rhino : '1.7.10',
chipView : '1.0.3',
// Kotlin // Kotlin
kotlin : '1.3.11', kotlin : '1.3.11',