1
0
Fork 0

For #13084 - Use runBlockingTest

master
Tiger Oakes 2020-07-29 16:48:03 -07:00 committed by Emily Kager
parent aaae70f3dc
commit 1a51b7f874
2 changed files with 17 additions and 12 deletions

View File

@ -7,6 +7,7 @@ package org.mozilla.fenix.settings.logins.controller
import android.util.Log import android.util.Log
import androidx.navigation.NavController import androidx.navigation.NavController
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -31,14 +32,15 @@ open class SavedLoginsStorageController(
private val passwordsStorage: SyncableLoginsStorage, private val passwordsStorage: SyncableLoginsStorage,
private val viewLifecycleScope: CoroutineScope, private val viewLifecycleScope: CoroutineScope,
private val navController: NavController, private val navController: NavController,
private val loginsFragmentStore: LoginsFragmentStore private val loginsFragmentStore: LoginsFragmentStore,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) { ) {
private suspend fun getLogin(loginId: String): Login? = passwordsStorage.get(loginId) private suspend fun getLogin(loginId: String): Login? = passwordsStorage.get(loginId)
fun delete(loginId: String) { fun delete(loginId: String) {
var deleteLoginJob: Deferred<Boolean>? = null var deleteLoginJob: Deferred<Boolean>? = null
val deleteJob = viewLifecycleScope.launch(Dispatchers.IO) { val deleteJob = viewLifecycleScope.launch(ioDispatcher) {
deleteLoginJob = async { deleteLoginJob = async {
passwordsStorage.delete(loginId) passwordsStorage.delete(loginId)
} }
@ -56,7 +58,7 @@ open class SavedLoginsStorageController(
fun save(loginId: String, usernameText: String, passwordText: String) { fun save(loginId: String, usernameText: String, passwordText: String) {
var saveLoginJob: Deferred<Unit>? = null var saveLoginJob: Deferred<Unit>? = null
viewLifecycleScope.launch(Dispatchers.IO) { viewLifecycleScope.launch(ioDispatcher) {
saveLoginJob = async { saveLoginJob = async {
// must retrieve from storage to get the httpsRealm and formActionOrigin // must retrieve from storage to get the httpsRealm and formActionOrigin
val oldLogin = passwordsStorage.get(loginId) val oldLogin = passwordsStorage.get(loginId)
@ -123,7 +125,7 @@ open class SavedLoginsStorageController(
fun findPotentialDuplicates(loginId: String) { fun findPotentialDuplicates(loginId: String) {
var deferredLogin: Deferred<List<Login>>? = null var deferredLogin: Deferred<List<Login>>? = null
// What scope should be used here? // What scope should be used here?
val fetchLoginJob = viewLifecycleScope.launch(Dispatchers.IO) { val fetchLoginJob = viewLifecycleScope.launch(ioDispatcher) {
deferredLogin = async { deferredLogin = async {
val login = getLogin(loginId) val login = getLogin(loginId)
passwordsStorage.getPotentialDupesIgnoringUsername(login!!) passwordsStorage.getPotentialDupesIgnoringUsername(login!!)
@ -149,7 +151,7 @@ open class SavedLoginsStorageController(
fun fetchLoginDetails(loginId: String) { fun fetchLoginDetails(loginId: String) {
var deferredLogin: Deferred<List<Login>>? = null var deferredLogin: Deferred<List<Login>>? = null
val fetchLoginJob = viewLifecycleScope.launch(Dispatchers.IO) { val fetchLoginJob = viewLifecycleScope.launch(ioDispatcher) {
deferredLogin = async { deferredLogin = async {
passwordsStorage.list() passwordsStorage.list()
} }
@ -177,7 +179,7 @@ open class SavedLoginsStorageController(
fun handleLoadAndMapLogins() { fun handleLoadAndMapLogins() {
var deferredLogins: Deferred<List<Login>>? = null var deferredLogins: Deferred<List<Login>>? = null
val fetchLoginsJob = viewLifecycleScope.launch(Dispatchers.IO) { val fetchLoginsJob = viewLifecycleScope.launch(ioDispatcher) {
deferredLogins = async { deferredLogins = async {
passwordsStorage.list() passwordsStorage.list()
} }

View File

@ -13,9 +13,9 @@ import io.mockk.every
import io.mockk.just import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.TestCoroutineScope import kotlinx.coroutines.test.TestCoroutineScope
import kotlinx.coroutines.test.runBlockingTest
import mozilla.components.concept.storage.Login import mozilla.components.concept.storage.Login
import mozilla.components.service.sync.logins.SyncableLoginsStorage import mozilla.components.service.sync.logins.SyncableLoginsStorage
import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.MainCoroutineRule
@ -41,6 +41,7 @@ class SavedLoginsStorageControllerTest {
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)
private val scope = TestCoroutineScope() private val scope = TestCoroutineScope()
private val ioDispatcher = TestCoroutineDispatcher()
private val loginMock: Login = mockk(relaxed = true) private val loginMock: Login = mockk(relaxed = true)
@Before @Before
@ -55,17 +56,19 @@ class SavedLoginsStorageControllerTest {
passwordsStorage = passwordsStorage, passwordsStorage = passwordsStorage,
viewLifecycleScope = scope, viewLifecycleScope = scope,
navController = navController, navController = navController,
loginsFragmentStore = loginsFragmentStore loginsFragmentStore = loginsFragmentStore,
ioDispatcher = ioDispatcher
) )
} }
@After @After
fun cleanUp() { fun cleanUp() {
scope.cleanupTestCoroutines() scope.cleanupTestCoroutines()
ioDispatcher.cleanupTestCoroutines()
} }
@Test @Test
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`() = scope.runBlockingTest {
val loginId = "id" val loginId = "id"
coEvery { passwordsStorage.delete(any()) } returns true coEvery { passwordsStorage.delete(any()) } returns true
controller.delete(loginId) controller.delete(loginId)
@ -77,7 +80,7 @@ class SavedLoginsStorageControllerTest {
} }
@Test @Test
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`() = scope.runBlockingTest {
val login = Login( val login = Login(
guid = "id", guid = "id",
origin = "https://www.test.co.gov.org", origin = "https://www.test.co.gov.org",
@ -103,7 +106,7 @@ class SavedLoginsStorageControllerTest {
} }
@Test @Test
fun `WHEN saving an update to an item, THEN navigate to login detail view`() { fun `WHEN saving an update to an item, THEN navigate to login detail view`() = scope.runBlockingTest {
val oldLogin = Login( val oldLogin = Login(
guid = "id", guid = "id",
origin = "https://www.test.co.gov.org", origin = "https://www.test.co.gov.org",
@ -147,7 +150,7 @@ class SavedLoginsStorageControllerTest {
} }
@Test @Test
fun `WHEN finding login dupes, THEN update duplicates in the store`() { fun `WHEN finding login dupes, THEN update duplicates in the store`() = scope.runBlockingTest {
val login = Login( val login = Login(
guid = "id", guid = "id",
origin = "https://www.test.co.gov.org", origin = "https://www.test.co.gov.org",