[fenix] Add tests for tab history

pull/600/head
Tiger Oakes 4 years ago committed by Kainalu Hagiwara
parent 135a3a607a
commit 4245f4fb0f

@ -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, "<b>Mozilla</b>" 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
))
}
}

@ -10,19 +10,20 @@ import io.mockk.verify
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SessionUseCases
import org.junit.Test import org.junit.Test
import org.mozilla.fenix.R
class TabHistoryControllerTest { class TabHistoryControllerTest {
val sessionManager: SessionManager = mockk(relaxed = true) private val sessionManager: SessionManager = mockk(relaxed = true)
val navController: NavController = mockk(relaxed = true) private val navController: NavController = mockk(relaxed = true)
val sessionUseCases = SessionUseCases(sessionManager) private val sessionUseCases = SessionUseCases(sessionManager)
val goToHistoryIndexUseCase = sessionUseCases.goToHistoryIndex private val goToHistoryIndexUseCase = sessionUseCases.goToHistoryIndex
val controller = DefaultTabHistoryController( private val controller = DefaultTabHistoryController(
navController = navController, navController = navController,
goToHistoryIndexUseCase = goToHistoryIndexUseCase goToHistoryIndexUseCase = goToHistoryIndexUseCase
) )
val currentItem = TabHistoryItem( private val currentItem = TabHistoryItem(
index = 0, index = 0,
title = "", title = "",
url = "", url = "",
@ -33,6 +34,7 @@ class TabHistoryControllerTest {
fun handleGoToHistoryIndex() { fun handleGoToHistoryIndex() {
controller.handleGoToHistoryItem(currentItem) controller.handleGoToHistoryItem(currentItem)
verify { navController.popBackStack(R.id.browserFragment, false) }
verify { goToHistoryIndexUseCase.invoke(currentItem.index) } verify { goToHistoryIndexUseCase.invoke(currentItem.index) }
} }
} }

@ -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<View.OnClickListener>
@Before
fun setup() {
MockKAnnotations.init(this)
onClick = slot()
every { view.setOnClickListener(capture(onClick)) } just Runs
every { view.findViewById<LibrarySiteItemView>(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<TabHistoryItem>(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") }
}
}
Loading…
Cancel
Save