mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-22 12:03:09 -04:00
Refactord tests
This commit is contained in:
parent
18580f53f1
commit
2c045b8cfe
@ -24,6 +24,7 @@ import androidx.test.core.app.ApplicationProvider
|
|||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
import io.objectbox.Box
|
import io.objectbox.Box
|
||||||
|
import kotlinx.coroutines.flow.subscribe
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.junit.jupiter.api.Assertions
|
import org.junit.jupiter.api.Assertions
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
@ -57,7 +58,7 @@ class NoteRoomDaoTest {
|
|||||||
noteRoomDao = db.noteRoomDao()
|
noteRoomDao = db.noteRoomDao()
|
||||||
noteRoomDao.deletePages(pagesToDelete)
|
noteRoomDao.deletePages(pagesToDelete)
|
||||||
noteRoomDao.deleteNotes(notesItemList)
|
noteRoomDao.deleteNotes(notesItemList)
|
||||||
noteRoomDao.pages().collect {
|
noteRoomDao.pages().subscribe {
|
||||||
Assertions.assertEquals(0, it.size)
|
Assertions.assertEquals(0, it.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,7 +76,7 @@ class NoteRoomDaoTest {
|
|||||||
notesItem.title = noteTitle
|
notesItem.title = noteTitle
|
||||||
noteRoomDao.saveNote(NotesRoomEntity(notesItem))
|
noteRoomDao.saveNote(NotesRoomEntity(notesItem))
|
||||||
noteRoomDao.deleteNote(noteTitle)
|
noteRoomDao.deleteNote(noteTitle)
|
||||||
noteRoomDao.notesAsEntity().collect {
|
noteRoomDao.notesAsEntity().subscribe {
|
||||||
Assertions.assertEquals(0, it.size)
|
Assertions.assertEquals(0, it.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,7 +94,7 @@ class NoteRoomDaoTest {
|
|||||||
val noteTitle = "abNotesTitle"
|
val noteTitle = "abNotesTitle"
|
||||||
notesItem.title = noteTitle
|
notesItem.title = noteTitle
|
||||||
noteRoomDao.saveNote(NotesRoomEntity(notesItem))
|
noteRoomDao.saveNote(NotesRoomEntity(notesItem))
|
||||||
noteRoomDao.notesAsEntity().collect {
|
noteRoomDao.notesAsEntity().subscribe {
|
||||||
Assertions.assertEquals(1, it.size)
|
Assertions.assertEquals(1, it.size)
|
||||||
Assertions.assertEquals(noteTitle, it.first().noteTitle)
|
Assertions.assertEquals(noteTitle, it.first().noteTitle)
|
||||||
}
|
}
|
||||||
@ -117,7 +118,7 @@ class NoteRoomDaoTest {
|
|||||||
noteRoomDao.saveNote(NotesRoomEntity(notesItem3))
|
noteRoomDao.saveNote(NotesRoomEntity(notesItem3))
|
||||||
noteRoomDao.saveNote(NotesRoomEntity(notesItem4))
|
noteRoomDao.saveNote(NotesRoomEntity(notesItem4))
|
||||||
noteRoomDao.saveNote(NotesRoomEntity(notesItem5))
|
noteRoomDao.saveNote(NotesRoomEntity(notesItem5))
|
||||||
noteRoomDao.notesAsEntity().collect {
|
noteRoomDao.notesAsEntity().subscribe {
|
||||||
Assertions.assertEquals(5, it.size)
|
Assertions.assertEquals(5, it.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -134,7 +135,7 @@ class NoteRoomDaoTest {
|
|||||||
newNotesDao.saveNote(newNote)
|
newNotesDao.saveNote(newNote)
|
||||||
notesBox.put(NotesEntity(newNote))
|
notesBox.put(NotesEntity(newNote))
|
||||||
noteRoomDao.migrationToRoomInsert(notesBox)
|
noteRoomDao.migrationToRoomInsert(notesBox)
|
||||||
noteRoomDao.pages().collect {
|
noteRoomDao.pages().subscribe {
|
||||||
Assertions.assertEquals(1, it.size)
|
Assertions.assertEquals(1, it.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,7 +157,7 @@ class NoteRoomDaoTest {
|
|||||||
notesBox.put(NotesEntity(newNote))
|
notesBox.put(NotesEntity(newNote))
|
||||||
notesBox.put(NotesEntity(newNote))
|
notesBox.put(NotesEntity(newNote))
|
||||||
noteRoomDao.migrationToRoomInsert(notesBox)
|
noteRoomDao.migrationToRoomInsert(notesBox)
|
||||||
noteRoomDao.pages().collect {
|
noteRoomDao.pages().subscribe {
|
||||||
Assertions.assertEquals(6, it.size)
|
Assertions.assertEquals(6, it.size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -347,4 +347,5 @@ object Libs {
|
|||||||
const val roomKtx = "androidx.room:room-ktx:" + Versions.roomVersion
|
const val roomKtx = "androidx.room:room-ktx:" + Versions.roomVersion
|
||||||
|
|
||||||
const val roomCompiler = "androidx.room:room-compiler:" + Versions.roomVersion
|
const val roomCompiler = "androidx.room:room-compiler:" + Versions.roomVersion
|
||||||
|
const val roomRxjava2 = "androidx.room:room-rxjava2:" + Versions.roomVersion
|
||||||
}
|
}
|
||||||
|
@ -209,6 +209,7 @@ class AllProjectConfigurer {
|
|||||||
implementation(Libs.rxjava)
|
implementation(Libs.rxjava)
|
||||||
implementation(Libs.preference_ktx)
|
implementation(Libs.preference_ktx)
|
||||||
implementation(Libs.roomKtx)
|
implementation(Libs.roomKtx)
|
||||||
|
implementation(Libs.roomRxjava2)
|
||||||
kapt(Libs.roomCompiler)
|
kapt(Libs.roomCompiler)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,9 @@ import androidx.room.Insert
|
|||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import io.objectbox.Box
|
import io.objectbox.Box
|
||||||
|
import io.reactivex.Flowable
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import kotlinx.coroutines.flow.map
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.kiwix.kiwixmobile.core.dao.entities.NotesEntity
|
import org.kiwix.kiwixmobile.core.dao.entities.NotesEntity
|
||||||
import org.kiwix.kiwixmobile.core.dao.entities.NotesRoomEntity
|
import org.kiwix.kiwixmobile.core.dao.entities.NotesRoomEntity
|
||||||
@ -34,12 +33,12 @@ import org.kiwix.kiwixmobile.core.page.adapter.Page
|
|||||||
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
abstract class NotesRoomDao : PageRoomDao {
|
abstract class NotesRoomDao : PageDao {
|
||||||
@Query("SELECT * FROM NotesRoomEntity ORDER BY NotesRoomEntity.noteTitle")
|
@Query("SELECT * FROM NotesRoomEntity ORDER BY NotesRoomEntity.noteTitle")
|
||||||
abstract fun notesAsEntity(): Flow<List<NotesRoomEntity>>
|
abstract fun notesAsEntity(): Flowable<List<NotesRoomEntity>>
|
||||||
|
|
||||||
fun notes(): Flow<List<Page>> = notesAsEntity().map { it.map(::NoteListItem) }
|
fun notes(): Flowable<List<Page>> = notesAsEntity().map { it.map(::NoteListItem) }
|
||||||
override fun pages(): Flow<List<Page>> = notes()
|
override fun pages(): Flowable<List<Page>> = notes()
|
||||||
override fun deletePages(pagesToDelete: List<Page>) =
|
override fun deletePages(pagesToDelete: List<Page>) =
|
||||||
deleteNotes(pagesToDelete as List<NoteListItem>)
|
deleteNotes(pagesToDelete as List<NoteListItem>)
|
||||||
|
|
||||||
|
@ -19,18 +19,18 @@
|
|||||||
package org.kiwix.kiwixmobile.core.dao
|
package org.kiwix.kiwixmobile.core.dao
|
||||||
|
|
||||||
import io.reactivex.Flowable
|
import io.reactivex.Flowable
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
||||||
|
|
||||||
interface PageDao : BasePageDao {
|
interface PageDao {
|
||||||
override fun pages(): Flowable<List<Page>>
|
fun pages(): Flowable<List<Page>>
|
||||||
}
|
|
||||||
|
|
||||||
interface PageRoomDao : BasePageDao {
|
|
||||||
override fun pages(): Flow<List<Page>>
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BasePageDao {
|
|
||||||
fun pages(): Any
|
|
||||||
fun deletePages(pagesToDelete: List<Page>)
|
fun deletePages(pagesToDelete: List<Page>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// interface PageRoomDao : BasePageDao {
|
||||||
|
// override fun pages(): Flow<List<Page>>
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// interface BasePageDao {
|
||||||
|
// fun pages(): Any
|
||||||
|
// fun deletePages(pagesToDelete: List<Page>)
|
||||||
|
// }
|
||||||
|
@ -22,6 +22,7 @@ import io.objectbox.annotation.Entity
|
|||||||
import io.objectbox.annotation.Id
|
import io.objectbox.annotation.Id
|
||||||
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
||||||
|
|
||||||
|
@Deprecated("Replaced with the Room")
|
||||||
@Entity
|
@Entity
|
||||||
data class NotesEntity(
|
data class NotesEntity(
|
||||||
@Id var id: Long = 0L,
|
@Id var id: Long = 0L,
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel
|
package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao
|
import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao
|
||||||
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
||||||
import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.ShowDeleteBookmarksDialog
|
import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects.ShowDeleteBookmarksDialog
|
||||||
@ -61,7 +62,7 @@ class BookmarkViewModel @Inject constructor(
|
|||||||
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
||||||
|
|
||||||
override fun createDeletePageDialogEffect(state: BookmarkState) =
|
override fun createDeletePageDialogEffect(state: BookmarkState) =
|
||||||
ShowDeleteBookmarksDialog(effects, state, basePageDao)
|
ShowDeleteBookmarksDialog(effects, state, pageDao, viewModelScope)
|
||||||
|
|
||||||
override fun copyWithNewItems(state: BookmarkState, newItems: List<BookmarkItem>): BookmarkState =
|
override fun copyWithNewItems(state: BookmarkState, newItems: List<BookmarkItem>): BookmarkState =
|
||||||
state.copy(pageItems = newItems)
|
state.copy(pageItems = newItems)
|
||||||
|
@ -21,8 +21,10 @@ package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.effects
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
||||||
|
import org.kiwix.kiwixmobile.core.dao.PageDao
|
||||||
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
||||||
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
||||||
import org.kiwix.kiwixmobile.core.page.viewmodel.PageState
|
import org.kiwix.kiwixmobile.core.page.viewmodel.PageState
|
||||||
@ -35,14 +37,17 @@ import javax.inject.Inject
|
|||||||
data class ShowDeleteBookmarksDialog(
|
data class ShowDeleteBookmarksDialog(
|
||||||
private val effects: PublishProcessor<SideEffect<*>>,
|
private val effects: PublishProcessor<SideEffect<*>>,
|
||||||
private val state: PageState<BookmarkItem>,
|
private val state: PageState<BookmarkItem>,
|
||||||
private val pageDao: BasePageDao
|
private val pageDao: PageDao,
|
||||||
|
private val coroutineScope: CoroutineScope
|
||||||
) : SideEffect<Unit> {
|
) : SideEffect<Unit> {
|
||||||
@Inject lateinit var dialogShower: DialogShower
|
@Inject lateinit var dialogShower: DialogShower
|
||||||
override fun invokeWith(activity: AppCompatActivity) {
|
override fun invokeWith(activity: AppCompatActivity) {
|
||||||
activity.cachedComponent.inject(this)
|
activity.cachedComponent.inject(this)
|
||||||
dialogShower.show(
|
dialogShower.show(
|
||||||
if (state.isInSelectionState) DeleteSelectedBookmarks else DeleteAllBookmarks,
|
if (state.isInSelectionState) DeleteSelectedBookmarks else DeleteAllBookmarks,
|
||||||
{ effects.offer(DeletePageItems(state, pageDao, activity.lifecycleScope)) }
|
{
|
||||||
|
effects.offer(DeletePageItems(state, pageDao))
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.core.page.history.viewmodel
|
package org.kiwix.kiwixmobile.core.page.history.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
||||||
import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem
|
import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem
|
||||||
import org.kiwix.kiwixmobile.core.page.history.viewmodel.effects.ShowDeleteHistoryDialog
|
import org.kiwix.kiwixmobile.core.page.history.viewmodel.effects.ShowDeleteHistoryDialog
|
||||||
@ -58,7 +59,7 @@ class HistoryViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun createDeletePageDialogEffect(state: HistoryState) =
|
override fun createDeletePageDialogEffect(state: HistoryState) =
|
||||||
ShowDeleteHistoryDialog(effects, state, basePageDao)
|
ShowDeleteHistoryDialog(effects, state, pageDao, viewModelScope)
|
||||||
|
|
||||||
override fun deselectAllPages(state: HistoryState): HistoryState =
|
override fun deselectAllPages(state: HistoryState): HistoryState =
|
||||||
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
||||||
|
@ -19,10 +19,9 @@ package org.kiwix.kiwixmobile.core.page.history.viewmodel.effects
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.PageDao
|
import org.kiwix.kiwixmobile.core.dao.PageDao
|
||||||
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
||||||
import org.kiwix.kiwixmobile.core.page.history.viewmodel.HistoryState
|
import org.kiwix.kiwixmobile.core.page.history.viewmodel.HistoryState
|
||||||
@ -35,13 +34,14 @@ import javax.inject.Inject
|
|||||||
data class ShowDeleteHistoryDialog(
|
data class ShowDeleteHistoryDialog(
|
||||||
private val effects: PublishProcessor<SideEffect<*>>,
|
private val effects: PublishProcessor<SideEffect<*>>,
|
||||||
private val state: HistoryState,
|
private val state: HistoryState,
|
||||||
private val pageDao: BasePageDao
|
private val pageDao: PageDao,
|
||||||
|
private val coroutineScope: CoroutineScope
|
||||||
) : SideEffect<Unit> {
|
) : SideEffect<Unit> {
|
||||||
@Inject lateinit var dialogShower: DialogShower
|
@Inject lateinit var dialogShower: DialogShower
|
||||||
override fun invokeWith(activity: AppCompatActivity) {
|
override fun invokeWith(activity: AppCompatActivity) {
|
||||||
activity.cachedComponent.inject(this)
|
activity.cachedComponent.inject(this)
|
||||||
dialogShower.show(if (state.isInSelectionState) DeleteSelectedHistory else DeleteAllHistory, {
|
dialogShower.show(if (state.isInSelectionState) DeleteSelectedHistory else DeleteAllHistory, {
|
||||||
effects.offer(DeletePageItems(state, pageDao, activity.lifecycleScope))
|
effects.offer(DeletePageItems(state, pageDao))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.core.page.notes.viewmodel
|
package org.kiwix.kiwixmobile.core.page.notes.viewmodel
|
||||||
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.NewNoteDao
|
import androidx.lifecycle.viewModelScope
|
||||||
import org.kiwix.kiwixmobile.core.dao.NotesRoomDao
|
import org.kiwix.kiwixmobile.core.dao.NotesRoomDao
|
||||||
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
||||||
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
||||||
@ -67,7 +67,7 @@ class NotesViewModel @Inject constructor(
|
|||||||
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
state.copy(pageItems = state.pageItems.map { it.copy(isSelected = false) })
|
||||||
|
|
||||||
override fun createDeletePageDialogEffect(state: NotesState) =
|
override fun createDeletePageDialogEffect(state: NotesState) =
|
||||||
ShowDeleteNotesDialog(effects, state, basePageDao)
|
ShowDeleteNotesDialog(effects, state, pageDao, viewModelScope)
|
||||||
|
|
||||||
override fun onItemClick(page: Page) =
|
override fun onItemClick(page: Page) =
|
||||||
ShowOpenNoteDialog(effects, page, zimReaderContainer)
|
ShowOpenNoteDialog(effects, page, zimReaderContainer)
|
||||||
|
@ -22,8 +22,12 @@ import android.util.Log
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
||||||
|
import org.kiwix.kiwixmobile.core.dao.PageDao
|
||||||
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.cachedComponent
|
||||||
import org.kiwix.kiwixmobile.core.page.notes.viewmodel.NotesState
|
import org.kiwix.kiwixmobile.core.page.notes.viewmodel.NotesState
|
||||||
import org.kiwix.kiwixmobile.core.page.viewmodel.effects.DeletePageItems
|
import org.kiwix.kiwixmobile.core.page.viewmodel.effects.DeletePageItems
|
||||||
@ -35,7 +39,8 @@ import javax.inject.Inject
|
|||||||
data class ShowDeleteNotesDialog(
|
data class ShowDeleteNotesDialog(
|
||||||
private val effects: PublishProcessor<SideEffect<*>>,
|
private val effects: PublishProcessor<SideEffect<*>>,
|
||||||
private val state: NotesState,
|
private val state: NotesState,
|
||||||
private val pageDao: BasePageDao
|
private val pageDao: PageDao,
|
||||||
|
private val coroutineScope: CoroutineScope
|
||||||
) : SideEffect<Unit> {
|
) : SideEffect<Unit> {
|
||||||
@Inject lateinit var dialogShower: DialogShower
|
@Inject lateinit var dialogShower: DialogShower
|
||||||
override fun invokeWith(activity: AppCompatActivity) {
|
override fun invokeWith(activity: AppCompatActivity) {
|
||||||
@ -44,7 +49,9 @@ data class ShowDeleteNotesDialog(
|
|||||||
dialogShower.show(
|
dialogShower.show(
|
||||||
if (state.isInSelectionState) DeleteSelectedNotes else DeleteAllNotes,
|
if (state.isInSelectionState) DeleteSelectedNotes else DeleteAllNotes,
|
||||||
{
|
{
|
||||||
effects.offer(DeletePageItems(state, pageDao, activity.lifecycleScope))
|
coroutineScope.launch(Dispatchers.IO) {
|
||||||
|
effects.offer(DeletePageItems(state, pageDao))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -20,16 +20,12 @@ package org.kiwix.kiwixmobile.core.page.viewmodel
|
|||||||
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
|
||||||
import org.kiwix.kiwixmobile.core.dao.PageDao
|
import org.kiwix.kiwixmobile.core.dao.PageDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.PageRoomDao
|
|
||||||
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
||||||
import org.kiwix.kiwixmobile.core.page.viewmodel.Action.Exit
|
import org.kiwix.kiwixmobile.core.page.viewmodel.Action.Exit
|
||||||
import org.kiwix.kiwixmobile.core.page.viewmodel.Action.ExitActionModeMenu
|
import org.kiwix.kiwixmobile.core.page.viewmodel.Action.ExitActionModeMenu
|
||||||
@ -46,7 +42,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.effects.PopFragmentBackstack
|
|||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
|
|
||||||
abstract class PageViewModel<T : Page, S : PageState<T>>(
|
abstract class PageViewModel<T : Page, S : PageState<T>>(
|
||||||
protected val basePageDao: BasePageDao,
|
protected val pageDao: PageDao,
|
||||||
val sharedPreferenceUtil: SharedPreferenceUtil,
|
val sharedPreferenceUtil: SharedPreferenceUtil,
|
||||||
val zimReaderContainer: ZimReaderContainer
|
val zimReaderContainer: ZimReaderContainer
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
@ -74,24 +70,12 @@ abstract class PageViewModel<T : Page, S : PageState<T>>(
|
|||||||
.subscribe(state::postValue, Throwable::printStackTrace)
|
.subscribe(state::postValue, Throwable::printStackTrace)
|
||||||
|
|
||||||
protected fun addDisposablesToCompositeDisposable() {
|
protected fun addDisposablesToCompositeDisposable() {
|
||||||
when (basePageDao) {
|
|
||||||
is PageDao -> {
|
|
||||||
compositeDisposable.addAll(
|
compositeDisposable.addAll(
|
||||||
viewStateReducer(),
|
viewStateReducer(),
|
||||||
basePageDao.pages().subscribeOn(Schedulers.io())
|
pageDao.pages().subscribeOn(Schedulers.io())
|
||||||
.subscribe({ actions.offer(UpdatePages(it)) }, Throwable::printStackTrace)
|
.subscribe({ actions.offer(UpdatePages(it)) }, Throwable::printStackTrace)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is PageRoomDao -> {
|
|
||||||
compositeDisposable.add(viewStateReducer())
|
|
||||||
viewModelScope.launch {
|
|
||||||
basePageDao.pages().collect {
|
|
||||||
actions.offer(UpdatePages(it))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun reduce(action: Action, state: S): S = when (action) {
|
private fun reduce(action: Action, state: S): S = when (action) {
|
||||||
Exit -> exitFragment(state)
|
Exit -> exitFragment(state)
|
||||||
|
@ -19,30 +19,20 @@
|
|||||||
package org.kiwix.kiwixmobile.core.page.viewmodel.effects
|
package org.kiwix.kiwixmobile.core.page.viewmodel.effects
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.BasePageDao
|
import org.kiwix.kiwixmobile.core.dao.PageDao
|
||||||
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
import org.kiwix.kiwixmobile.core.page.adapter.Page
|
||||||
import org.kiwix.kiwixmobile.core.page.viewmodel.PageState
|
import org.kiwix.kiwixmobile.core.page.viewmodel.PageState
|
||||||
|
|
||||||
data class DeletePageItems(
|
data class DeletePageItems(
|
||||||
private val state: PageState<*>,
|
private val state: PageState<*>,
|
||||||
private val pageDao: BasePageDao,
|
private val pageDao: PageDao
|
||||||
private val coroutineScope: CoroutineScope
|
|
||||||
) : SideEffect<Unit> {
|
) : SideEffect<Unit> {
|
||||||
override fun invokeWith(activity: AppCompatActivity) {
|
override fun invokeWith(activity: AppCompatActivity) {
|
||||||
if (state.isInSelectionState) {
|
|
||||||
pageDao.deletePages(state.pageItems.filter(Page::isSelected))
|
|
||||||
} else {
|
|
||||||
coroutineScope.launch(Dispatchers.IO) {
|
|
||||||
if (state.isInSelectionState) {
|
if (state.isInSelectionState) {
|
||||||
pageDao.deletePages(state.pageItems.filter(Page::isSelected))
|
pageDao.deletePages(state.pageItems.filter(Page::isSelected))
|
||||||
} else {
|
} else {
|
||||||
pageDao.deletePages(state.pageItems)
|
pageDao.deletePages(state.pageItems)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel
|
package org.kiwix.kiwixmobile.core.page.bookmark.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.mockk.clearAllMocks
|
import io.mockk.clearAllMocks
|
||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
@ -132,7 +133,12 @@ internal class BookmarkViewModelTest {
|
|||||||
assertThat(
|
assertThat(
|
||||||
viewModel.createDeletePageDialogEffect(bookmarkState())
|
viewModel.createDeletePageDialogEffect(bookmarkState())
|
||||||
).isEqualTo(
|
).isEqualTo(
|
||||||
ShowDeleteBookmarksDialog(viewModel.effects, bookmarkState(), bookmarksDao)
|
ShowDeleteBookmarksDialog(
|
||||||
|
viewModel.effects,
|
||||||
|
bookmarkState(),
|
||||||
|
bookmarksDao,
|
||||||
|
viewModel.viewModelScope
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import io.mockk.mockk
|
|||||||
import io.mockk.slot
|
import io.mockk.slot
|
||||||
import io.mockk.verify
|
import io.mockk.verify
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao
|
import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao
|
||||||
@ -39,17 +40,25 @@ internal class ShowDeleteBookmarksDialogTest {
|
|||||||
private val newBookmarksDao = mockk<NewBookmarksDao>()
|
private val newBookmarksDao = mockk<NewBookmarksDao>()
|
||||||
val activity = mockk<CoreMainActivity>()
|
val activity = mockk<CoreMainActivity>()
|
||||||
private val dialogShower = mockk<DialogShower>(relaxed = true)
|
private val dialogShower = mockk<DialogShower>(relaxed = true)
|
||||||
|
private val coroutineScope: CoroutineScope = mockk(relaxed = true)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `invoke with shows dialog that offers ConfirmDelete action`() {
|
fun `invoke with shows dialog that offers ConfirmDelete action`() {
|
||||||
val showDeleteBookmarksDialog =
|
val showDeleteBookmarksDialog =
|
||||||
ShowDeleteBookmarksDialog(effects, bookmarkState(), newBookmarksDao)
|
ShowDeleteBookmarksDialog(effects, bookmarkState(), newBookmarksDao, coroutineScope)
|
||||||
mockkActivityInjection(showDeleteBookmarksDialog)
|
mockkActivityInjection(showDeleteBookmarksDialog)
|
||||||
val lambdaSlot = slot<() -> Unit>()
|
val lambdaSlot = slot<() -> Unit>()
|
||||||
showDeleteBookmarksDialog.invokeWith(activity)
|
showDeleteBookmarksDialog.invokeWith(activity)
|
||||||
verify { dialogShower.show(any(), capture(lambdaSlot)) }
|
verify { dialogShower.show(any(), capture(lambdaSlot)) }
|
||||||
lambdaSlot.captured.invoke()
|
lambdaSlot.captured.invoke()
|
||||||
verify { effects.offer(DeletePageItems(bookmarkState(), newBookmarksDao)) }
|
verify {
|
||||||
|
effects.offer(
|
||||||
|
DeletePageItems(
|
||||||
|
bookmarkState(),
|
||||||
|
newBookmarksDao
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun mockkActivityInjection(showDeleteBookmarksDialog: ShowDeleteBookmarksDialog) {
|
private fun mockkActivityInjection(showDeleteBookmarksDialog: ShowDeleteBookmarksDialog) {
|
||||||
@ -65,7 +74,8 @@ internal class ShowDeleteBookmarksDialogTest {
|
|||||||
ShowDeleteBookmarksDialog(
|
ShowDeleteBookmarksDialog(
|
||||||
effects,
|
effects,
|
||||||
bookmarkState(listOf(bookmark(isSelected = true))),
|
bookmarkState(listOf(bookmark(isSelected = true))),
|
||||||
newBookmarksDao
|
newBookmarksDao,
|
||||||
|
coroutineScope
|
||||||
)
|
)
|
||||||
mockkActivityInjection(showDeleteBookmarksDialog)
|
mockkActivityInjection(showDeleteBookmarksDialog)
|
||||||
showDeleteBookmarksDialog.invokeWith(activity)
|
showDeleteBookmarksDialog.invokeWith(activity)
|
||||||
@ -78,7 +88,8 @@ internal class ShowDeleteBookmarksDialogTest {
|
|||||||
ShowDeleteBookmarksDialog(
|
ShowDeleteBookmarksDialog(
|
||||||
effects,
|
effects,
|
||||||
bookmarkState(listOf(bookmark())),
|
bookmarkState(listOf(bookmark())),
|
||||||
newBookmarksDao
|
newBookmarksDao,
|
||||||
|
coroutineScope
|
||||||
)
|
)
|
||||||
mockkActivityInjection(showDeleteBookmarksDialog)
|
mockkActivityInjection(showDeleteBookmarksDialog)
|
||||||
showDeleteBookmarksDialog.invokeWith(activity)
|
showDeleteBookmarksDialog.invokeWith(activity)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.kiwix.kiwixmobile.core.page.history.viewmodel
|
package org.kiwix.kiwixmobile.core.page.history.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.mockk.clearAllMocks
|
import io.mockk.clearAllMocks
|
||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
@ -101,7 +102,12 @@ internal class HistoryViewModelTest {
|
|||||||
@Test
|
@Test
|
||||||
fun `createDeletePageDialogEffect returns ShowDeleteHistoryDialog`() {
|
fun `createDeletePageDialogEffect returns ShowDeleteHistoryDialog`() {
|
||||||
assertThat(viewModel.createDeletePageDialogEffect(historyState())).isEqualTo(
|
assertThat(viewModel.createDeletePageDialogEffect(historyState())).isEqualTo(
|
||||||
ShowDeleteHistoryDialog(viewModel.effects, historyState(), historyDao)
|
ShowDeleteHistoryDialog(
|
||||||
|
viewModel.effects,
|
||||||
|
historyState(),
|
||||||
|
historyDao,
|
||||||
|
viewModel.viewModelScope
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import io.mockk.mockk
|
|||||||
import io.mockk.slot
|
import io.mockk.slot
|
||||||
import io.mockk.verify
|
import io.mockk.verify
|
||||||
import io.reactivex.processors.PublishProcessor
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.kiwix.kiwixmobile.core.base.SideEffect
|
import org.kiwix.kiwixmobile.core.base.SideEffect
|
||||||
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
import org.kiwix.kiwixmobile.core.dao.HistoryDao
|
||||||
@ -21,6 +22,7 @@ internal class ShowDeleteHistoryDialogTest {
|
|||||||
private val historyDao = mockk<HistoryDao>()
|
private val historyDao = mockk<HistoryDao>()
|
||||||
val activity = mockk<CoreMainActivity>()
|
val activity = mockk<CoreMainActivity>()
|
||||||
private val dialogShower = mockk<DialogShower>(relaxed = true)
|
private val dialogShower = mockk<DialogShower>(relaxed = true)
|
||||||
|
private val coroutineScope: CoroutineScope = mockk(relaxed = true)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `invoke with shows dialog that offers ConfirmDelete action`() {
|
fun `invoke with shows dialog that offers ConfirmDelete action`() {
|
||||||
@ -28,7 +30,8 @@ internal class ShowDeleteHistoryDialogTest {
|
|||||||
ShowDeleteHistoryDialog(
|
ShowDeleteHistoryDialog(
|
||||||
effects,
|
effects,
|
||||||
historyState(),
|
historyState(),
|
||||||
historyDao
|
historyDao,
|
||||||
|
coroutineScope
|
||||||
)
|
)
|
||||||
mockkActivityInjection(showDeleteHistoryDialog)
|
mockkActivityInjection(showDeleteHistoryDialog)
|
||||||
val lambdaSlot = slot<() -> Unit>()
|
val lambdaSlot = slot<() -> Unit>()
|
||||||
@ -44,7 +47,8 @@ internal class ShowDeleteHistoryDialogTest {
|
|||||||
ShowDeleteHistoryDialog(
|
ShowDeleteHistoryDialog(
|
||||||
effects,
|
effects,
|
||||||
historyState(listOf(historyItem(isSelected = true))),
|
historyState(listOf(historyItem(isSelected = true))),
|
||||||
historyDao
|
historyDao,
|
||||||
|
coroutineScope
|
||||||
)
|
)
|
||||||
mockkActivityInjection(showDeleteHistoryDialog)
|
mockkActivityInjection(showDeleteHistoryDialog)
|
||||||
showDeleteHistoryDialog.invokeWith(activity)
|
showDeleteHistoryDialog.invokeWith(activity)
|
||||||
@ -57,7 +61,8 @@ internal class ShowDeleteHistoryDialogTest {
|
|||||||
ShowDeleteHistoryDialog(
|
ShowDeleteHistoryDialog(
|
||||||
effects,
|
effects,
|
||||||
historyState(),
|
historyState(),
|
||||||
historyDao
|
historyDao,
|
||||||
|
coroutineScope
|
||||||
)
|
)
|
||||||
mockkActivityInjection(showDeleteHistoryDialog)
|
mockkActivityInjection(showDeleteHistoryDialog)
|
||||||
showDeleteHistoryDialog.invokeWith(activity)
|
showDeleteHistoryDialog.invokeWith(activity)
|
||||||
|
@ -35,14 +35,20 @@ internal class DeletePageItemsTest {
|
|||||||
@Test
|
@Test
|
||||||
fun `delete with selected items only deletes the selected items`() {
|
fun `delete with selected items only deletes the selected items`() {
|
||||||
item1.isSelected = true
|
item1.isSelected = true
|
||||||
DeletePageItems(historyState(listOf(item1, item2)), pageDao).invokeWith(activity)
|
DeletePageItems(
|
||||||
|
historyState(listOf(item1, item2)),
|
||||||
|
pageDao
|
||||||
|
).invokeWith(activity)
|
||||||
verify { pageDao.deletePages(listOf(item1)) }
|
verify { pageDao.deletePages(listOf(item1)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `delete with no selected items deletes all items`() {
|
fun `delete with no selected items deletes all items`() {
|
||||||
item1.isSelected = false
|
item1.isSelected = false
|
||||||
DeletePageItems(historyState(listOf(item1, item2)), pageDao).invokeWith(activity)
|
DeletePageItems(
|
||||||
|
historyState(listOf(item1, item2)),
|
||||||
|
pageDao
|
||||||
|
).invokeWith(activity)
|
||||||
verify { pageDao.deletePages(listOf(item1, item2)) }
|
verify { pageDao.deletePages(listOf(item1, item2)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user