[fenix] For https://github.com/mozilla-mobile/fenix/issues/22250 - Convert Recent Bookmarks to Jetpack Compose
parent
f2e74f31f8
commit
100d5372ee
@ -1,44 +0,0 @@
|
||||
/* 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.home.recentbookmarks
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import mozilla.components.concept.storage.BookmarkNode
|
||||
import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor
|
||||
import org.mozilla.fenix.home.recentbookmarks.view.RecentBookmarkItemViewHolder
|
||||
|
||||
/**
|
||||
* Adapter for binding individual bookmark items for the homescreen.
|
||||
*
|
||||
* @param interactor The [RecentBookmarksInteractor] to be passed into the view.
|
||||
*/
|
||||
class RecentBookmarksItemAdapter(
|
||||
private val interactor: RecentBookmarksInteractor
|
||||
) : ListAdapter<BookmarkNode, RecentBookmarkItemViewHolder>(RecentBookmarkItemDiffCallback) {
|
||||
|
||||
override fun onCreateViewHolder(
|
||||
parent: ViewGroup,
|
||||
viewType: Int
|
||||
): RecentBookmarkItemViewHolder {
|
||||
val view = LayoutInflater.from(parent.context)
|
||||
.inflate(RecentBookmarkItemViewHolder.LAYOUT_ID, parent, false)
|
||||
return RecentBookmarkItemViewHolder(view, interactor)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: RecentBookmarkItemViewHolder, position: Int) {
|
||||
holder.bind(getItem(position))
|
||||
}
|
||||
|
||||
internal object RecentBookmarkItemDiffCallback : DiffUtil.ItemCallback<BookmarkNode>() {
|
||||
override fun areItemsTheSame(oldItem: BookmarkNode, newItem: BookmarkNode) =
|
||||
oldItem.guid == newItem.guid
|
||||
|
||||
override fun areContentsTheSame(oldItem: BookmarkNode, newItem: BookmarkNode) =
|
||||
oldItem == newItem
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import android.view.View
|
||||
import mozilla.components.concept.storage.BookmarkNode
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.databinding.RecentBookmarkItemBinding
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.ext.loadIntoView
|
||||
import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor
|
||||
import org.mozilla.fenix.utils.view.ViewHolder
|
||||
|
||||
class RecentBookmarkItemViewHolder(
|
||||
private val view: View,
|
||||
private val interactor: RecentBookmarksInteractor
|
||||
) : ViewHolder(view) {
|
||||
|
||||
fun bind(bookmark: BookmarkNode) {
|
||||
val binding = RecentBookmarkItemBinding.bind(view)
|
||||
|
||||
binding.bookmarkTitle.text = bookmark.title ?: bookmark.url
|
||||
|
||||
binding.bookmarkItem.setOnClickListener {
|
||||
interactor.onRecentBookmarkClicked(bookmark)
|
||||
}
|
||||
|
||||
bookmark.url?.let {
|
||||
view.context.components.core.icons.loadIntoView(binding.faviconImage, it)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val LAYOUT_ID = R.layout.recent_bookmark_item
|
||||
}
|
||||
}
|
@ -0,0 +1,182 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.lazy.LazyRow
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.Card
|
||||
import androidx.compose.material.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import mozilla.components.browser.icons.compose.Loader
|
||||
import mozilla.components.browser.icons.compose.Placeholder
|
||||
import mozilla.components.browser.icons.compose.WithIcon
|
||||
import mozilla.components.concept.storage.BookmarkNode
|
||||
import mozilla.components.concept.storage.BookmarkNodeType
|
||||
import mozilla.components.ui.colors.PhotonColors
|
||||
import org.mozilla.fenix.components.components
|
||||
import org.mozilla.fenix.theme.FirefoxTheme
|
||||
|
||||
/**
|
||||
* A list of recent bookmarks.
|
||||
*
|
||||
* @param bookmarks List of [BookmarkNode]s to display.
|
||||
* @param onRecentBookmarkClick Invoked when the user clicks on a recent bookmark.
|
||||
*/
|
||||
@Composable
|
||||
fun RecentBookmarks(
|
||||
bookmarks: List<BookmarkNode>,
|
||||
onRecentBookmarkClick: (BookmarkNode) -> Unit = {}
|
||||
) {
|
||||
LazyRow(
|
||||
contentPadding = PaddingValues(horizontal = 16.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
items(bookmarks) { bookmark ->
|
||||
RecentBookmarkItem(
|
||||
bookmark = bookmark,
|
||||
onRecentBookmarkClick = onRecentBookmarkClick
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A recent bookmark item.
|
||||
*
|
||||
* @param bookmark The [BookmarkNode] to display.
|
||||
* @param onRecentBookmarkClick Invoked when the user clicks on the recent bookmark item.
|
||||
*/
|
||||
@Composable
|
||||
private fun RecentBookmarkItem(
|
||||
bookmark: BookmarkNode,
|
||||
onRecentBookmarkClick: (BookmarkNode) -> Unit = {}
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.width(156.dp)
|
||||
.clickable { onRecentBookmarkClick(bookmark) }
|
||||
) {
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(96.dp),
|
||||
elevation = 6.dp
|
||||
) {
|
||||
if (bookmark.url != null) {
|
||||
components.core.icons.Loader(bookmark.url!!) {
|
||||
Placeholder {
|
||||
Box(
|
||||
modifier = Modifier.background(
|
||||
color = when (isSystemInDarkTheme()) {
|
||||
true -> PhotonColors.DarkGrey30
|
||||
false -> PhotonColors.LightGrey30
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
WithIcon { icon ->
|
||||
Box(
|
||||
modifier = Modifier.size(36.dp),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Image(
|
||||
painter = icon.painter,
|
||||
contentDescription = null,
|
||||
modifier = Modifier
|
||||
.size(36.dp)
|
||||
.clip(RoundedCornerShape(8.dp)),
|
||||
contentScale = ContentScale.Fit
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
|
||||
Text(
|
||||
text = bookmark.title ?: bookmark.url ?: "",
|
||||
color = FirefoxTheme.colors.textPrimary,
|
||||
fontSize = 12.sp,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
maxLines = 1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
private fun RecentBookmarksPreview() {
|
||||
FirefoxTheme {
|
||||
RecentBookmarks(
|
||||
bookmarks = listOf(
|
||||
BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "1",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Other Bookmark Title",
|
||||
url = "https://www.example.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
),
|
||||
BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "2",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Other Bookmark Title",
|
||||
url = "https://www.example.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
),
|
||||
BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "3",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Other Bookmark Title",
|
||||
url = "https://www.example.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
),
|
||||
BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "4",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Other Bookmark Title",
|
||||
url = "https://www.example.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import android.view.View
|
||||
import androidx.navigation.findNavController
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.databinding.RecentBookmarksHeaderBinding
|
||||
import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor
|
||||
import org.mozilla.fenix.utils.view.ViewHolder
|
||||
|
||||
/**
|
||||
* View holder for the recent bookmarks header and "Show all" button.
|
||||
*
|
||||
* @param view The container [View] for this view holder.
|
||||
* @param interactor [RecentBookmarksInteractor] which will have delegated to all user interactions.
|
||||
*/
|
||||
class RecentBookmarksHeaderViewHolder(
|
||||
view: View,
|
||||
private val interactor: RecentBookmarksInteractor
|
||||
) : ViewHolder(view) {
|
||||
|
||||
init {
|
||||
val binding = RecentBookmarksHeaderBinding.bind(view)
|
||||
binding.showAllBookmarksButton.setOnClickListener {
|
||||
dismissSearchDialogIfDisplayed()
|
||||
interactor.onShowAllBookmarksClicked()
|
||||
}
|
||||
}
|
||||
|
||||
private fun dismissSearchDialogIfDisplayed() {
|
||||
val navController = itemView.findNavController()
|
||||
if (navController.currentDestination?.id == R.id.searchDialogFragment) {
|
||||
navController.navigateUp()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val LAYOUT_ID = R.layout.recent_bookmarks_header
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/home_item_horizontal_margin"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include
|
||||
android:id="@+id/recent_bookmarks_header"
|
||||
layout="@layout/recent_bookmarks_header" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recent_bookmarks_list"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
tools:listitem="@layout/recent_bookmark_item"
|
||||
tools:spanCount="4" />
|
||||
</LinearLayout>
|
@ -1,49 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/bookmark_item"
|
||||
android:layout_width="@dimen/recent_bookmark_item_width"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:layout_width="@dimen/recent_bookmark_item_card_width"
|
||||
android:layout_height="@dimen/recent_bookmark_item_favicon_height"
|
||||
android:layout_marginTop="@dimen/recent_bookmark_item_card_padding_top"
|
||||
android:layout_marginBottom="@dimen/recent_bookmark_item_card_padding_bottom"
|
||||
app:cardBackgroundColor="?mozac_widget_favicon_background_color"
|
||||
app:cardElevation="@dimen/recent_bookmark_item_card_elevation"
|
||||
app:layout_constraintBottom_toTopOf="@+id/bookmark_title"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/favicon_image"
|
||||
style="@style/recentBookmarkFavicon"
|
||||
android:layout_width="@dimen/top_sites_favicon_size"
|
||||
android:layout_height="@dimen/top_sites_favicon_size"
|
||||
android:layout_gravity="center" />
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bookmark_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:importantForAccessibility="yes"
|
||||
android:maxLines="1"
|
||||
android:nestedScrollingEnabled="false"
|
||||
android:scrollbars="none"
|
||||
android:textAppearance="@style/recentBookmarkItemSubTitleText"
|
||||
android:paddingHorizontal="@dimen/recent_bookmark_item_text_padding_horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="Recently Saved bookmark item" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -1,90 +0,0 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import io.mockk.mockk
|
||||
import mozilla.components.concept.storage.BookmarkNode
|
||||
import mozilla.components.concept.storage.BookmarkNodeType
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Assert
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.databinding.RecentBookmarkItemBinding
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class RecentBookmarkItemViewHolderTest {
|
||||
|
||||
private lateinit var binding: RecentBookmarkItemBinding
|
||||
private lateinit var interactor: SessionControlInteractor
|
||||
|
||||
private val bookmarkNoUrl = BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "guid#${Math.random() * 1000}",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Bookmark Title",
|
||||
url = null,
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
)
|
||||
|
||||
private val bookmarkWithUrl = BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "guid#${Math.random() * 1000}",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = "Other Bookmark Title",
|
||||
url = "https://www.example.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
)
|
||||
|
||||
private val bookmarkNoTitle = BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "guid#${Math.random() * 1000}",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = null,
|
||||
url = "https://www.github.com",
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
)
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
binding = RecentBookmarkItemBinding.inflate(LayoutInflater.from(testContext))
|
||||
|
||||
interactor = mockk(relaxed = true)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN a bookmark exists in the list THEN set the title text`() {
|
||||
RecentBookmarkItemViewHolder(binding.root, interactor).bind(bookmarkWithUrl)
|
||||
|
||||
Assert.assertEquals(bookmarkWithUrl.title, binding.bookmarkTitle.text)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN there is no url for the bookmark THEN do not load an icon `() {
|
||||
val viewHolder = RecentBookmarkItemViewHolder(binding.root, interactor)
|
||||
|
||||
Assert.assertNull(binding.faviconImage.drawable)
|
||||
|
||||
viewHolder.bind(bookmarkNoUrl)
|
||||
|
||||
Assert.assertNull(binding.faviconImage.drawable)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN a bookmark does not have a title THEN show the url`() {
|
||||
RecentBookmarkItemViewHolder(binding.root, interactor).bind(bookmarkNoTitle)
|
||||
|
||||
Assert.assertEquals(bookmarkNoTitle.url, binding.bookmarkTitle.text)
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import androidx.navigation.Navigation
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.databinding.RecentBookmarksHeaderBinding
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class RecentBookmarksHeaderViewHolderTest {
|
||||
|
||||
private lateinit var binding: RecentBookmarksHeaderBinding
|
||||
private lateinit var interactor: RecentBookmarksInteractor
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
binding = RecentBookmarksHeaderBinding.inflate(LayoutInflater.from(testContext))
|
||||
Navigation.setViewNavController(binding.root, mockk(relaxed = true))
|
||||
interactor = mockk(relaxed = true)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN show all button is clicked THEN interactor is called`() {
|
||||
RecentBookmarksHeaderViewHolder(binding.root, interactor)
|
||||
|
||||
binding.showAllBookmarksButton.performClick()
|
||||
|
||||
verify { interactor.onShowAllBookmarksClicked() }
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
/* 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.home.recentbookmarks.view
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import androidx.navigation.Navigation
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import mozilla.components.concept.storage.BookmarkNode
|
||||
import mozilla.components.concept.storage.BookmarkNodeType
|
||||
import mozilla.components.support.test.robolectric.testContext
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.mozilla.fenix.databinding.ComponentRecentBookmarksBinding
|
||||
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
|
||||
import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class RecentBookmarksViewHolderTest {
|
||||
|
||||
private lateinit var binding: ComponentRecentBookmarksBinding
|
||||
private lateinit var interactor: SessionControlInteractor
|
||||
|
||||
private val bookmark = BookmarkNode(
|
||||
type = BookmarkNodeType.ITEM,
|
||||
guid = "guid#${Math.random() * 1000}",
|
||||
parentGuid = null,
|
||||
position = null,
|
||||
title = null,
|
||||
url = null,
|
||||
dateAdded = 0,
|
||||
children = null
|
||||
)
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
binding = ComponentRecentBookmarksBinding.inflate(LayoutInflater.from(testContext))
|
||||
Navigation.setViewNavController(binding.root, mockk(relaxed = true))
|
||||
interactor = mockk(relaxed = true)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN show all bookmarks button is clicked THEN interactor is called`() {
|
||||
RecentBookmarksViewHolder(binding.root, interactor, mockk(relaxed = true)).bind(listOf(bookmark))
|
||||
binding.recentBookmarksHeader.showAllBookmarksButton.performClick()
|
||||
|
||||
verify { interactor.onShowAllBookmarksClicked() }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue