FileDisplayActivityIT.kt 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /*
  2. * Nextcloud - Android Client
  3. *
  4. * SPDX-FileCopyrightText: 2019 Tobias Kaminsky <tobias@kaminsky.me>
  5. * SPDX-FileCopyrightText: 2019 Nextcloud GmbH
  6. * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
  7. */
  8. package com.nextcloud.client
  9. import android.app.Activity
  10. import androidx.test.espresso.Espresso
  11. import androidx.test.espresso.Espresso.onView
  12. import androidx.test.espresso.action.ViewActions.click
  13. import androidx.test.espresso.action.ViewActions.closeSoftKeyboard
  14. import androidx.test.espresso.assertion.ViewAssertions.matches
  15. import androidx.test.espresso.contrib.DrawerActions
  16. import androidx.test.espresso.contrib.NavigationViewActions
  17. import androidx.test.espresso.contrib.RecyclerViewActions
  18. import androidx.test.espresso.intent.rule.IntentsTestRule
  19. import androidx.test.espresso.matcher.ViewMatchers
  20. import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
  21. import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
  22. import androidx.test.espresso.matcher.ViewMatchers.withId
  23. import androidx.test.espresso.matcher.ViewMatchers.withText
  24. import androidx.test.platform.app.InstrumentationRegistry
  25. import com.nextcloud.test.RetryTestRule
  26. import com.owncloud.android.AbstractOnServerIT
  27. import com.owncloud.android.R
  28. import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation
  29. import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation
  30. import com.owncloud.android.lib.resources.files.ToggleFavoriteRemoteOperation
  31. import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation
  32. import com.owncloud.android.lib.resources.shares.OCShare
  33. import com.owncloud.android.lib.resources.shares.ShareType
  34. import com.owncloud.android.operations.CreateFolderOperation
  35. import com.owncloud.android.ui.activity.FileDisplayActivity
  36. import com.owncloud.android.ui.adapter.OCFileListItemViewHolder
  37. import org.junit.Assert
  38. import org.junit.Rule
  39. import org.junit.Test
  40. class FileDisplayActivityIT : AbstractOnServerIT() {
  41. @get:Rule
  42. val activityRule = IntentsTestRule(
  43. FileDisplayActivity::class.java,
  44. true,
  45. false
  46. )
  47. @get:Rule
  48. val retryRule = RetryTestRule() // showShares is flaky
  49. // @ScreenshotTest // todo run without real server
  50. @Test
  51. fun showShares() {
  52. Assert.assertTrue(ExistenceCheckRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess)
  53. Assert.assertTrue(CreateFolderRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess)
  54. Assert.assertTrue(CreateFolderRemoteOperation("/shareToGroup/", true).execute(client).isSuccess)
  55. Assert.assertTrue(CreateFolderRemoteOperation("/shareViaLink/", true).execute(client).isSuccess)
  56. Assert.assertTrue(CreateFolderRemoteOperation("/noShare/", true).execute(client).isSuccess)
  57. // assertTrue(new CreateFolderRemoteOperation("/shareToCircle/", true).execute(client).isSuccess());
  58. // share folder to user "admin"
  59. Assert.assertTrue(
  60. CreateShareRemoteOperation(
  61. "/shareToAdmin/",
  62. ShareType.USER,
  63. "admin",
  64. false,
  65. "",
  66. OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER
  67. ).execute(client).isSuccess
  68. )
  69. // share folder via public link
  70. Assert.assertTrue(
  71. CreateShareRemoteOperation(
  72. "/shareViaLink/",
  73. ShareType.PUBLIC_LINK,
  74. "",
  75. true,
  76. "",
  77. OCShare.READ_PERMISSION_FLAG
  78. ).execute(client).isSuccess
  79. )
  80. // share folder to group
  81. Assert.assertTrue(
  82. CreateShareRemoteOperation(
  83. "/shareToGroup/",
  84. ShareType.GROUP,
  85. "users",
  86. false,
  87. "",
  88. OCShare.NO_PERMISSION
  89. ).execute(client).isSuccess
  90. )
  91. // share folder to circle
  92. // get share
  93. // RemoteOperationResult searchResult = new GetShareesRemoteOperation("publicCircle", 1, 50).execute(client);
  94. // assertTrue(searchResult.getLogMessage(), searchResult.isSuccess());
  95. //
  96. // JSONObject resultJson = (JSONObject) searchResult.getData().get(0);
  97. // String circleId = resultJson.getJSONObject("value").getString("shareWith");
  98. //
  99. // assertTrue(new CreateShareRemoteOperation("/shareToCircle/",
  100. // ShareType.CIRCLE,
  101. // circleId,
  102. // false,
  103. // "",
  104. // OCShare.DEFAULT_PERMISSION)
  105. // .execute(client).isSuccess());
  106. val sut: Activity = activityRule.launchActivity(null)
  107. InstrumentationRegistry.getInstrumentation().waitForIdleSync()
  108. // open drawer
  109. onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
  110. // click "shared"
  111. onView(withId(R.id.nav_view))
  112. .perform(NavigationViewActions.navigateTo(R.id.nav_shared))
  113. shortSleep()
  114. shortSleep()
  115. // screenshot(sut) // todo run without real server
  116. }
  117. @Test
  118. fun allFiles() {
  119. val sut = activityRule.launchActivity(null)
  120. // given test folder
  121. Assert.assertTrue(
  122. CreateFolderOperation("/test/", user, targetContext, storageManager)
  123. .execute(client)
  124. .isSuccess
  125. )
  126. // navigate into it
  127. val test = storageManager.getFileByPath("/test/")
  128. sut.file = test
  129. sut.startSyncFolderOperation(test, false)
  130. Assert.assertEquals(storageManager.getFileByPath("/test/"), sut.currentDir)
  131. // open drawer
  132. onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
  133. // click "all files"
  134. onView(withId(R.id.nav_view))
  135. .perform(NavigationViewActions.navigateTo(R.id.nav_all_files))
  136. // then should be in root again
  137. shortSleep()
  138. Assert.assertEquals(storageManager.getFileByPath("/"), sut.currentDir)
  139. }
  140. @Test
  141. fun checkToolbarTitleOnNavigation() {
  142. // Create folder structure
  143. val topFolder = "folder1"
  144. val childFolder = "folder2"
  145. CreateFolderOperation("/$topFolder/", user, targetContext, storageManager)
  146. .execute(client)
  147. CreateFolderOperation("/$topFolder/$childFolder/", user, targetContext, storageManager)
  148. .execute(client)
  149. activityRule.launchActivity(null)
  150. shortSleep()
  151. // go into "foo"
  152. onView(withText(topFolder)).perform(click())
  153. shortSleep()
  154. // check title is right
  155. checkToolbarTitle(topFolder)
  156. // go into "bar"
  157. onView(withText(childFolder)).perform(click())
  158. shortSleep()
  159. // check title is right
  160. checkToolbarTitle(childFolder)
  161. // browse back up, we should be back in "foo"
  162. Espresso.pressBack()
  163. shortSleep()
  164. // check title is right
  165. checkToolbarTitle(topFolder)
  166. }
  167. private fun checkToolbarTitle(childFolder: String) {
  168. onView(withId(R.id.appbar)).check(
  169. matches(
  170. hasDescendant(
  171. withText(childFolder)
  172. )
  173. )
  174. )
  175. }
  176. @Test
  177. fun browseFavoriteAndBack() {
  178. // Create folder structure
  179. val topFolder = "folder1"
  180. CreateFolderOperation("/$topFolder/", user, targetContext, storageManager)
  181. .execute(client)
  182. ToggleFavoriteRemoteOperation(true, "/$topFolder/")
  183. .execute(client)
  184. val sut = activityRule.launchActivity(null)
  185. // navigate to favorites
  186. onView(withId(R.id.drawer_layout)).perform(DrawerActions.open())
  187. onView(withId(R.id.nav_view))
  188. .perform(NavigationViewActions.navigateTo(R.id.nav_favorites))
  189. shortSleep()
  190. // check sort button is not shown, favorites are not sortable
  191. onView(withId(R.id.sort_button)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
  192. // browse into folder
  193. onView(withId(R.id.list_root))
  194. .perform(closeSoftKeyboard())
  195. .perform(
  196. RecyclerViewActions.actionOnItemAtPosition<OCFileListItemViewHolder>(
  197. 0,
  198. click()
  199. )
  200. )
  201. shortSleep()
  202. checkToolbarTitle(topFolder)
  203. // sort button should now be visible
  204. onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed()))
  205. // browse back, should be back to All Files
  206. Espresso.pressBack()
  207. checkToolbarTitle(sut.getString(R.string.app_name))
  208. onView(withId(R.id.sort_button)).check(matches(ViewMatchers.isDisplayed()))
  209. }
  210. @Test
  211. fun switchToGridView() {
  212. activityRule.launchActivity(null)
  213. Assert.assertTrue(
  214. CreateFolderOperation("/test/", user, targetContext, storageManager)
  215. .execute(client)
  216. .isSuccess
  217. )
  218. onView(withId(R.id.switch_grid_view_button)).perform(click())
  219. }
  220. @Test
  221. fun openAccountSwitcher() {
  222. activityRule.launchActivity(null)
  223. onView(withId(R.id.switch_account_button)).perform(click())
  224. }
  225. }