diff --git a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt
new file mode 100644
index 0000000000..72662e807a
--- /dev/null
+++ b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt
@@ -0,0 +1,96 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.fenix.tabhistory
+
+import android.text.Spanned
+import android.widget.FrameLayout
+import androidx.appcompat.view.ContextThemeWrapper
+import androidx.core.text.HtmlCompat
+import io.mockk.mockk
+import kotlinx.android.synthetic.main.history_list_item.*
+import mozilla.components.support.test.robolectric.testContext
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.fenix.R
+import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
+
+@RunWith(FenixRobolectricTestRunner::class)
+class TabHistoryAdapterTest {
+
+ private lateinit var parent: FrameLayout
+ private lateinit var interactor: TabHistoryInteractor
+ private lateinit var adapter: TabHistoryAdapter
+
+ private val selectedItem = TabHistoryItem(
+ title = "Mozilla",
+ url = "https://mozilla.org",
+ index = 0,
+ isSelected = true
+ )
+ private val unselectedItem = TabHistoryItem(
+ title = "Firefox",
+ url = "https://firefox.com",
+ index = 1,
+ isSelected = false
+ )
+
+ @Before
+ fun setup() {
+ parent = FrameLayout(ContextThemeWrapper(testContext, R.style.NormalTheme))
+ interactor = mockk()
+ adapter = TabHistoryAdapter(interactor)
+ }
+
+ @Test
+ fun `creates and binds view holder`() {
+ adapter.submitList(listOf(selectedItem, unselectedItem))
+
+ val holder = adapter.createViewHolder(parent, 0)
+
+ adapter.bindViewHolder(holder, 0)
+ val htmlSelected = HtmlCompat.toHtml(holder.history_layout.titleView.text as Spanned, 0)
+ assertTrue(htmlSelected, "Mozilla" in htmlSelected)
+
+ adapter.bindViewHolder(holder, 1)
+ assertFalse(holder.history_layout.titleView.text is Spanned)
+ assertEquals("Firefox", holder.history_layout.titleView.text)
+ }
+
+ @Test
+ fun `items are the same if they have matching URLs`() {
+ assertTrue(TabHistoryAdapter.DiffCallback.areItemsTheSame(
+ selectedItem,
+ selectedItem
+ ))
+ assertTrue(TabHistoryAdapter.DiffCallback.areItemsTheSame(
+ unselectedItem,
+ unselectedItem.copy(title = "Waterbug", index = 2, isSelected = true)
+ ))
+ assertFalse(TabHistoryAdapter.DiffCallback.areItemsTheSame(
+ unselectedItem,
+ unselectedItem.copy(url = "https://firefox.com/subpage")
+ ))
+ }
+
+ @Test
+ fun `equal items have the same contents`() {
+ assertTrue(TabHistoryAdapter.DiffCallback.areContentsTheSame(
+ selectedItem,
+ selectedItem
+ ))
+ assertFalse(TabHistoryAdapter.DiffCallback.areContentsTheSame(
+ selectedItem,
+ selectedItem.copy(title = "Waterbug", index = 2, isSelected = false)
+ ))
+ assertFalse(TabHistoryAdapter.DiffCallback.areContentsTheSame(
+ unselectedItem,
+ selectedItem
+ ))
+ }
+}
diff --git a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryControllerTest.kt b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryControllerTest.kt
index 8b32cc10f8..1f9099245d 100644
--- a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryControllerTest.kt
+++ b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryControllerTest.kt
@@ -10,19 +10,20 @@ import io.mockk.verify
import mozilla.components.browser.session.SessionManager
import mozilla.components.feature.session.SessionUseCases
import org.junit.Test
+import org.mozilla.fenix.R
class TabHistoryControllerTest {
- val sessionManager: SessionManager = mockk(relaxed = true)
- val navController: NavController = mockk(relaxed = true)
- val sessionUseCases = SessionUseCases(sessionManager)
- val goToHistoryIndexUseCase = sessionUseCases.goToHistoryIndex
- val controller = DefaultTabHistoryController(
+ private val sessionManager: SessionManager = mockk(relaxed = true)
+ private val navController: NavController = mockk(relaxed = true)
+ private val sessionUseCases = SessionUseCases(sessionManager)
+ private val goToHistoryIndexUseCase = sessionUseCases.goToHistoryIndex
+ private val controller = DefaultTabHistoryController(
navController = navController,
goToHistoryIndexUseCase = goToHistoryIndexUseCase
)
- val currentItem = TabHistoryItem(
+ private val currentItem = TabHistoryItem(
index = 0,
title = "",
url = "",
@@ -33,6 +34,7 @@ class TabHistoryControllerTest {
fun handleGoToHistoryIndex() {
controller.handleGoToHistoryItem(currentItem)
+ verify { navController.popBackStack(R.id.browserFragment, false) }
verify { goToHistoryIndexUseCase.invoke(currentItem.index) }
}
}
diff --git a/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolderTest.kt b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolderTest.kt
new file mode 100644
index 0000000000..e3013d60e4
--- /dev/null
+++ b/app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolderTest.kt
@@ -0,0 +1,62 @@
+package org.mozilla.fenix.tabhistory
+
+import android.view.View
+import io.mockk.CapturingSlot
+import io.mockk.MockKAnnotations
+import io.mockk.Runs
+import io.mockk.every
+import io.mockk.impl.annotations.MockK
+import io.mockk.just
+import io.mockk.mockk
+import io.mockk.slot
+import io.mockk.verify
+import org.junit.Before
+import org.junit.Test
+import org.mozilla.fenix.R
+import org.mozilla.fenix.library.LibrarySiteItemView
+
+class TabHistoryViewHolderTest {
+
+ @MockK private lateinit var view: View
+ @MockK private lateinit var interactor: TabHistoryViewInteractor
+ @MockK(relaxed = true) private lateinit var siteItemView: LibrarySiteItemView
+ private lateinit var holder: TabHistoryViewHolder
+ private lateinit var onClick: CapturingSlot
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this)
+ onClick = slot()
+
+ every { view.setOnClickListener(capture(onClick)) } just Runs
+ every { view.findViewById(R.id.history_layout) } returns siteItemView
+
+ holder = TabHistoryViewHolder(view, interactor)
+ }
+
+ @Test
+ fun `calls interactor on click`() {
+ every { interactor.goToHistoryItem(any()) } just Runs
+
+ val item = mockk(relaxed = true)
+ holder.bind(item)
+ onClick.captured.onClick(mockk())
+ verify { interactor.goToHistoryItem(item) }
+ }
+
+ @Test
+ fun `binds title and url`() {
+ val item = TabHistoryItem(
+ title = "Firefox",
+ url = "https://firefox.com",
+ index = 1,
+ isSelected = false
+ )
+ holder.bind(item)
+
+ verify { siteItemView.displayAs(LibrarySiteItemView.ItemType.SITE) }
+ verify { siteItemView.titleView.text = "Firefox" }
+ verify { siteItemView.urlView.text = "https://firefox.com" }
+ verify { siteItemView.loadFavicon("https://firefox.com") }
+ }
+}