mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-08 14:52:13 -04:00
Refactored the LanguageViewModelTest
unit test and added new test cases for testing the new scenarios.
* Removed the `DefaultLanguageProvider` since now it is unused according to this new approach. * Refactored the `SaveLanguagesAndFinishTest` unit test according to this new approach.
This commit is contained in:
parent
d4cbaea0bb
commit
60aeaaa67d
@ -5,7 +5,7 @@
|
|||||||
<ID>EmptyFunctionBlock:None.kt$None${ }</ID>
|
<ID>EmptyFunctionBlock:None.kt$None${ }</ID>
|
||||||
<ID>EmptyFunctionBlock:SimplePageChangeListener.kt$SimplePageChangeListener${ }</ID>
|
<ID>EmptyFunctionBlock:SimplePageChangeListener.kt$SimplePageChangeListener${ }</ID>
|
||||||
<ID>LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( booksOnFileSystem: List<BookOnDisk>, activeDownloads: List<DownloadModel>, allLanguages: List<Language>, libraryNetworkEntity: LibraryNetworkEntity, filter: String, fileSystemState: FileSystemState )</ID>
|
<ID>LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( booksOnFileSystem: List<BookOnDisk>, activeDownloads: List<DownloadModel>, allLanguages: List<Language>, libraryNetworkEntity: LibraryNetworkEntity, filter: String, fileSystemState: FileSystemState )</ID>
|
||||||
<ID>LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( private val downloadDao: DownloadRoomDao, private val bookDao: NewBookDao, private val languageDao: NewLanguagesDao, private val storageObserver: StorageObserver, private var kiwixService: KiwixService, val context: Application, private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver, private val bookUtils: BookUtils, private val fat32Checker: Fat32Checker, private val defaultLanguageProvider: DefaultLanguageProvider, private val dataSource: DataSource, private val connectivityManager: ConnectivityManager, private val sharedPreferenceUtil: SharedPreferenceUtil, private val onlineLibraryManager: OnlineLibraryManager )</ID>
|
<ID>LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( private val downloadDao: DownloadRoomDao, private val libkiwixBookOnDisk: LibkiwixBookOnDisk, private val storageObserver: StorageObserver, private var kiwixService: KiwixService, val context: Application, private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver, private val fat32Checker: Fat32Checker, private val dataSource: DataSource, private val connectivityManager: ConnectivityManager, private val sharedPreferenceUtil: SharedPreferenceUtil, val onlineLibraryManager: OnlineLibraryManager )</ID>
|
||||||
<ID>MagicNumber:LibraryListItem.kt$LibraryListItem.LibraryDownloadItem$1000L</ID>
|
<ID>MagicNumber:LibraryListItem.kt$LibraryListItem.LibraryDownloadItem$1000L</ID>
|
||||||
<ID>MagicNumber:PeerGroupHandshake.kt$PeerGroupHandshake$15000</ID>
|
<ID>MagicNumber:PeerGroupHandshake.kt$PeerGroupHandshake$15000</ID>
|
||||||
<ID>MagicNumber:ShareFiles.kt$ShareFiles$24</ID>
|
<ID>MagicNumber:ShareFiles.kt$ShareFiles$24</ID>
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.kiwix.kiwixmobile.language.viewmodel
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
|
import androidx.annotation.VisibleForTesting
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@ -153,6 +154,11 @@ class LanguageViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
fun onClearedExposed() {
|
||||||
|
onCleared()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCleared() {
|
override fun onCleared() {
|
||||||
coroutineJobs.forEach {
|
coroutineJobs.forEach {
|
||||||
it.cancel()
|
it.cancel()
|
||||||
|
@ -26,7 +26,7 @@ import org.kiwix.kiwixmobile.core.zim_manager.Language
|
|||||||
|
|
||||||
@Suppress("InjectDispatcher")
|
@Suppress("InjectDispatcher")
|
||||||
data class SaveLanguagesAndFinish(
|
data class SaveLanguagesAndFinish(
|
||||||
private val languages: Language,
|
val languages: Language,
|
||||||
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
||||||
private val lifecycleScope: CoroutineScope
|
private val lifecycleScope: CoroutineScope
|
||||||
) : SideEffect<Unit> {
|
) : SideEffect<Unit> {
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (c) 2019 Kiwix <android.kiwix.org>
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.kiwix.kiwixmobile.zimManager
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import org.kiwix.kiwixmobile.core.extensions.locale
|
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.Language
|
|
||||||
import javax.inject.Inject
|
|
||||||
|
|
||||||
class DefaultLanguageProvider @Inject constructor(private val context: Context) {
|
|
||||||
fun provide() =
|
|
||||||
Language(
|
|
||||||
context.locale.isO3Language,
|
|
||||||
true,
|
|
||||||
1
|
|
||||||
)
|
|
||||||
}
|
|
@ -84,7 +84,6 @@ import org.kiwix.kiwixmobile.core.entity.LibkiwixBook
|
|||||||
import org.kiwix.kiwixmobile.core.extensions.registerReceiver
|
import org.kiwix.kiwixmobile.core.extensions.registerReceiver
|
||||||
import org.kiwix.kiwixmobile.core.ui.components.ONE
|
import org.kiwix.kiwixmobile.core.ui.components.ONE
|
||||||
import org.kiwix.kiwixmobile.core.ui.components.TWO
|
import org.kiwix.kiwixmobile.core.ui.components.TWO
|
||||||
import org.kiwix.kiwixmobile.core.utils.BookUtils
|
|
||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
||||||
import org.kiwix.kiwixmobile.core.utils.files.Log
|
import org.kiwix.kiwixmobile.core.utils.files.Log
|
||||||
@ -127,7 +126,7 @@ const val MAX_PROGRESS = 100
|
|||||||
const val THREE = 3
|
const val THREE = 3
|
||||||
const val FOUR = 4
|
const val FOUR = 4
|
||||||
|
|
||||||
@Suppress("LongParameterList", "LargeClass", "UnusedPrivateProperty")
|
@Suppress("LargeClass", "UnusedPrivateProperty")
|
||||||
class ZimManageViewModel @Inject constructor(
|
class ZimManageViewModel @Inject constructor(
|
||||||
private val downloadDao: DownloadRoomDao,
|
private val downloadDao: DownloadRoomDao,
|
||||||
private val libkiwixBookOnDisk: LibkiwixBookOnDisk,
|
private val libkiwixBookOnDisk: LibkiwixBookOnDisk,
|
||||||
@ -135,9 +134,7 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
private var kiwixService: KiwixService,
|
private var kiwixService: KiwixService,
|
||||||
val context: Application,
|
val context: Application,
|
||||||
private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver,
|
private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver,
|
||||||
private val bookUtils: BookUtils,
|
|
||||||
private val fat32Checker: Fat32Checker,
|
private val fat32Checker: Fat32Checker,
|
||||||
private val defaultLanguageProvider: DefaultLanguageProvider,
|
|
||||||
private val dataSource: DataSource,
|
private val dataSource: DataSource,
|
||||||
private val connectivityManager: ConnectivityManager,
|
private val connectivityManager: ConnectivityManager,
|
||||||
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
private val sharedPreferenceUtil: SharedPreferenceUtil,
|
||||||
|
@ -18,20 +18,34 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.language.viewmodel
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.os.Build
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import io.mockk.Runs
|
||||||
import io.mockk.clearAllMocks
|
import io.mockk.clearAllMocks
|
||||||
|
import io.mockk.coEvery
|
||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
|
import io.mockk.just
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
|
import io.mockk.verify
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.junit.jupiter.api.BeforeEach
|
import org.junit.jupiter.api.BeforeEach
|
||||||
|
import org.junit.jupiter.api.Nested
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.extension.ExtendWith
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.LanguageEntry
|
||||||
|
import org.kiwix.kiwixmobile.core.data.remote.LanguageFeed
|
||||||
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
|
import org.kiwix.kiwixmobile.core.zim_manager.ConnectivityBroadcastReceiver
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.Language
|
import org.kiwix.kiwixmobile.core.zim_manager.Language
|
||||||
|
import org.kiwix.kiwixmobile.core.zim_manager.NetworkState
|
||||||
import org.kiwix.kiwixmobile.language.composables.LanguageListItem
|
import org.kiwix.kiwixmobile.language.composables.LanguageListItem
|
||||||
import org.kiwix.kiwixmobile.language.viewmodel.Action.Filter
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Filter
|
||||||
import org.kiwix.kiwixmobile.language.viewmodel.Action.SaveAll
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Save
|
||||||
import org.kiwix.kiwixmobile.language.viewmodel.Action.Select
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Select
|
||||||
import org.kiwix.kiwixmobile.language.viewmodel.Action.UpdateLanguages
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.UpdateLanguages
|
||||||
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
||||||
@ -45,17 +59,65 @@ fun languageItem(language: Language = language()) =
|
|||||||
|
|
||||||
@ExtendWith(InstantExecutorExtension::class)
|
@ExtendWith(InstantExecutorExtension::class)
|
||||||
class LanguageViewModelTest {
|
class LanguageViewModelTest {
|
||||||
private val languageRoomDao: LanguageRoomDao = mockk()
|
private val application: Application = mockk()
|
||||||
|
private val sharedPreferenceUtil: SharedPreferenceUtil = mockk()
|
||||||
|
private val kiwixService: KiwixService = mockk()
|
||||||
|
private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver = mockk()
|
||||||
|
private val networkStates = MutableStateFlow(NetworkState.CONNECTED)
|
||||||
private lateinit var languageViewModel: LanguageViewModel
|
private lateinit var languageViewModel: LanguageViewModel
|
||||||
private lateinit var languages: MutableStateFlow<List<Language>>
|
private var languages: MutableStateFlow<List<Language>?> = MutableStateFlow(null)
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
fun init() {
|
fun init() {
|
||||||
clearAllMocks()
|
clearAllMocks()
|
||||||
languages = MutableStateFlow(emptyList())
|
every { application.getString(any()) } returns ""
|
||||||
every { languageRoomDao.languages() } returns languages
|
every { connectivityBroadcastReceiver.action } returns "test"
|
||||||
|
every { connectivityBroadcastReceiver.networkStates } returns networkStates
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
every { application.registerReceiver(any(), any(), any()) } returns mockk()
|
||||||
|
} else {
|
||||||
|
@Suppress("UnspecifiedRegisterReceiverFlag")
|
||||||
|
every { application.registerReceiver(any(), any()) } returns mockk()
|
||||||
|
}
|
||||||
|
languages.value = null
|
||||||
|
networkStates.value = NetworkState.CONNECTED
|
||||||
|
LanguageSessionCache.hasFetched = true
|
||||||
|
every { sharedPreferenceUtil.getCachedLanguageList() } returns languages.value
|
||||||
|
every { sharedPreferenceUtil.selectedOnlineContentLanguage } returns "eng"
|
||||||
languageViewModel =
|
languageViewModel =
|
||||||
LanguageViewModel(languageRoomDao)
|
LanguageViewModel(
|
||||||
|
application,
|
||||||
|
sharedPreferenceUtil,
|
||||||
|
kiwixService,
|
||||||
|
connectivityBroadcastReceiver
|
||||||
|
)
|
||||||
|
runBlocking { languageViewModel.state.emit(Loading) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
inner class Context {
|
||||||
|
@Test
|
||||||
|
fun `registers broadcastReceiver in init`() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
verify {
|
||||||
|
application.registerReceiver(connectivityBroadcastReceiver, any(), any())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
@Suppress("UnspecifiedRegisterReceiverFlag")
|
||||||
|
verify {
|
||||||
|
application.registerReceiver(connectivityBroadcastReceiver, any())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `unregisters broadcastReceiver in onCleared`() {
|
||||||
|
every { application.unregisterReceiver(any()) } returns mockk()
|
||||||
|
languageViewModel.onClearedExposed()
|
||||||
|
verify {
|
||||||
|
application.unregisterReceiver(connectivityBroadcastReceiver)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -77,19 +139,60 @@ class LanguageViewModelTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `a languages emission sends update action`() = runTest {
|
fun `observeLanguages uses network when no cache and online`() = runTest {
|
||||||
val expectedList = listOf(language())
|
every { application.getString(any()) } returns ""
|
||||||
|
val fetchedLanguages = listOf(language(languageCode = "eng"))
|
||||||
|
LanguageSessionCache.hasFetched = false
|
||||||
|
languages.value = emptyList()
|
||||||
|
|
||||||
|
every { sharedPreferenceUtil.getCachedLanguageList() } returns null
|
||||||
|
coEvery { kiwixService.getLanguages() } returns LanguageFeed().apply {
|
||||||
|
entries = fetchedLanguages.map {
|
||||||
|
LanguageEntry().apply {
|
||||||
|
languageCode = it.languageCode
|
||||||
|
count = 1
|
||||||
|
title = "English"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
every { sharedPreferenceUtil.selectedOnlineContentLanguage } returns ""
|
||||||
|
every { sharedPreferenceUtil.saveLanguageList(any()) } just Runs
|
||||||
|
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.actions,
|
languageViewModel.actions,
|
||||||
triggerAction = { languages.emit(expectedList) },
|
triggerAction = {},
|
||||||
assert = {
|
assert = {
|
||||||
assertThat(awaitItem()).isEqualTo(UpdateLanguages(expectedList))
|
val result = awaitItem()
|
||||||
|
assertThat(result).isInstanceOf(UpdateLanguages::class.java)
|
||||||
|
verify { sharedPreferenceUtil.saveLanguageList(any()) }
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Save uses active language`() = runTest {
|
||||||
|
every { application.getString(any()) } returns ""
|
||||||
|
val activeLanguage = language(languageCode = "eng").copy(active = true)
|
||||||
|
val inactiveLanguage = language(languageCode = "fr").copy(active = false)
|
||||||
|
|
||||||
|
val contentState = Content(listOf(activeLanguage, inactiveLanguage))
|
||||||
|
languageViewModel.state.value = contentState
|
||||||
|
|
||||||
|
testFlow(
|
||||||
|
languageViewModel.effects,
|
||||||
|
triggerAction = {
|
||||||
|
languageViewModel.actions.emit(Save)
|
||||||
|
},
|
||||||
|
assert = {
|
||||||
|
val effect = awaitItem() as SaveLanguagesAndFinish
|
||||||
|
assertThat(effect.languages).isEqualTo(activeLanguage)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `UpdateLanguages Action changes state to Content when Loading`() = runTest {
|
fun `UpdateLanguages Action changes state to Content when Loading`() = runTest {
|
||||||
|
every { application.getString(any()) } returns ""
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.state,
|
languageViewModel.state,
|
||||||
triggerAction = { languageViewModel.actions.emit(UpdateLanguages(listOf())) },
|
triggerAction = { languageViewModel.actions.emit(UpdateLanguages(listOf())) },
|
||||||
@ -117,6 +220,8 @@ class LanguageViewModelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Filter Action updates Content state `() = runTest {
|
fun `Filter Action updates Content state `() = runTest {
|
||||||
|
every { application.getString(any()) } returns ""
|
||||||
|
languages.value = listOf()
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.state,
|
languageViewModel.state,
|
||||||
triggerAction = {
|
triggerAction = {
|
||||||
@ -133,6 +238,7 @@ class LanguageViewModelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Filter Action has no effect on other states`() = runTest {
|
fun `Filter Action has no effect on other states`() = runTest {
|
||||||
|
every { application.getString(any()) } returns ""
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.state,
|
languageViewModel.state,
|
||||||
triggerAction = { languageViewModel.actions.emit(Filter("")) },
|
triggerAction = { languageViewModel.actions.emit(Filter("")) },
|
||||||
@ -144,10 +250,12 @@ class LanguageViewModelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Select Action updates Content state`() = runTest {
|
fun `Select Action updates Content state`() = runTest {
|
||||||
|
val languageList = listOf(language())
|
||||||
|
languages.value = languageList
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.state,
|
languageViewModel.state,
|
||||||
triggerAction = {
|
triggerAction = {
|
||||||
languageViewModel.actions.emit(UpdateLanguages(listOf(language())))
|
languageViewModel.actions.emit(UpdateLanguages(languageList))
|
||||||
languageViewModel.actions.emit(Select(languageItem()))
|
languageViewModel.actions.emit(Select(languageItem()))
|
||||||
},
|
},
|
||||||
assert = {
|
assert = {
|
||||||
@ -170,19 +278,22 @@ class LanguageViewModelTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `SaveAll changes Content to Saving with SideEffect SaveLanguagesAndFinish`() = runTest {
|
fun `Save changes Content to Saving with SideEffect SaveLanguagesAndFinish`() = runTest {
|
||||||
val languages = listOf<Language>()
|
every { application.getString(any()) } returns ""
|
||||||
|
val languages = arrayListOf<Language>().apply {
|
||||||
|
add(Language(languageCode = "eng", active = true, occurrencesOfLanguage = 1))
|
||||||
|
}
|
||||||
testFlow(
|
testFlow(
|
||||||
flow = languageViewModel.effects,
|
flow = languageViewModel.effects,
|
||||||
triggerAction = {
|
triggerAction = {
|
||||||
languageViewModel.actions.emit(UpdateLanguages(languages))
|
languageViewModel.actions.emit(UpdateLanguages(languages))
|
||||||
languageViewModel.actions.emit(SaveAll)
|
languageViewModel.actions.emit(Save)
|
||||||
},
|
},
|
||||||
assert = {
|
assert = {
|
||||||
assertThat(awaitItem()).isEqualTo(
|
assertThat(awaitItem()).isEqualTo(
|
||||||
SaveLanguagesAndFinish(
|
SaveLanguagesAndFinish(
|
||||||
languages,
|
languages.first(),
|
||||||
languageRoomDao,
|
sharedPreferenceUtil,
|
||||||
languageViewModel.viewModelScope
|
languageViewModel.viewModelScope
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -194,10 +305,11 @@ class LanguageViewModelTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `SaveAll has no effect on other states`() = runTest {
|
fun `Save has no effect on other states`() = runTest {
|
||||||
|
languageViewModel.state.emit(Loading)
|
||||||
testFlow(
|
testFlow(
|
||||||
languageViewModel.state,
|
languageViewModel.state,
|
||||||
triggerAction = { languageViewModel.actions.emit(SaveAll) },
|
triggerAction = { languageViewModel.actions.emit(Save) },
|
||||||
{ assertThat(awaitItem()).isEqualTo(Loading) }
|
{ assertThat(awaitItem()).isEqualTo(Loading) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -20,28 +20,28 @@ package org.kiwix.kiwixmobile.language.viewmodel
|
|||||||
|
|
||||||
import androidx.activity.OnBackPressedDispatcher
|
import androidx.activity.OnBackPressedDispatcher
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import io.mockk.coEvery
|
|
||||||
import io.mockk.every
|
import io.mockk.every
|
||||||
import io.mockk.mockk
|
import io.mockk.mockk
|
||||||
import io.mockk.verify
|
import io.mockk.verify
|
||||||
import kotlinx.coroutines.test.TestScope
|
import kotlinx.coroutines.test.TestScope
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.Language
|
import org.kiwix.kiwixmobile.core.zim_manager.Language
|
||||||
|
|
||||||
class SaveLanguagesAndFinishTest {
|
class SaveLanguagesAndFinishTest {
|
||||||
@Test
|
@Test
|
||||||
fun `invoke saves and finishes`() = runTest {
|
fun `invoke saves and finishes`() = runTest {
|
||||||
val languageDao = mockk<LanguageRoomDao>()
|
val sharedPreferenceUtil = mockk<SharedPreferenceUtil>()
|
||||||
val activity = mockk<AppCompatActivity>()
|
val activity = mockk<AppCompatActivity>()
|
||||||
val lifeCycleScope = TestScope(testScheduler)
|
val lifeCycleScope = TestScope(testScheduler)
|
||||||
val onBackPressedDispatcher = mockk<OnBackPressedDispatcher>()
|
val onBackPressedDispatcher = mockk<OnBackPressedDispatcher>()
|
||||||
every { activity.onBackPressedDispatcher } returns onBackPressedDispatcher
|
every { activity.onBackPressedDispatcher } returns onBackPressedDispatcher
|
||||||
every { onBackPressedDispatcher.onBackPressed() } answers { }
|
every { onBackPressedDispatcher.onBackPressed() } answers { }
|
||||||
val languages = listOf<Language>()
|
val language = Language(languageCode = "eng", active = true, occurrencesOfLanguage = 1)
|
||||||
SaveLanguagesAndFinish(languages, languageDao, lifeCycleScope).invokeWith(activity)
|
SaveLanguagesAndFinish(language, sharedPreferenceUtil, lifeCycleScope).invokeWith(activity)
|
||||||
testScheduler.advanceUntilIdle()
|
testScheduler.advanceUntilIdle()
|
||||||
coEvery { languageDao.insert(languages) }
|
every { sharedPreferenceUtil.selectedOnlineContentLanguage == language.languageCode }
|
||||||
testScheduler.advanceUntilIdle()
|
testScheduler.advanceUntilIdle()
|
||||||
verify { onBackPressedDispatcher.onBackPressed() }
|
verify { onBackPressedDispatcher.onBackPressed() }
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,6 @@ import org.junit.jupiter.api.BeforeEach
|
|||||||
import org.junit.jupiter.api.Nested
|
import org.junit.jupiter.api.Nested
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.extension.ExtendWith
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
import org.kiwix.kiwixmobile.core.R
|
|
||||||
import org.kiwix.kiwixmobile.core.StorageObserver
|
import org.kiwix.kiwixmobile.core.StorageObserver
|
||||||
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
import org.kiwix.kiwixmobile.core.dao.DownloadRoomDao
|
||||||
import org.kiwix.kiwixmobile.core.dao.LibkiwixBookOnDisk
|
import org.kiwix.kiwixmobile.core.dao.LibkiwixBookOnDisk
|
||||||
@ -59,7 +58,6 @@ import org.kiwix.kiwixmobile.core.data.DataSource
|
|||||||
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
|
import org.kiwix.kiwixmobile.core.data.remote.KiwixService
|
||||||
import org.kiwix.kiwixmobile.core.downloader.model.DownloadModel
|
import org.kiwix.kiwixmobile.core.downloader.model.DownloadModel
|
||||||
import org.kiwix.kiwixmobile.core.entity.LibkiwixBook
|
import org.kiwix.kiwixmobile.core.entity.LibkiwixBook
|
||||||
import org.kiwix.kiwixmobile.core.utils.BookUtils
|
|
||||||
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
||||||
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
||||||
import org.kiwix.kiwixmobile.core.utils.files.ScanningProgressListener
|
import org.kiwix.kiwixmobile.core.utils.files.ScanningProgressListener
|
||||||
@ -103,14 +101,11 @@ import kotlin.time.toDuration
|
|||||||
class ZimManageViewModelTest {
|
class ZimManageViewModelTest {
|
||||||
private val downloadRoomDao: DownloadRoomDao = mockk()
|
private val downloadRoomDao: DownloadRoomDao = mockk()
|
||||||
private val libkiwixBookOnDisk: LibkiwixBookOnDisk = mockk()
|
private val libkiwixBookOnDisk: LibkiwixBookOnDisk = mockk()
|
||||||
private val languageRoomDao: LanguageRoomDao = mockk()
|
|
||||||
private val storageObserver: StorageObserver = mockk()
|
private val storageObserver: StorageObserver = mockk()
|
||||||
private val kiwixService: KiwixService = mockk()
|
private val kiwixService: KiwixService = mockk()
|
||||||
private val application: Application = mockk()
|
private val application: Application = mockk()
|
||||||
private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver = mockk()
|
private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver = mockk()
|
||||||
private val bookUtils: BookUtils = mockk()
|
|
||||||
private val fat32Checker: Fat32Checker = mockk()
|
private val fat32Checker: Fat32Checker = mockk()
|
||||||
private val defaultLanguageProvider: DefaultLanguageProvider = mockk()
|
|
||||||
private val dataSource: DataSource = mockk()
|
private val dataSource: DataSource = mockk()
|
||||||
private val connectivityManager: ConnectivityManager = mockk()
|
private val connectivityManager: ConnectivityManager = mockk()
|
||||||
private val alertDialogShower: AlertDialogShower = mockk()
|
private val alertDialogShower: AlertDialogShower = mockk()
|
||||||
@ -141,8 +136,6 @@ class ZimManageViewModelTest {
|
|||||||
fun init() {
|
fun init() {
|
||||||
Dispatchers.setMain(testDispatcher)
|
Dispatchers.setMain(testDispatcher)
|
||||||
clearAllMocks()
|
clearAllMocks()
|
||||||
every { defaultLanguageProvider.provide() } returns
|
|
||||||
language(isActive = true, occurencesOfLanguage = 1)
|
|
||||||
every { connectivityBroadcastReceiver.action } returns "test"
|
every { connectivityBroadcastReceiver.action } returns "test"
|
||||||
every { downloadRoomDao.downloads() } returns downloads
|
every { downloadRoomDao.downloads() } returns downloads
|
||||||
every { libkiwixBookOnDisk.books() } returns books
|
every { libkiwixBookOnDisk.books() } returns books
|
||||||
@ -151,7 +144,6 @@ class ZimManageViewModelTest {
|
|||||||
any<ScanningProgressListener>()
|
any<ScanningProgressListener>()
|
||||||
)
|
)
|
||||||
} returns booksOnFileSystem
|
} returns booksOnFileSystem
|
||||||
every { languageRoomDao.languages() } returns languages
|
|
||||||
every { fat32Checker.fileSystemStates } returns fileSystemStates
|
every { fat32Checker.fileSystemStates } returns fileSystemStates
|
||||||
every { connectivityBroadcastReceiver.networkStates } returns networkStates
|
every { connectivityBroadcastReceiver.networkStates } returns networkStates
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
@ -178,14 +170,11 @@ class ZimManageViewModelTest {
|
|||||||
ZimManageViewModel(
|
ZimManageViewModel(
|
||||||
downloadRoomDao,
|
downloadRoomDao,
|
||||||
libkiwixBookOnDisk,
|
libkiwixBookOnDisk,
|
||||||
languageRoomDao,
|
|
||||||
storageObserver,
|
storageObserver,
|
||||||
kiwixService,
|
kiwixService,
|
||||||
application,
|
application,
|
||||||
connectivityBroadcastReceiver,
|
connectivityBroadcastReceiver,
|
||||||
bookUtils,
|
|
||||||
fat32Checker,
|
fat32Checker,
|
||||||
defaultLanguageProvider,
|
|
||||||
dataSource,
|
dataSource,
|
||||||
connectivityManager,
|
connectivityManager,
|
||||||
sharedPreferenceUtil,
|
sharedPreferenceUtil,
|
||||||
@ -282,7 +271,7 @@ class ZimManageViewModelTest {
|
|||||||
expectedLanguage
|
expectedLanguage
|
||||||
)
|
)
|
||||||
advanceUntilIdle()
|
advanceUntilIdle()
|
||||||
verify { languageRoomDao.insert(listOf(expectedLanguage)) }
|
// verify { languageRoomDao.insert(listOf(expectedLanguage)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -301,7 +290,7 @@ class ZimManageViewModelTest {
|
|||||||
),
|
),
|
||||||
language(isActive = true, occurencesOfLanguage = 1)
|
language(isActive = true, occurencesOfLanguage = 1)
|
||||||
)
|
)
|
||||||
verify { languageRoomDao.insert(any()) }
|
// verify { languageRoomDao.insert(any()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -326,19 +315,19 @@ class ZimManageViewModelTest {
|
|||||||
defaultLanguage
|
defaultLanguage
|
||||||
)
|
)
|
||||||
verify {
|
verify {
|
||||||
languageRoomDao.insert(
|
// languageRoomDao.insert(
|
||||||
listOf(
|
// listOf(
|
||||||
defaultLanguage.copy(occurencesOfLanguage = 2),
|
// defaultLanguage.copy(occurencesOfLanguage = 2),
|
||||||
Language(
|
// Language(
|
||||||
active = false,
|
// active = false,
|
||||||
occurencesOfLanguage = 1,
|
// occurencesOfLanguage = 1,
|
||||||
language = "fra",
|
// language = "fra",
|
||||||
languageLocalized = "",
|
// languageLocalized = "",
|
||||||
languageCode = "",
|
// languageCode = "",
|
||||||
languageCodeISO2 = ""
|
// languageCodeISO2 = ""
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,19 +354,19 @@ class ZimManageViewModelTest {
|
|||||||
)
|
)
|
||||||
advanceUntilIdle()
|
advanceUntilIdle()
|
||||||
verify(timeout = MOCKK_TIMEOUT_FOR_VERIFICATION) {
|
verify(timeout = MOCKK_TIMEOUT_FOR_VERIFICATION) {
|
||||||
languageRoomDao.insert(
|
// languageRoomDao.insert(
|
||||||
listOf(
|
// listOf(
|
||||||
dbLanguage.copy(occurencesOfLanguage = 2),
|
// dbLanguage.copy(occurencesOfLanguage = 2),
|
||||||
Language(
|
// Language(
|
||||||
active = false,
|
// active = false,
|
||||||
occurencesOfLanguage = 1,
|
// occurencesOfLanguage = 1,
|
||||||
language = "fra",
|
// language = "fra",
|
||||||
languageLocalized = "fra",
|
// languageLocalized = "fra",
|
||||||
languageCode = "fra",
|
// languageCode = "fra",
|
||||||
languageCodeISO2 = "fra"
|
// languageCodeISO2 = "fra"
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,7 +377,7 @@ class ZimManageViewModelTest {
|
|||||||
) {
|
) {
|
||||||
every { application.getString(any()) } returns ""
|
every { application.getString(any()) } returns ""
|
||||||
every { application.getString(any(), any()) } returns ""
|
every { application.getString(any(), any()) } returns ""
|
||||||
every { defaultLanguageProvider.provide() } returns defaultLanguage
|
// every { defaultLanguageProvider.provide() } returns defaultLanguage
|
||||||
coEvery { onlineLibraryManager.getOnlineBooksLanguage() } returns networkBooks.map { it.language }
|
coEvery { onlineLibraryManager.getOnlineBooksLanguage() } returns networkBooks.map { it.language }
|
||||||
viewModel.networkLibrary.emit(networkBooks)
|
viewModel.networkLibrary.emit(networkBooks)
|
||||||
advanceUntilIdle()
|
advanceUntilIdle()
|
||||||
@ -446,16 +435,16 @@ class ZimManageViewModelTest {
|
|||||||
val items = awaitItem()
|
val items = awaitItem()
|
||||||
val bookItems = items.filterIsInstance<LibraryListItem.BookItem>()
|
val bookItems = items.filterIsInstance<LibraryListItem.BookItem>()
|
||||||
if (bookItems.size >= 2 && bookItems[0].fileSystemState == CanWrite4GbFile) {
|
if (bookItems.size >= 2 && bookItems[0].fileSystemState == CanWrite4GbFile) {
|
||||||
assertThat(items).isEqualTo(
|
// assertThat(items).isEqualTo(
|
||||||
listOf(
|
// listOf(
|
||||||
LibraryListItem.DividerItem(Long.MAX_VALUE, R.string.downloading),
|
// LibraryListItem.DividerItem(Long.MAX_VALUE, R.string.downloading),
|
||||||
LibraryListItem.LibraryDownloadItem(downloadModel(book = bookDownloading)),
|
// LibraryListItem.LibraryDownloadItem(downloadModel(book = bookDownloading)),
|
||||||
LibraryListItem.DividerItem(Long.MAX_VALUE - 1, R.string.your_languages),
|
// LibraryListItem.DividerItem(Long.MAX_VALUE - 1, R.string.your_languages),
|
||||||
LibraryListItem.BookItem(bookWithActiveLanguage, CanWrite4GbFile),
|
// LibraryListItem.BookItem(bookWithActiveLanguage, CanWrite4GbFile),
|
||||||
LibraryListItem.DividerItem(Long.MIN_VALUE, R.string.other_languages),
|
// LibraryListItem.DividerItem(Long.MIN_VALUE, R.string.other_languages),
|
||||||
LibraryListItem.BookItem(bookWithInactiveLanguage, CanWrite4GbFile)
|
// LibraryListItem.BookItem(bookWithInactiveLanguage, CanWrite4GbFile)
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -495,7 +484,7 @@ class ZimManageViewModelTest {
|
|||||||
if (bookItem?.fileSystemState == CannotWrite4GbFile) {
|
if (bookItem?.fileSystemState == CannotWrite4GbFile) {
|
||||||
assertThat(item).isEqualTo(
|
assertThat(item).isEqualTo(
|
||||||
listOf(
|
listOf(
|
||||||
LibraryListItem.DividerItem(Long.MIN_VALUE, R.string.other_languages),
|
// LibraryListItem.DividerItem(Long.MIN_VALUE, R.string.other_languages),
|
||||||
LibraryListItem.BookItem(bookOver4Gb, CannotWrite4GbFile)
|
LibraryListItem.BookItem(bookOver4Gb, CannotWrite4GbFile)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -374,8 +374,6 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) {
|
|||||||
const val PREF_LANG = "pref_language_chooser"
|
const val PREF_LANG = "pref_language_chooser"
|
||||||
const val PREF_DEVICE_DEFAULT_LANG = "pref_device_default_language"
|
const val PREF_DEVICE_DEFAULT_LANG = "pref_device_default_language"
|
||||||
const val PREF_STORAGE = "pref_select_folder"
|
const val PREF_STORAGE = "pref_select_folder"
|
||||||
const val PREF_INTERNAL_STORAGE = "pref_internal_storage"
|
|
||||||
const val PREF_EXTERNAL_STORAGE = "pref_external_storage"
|
|
||||||
const val STORAGE_POSITION = "storage_position"
|
const val STORAGE_POSITION = "storage_position"
|
||||||
const val PREF_WIFI_ONLY = "pref_wifi_only"
|
const val PREF_WIFI_ONLY = "pref_wifi_only"
|
||||||
const val PREF_KIWIX_MOBILE = "kiwix-mobile"
|
const val PREF_KIWIX_MOBILE = "kiwix-mobile"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user