1
0
Fork 0

Add tests for tab history

master
Tiger Oakes 2020-07-30 10:59:25 -07:00 committed by Kainalu Hagiwara
parent 4c1e6eeb25
commit 6152469ffd
3 changed files with 166 additions and 6 deletions

View File

@ -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
))
}
}

View File

@ -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) }
}
}

View File

@ -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") }
}
}