From 9ed161ff27c006546536b8007f089443ccf067cc Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Thu, 29 Jul 2021 17:04:18 -0400 Subject: [PATCH] [fenix] Issue https://github.com/mozilla-mobile/fenix/issues/20533: Fix intermittent test failures in SearchDialogControllerTest --- .../search/SearchDialogControllerTest.kt | 109 +++++++++--------- 1 file changed, 57 insertions(+), 52 deletions(-) diff --git a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt index ca36eb827..688509f98 100644 --- a/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/SearchDialogControllerTest.kt @@ -27,6 +27,7 @@ import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.middleware.CaptureActionsMiddleware import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.mozilla.fenix.BrowserDirection @@ -35,7 +36,6 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.components.metrics.MetricsUtils - import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalAddonsManagementFragment import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalSearchEngineFragment import org.mozilla.fenix.settings.SupportUtils @@ -50,12 +50,7 @@ class SearchDialogControllerTest { @MockK private lateinit var searchEngine: SearchEngine @MockK(relaxed = true) private lateinit var metrics: MetricController @MockK(relaxed = true) private lateinit var settings: Settings - @MockK(relaxed = true) private lateinit var clearToolbarFocus: () -> Unit - @MockK(relaxed = true) private lateinit var focusToolbar: () -> Unit - @MockK(relaxed = true) private lateinit var clearToolbar: () -> Unit - @MockK(relaxed = true) private lateinit var dismissDialog: () -> Unit - private lateinit var controller: SearchDialogController private lateinit var middleware: CaptureActionsMiddleware private lateinit var browserStore: BrowserStore @@ -73,22 +68,6 @@ class SearchDialogControllerTest { every { id } returns R.id.searchDialogFragment } every { MetricsUtils.createSearchEvent(searchEngine, browserStore, any()) } returns null - - val tabsUseCases = TabsUseCases(browserStore) - - controller = SearchDialogController( - activity = activity, - store = browserStore, - tabsUseCases = tabsUseCases, - fragmentStore = store, - navController = navController, - settings = settings, - metrics = metrics, - dismissDialog = dismissDialog, - clearToolbarFocus = clearToolbarFocus, - focusToolbar = focusToolbar, - clearToolbar = clearToolbar - ) } @After @@ -100,7 +79,7 @@ class SearchDialogControllerTest { fun handleUrlCommitted() { val url = "https://www.google.com/" - controller.handleUrlCommitted(url) + createController().handleUrlCommitted(url) verify { activity.openToBrowserAndLoad( @@ -117,18 +96,19 @@ class SearchDialogControllerTest { fun handleBlankUrlCommitted() { val url = "" - controller.handleUrlCommitted(url) + var dismissDialogInvoked = false + createController(dismissDialog = { + dismissDialogInvoked = true + }).handleUrlCommitted(url) - verify { - dismissDialog() - } + assertTrue(dismissDialogInvoked) } @Test fun handleSearchCommitted() { val searchTerm = "Firefox" - controller.handleUrlCommitted(searchTerm) + createController().handleUrlCommitted(searchTerm) verify { activity.openToBrowserAndLoad( @@ -145,7 +125,7 @@ class SearchDialogControllerTest { val url = "about:crashes" every { activity.packageName } returns "org.mozilla.fenix" - controller.handleUrlCommitted(url) + createController().handleUrlCommitted(url) verify { activity.startActivity(any()) @@ -157,7 +137,7 @@ class SearchDialogControllerTest { val url = "about:addons" val directions = actionGlobalAddonsManagementFragment() - controller.handleUrlCommitted(url) + createController().handleUrlCommitted(url) verify { navController.navigate(directions) } } @@ -166,7 +146,7 @@ class SearchDialogControllerTest { fun handleMozillaUrlCommitted() { val url = "moz://a" - controller.handleUrlCommitted(url) + createController().handleUrlCommitted(url) verify { activity.openToBrowserAndLoad( @@ -181,18 +161,19 @@ class SearchDialogControllerTest { @Test fun handleEditingCancelled() = runBlockingTest { - controller.handleEditingCancelled() + var clearToolbarFocusInvoked = false + createController(clearToolbarFocus = { + clearToolbarFocusInvoked = true + }).handleEditingCancelled() - verify { - clearToolbarFocus() - } + assertTrue(clearToolbarFocusInvoked) } @Test fun handleTextChangedNonEmpty() { val text = "fenix" - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.UpdateQuery(text)) } } @@ -201,7 +182,7 @@ class SearchDialogControllerTest { fun handleTextChangedEmpty() { val text = "" - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.UpdateQuery(text)) } } @@ -211,7 +192,7 @@ class SearchDialogControllerTest { val text = "" every { settings.shouldShowSearchShortcuts } returns true - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) } } @@ -222,7 +203,7 @@ class SearchDialogControllerTest { every { store.state.url } returns "mozilla.org" every { settings.shouldShowSearchShortcuts } returns true - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) } } @@ -231,7 +212,7 @@ class SearchDialogControllerTest { fun `do not show search shortcuts when setting enabled AND query non-empty`() { val text = "mozilla" - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } } @@ -242,7 +223,7 @@ class SearchDialogControllerTest { val text = "" - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } } @@ -253,7 +234,7 @@ class SearchDialogControllerTest { val text = "mozilla" - controller.handleTextChanged(text) + createController().handleTextChanged(text) verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } } @@ -262,7 +243,7 @@ class SearchDialogControllerTest { fun handleUrlTapped() { val url = "https://www.google.com/" - controller.handleUrlTapped(url) + createController().handleUrlTapped(url) verify { activity.openToBrowserAndLoad( @@ -278,7 +259,7 @@ class SearchDialogControllerTest { fun handleSearchTermsTapped() { val searchTerms = "fenix" - controller.handleSearchTermsTapped(searchTerms) + createController().handleSearchTermsTapped(searchTerms) verify { activity.openToBrowserAndLoad( @@ -295,9 +276,12 @@ class SearchDialogControllerTest { fun handleSearchShortcutEngineSelected() { val searchEngine: SearchEngine = mockk(relaxed = true) - controller.handleSearchShortcutEngineSelected(searchEngine) + var focusToolbarInvoked = false + createController(focusToolbar = { + focusToolbarInvoked = true + }).handleSearchShortcutEngineSelected(searchEngine) - verify { focusToolbar() } + assertTrue(focusToolbarInvoked) verify { store.dispatch(SearchFragmentAction.SearchShortcutEngineSelected(searchEngine)) } verify { metrics.track(Event.SearchShortcutSelected(searchEngine, false)) } } @@ -306,7 +290,7 @@ class SearchDialogControllerTest { fun handleClickSearchEngineSettings() { val directions: NavDirections = actionGlobalSearchEngineFragment() - controller.handleClickSearchEngineSettings() + createController().handleClickSearchEngineSettings() verify { navController.navigate(directions) } } @@ -315,7 +299,7 @@ class SearchDialogControllerTest { fun handleSearchShortcutsButtonClicked_alreadyOpen() { every { store.state.showSearchShortcuts } returns true - controller.handleSearchShortcutsButtonClicked() + createController().handleSearchShortcutsButtonClicked() verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(false)) } } @@ -324,14 +308,14 @@ class SearchDialogControllerTest { fun handleSearchShortcutsButtonClicked_notYetOpen() { every { store.state.showSearchShortcuts } returns false - controller.handleSearchShortcutsButtonClicked() + createController().handleSearchShortcutsButtonClicked() verify { store.dispatch(SearchFragmentAction.ShowSearchShortcutEnginePicker(true)) } } @Test fun handleExistingSessionSelected() { - controller.handleExistingSessionSelected("selected") + createController().handleExistingSessionSelected("selected") browserStore.waitUntilIdle() @@ -344,7 +328,7 @@ class SearchDialogControllerTest { @Test fun handleExistingSessionSelected_tabId() { - controller.handleExistingSessionSelected("tab-id") + createController().handleExistingSessionSelected("tab-id") browserStore.waitUntilIdle() @@ -358,11 +342,32 @@ class SearchDialogControllerTest { fun `show camera permissions needed dialog`() { val dialogBuilder: AlertDialog.Builder = mockk(relaxed = true) - val spyController = spyk(controller) + val spyController = spyk(createController()) every { spyController.buildDialog() } returns dialogBuilder spyController.handleCameraPermissionsNeeded() verify { dialogBuilder.show() } } + + private fun createController( + clearToolbarFocus: () -> Unit = { }, + focusToolbar: () -> Unit = { }, + clearToolbar: () -> Unit = { }, + dismissDialog: () -> Unit = { } + ): SearchDialogController { + return SearchDialogController( + activity = activity, + store = browserStore, + tabsUseCases = TabsUseCases(browserStore), + fragmentStore = store, + navController = navController, + settings = settings, + metrics = metrics, + dismissDialog = dismissDialog, + clearToolbarFocus = clearToolbarFocus, + focusToolbar = focusToolbar, + clearToolbar = clearToolbar + ) + } }