|
|
@ -6,17 +6,20 @@ package org.mozilla.fenix.library.bookmarks
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.ClipData
|
|
|
|
import android.content.ClipData
|
|
|
|
import android.content.ClipboardManager
|
|
|
|
import android.content.ClipboardManager
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
import androidx.navigation.NavController
|
|
|
|
|
|
|
|
import androidx.navigation.NavDestination
|
|
|
|
import androidx.navigation.NavDirections
|
|
|
|
import androidx.navigation.NavDirections
|
|
|
|
import io.mockk.MockKAnnotations
|
|
|
|
import io.mockk.Runs
|
|
|
|
import io.mockk.called
|
|
|
|
import io.mockk.called
|
|
|
|
import io.mockk.coEvery
|
|
|
|
import io.mockk.coEvery
|
|
|
|
import io.mockk.coVerify
|
|
|
|
import io.mockk.coVerify
|
|
|
|
import io.mockk.every
|
|
|
|
import io.mockk.every
|
|
|
|
import io.mockk.impl.annotations.MockK
|
|
|
|
|
|
|
|
import io.mockk.just
|
|
|
|
import io.mockk.just
|
|
|
|
import io.mockk.mockk
|
|
|
|
import io.mockk.mockk
|
|
|
|
import io.mockk.runs
|
|
|
|
import io.mockk.runs
|
|
|
|
|
|
|
|
import io.mockk.slot
|
|
|
|
|
|
|
|
import io.mockk.spyk
|
|
|
|
import io.mockk.verify
|
|
|
|
import io.mockk.verify
|
|
|
|
import io.mockk.verifyOrder
|
|
|
|
import io.mockk.verifyOrder
|
|
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
|
@ -24,8 +27,6 @@ import kotlinx.coroutines.test.TestCoroutineScope
|
|
|
|
import mozilla.appservices.places.BookmarkRoot
|
|
|
|
import mozilla.appservices.places.BookmarkRoot
|
|
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
|
|
import mozilla.components.concept.storage.BookmarkNodeType
|
|
|
|
import mozilla.components.concept.storage.BookmarkNodeType
|
|
|
|
import mozilla.components.concept.storage.BookmarksStorage
|
|
|
|
|
|
|
|
import mozilla.components.service.fxa.manager.FxaAccountManager
|
|
|
|
|
|
|
|
import org.junit.After
|
|
|
|
import org.junit.After
|
|
|
|
import org.junit.Assert.assertEquals
|
|
|
|
import org.junit.Assert.assertEquals
|
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Before
|
|
|
@ -34,28 +35,32 @@ import org.mozilla.fenix.BrowserDirection
|
|
|
|
import org.mozilla.fenix.HomeActivity
|
|
|
|
import org.mozilla.fenix.HomeActivity
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
|
|
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
|
|
|
|
|
|
|
import org.mozilla.fenix.components.Services
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
import org.mozilla.fenix.components.metrics.Event
|
|
|
|
|
|
|
|
import org.mozilla.fenix.ext.bookmarkStorage
|
|
|
|
|
|
|
|
import org.mozilla.fenix.ext.components
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("TooManyFunctions", "LargeClass")
|
|
|
|
@ExperimentalCoroutinesApi
|
|
|
|
@ExperimentalCoroutinesApi
|
|
|
|
class BookmarkControllerTest {
|
|
|
|
class BookmarkControllerTest {
|
|
|
|
|
|
|
|
|
|
|
|
private val scope = TestCoroutineScope()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@MockK private lateinit var bookmarkStore: BookmarkFragmentStore
|
|
|
|
|
|
|
|
@MockK private lateinit var sharedViewModel: BookmarksSharedViewModel
|
|
|
|
|
|
|
|
@MockK(relaxUnitFun = true) private lateinit var clipboardManager: ClipboardManager
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var homeActivity: HomeActivity
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var bookmarkStorage: BookmarksStorage
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var accountManager: FxaAccountManager
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var navController: NavController
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var loadBookmarkNode: suspend (String) -> BookmarkNode?
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var showSnackbar: (String) -> Unit
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var deleteBookmarkNodes: (Set<BookmarkNode>, Event) -> Unit
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var deleteBookmarkFolder: (Set<BookmarkNode>) -> Unit
|
|
|
|
|
|
|
|
@MockK(relaxed = true) private lateinit var invokePendingDeletion: () -> Unit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private lateinit var controller: BookmarkController
|
|
|
|
private lateinit var controller: BookmarkController
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val bookmarkStore = spyk(BookmarkFragmentStore(BookmarkFragmentState(null)))
|
|
|
|
|
|
|
|
private val context: Context = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val scope = TestCoroutineScope()
|
|
|
|
|
|
|
|
private val clipboardManager: ClipboardManager = mockk(relaxUnitFun = true)
|
|
|
|
|
|
|
|
private val navController: NavController = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val sharedViewModel: BookmarksSharedViewModel = mockk()
|
|
|
|
|
|
|
|
private val loadBookmarkNode: suspend (String) -> BookmarkNode? = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val showSnackbar: (String) -> Unit = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val deleteBookmarkNodes: (Set<BookmarkNode>, Event) -> Unit = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val deleteBookmarkFolder: (Set<BookmarkNode>) -> Unit = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val invokePendingDeletion: () -> Unit = mockk(relaxed = true)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val homeActivity: HomeActivity = mockk(relaxed = true)
|
|
|
|
|
|
|
|
private val services: Services = mockk(relaxed = true)
|
|
|
|
|
|
|
|
|
|
|
|
private val item =
|
|
|
|
private val item =
|
|
|
|
BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
|
|
|
|
BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
|
|
|
|
private val subfolder =
|
|
|
|
private val subfolder =
|
|
|
@ -84,20 +89,15 @@ class BookmarkControllerTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Before
|
|
|
|
@Before
|
|
|
|
fun setup() {
|
|
|
|
fun setup() {
|
|
|
|
MockKAnnotations.init(this)
|
|
|
|
every { homeActivity.components.services } returns services
|
|
|
|
loadBookmarkNode = mockk(relaxed = true)
|
|
|
|
every { navController.currentDestination } returns NavDestination("").apply {
|
|
|
|
|
|
|
|
id = R.id.bookmarkFragment
|
|
|
|
every { navController.currentDestination } returns mockk {
|
|
|
|
|
|
|
|
every { id } returns R.id.bookmarkFragment
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
every { bookmarkStore.state } returns BookmarkFragmentState(null)
|
|
|
|
|
|
|
|
every { bookmarkStore.dispatch(any()) } returns mockk()
|
|
|
|
every { bookmarkStore.dispatch(any()) } returns mockk()
|
|
|
|
every { sharedViewModel.selectedFolder = any() } just runs
|
|
|
|
every { sharedViewModel.selectedFolder = any() } just runs
|
|
|
|
|
|
|
|
|
|
|
|
controller = DefaultBookmarkController(
|
|
|
|
controller = DefaultBookmarkController(
|
|
|
|
activity = homeActivity,
|
|
|
|
activity = homeActivity,
|
|
|
|
bookmarkStorage = bookmarkStorage,
|
|
|
|
|
|
|
|
accountManager = accountManager,
|
|
|
|
|
|
|
|
navController = navController,
|
|
|
|
navController = navController,
|
|
|
|
clipboardManager = clipboardManager,
|
|
|
|
clipboardManager = clipboardManager,
|
|
|
|
scope = scope,
|
|
|
|
scope = scope,
|
|
|
@ -211,12 +211,12 @@ class BookmarkControllerTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `handleBookmarkSelected should show a toast when selecting a root folder`() {
|
|
|
|
fun `handleBookmarkSelected should show a toast when selecting a root folder`() {
|
|
|
|
every { homeActivity.resources.getString(R.string.bookmark_cannot_edit_root) } returns "Can't edit default folders"
|
|
|
|
val errorMessage = context.getString(R.string.bookmark_cannot_edit_root)
|
|
|
|
|
|
|
|
|
|
|
|
controller.handleBookmarkSelected(root)
|
|
|
|
controller.handleBookmarkSelected(root)
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
showSnackbar("Can't edit default folders")
|
|
|
|
showSnackbar(errorMessage)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -240,24 +240,25 @@ class BookmarkControllerTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `handleCopyUrl should copy bookmark url to clipboard and show a toast`() {
|
|
|
|
fun `handleCopyUrl should copy bookmark url to clipboard and show a toast`() {
|
|
|
|
every { homeActivity.resources.getString(R.string.url_copied) } returns "URL copied"
|
|
|
|
val urlCopiedMessage = context.getString(R.string.url_copied)
|
|
|
|
|
|
|
|
|
|
|
|
controller.handleCopyUrl(item)
|
|
|
|
controller.handleCopyUrl(item)
|
|
|
|
|
|
|
|
|
|
|
|
verifyOrder {
|
|
|
|
verifyOrder {
|
|
|
|
ClipData.newPlainText(item.url, item.url)
|
|
|
|
ClipData.newPlainText(item.url, item.url)
|
|
|
|
showSnackbar("URL copied")
|
|
|
|
showSnackbar(urlCopiedMessage)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `handleBookmarkSharing should navigate to the 'Share' fragment`() {
|
|
|
|
fun `handleBookmarkSharing should navigate to the 'Share' fragment`() {
|
|
|
|
|
|
|
|
val navDirectionsSlot = slot<NavDirections>()
|
|
|
|
|
|
|
|
every { navController.navigate(capture(navDirectionsSlot), null) } just Runs
|
|
|
|
|
|
|
|
|
|
|
|
controller.handleBookmarkSharing(item)
|
|
|
|
controller.handleBookmarkSharing(item)
|
|
|
|
|
|
|
|
|
|
|
|
verify {
|
|
|
|
verify {
|
|
|
|
navController.navigate(withArg<NavDirections> {
|
|
|
|
navController.navigate(navDirectionsSlot.captured, null)
|
|
|
|
assertEquals(R.id.action_global_shareFragment, it.actionId)
|
|
|
|
|
|
|
|
}, null)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -312,7 +313,8 @@ class BookmarkControllerTest {
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
fun `handleRequestSync dispatches actions in the correct order`() {
|
|
|
|
fun `handleRequestSync dispatches actions in the correct order`() {
|
|
|
|
coEvery { bookmarkStorage.getBookmark(any()) } returns tree
|
|
|
|
every { homeActivity.components.backgroundServices.accountManager } returns mockk(relaxed = true)
|
|
|
|
|
|
|
|
coEvery { homeActivity.bookmarkStorage.getBookmark(any()) } returns tree
|
|
|
|
coEvery { loadBookmarkNode.invoke(any()) } returns tree
|
|
|
|
coEvery { loadBookmarkNode.invoke(any()) } returns tree
|
|
|
|
|
|
|
|
|
|
|
|
controller.handleRequestSync()
|
|
|
|
controller.handleRequestSync()
|
|
|
|