[fenix] Add tests for login exceptions (https://github.com/mozilla-mobile/fenix/pull/12681)
parent
5c9876dcff
commit
a7bbc86f4a
@ -0,0 +1,113 @@
|
||||
/* 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.loginexceptions
|
||||
|
||||
import android.widget.LinearLayout
|
||||
import androidx.appcompat.view.ContextThemeWrapper
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
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
|
||||
import org.mozilla.fenix.loginexceptions.viewholders.LoginExceptionsDeleteButtonViewHolder
|
||||
import org.mozilla.fenix.loginexceptions.viewholders.LoginExceptionsHeaderViewHolder
|
||||
import org.mozilla.fenix.loginexceptions.viewholders.LoginExceptionsListItemViewHolder
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class LoginExceptionsAdapterTest {
|
||||
|
||||
private lateinit var interactor: LoginExceptionsInteractor
|
||||
private lateinit var adapter: LoginExceptionsAdapter
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
interactor = mockk()
|
||||
adapter = LoginExceptionsAdapter(interactor)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `creates correct view holder type`() {
|
||||
val parent = LinearLayout(ContextThemeWrapper(testContext, R.style.NormalTheme))
|
||||
adapter.updateData(listOf(mockk(), mockk()))
|
||||
assertEquals(4, adapter.itemCount)
|
||||
|
||||
val holders = (0 until adapter.itemCount).asSequence()
|
||||
.map { i -> adapter.getItemViewType(i) }
|
||||
.map { viewType -> adapter.onCreateViewHolder(parent, viewType) }
|
||||
.toList()
|
||||
assertEquals(4, holders.size)
|
||||
|
||||
assertTrue(holders[0] is LoginExceptionsHeaderViewHolder)
|
||||
assertTrue(holders[1] is LoginExceptionsListItemViewHolder)
|
||||
assertTrue(holders[2] is LoginExceptionsListItemViewHolder)
|
||||
assertTrue(holders[3] is LoginExceptionsDeleteButtonViewHolder)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `headers and delete should check if the other object is the same`() {
|
||||
assertTrue(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Header,
|
||||
LoginExceptionsAdapter.AdapterItem.Header
|
||||
))
|
||||
assertTrue(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton,
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton
|
||||
))
|
||||
assertFalse(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Header,
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton
|
||||
))
|
||||
assertTrue(LoginExceptionsAdapter.DiffCallback.areContentsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Header,
|
||||
LoginExceptionsAdapter.AdapterItem.Header
|
||||
))
|
||||
assertTrue(LoginExceptionsAdapter.DiffCallback.areContentsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton,
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton
|
||||
))
|
||||
assertFalse(LoginExceptionsAdapter.DiffCallback.areContentsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton,
|
||||
LoginExceptionsAdapter.AdapterItem.Header
|
||||
))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `items with the same id should be marked as same`() {
|
||||
assertTrue(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 12L
|
||||
}),
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 12L
|
||||
})
|
||||
))
|
||||
assertFalse(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 14L
|
||||
}),
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 12L
|
||||
})
|
||||
))
|
||||
assertFalse(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 14L
|
||||
}),
|
||||
LoginExceptionsAdapter.AdapterItem.Header
|
||||
))
|
||||
assertFalse(LoginExceptionsAdapter.DiffCallback.areItemsTheSame(
|
||||
LoginExceptionsAdapter.AdapterItem.DeleteButton,
|
||||
LoginExceptionsAdapter.AdapterItem.Item(mockk {
|
||||
every { id } returns 14L
|
||||
})
|
||||
))
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
/* 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.loginexceptions
|
||||
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import io.mockk.mockk
|
||||
import kotlinx.android.synthetic.main.component_exceptions.*
|
||||
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.helpers.FenixRobolectricTestRunner
|
||||
|
||||
@RunWith(FenixRobolectricTestRunner::class)
|
||||
class LoginExceptionsViewTest {
|
||||
|
||||
private lateinit var parent: ViewGroup
|
||||
private lateinit var interactor: LoginExceptionsInteractor
|
||||
private lateinit var view: LoginExceptionsView
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
parent = FrameLayout(testContext)
|
||||
interactor = mockk()
|
||||
view = LoginExceptionsView(parent, interactor)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `sets empty message text`() {
|
||||
assertEquals(
|
||||
"Logins and passwords that are not saved will be shown here.",
|
||||
view.exceptions_empty_message.text
|
||||
)
|
||||
assertTrue(view.exceptions_list.adapter is LoginExceptionsAdapter)
|
||||
assertTrue(view.exceptions_list.layoutManager is LinearLayoutManager)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `hide list when there are no items`() {
|
||||
view.update(ExceptionsFragmentState(
|
||||
items = emptyList()
|
||||
))
|
||||
|
||||
assertTrue(view.exceptions_empty_view.isVisible)
|
||||
assertFalse(view.exceptions_list.isVisible)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `shows list when there are items`() {
|
||||
view.update(ExceptionsFragmentState(
|
||||
items = listOf(mockk())
|
||||
))
|
||||
|
||||
assertFalse(view.exceptions_empty_view.isVisible)
|
||||
assertTrue(view.exceptions_list.isVisible)
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/* 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.loginexceptions.viewholders
|
||||
|
||||
import android.view.View
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import io.mockk.Runs
|
||||
import io.mockk.every
|
||||
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.loginexceptions.LoginExceptionsInteractor
|
||||
|
||||
class LoginExceptionsDeleteButtonViewHolderTest {
|
||||
|
||||
private lateinit var view: View
|
||||
private lateinit var deleteButton: MaterialButton
|
||||
private lateinit var interactor: LoginExceptionsInteractor
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
deleteButton = mockk()
|
||||
view = mockk {
|
||||
every { findViewById<MaterialButton>(R.id.removeAllExceptions) } returns deleteButton
|
||||
}
|
||||
interactor = mockk()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `delete button calls interactor`() {
|
||||
val slot = slot<View.OnClickListener>()
|
||||
every { deleteButton.setOnClickListener(capture(slot)) } just Runs
|
||||
LoginExceptionsDeleteButtonViewHolder(view, interactor)
|
||||
|
||||
every { interactor.onDeleteAll() } just Runs
|
||||
slot.captured.onClick(mockk())
|
||||
verify { interactor.onDeleteAll() }
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
/* 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.loginexceptions.viewholders
|
||||
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.mozilla.fenix.R
|
||||
|
||||
class LoginExceptionsHeaderViewHolderTest {
|
||||
|
||||
private lateinit var view: View
|
||||
private lateinit var description: TextView
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
description = mockk(relaxUnitFun = true)
|
||||
view = mockk {
|
||||
every { findViewById<TextView>(R.id.exceptions_description) } returns description
|
||||
every {
|
||||
context.getString(R.string.preferences_passwords_exceptions_description)
|
||||
} returns "Logins and passwords will not be saved for these sites."
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `sets description text`() {
|
||||
LoginExceptionsHeaderViewHolder(view)
|
||||
verify { description.text = "Logins and passwords will not be saved for these sites." }
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
/* 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.loginexceptions.viewholders
|
||||
|
||||
import android.view.View
|
||||
import android.widget.ImageButton
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import io.mockk.Runs
|
||||
import io.mockk.every
|
||||
import io.mockk.just
|
||||
import io.mockk.mockk
|
||||
import io.mockk.slot
|
||||
import io.mockk.verify
|
||||
import mozilla.components.feature.logins.exceptions.LoginException
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.loginexceptions.LoginExceptionsInteractor
|
||||
|
||||
class LoginExceptionsListItemViewHolderTest {
|
||||
|
||||
private lateinit var view: View
|
||||
private lateinit var url: TextView
|
||||
private lateinit var deleteButton: ImageButton
|
||||
private lateinit var interactor: LoginExceptionsInteractor
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
url = mockk(relaxUnitFun = true)
|
||||
deleteButton = mockk(relaxUnitFun = true)
|
||||
view = mockk {
|
||||
every { findViewById<TextView>(R.id.webAddressView) } returns url
|
||||
every { findViewById<ImageButton>(R.id.delete_exception) } returns deleteButton
|
||||
every { findViewById<ImageView>(R.id.favicon_image) } returns mockk()
|
||||
}
|
||||
interactor = mockk()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `sets url text`() {
|
||||
LoginExceptionsListItemViewHolder(view, interactor).bind(mockk {
|
||||
every { origin } returns "mozilla.org"
|
||||
})
|
||||
verify { url.text = "mozilla.org" }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `delete button calls interactor`() {
|
||||
val slot = slot<View.OnClickListener>()
|
||||
val loginException = mockk<LoginException> {
|
||||
every { origin } returns "mozilla.org"
|
||||
}
|
||||
every { deleteButton.setOnClickListener(capture(slot)) } just Runs
|
||||
LoginExceptionsListItemViewHolder(view, interactor).bind(loginException)
|
||||
|
||||
every { interactor.onDeleteOne(loginException) } just Runs
|
||||
slot.captured.onClick(mockk())
|
||||
verify { interactor.onDeleteOne(loginException) }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue