From 6152469ffd309481bd5760d999972ad7104c1201 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Thu, 30 Jul 2020 10:59:25 -0700 Subject: [PATCH] Add tests for tab history --- .../fenix/tabhistory/TabHistoryAdapterTest.kt | 96 +++++++++++++++++++ .../tabhistory/TabHistoryControllerTest.kt | 14 +-- .../tabhistory/TabHistoryViewHolderTest.kt | 62 ++++++++++++ 3 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryAdapterTest.kt create mode 100644 app/src/test/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolderTest.kt 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") } + } +}