From 720a5909024b73540ccd49bbf9d49aade1a12261 Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Tue, 7 Jul 2020 19:46:25 -0700 Subject: [PATCH] Add tests for browser helper classes (#12370) --- .../fenix/browser/FenixSnackbarDelegate.kt | 4 +- .../browser/FenixSnackbarDelegateTest.kt | 112 ++++++++++++++++++ .../browser/TelemetrySessionObserverTest.kt | 21 ++-- .../fenix/browser/UriOpenedObserverTest.kt | 28 +++++ 4 files changed, 153 insertions(+), 12 deletions(-) create mode 100644 app/src/test/java/org/mozilla/fenix/browser/FenixSnackbarDelegateTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/browser/FenixSnackbarDelegate.kt b/app/src/main/java/org/mozilla/fenix/browser/FenixSnackbarDelegate.kt index 2547fd871..6d2a4cdfc 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/FenixSnackbarDelegate.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/FenixSnackbarDelegate.kt @@ -9,8 +9,8 @@ import androidx.annotation.StringRes import mozilla.components.feature.contextmenu.ContextMenuCandidate import org.mozilla.fenix.components.FenixSnackbar -class FenixSnackbarDelegate(val view: View) : - ContextMenuCandidate.SnackbarDelegate { +class FenixSnackbarDelegate(private val view: View) : ContextMenuCandidate.SnackbarDelegate { + override fun show( snackBarParentView: View, @StringRes text: Int, diff --git a/app/src/test/java/org/mozilla/fenix/browser/FenixSnackbarDelegateTest.kt b/app/src/test/java/org/mozilla/fenix/browser/FenixSnackbarDelegateTest.kt new file mode 100644 index 000000000..bbf50f419 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/browser/FenixSnackbarDelegateTest.kt @@ -0,0 +1,112 @@ +/* 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.browser + +import android.view.View +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.unmockkObject +import io.mockk.verify +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.mozilla.fenix.R +import org.mozilla.fenix.components.FenixSnackbar +import org.mozilla.fenix.components.FenixSnackbar.Companion.LENGTH_SHORT + +class FenixSnackbarDelegateTest { + + @MockK private lateinit var view: View + @MockK(relaxed = true) private lateinit var snackbar: FenixSnackbar + private lateinit var delegate: FenixSnackbarDelegate + + @Before + fun setup() { + MockKAnnotations.init(this) + mockkObject(FenixSnackbar.Companion) + + delegate = FenixSnackbarDelegate(view) + every { + FenixSnackbar.make(view, LENGTH_SHORT, isDisplayedWithBrowserToolbar = true) + } returns snackbar + every { snackbar.setText(any()) } returns snackbar + every { snackbar.setAction(any(), any()) } returns snackbar + every { view.context.getString(R.string.app_name) } returns "Firefox" + every { view.context.getString(R.string.edit) } returns "Edit" + } + + @After + fun teardown() { + unmockkObject(FenixSnackbar.Companion) + } + + @Test + fun `show with no listener nor action`() { + delegate.show( + snackBarParentView = mockk(), + text = R.string.app_name, + duration = 0, + action = 0, + listener = null + ) + + verify { snackbar.setText("Firefox") } + verify(exactly = 0) { snackbar.setAction(any(), any()) } + verify { snackbar.show() } + } + + @Test + fun `show with listener but no action`() { + delegate.show( + snackBarParentView = mockk(), + text = R.string.app_name, + duration = 0, + action = 0, + listener = {} + ) + + verify { snackbar.setText("Firefox") } + verify(exactly = 0) { snackbar.setAction(any(), any()) } + verify { snackbar.show() } + } + + @Test + fun `show with action but no listener`() { + delegate.show( + snackBarParentView = mockk(), + text = R.string.app_name, + duration = 0, + action = R.string.edit, + listener = null + ) + + verify { snackbar.setText("Firefox") } + verify(exactly = 0) { snackbar.setAction(any(), any()) } + verify { snackbar.show() } + } + + @Test + fun `show with listener and action`() { + val listener = mockk<(View) -> Unit>(relaxed = true) + delegate.show( + snackBarParentView = mockk(), + text = R.string.app_name, + duration = 0, + action = R.string.edit, + listener = listener + ) + + verify { snackbar.setText("Firefox") } + verify { snackbar.setAction("Edit", withArg { + verify(exactly = 0) { listener(view) } + it.invoke() + verify { listener(view) } + }) } + verify { snackbar.show() } + } +} diff --git a/app/src/test/java/org/mozilla/fenix/browser/TelemetrySessionObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/TelemetrySessionObserverTest.kt index 517d1cb24..5f914bb54 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/TelemetrySessionObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/TelemetrySessionObserverTest.kt @@ -10,7 +10,8 @@ import io.mockk.mockk import io.mockk.verify import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test import org.mozilla.fenix.components.metrics.Event @@ -59,8 +60,8 @@ class TelemetrySessionObserverTest { triggeredByRedirect = false, triggeredByWebContent = false ) - Assert.assertEquals(sessionUrl, singleSessionObserver.originSessionUrl) - Assert.assertEquals(url, singleSessionObserver.redirectChain[0]) + assertEquals(sessionUrl, singleSessionObserver.originSessionUrl) + assertEquals(url, singleSessionObserver.redirectChain[0]) } @Test @@ -77,9 +78,9 @@ class TelemetrySessionObserverTest { triggeredByRedirect = false, triggeredByWebContent = false ) - Assert.assertEquals(url, singleSessionObserver.originSessionUrl) - Assert.assertEquals(url, singleSessionObserver.redirectChain[0]) - Assert.assertEquals(newUrl, singleSessionObserver.redirectChain[1]) + assertEquals(url, singleSessionObserver.originSessionUrl) + assertEquals(url, singleSessionObserver.redirectChain[0]) + assertEquals(newUrl, singleSessionObserver.redirectChain[1]) } @Test @@ -93,8 +94,8 @@ class TelemetrySessionObserverTest { triggeredByRedirect = false, triggeredByWebContent = false ) - Assert.assertNull(singleSessionObserver.originSessionUrl) - Assert.assertEquals(0, singleSessionObserver.redirectChain.size) + assertNull(singleSessionObserver.originSessionUrl) + assertEquals(0, singleSessionObserver.redirectChain.size) } @Test @@ -116,7 +117,7 @@ class TelemetrySessionObserverTest { redirectChain ) } - Assert.assertNull(singleSessionObserver.originSessionUrl) - Assert.assertEquals(0, singleSessionObserver.redirectChain.size) + assertNull(singleSessionObserver.originSessionUrl) + assertEquals(0, singleSessionObserver.redirectChain.size) } } diff --git a/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt index 2b1224ba4..7822da7b0 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/UriOpenedObserverTest.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.browser import androidx.lifecycle.LifecycleOwner +import io.mockk.every import io.mockk.mockk import io.mockk.verify import mozilla.components.browser.session.Session @@ -41,7 +42,34 @@ class UriOpenedObserverTest { observer.onSessionAdded(session) verify { session.register(observer.singleSessionObserver, owner) } + observer.onSessionSelected(session) + verify { session.register(observer.singleSessionObserver, owner) } + observer.onSessionRemoved(session) verify { session.unregister(observer.singleSessionObserver) } } + + @Test + fun `registers when all sessions are restored`() { + val session1: Session = mockk(relaxed = true) + val session2: Session = mockk(relaxed = true) + every { sessionManager.sessions } returns listOf(session1, session2) + + observer.onSessionsRestored() + + verify { session1.register(observer.singleSessionObserver, owner) } + verify { session2.register(observer.singleSessionObserver, owner) } + } + + @Test + fun `unregisters when all sessions are removed`() { + val session1: Session = mockk(relaxed = true) + val session2: Session = mockk(relaxed = true) + every { sessionManager.sessions } returns listOf(session1, session2) + + observer.onAllSessionsRemoved() + + verify { session1.unregister(observer.singleSessionObserver) } + verify { session2.unregister(observer.singleSessionObserver) } + } }