diff --git a/app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt b/app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt index 3a0638c06b38..e4e59f44ffc5 100644 --- a/app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt +++ b/app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt @@ -1,28 +1,29 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2024 Alper Ozturk * SPDX-FileCopyrightText: 2019 Tobias Kaminsky * SPDX-FileCopyrightText: 2019 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ package com.nextcloud.client -import android.app.Activity +import androidx.test.core.app.launchActivity import androidx.test.espresso.Espresso import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.IdlingRegistry import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.DrawerActions import androidx.test.espresso.contrib.NavigationViewActions import androidx.test.espresso.contrib.RecyclerViewActions -import androidx.test.espresso.intent.rule.IntentsTestRule import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.platform.app.InstrumentationRegistry import com.nextcloud.test.RetryTestRule import com.owncloud.android.AbstractOnServerIT import com.owncloud.android.R @@ -35,30 +36,38 @@ import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.operations.CreateFolderOperation import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.adapter.OCFileListItemViewHolder +import com.owncloud.android.utils.EspressoIdlingResource +import org.junit.After import org.junit.Assert +import org.junit.Before import org.junit.Rule import org.junit.Test class FileDisplayActivityIT : AbstractOnServerIT() { - @get:Rule - val activityRule = IntentsTestRule( - FileDisplayActivity::class.java, - true, - false - ) + + @Before + fun registerIdlingResource() { + IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource) + } + + @After + fun unregisterIdlingResource() { + IdlingRegistry.getInstance().unregister(EspressoIdlingResource.countingIdlingResource) + } @get:Rule - val retryRule = RetryTestRule() // showShares is flaky + val retryRule = RetryTestRule() - // @ScreenshotTest // todo run without real server + @Suppress("DEPRECATION") @Test fun showShares() { + EspressoIdlingResource.increment() + Assert.assertTrue(ExistenceCheckRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess) Assert.assertTrue(CreateFolderRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess) Assert.assertTrue(CreateFolderRemoteOperation("/shareToGroup/", true).execute(client).isSuccess) Assert.assertTrue(CreateFolderRemoteOperation("/shareViaLink/", true).execute(client).isSuccess) Assert.assertTrue(CreateFolderRemoteOperation("/noShare/", true).execute(client).isSuccess) - // assertTrue(new CreateFolderRemoteOperation("/shareToCircle/", true).execute(client).isSuccess()); // share folder to user "admin" Assert.assertTrue( @@ -96,68 +105,61 @@ class FileDisplayActivityIT : AbstractOnServerIT() { ).execute(client).isSuccess ) - // share folder to circle - // get share -// RemoteOperationResult searchResult = new GetShareesRemoteOperation("publicCircle", 1, 50).execute(client); -// assertTrue(searchResult.getLogMessage(), searchResult.isSuccess()); -// -// JSONObject resultJson = (JSONObject) searchResult.getData().get(0); -// String circleId = resultJson.getJSONObject("value").getString("shareWith"); -// -// assertTrue(new CreateShareRemoteOperation("/shareToCircle/", -// ShareType.CIRCLE, -// circleId, -// false, -// "", -// OCShare.DEFAULT_PERMISSION) -// .execute(client).isSuccess()); - - val sut: Activity = activityRule.launchActivity(null) - InstrumentationRegistry.getInstrumentation().waitForIdleSync() - - // open drawer - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) - - // click "shared" - onView(withId(R.id.nav_view)) - .perform(NavigationViewActions.navigateTo(R.id.nav_shared)) - shortSleep() - shortSleep() - // screenshot(sut) // todo run without real server + EspressoIdlingResource.decrement() + + launchActivity().use { scenario -> + scenario.onActivity { _ -> + onIdleSync { + // open drawer + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) + + // click "shared" + onView(withId(R.id.nav_view)) + .perform(NavigationViewActions.navigateTo(R.id.nav_shared)) + } + } + } } + @Suppress("DEPRECATION") @Test fun allFiles() { - val sut = activityRule.launchActivity(null) + EspressoIdlingResource.increment() - // given test folder Assert.assertTrue( CreateFolderOperation("/test/", user, targetContext, storageManager) .execute(client) .isSuccess ) - // navigate into it - val test = storageManager.getFileByPath("/test/") - sut.file = test - sut.startSyncFolderOperation(test, false) - Assert.assertEquals(storageManager.getFileByPath("/test/"), sut.currentDir) + launchActivity().use { scenario -> + scenario.onActivity { sut -> + onIdleSync { + val test = storageManager.getFileByPath("/test/") + sut.file = test + Assert.assertEquals(storageManager.getFileByPath("/test/"), sut.currentDir) + + sut.startSyncFolderOperation(test, false) + EspressoIdlingResource.decrement() - // open drawer - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) + // open drawer + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) - // click "all files" - onView(withId(R.id.nav_view)) - .perform(NavigationViewActions.navigateTo(R.id.nav_all_files)) + // click "all files" + onView(withId(R.id.nav_view)) + .perform(NavigationViewActions.navigateTo(R.id.nav_all_files)) - // then should be in root again - shortSleep() - Assert.assertEquals(storageManager.getFileByPath("/"), sut.currentDir) + Assert.assertEquals(storageManager.getFileByPath("/"), sut.currentDir) + } + } + } } + @Suppress("DEPRECATION") @Test fun checkToolbarTitleOnNavigation() { - // Create folder structure + EspressoIdlingResource.increment() + val topFolder = "folder1" val childFolder = "folder2" @@ -167,30 +169,31 @@ class FileDisplayActivityIT : AbstractOnServerIT() { CreateFolderOperation("/$topFolder/$childFolder/", user, targetContext, storageManager) .execute(client) - activityRule.launchActivity(null) - - shortSleep() + EspressoIdlingResource.decrement() - // go into "foo" - onView(withText(topFolder)).perform(click()) - shortSleep() + launchActivity().use { scenario -> + scenario.onActivity { _ -> + onIdleSync { + // go into "foo" + onView(withText(topFolder)).perform(click()) - // check title is right - checkToolbarTitle(topFolder) + // check title is right + checkToolbarTitle(topFolder) - // go into "bar" - onView(withText(childFolder)).perform(click()) - shortSleep() + // go into "bar" + onView(withText(childFolder)).perform(click()) - // check title is right - checkToolbarTitle(childFolder) + // check title is right + checkToolbarTitle(childFolder) - // browse back up, we should be back in "foo" - Espresso.pressBack() - shortSleep() + // browse back up, we should be back in "foo" + Espresso.pressBack() - // check title is right - checkToolbarTitle(topFolder) + // check title is right + checkToolbarTitle(topFolder) + } + } + } } private fun checkToolbarTitle(childFolder: String) { @@ -203,9 +206,11 @@ class FileDisplayActivityIT : AbstractOnServerIT() { ) } + @Suppress("DEPRECATION") @Test fun browseFavoriteAndBack() { - // Create folder structure + EspressoIdlingResource.increment() + val topFolder = "folder1" CreateFolderOperation("/$topFolder/", user, targetContext, storageManager) @@ -213,51 +218,70 @@ class FileDisplayActivityIT : AbstractOnServerIT() { ToggleFavoriteRemoteOperation(true, "/$topFolder/") .execute(client) - val sut = activityRule.launchActivity(null) - - // navigate to favorites - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) - onView(withId(R.id.nav_view)) - .perform(NavigationViewActions.navigateTo(R.id.nav_favorites)) - shortSleep() - - // check sort button is not shown, favorites are not sortable - onView(withId(R.id.sort_button)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))) - - // browse into folder - onView(withId(R.id.list_root)) - .perform(closeSoftKeyboard()) - .perform( - RecyclerViewActions.actionOnItemAtPosition( - 0, - click() - ) - ) - shortSleep() - checkToolbarTitle(topFolder) - // sort button should now be visible - onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed())) - - // browse back, should be back to All Files - Espresso.pressBack() - checkToolbarTitle(sut.getString(R.string.app_name)) - onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed())) + EspressoIdlingResource.decrement() + + launchActivity().use { scenario -> + scenario.onActivity { sut -> + onIdleSync { + // navigate to favorites + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) + onView(withId(R.id.nav_view)) + .perform(NavigationViewActions.navigateTo(R.id.nav_favorites)) + + // check sort button is not shown, favorites are not sortable + onView( + withId(R.id.sort_button) + ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))) + + // browse into folder + onView(withId(R.id.list_root)) + .perform(closeSoftKeyboard()) + .perform( + RecyclerViewActions.actionOnItemAtPosition( + 0, + click() + ) + ) + checkToolbarTitle(topFolder) + // sort button should now be visible + onView(withId(R.id.sort_button)).check(matches(isDisplayed())) + + // browse back, should be back to All Files + Espresso.pressBack() + checkToolbarTitle(sut.getString(R.string.app_name)) + onView(withId(R.id.sort_button)).check(matches(isDisplayed())) + } + } + } } + @Suppress("DEPRECATION") @Test fun switchToGridView() { - activityRule.launchActivity(null) - Assert.assertTrue( - CreateFolderOperation("/test/", user, targetContext, storageManager) - .execute(client) - .isSuccess - ) - onView(withId(R.id.switch_grid_view_button)).perform(click()) + launchActivity().use { scenario -> + scenario.onActivity { _ -> + onIdleSync { + EspressoIdlingResource.increment() + Assert.assertTrue( + CreateFolderOperation("/test/", user, targetContext, storageManager) + .execute(client) + .isSuccess + ) + EspressoIdlingResource.decrement() + onView(withId(R.id.switch_grid_view_button)).perform(click()) + } + } + } } @Test fun openAccountSwitcher() { - activityRule.launchActivity(null) - onView(withId(R.id.switch_account_button)).perform(click()) + launchActivity().use { scenario -> + scenario.onActivity { _ -> + onIdleSync { + onView(withId(R.id.switch_account_button)).perform(click()) + } + } + } } }