|
|
@ -4,7 +4,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
package org.mozilla.fenix.settings.logins
|
|
|
|
package org.mozilla.fenix.settings.logins
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
|
|
|
|
import android.os.Looper
|
|
|
|
import android.os.Looper
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.NavDestination
|
|
|
|
import androidx.navigation.NavDestination
|
|
|
@ -17,13 +16,13 @@ import kotlinx.coroutines.MainScope
|
|
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
import kotlinx.coroutines.test.TestCoroutineScope
|
|
|
|
import kotlinx.coroutines.test.TestCoroutineScope
|
|
|
|
import mozilla.components.concept.storage.Login
|
|
|
|
import mozilla.components.concept.storage.Login
|
|
|
|
|
|
|
|
import mozilla.components.service.sync.logins.SyncableLoginsStorage
|
|
|
|
import org.junit.After
|
|
|
|
import org.junit.After
|
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Test
|
|
|
|
import org.junit.Test
|
|
|
|
import org.junit.runner.RunWith
|
|
|
|
import org.junit.runner.RunWith
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.components.Components
|
|
|
|
import org.mozilla.fenix.components.Components
|
|
|
|
import org.mozilla.fenix.ext.components
|
|
|
|
|
|
|
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
|
|
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
|
|
|
import org.mozilla.fenix.settings.logins.controller.SavedLoginsStorageController
|
|
|
|
import org.mozilla.fenix.settings.logins.controller.SavedLoginsStorageController
|
|
|
|
import org.robolectric.Shadows.shadowOf
|
|
|
|
import org.robolectric.Shadows.shadowOf
|
|
|
@ -34,7 +33,7 @@ import org.robolectric.annotation.LooperMode
|
|
|
|
@RunWith(FenixRobolectricTestRunner::class)
|
|
|
|
@RunWith(FenixRobolectricTestRunner::class)
|
|
|
|
class SavedLoginsStorageControllerTest {
|
|
|
|
class SavedLoginsStorageControllerTest {
|
|
|
|
private lateinit var components: Components
|
|
|
|
private lateinit var components: Components
|
|
|
|
private val context: Context = mockk(relaxed = true)
|
|
|
|
private val passwordsStorage: SyncableLoginsStorage = mockk(relaxed = true)
|
|
|
|
private lateinit var controller: SavedLoginsStorageController
|
|
|
|
private lateinit var controller: SavedLoginsStorageController
|
|
|
|
private val navController: NavController = mockk(relaxed = true)
|
|
|
|
private val navController: NavController = mockk(relaxed = true)
|
|
|
|
private val loginsFragmentStore: LoginsFragmentStore = mockk(relaxed = true)
|
|
|
|
private val loginsFragmentStore: LoginsFragmentStore = mockk(relaxed = true)
|
|
|
@ -46,13 +45,12 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
every { navController.currentDestination } returns NavDestination("").apply {
|
|
|
|
every { navController.currentDestination } returns NavDestination("").apply {
|
|
|
|
id = R.id.loginDetailFragment
|
|
|
|
id = R.id.loginDetailFragment
|
|
|
|
}
|
|
|
|
}
|
|
|
|
coEvery { context.components.core.passwordsStorage.get(any()) } returns loginMock
|
|
|
|
coEvery { passwordsStorage.get(any()) } returns loginMock
|
|
|
|
every { loginsFragmentStore.dispatch(any()) } returns mockk()
|
|
|
|
every { loginsFragmentStore.dispatch(any()) } returns mockk()
|
|
|
|
coEvery { context.components.core.passwordsStorage } returns mockk(relaxed = true)
|
|
|
|
|
|
|
|
components = mockk(relaxed = true)
|
|
|
|
components = mockk(relaxed = true)
|
|
|
|
|
|
|
|
|
|
|
|
controller = SavedLoginsStorageController(
|
|
|
|
controller = SavedLoginsStorageController(
|
|
|
|
context = context,
|
|
|
|
passwordsStorage = passwordsStorage,
|
|
|
|
viewLifecycleScope = MainScope(),
|
|
|
|
viewLifecycleScope = MainScope(),
|
|
|
|
navController = navController,
|
|
|
|
navController = navController,
|
|
|
|
loginsFragmentStore = loginsFragmentStore
|
|
|
|
loginsFragmentStore = loginsFragmentStore
|
|
|
@ -68,12 +66,12 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
fun `WHEN a login is deleted, THEN navigate back to the previous page`() = runBlocking {
|
|
|
|
fun `WHEN a login is deleted, THEN navigate back to the previous page`() = runBlocking {
|
|
|
|
val loginId = "id"
|
|
|
|
val loginId = "id"
|
|
|
|
// mock for deleteLoginJob: Deferred<Boolean>?
|
|
|
|
// mock for deleteLoginJob: Deferred<Boolean>?
|
|
|
|
coEvery { context.components.core.passwordsStorage.delete(any()) } returns true
|
|
|
|
coEvery { passwordsStorage.delete(any()) } returns true
|
|
|
|
controller.delete(loginId)
|
|
|
|
controller.delete(loginId)
|
|
|
|
|
|
|
|
|
|
|
|
shadow()
|
|
|
|
shadow()
|
|
|
|
|
|
|
|
|
|
|
|
coVerify { context.components.core.passwordsStorage.delete(loginId) }
|
|
|
|
coVerify { passwordsStorage.delete(loginId) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun shadow() {
|
|
|
|
private fun shadow() {
|
|
|
@ -86,11 +84,11 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
fun `WHEN fetching the login list, THEN update the state in the store`() {
|
|
|
|
fun `WHEN fetching the login list, THEN update the state in the store`() {
|
|
|
|
val loginId = "id"
|
|
|
|
val loginId = "id"
|
|
|
|
// for deferredLogin: Deferred<List<Login>>?
|
|
|
|
// for deferredLogin: Deferred<List<Login>>?
|
|
|
|
coEvery { context.components.core.passwordsStorage.list() } returns listOf()
|
|
|
|
coEvery { passwordsStorage.list() } returns listOf()
|
|
|
|
|
|
|
|
|
|
|
|
controller.fetchLoginDetails(loginId)
|
|
|
|
controller.fetchLoginDetails(loginId)
|
|
|
|
|
|
|
|
|
|
|
|
coVerify { context.components.core.passwordsStorage.list() }
|
|
|
|
coVerify { passwordsStorage.list() }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
@ -103,11 +101,11 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
httpRealm = "httpRealm",
|
|
|
|
httpRealm = "httpRealm",
|
|
|
|
formActionOrigin = ""
|
|
|
|
formActionOrigin = ""
|
|
|
|
)
|
|
|
|
)
|
|
|
|
coEvery { context.components.core.passwordsStorage.get(any()) } returns loginMock
|
|
|
|
coEvery { passwordsStorage.get(any()) } returns loginMock
|
|
|
|
|
|
|
|
|
|
|
|
controller.save(login.guid!!, login.username, login.password)
|
|
|
|
controller.save(login.guid!!, login.username, login.password)
|
|
|
|
|
|
|
|
|
|
|
|
coVerify { context.components.core.passwordsStorage.get(any()) }
|
|
|
|
coVerify { passwordsStorage.get(any()) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
@ -121,11 +119,11 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
formActionOrigin = ""
|
|
|
|
formActionOrigin = ""
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
coEvery { context.components.core.passwordsStorage.get(any()) } returns login
|
|
|
|
coEvery { passwordsStorage.get(any()) } returns login
|
|
|
|
|
|
|
|
|
|
|
|
// for deferredLogin: Deferred<List<Login>>?
|
|
|
|
// for deferredLogin: Deferred<List<Login>>?
|
|
|
|
coEvery {
|
|
|
|
coEvery {
|
|
|
|
context.components.core.passwordsStorage.getPotentialDupesIgnoringUsername(any())
|
|
|
|
passwordsStorage.getPotentialDupesIgnoringUsername(any())
|
|
|
|
} returns listOf()
|
|
|
|
} returns listOf()
|
|
|
|
|
|
|
|
|
|
|
|
controller.findPotentialDuplicates(login.guid!!)
|
|
|
|
controller.findPotentialDuplicates(login.guid!!)
|
|
|
@ -133,7 +131,7 @@ class SavedLoginsStorageControllerTest {
|
|
|
|
shadow()
|
|
|
|
shadow()
|
|
|
|
|
|
|
|
|
|
|
|
coVerify {
|
|
|
|
coVerify {
|
|
|
|
context.components.core.passwordsStorage.getPotentialDupesIgnoringUsername(login)
|
|
|
|
passwordsStorage.getPotentialDupesIgnoringUsername(login)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|