Commit 6152469f authored by Tiger Oakes's avatar Tiger Oakes Committed by Kainalu Hagiwara
Browse files

Add tests for tab history

parent 4c1e6eeb
Loading
Loading
Loading
Loading
+96 −0
Original line number Diff line number Diff line
/* 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
        ))
    }
}
+8 −6
Original line number Diff line number Diff line
@@ -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) }
    }
}
+62 −0
Original line number Diff line number Diff line
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") }
    }
}