aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/androidTest/kotlin/com/pitchedapps/frost/db/FrostDatabaseTest.kt41
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt31
2 files changed, 58 insertions, 14 deletions
diff --git a/app/src/androidTest/kotlin/com/pitchedapps/frost/db/FrostDatabaseTest.kt b/app/src/androidTest/kotlin/com/pitchedapps/frost/db/FrostDatabaseTest.kt
index 2d94ed97..dcc96c2d 100644
--- a/app/src/androidTest/kotlin/com/pitchedapps/frost/db/FrostDatabaseTest.kt
+++ b/app/src/androidTest/kotlin/com/pitchedapps/frost/db/FrostDatabaseTest.kt
@@ -5,7 +5,6 @@ import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.runBlocking
-import org.junit.Rule
import org.junit.runner.RunWith
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
@@ -35,7 +34,7 @@ class FrostDatabaseTest {
}
@Test
- fun basic() {
+ fun basicCookie() {
val cookie = CookieEntity(id = 1234L, name = "testName", cookie = "testCookie")
runBlocking {
db.cookieDao().insertCookie(cookie)
@@ -43,4 +42,42 @@ class FrostDatabaseTest {
assertEquals(listOf(cookie), cookies, "Cookie mismatch")
}
}
+
+ @Test
+ fun deleteCookie() {
+ val cookie = CookieEntity(id = 1234L, name = "testName", cookie = "testCookie")
+
+ runBlocking {
+ db.cookieDao().insertCookie(cookie)
+ db.cookieDao().deleteById(cookie.id + 1)
+ assertEquals(
+ listOf(cookie),
+ db.cookieDao().selectAll(),
+ "Cookie list should be the same after inexistent deletion"
+ )
+ db.cookieDao().deleteById(cookie.id)
+ assertEquals(emptyList(), db.cookieDao().selectAll(), "Cookie list should be empty after deletion")
+ }
+ }
+
+ @Test
+ fun insertCookie() {
+ val cookie = CookieEntity(id = 1234L, name = "testName", cookie = "testCookie")
+ runBlocking {
+ db.cookieDao().insertCookie(cookie)
+ assertEquals(listOf(cookie), db.cookieDao().selectAll(), "Cookie insertion failed")
+ db.cookieDao().insertCookie(cookie.copy(name = "testName2"))
+ assertEquals(
+ listOf(cookie.copy(name = "testName2")),
+ db.cookieDao().selectAll(),
+ "Cookie replacement failed"
+ )
+ db.cookieDao().insertCookie(cookie.copy(id = 123L))
+ assertEquals(
+ setOf(cookie.copy(id = 123L), cookie.copy(name = "testName2")),
+ db.cookieDao().selectAll().toSet(),
+ "New cookie insertion failed"
+ )
+ }
+ }
} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
index ff64f5eb..44e62938 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
@@ -33,6 +33,8 @@ import com.raizlabs.android.dbflow.kotlinextensions.fastSave
import com.raizlabs.android.dbflow.kotlinextensions.from
import com.raizlabs.android.dbflow.kotlinextensions.select
import com.raizlabs.android.dbflow.structure.BaseModel
+import kotlinx.coroutines.NonCancellable
+import kotlinx.coroutines.withContext
/**
* Created by Allan Wang on 2017-05-30.
@@ -52,21 +54,26 @@ interface FbTabDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun _insertAll(items: List<FbTabEntity>)
-
- @Transaction
- suspend fun _save(items: List<FbTabEntity>) {
- _deleteAll()
- _insertAll(items)
- }
}
+/**
+ * Saving tabs operates by deleting all db items and saving the new list.
+ * Transactions can't be done with suspensions in room as switching threads during the process
+ * may result in a deadlock.
+ * In this case, there may be a chance that the 'transaction' completes partially,
+ * but we'll just fallback to the default anyways.
+ */
suspend fun FbTabDao.save(items: List<FbItem>) {
- _save((items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem ->
- FbTabEntity(
- index,
- fbItem
- )
- })
+ withContext(NonCancellable) {
+ _deleteAll()
+ val entities = (items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem ->
+ FbTabEntity(
+ index,
+ fbItem
+ )
+ }
+ _insertAll(entities)
+ }
}
suspend fun FbTabDao.selectAll(): List<FbItem> = _selectAll().map { it.tab }.takeIf { it.isNotEmpty() } ?: defaultTabs()