FileDetailSharingFragmentIT.kt 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. /*
  2. *
  3. * Nextcloud Android client application
  4. *
  5. * @author Tobias Kaminsky
  6. * Copyright (C) 2020 Tobias Kaminsky
  7. * Copyright (C) 2020 Nextcloud GmbH
  8. *
  9. * This program is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU Affero General Public License as published by
  11. * the Free Software Foundation, either version 3 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU Affero General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Affero General Public License
  20. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  21. */
  22. package com.owncloud.android.ui.fragment
  23. import android.widget.ImageView
  24. import androidx.appcompat.widget.PopupMenu
  25. import androidx.test.espresso.intent.rule.IntentsTestRule
  26. import com.nextcloud.client.TestActivity
  27. import com.owncloud.android.AbstractIT
  28. import com.owncloud.android.R
  29. import com.owncloud.android.datamodel.OCFile
  30. import com.owncloud.android.lib.resources.shares.OCShare
  31. import com.owncloud.android.lib.resources.shares.OCShare.CREATE_PERMISSION_FLAG
  32. import com.owncloud.android.lib.resources.shares.OCShare.DELETE_PERMISSION_FLAG
  33. import com.owncloud.android.lib.resources.shares.OCShare.MAXIMUM_PERMISSIONS_FOR_FILE
  34. import com.owncloud.android.lib.resources.shares.OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER
  35. import com.owncloud.android.lib.resources.shares.OCShare.NO_PERMISSION
  36. import com.owncloud.android.lib.resources.shares.OCShare.READ_PERMISSION_FLAG
  37. import com.owncloud.android.lib.resources.shares.OCShare.SHARE_PERMISSION_FLAG
  38. import com.owncloud.android.lib.resources.shares.ShareType
  39. import com.owncloud.android.utils.ScreenshotTest
  40. import org.junit.After
  41. import org.junit.Assert.assertFalse
  42. import org.junit.Assert.assertTrue
  43. import org.junit.Before
  44. import org.junit.Rule
  45. import org.junit.Test
  46. class FileDetailSharingFragmentIT : AbstractIT() {
  47. @get:Rule
  48. val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false)
  49. lateinit var file: OCFile
  50. lateinit var folder: OCFile
  51. lateinit var activity: TestActivity
  52. @Before
  53. fun before() {
  54. activity = testActivityRule.launchActivity(null)
  55. file = OCFile("/test.md").apply {
  56. parentId = activity.storageManager.getFileByEncryptedRemotePath("/").fileId
  57. permissions = OCFile.PERMISSION_CAN_RESHARE
  58. }
  59. folder = OCFile("/test").apply {
  60. setFolder()
  61. parentId = activity.storageManager.getFileByEncryptedRemotePath("/").fileId
  62. permissions = OCFile.PERMISSION_CAN_RESHARE
  63. }
  64. }
  65. @Test
  66. @ScreenshotTest
  67. fun listSharesFileNone() {
  68. show(file)
  69. }
  70. @Test
  71. @ScreenshotTest
  72. fun listSharesFileResharingNotAllowed() {
  73. file.permissions = ""
  74. show(file)
  75. }
  76. @Test
  77. @ScreenshotTest
  78. @Suppress("MagicNumber")
  79. /**
  80. * Use same values as {@link OCFileListFragmentStaticServerIT showSharedFiles }
  81. */
  82. fun listSharesFileAllShareTypes() {
  83. OCShare(file.decryptedRemotePath).apply {
  84. remoteId = 1
  85. shareType = ShareType.USER
  86. sharedWithDisplayName = "Admin"
  87. permissions = MAXIMUM_PERMISSIONS_FOR_FILE
  88. userId = getUserId(user)
  89. activity.storageManager.saveShare(this)
  90. }
  91. OCShare(file.decryptedRemotePath).apply {
  92. remoteId = 2
  93. shareType = ShareType.GROUP
  94. sharedWithDisplayName = "Group"
  95. permissions = MAXIMUM_PERMISSIONS_FOR_FILE
  96. userId = getUserId(user)
  97. activity.storageManager.saveShare(this)
  98. }
  99. OCShare(file.decryptedRemotePath).apply {
  100. remoteId = 3
  101. shareType = ShareType.EMAIL
  102. sharedWithDisplayName = "admin@nextcloud.localhost"
  103. userId = getUserId(user)
  104. activity.storageManager.saveShare(this)
  105. }
  106. OCShare(file.decryptedRemotePath).apply {
  107. remoteId = 4
  108. shareType = ShareType.PUBLIC_LINK
  109. label = "Customer"
  110. activity.storageManager.saveShare(this)
  111. }
  112. OCShare(file.decryptedRemotePath).apply {
  113. remoteId = 5
  114. shareType = ShareType.PUBLIC_LINK
  115. label = "Colleagues"
  116. activity.storageManager.saveShare(this)
  117. }
  118. OCShare(file.decryptedRemotePath).apply {
  119. remoteId = 6
  120. shareType = ShareType.FEDERATED
  121. sharedWithDisplayName = "admin@nextcloud.localhost"
  122. permissions = OCShare.FEDERATED_PERMISSIONS_FOR_FILE
  123. userId = getUserId(user)
  124. activity.storageManager.saveShare(this)
  125. }
  126. OCShare(file.decryptedRemotePath).apply {
  127. remoteId = 7
  128. shareType = ShareType.CIRCLE
  129. sharedWithDisplayName = "Personal circle"
  130. permissions = SHARE_PERMISSION_FLAG
  131. userId = getUserId(user)
  132. activity.storageManager.saveShare(this)
  133. }
  134. OCShare(file.decryptedRemotePath).apply {
  135. remoteId = 8
  136. shareType = ShareType.CIRCLE
  137. sharedWithDisplayName = "Public circle"
  138. permissions = SHARE_PERMISSION_FLAG
  139. userId = getUserId(user)
  140. activity.storageManager.saveShare(this)
  141. }
  142. OCShare(file.decryptedRemotePath).apply {
  143. remoteId = 9
  144. shareType = ShareType.CIRCLE
  145. sharedWithDisplayName = "Closed circle"
  146. permissions = SHARE_PERMISSION_FLAG
  147. userId = getUserId(user)
  148. activity.storageManager.saveShare(this)
  149. }
  150. OCShare(file.decryptedRemotePath).apply {
  151. remoteId = 10
  152. shareType = ShareType.CIRCLE
  153. sharedWithDisplayName = "Secret circle"
  154. permissions = SHARE_PERMISSION_FLAG
  155. userId = getUserId(user)
  156. activity.storageManager.saveShare(this)
  157. }
  158. OCShare(file.decryptedRemotePath).apply {
  159. remoteId = 11
  160. shareType = ShareType.ROOM
  161. sharedWithDisplayName = "Admin"
  162. permissions = SHARE_PERMISSION_FLAG
  163. userId = getUserId(user)
  164. activity.storageManager.saveShare(this)
  165. }
  166. OCShare(file.decryptedRemotePath).apply {
  167. remoteId = 12
  168. shareType = ShareType.ROOM
  169. sharedWithDisplayName = "Meeting"
  170. permissions = SHARE_PERMISSION_FLAG
  171. userId = getUserId(user)
  172. activity.storageManager.saveShare(this)
  173. }
  174. show(file)
  175. }
  176. private fun show(file: OCFile) {
  177. val fragment = FileDetailSharingFragment.newInstance(file, user)
  178. activity.addFragment(fragment)
  179. waitForIdleSync()
  180. screenshot(activity)
  181. }
  182. @Test
  183. @Suppress("MagicNumber")
  184. // public link and email are handled the same way
  185. fun publicLinkOptionMenuFolder() {
  186. val sut = FileDetailSharingFragment.newInstance(file, user)
  187. activity.addFragment(sut)
  188. shortSleep()
  189. sut.refreshCapabilitiesFromDB()
  190. val overflowMenuShareLink = ImageView(targetContext)
  191. val popup = PopupMenu(targetContext, overflowMenuShareLink)
  192. popup.inflate(R.menu.fragment_file_detail_sharing_public_link)
  193. val publicShare = OCShare().apply {
  194. isFolder = true
  195. shareType = ShareType.PUBLIC_LINK
  196. permissions = 17
  197. }
  198. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  199. // check if items are visible
  200. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isVisible)
  201. assertTrue(popup.menu.findItem(R.id.action_password).isVisible)
  202. assertTrue(popup.menu.findItem(R.id.action_share_expiration_date).isVisible)
  203. assertTrue(popup.menu.findItem(R.id.action_share_send_link).isVisible)
  204. assertTrue(popup.menu.findItem(R.id.action_share_send_note).isVisible)
  205. assertTrue(popup.menu.findItem(R.id.action_edit_label).isVisible)
  206. assertTrue(popup.menu.findItem(R.id.action_unshare).isVisible)
  207. assertTrue(popup.menu.findItem(R.id.action_add_another_public_share_link).isVisible)
  208. // read-only
  209. assertTrue(popup.menu.findItem(R.id.link_share_read_only).isChecked)
  210. assertFalse(popup.menu.findItem(R.id.link_share_allow_upload_and_editing).isChecked)
  211. assertFalse(popup.menu.findItem(R.id.link_share_file_drop).isChecked)
  212. // upload and editing
  213. publicShare.permissions = MAXIMUM_PERMISSIONS_FOR_FOLDER
  214. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  215. assertFalse(popup.menu.findItem(R.id.link_share_read_only).isChecked)
  216. assertTrue(popup.menu.findItem(R.id.link_share_allow_upload_and_editing).isChecked)
  217. assertFalse(popup.menu.findItem(R.id.link_share_file_drop).isChecked)
  218. // file drop
  219. publicShare.permissions = 4
  220. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  221. assertFalse(popup.menu.findItem(R.id.link_share_read_only).isChecked)
  222. assertFalse(popup.menu.findItem(R.id.link_share_allow_upload_and_editing).isChecked)
  223. assertTrue(popup.menu.findItem(R.id.link_share_file_drop).isChecked)
  224. // password protection
  225. publicShare.shareWith = "someValue"
  226. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  227. assertTrue(
  228. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_password_title)
  229. )
  230. publicShare.shareWith = ""
  231. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  232. assertTrue(
  233. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_no_password_title)
  234. )
  235. // hide download
  236. publicShare.isHideFileDownload = true
  237. publicShare.permissions = MAXIMUM_PERMISSIONS_FOR_FOLDER
  238. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  239. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  240. publicShare.isHideFileDownload = false
  241. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  242. assertFalse(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  243. publicShare.expirationDate = 1582019340000
  244. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  245. assertTrue(
  246. popup.menu.findItem(R.id.action_share_expiration_date).title
  247. .startsWith(targetContext.getString(R.string.share_expiration_date_label).split(" ")[0])
  248. )
  249. publicShare.expirationDate = 0
  250. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  251. assertTrue(
  252. popup.menu.findItem(R.id.action_share_expiration_date).title ==
  253. targetContext.getString(R.string.share_no_expiration_date_label)
  254. )
  255. // file
  256. publicShare.isFolder = false
  257. publicShare.permissions = READ_PERMISSION_FLAG
  258. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  259. // check if items are visible
  260. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isVisible)
  261. assertTrue(popup.menu.findItem(R.id.action_password).isVisible)
  262. assertTrue(popup.menu.findItem(R.id.action_share_expiration_date).isVisible)
  263. assertTrue(popup.menu.findItem(R.id.action_share_send_link).isVisible)
  264. assertTrue(popup.menu.findItem(R.id.action_share_send_note).isVisible)
  265. assertTrue(popup.menu.findItem(R.id.action_edit_label).isVisible)
  266. assertTrue(popup.menu.findItem(R.id.action_unshare).isVisible)
  267. assertTrue(popup.menu.findItem(R.id.action_add_another_public_share_link).isVisible)
  268. assertFalse(popup.menu.findItem(R.id.link_share_read_only).isVisible)
  269. assertFalse(popup.menu.findItem(R.id.link_share_allow_upload_and_editing).isVisible)
  270. assertFalse(popup.menu.findItem(R.id.link_share_file_drop).isVisible)
  271. assertTrue(popup.menu.findItem(R.id.allow_editing).isVisible)
  272. // allow editing
  273. publicShare.permissions = 17 // from server
  274. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  275. assertFalse(popup.menu.findItem(R.id.allow_editing).isChecked)
  276. publicShare.permissions = 19 // from server
  277. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  278. assertTrue(popup.menu.findItem(R.id.allow_editing).isChecked)
  279. // hide download
  280. publicShare.isHideFileDownload = true
  281. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  282. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  283. publicShare.isHideFileDownload = false
  284. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  285. assertFalse(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  286. // password protection
  287. publicShare.isPasswordProtected = true
  288. publicShare.shareWith = "someValue"
  289. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  290. assertTrue(
  291. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_password_title)
  292. )
  293. publicShare.isPasswordProtected = false
  294. publicShare.shareWith = ""
  295. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  296. assertTrue(
  297. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_no_password_title)
  298. )
  299. // expires
  300. publicShare.expirationDate = 1582019340
  301. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  302. assertTrue(
  303. popup.menu.findItem(R.id.action_share_expiration_date).title
  304. .startsWith(targetContext.getString(R.string.share_expiration_date_label).split(" ")[0])
  305. )
  306. publicShare.expirationDate = 0
  307. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  308. assertTrue(
  309. popup.menu.findItem(R.id.action_share_expiration_date).title ==
  310. targetContext.getString(R.string.share_no_expiration_date_label)
  311. )
  312. }
  313. @Test
  314. @Suppress("MagicNumber")
  315. // public link and email are handled the same way
  316. fun publicLinkOptionMenuFile() {
  317. val sut = FileDetailSharingFragment.newInstance(file, user)
  318. activity.addFragment(sut)
  319. shortSleep()
  320. sut.refreshCapabilitiesFromDB()
  321. val overflowMenuShareLink = ImageView(targetContext)
  322. val popup = PopupMenu(targetContext, overflowMenuShareLink)
  323. popup.inflate(R.menu.fragment_file_detail_sharing_public_link)
  324. val publicShare = OCShare().apply {
  325. isFolder = false
  326. shareType = ShareType.PUBLIC_LINK
  327. permissions = 17
  328. }
  329. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  330. // check if items are visible
  331. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isVisible)
  332. assertTrue(popup.menu.findItem(R.id.action_password).isVisible)
  333. assertTrue(popup.menu.findItem(R.id.action_share_expiration_date).isVisible)
  334. assertTrue(popup.menu.findItem(R.id.action_share_send_link).isVisible)
  335. assertTrue(popup.menu.findItem(R.id.action_share_send_note).isVisible)
  336. assertTrue(popup.menu.findItem(R.id.action_edit_label).isVisible)
  337. assertTrue(popup.menu.findItem(R.id.action_unshare).isVisible)
  338. assertTrue(popup.menu.findItem(R.id.action_add_another_public_share_link).isVisible)
  339. assertFalse(popup.menu.findItem(R.id.link_share_read_only).isVisible)
  340. assertFalse(popup.menu.findItem(R.id.link_share_allow_upload_and_editing).isVisible)
  341. assertFalse(popup.menu.findItem(R.id.link_share_file_drop).isVisible)
  342. assertTrue(popup.menu.findItem(R.id.allow_editing).isVisible)
  343. // password protection
  344. publicShare.shareWith = "someValue"
  345. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  346. assertTrue(
  347. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_password_title)
  348. )
  349. publicShare.shareWith = ""
  350. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  351. assertTrue(
  352. popup.menu.findItem(R.id.action_password).title == targetContext.getString(R.string.share_no_password_title)
  353. )
  354. // hide download
  355. publicShare.isHideFileDownload = true
  356. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  357. assertTrue(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  358. publicShare.isHideFileDownload = false
  359. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  360. assertFalse(popup.menu.findItem(R.id.action_hide_file_download).isChecked)
  361. // expiration date
  362. publicShare.expirationDate = 1582019340000
  363. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  364. assertTrue(
  365. popup.menu.findItem(R.id.action_share_expiration_date).title
  366. .startsWith(targetContext.getString(R.string.share_expiration_date_label).split(" ")[0])
  367. )
  368. publicShare.expirationDate = 0
  369. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  370. assertTrue(
  371. popup.menu.findItem(R.id.action_share_expiration_date).title ==
  372. targetContext.getString(R.string.share_no_expiration_date_label)
  373. )
  374. publicShare.isFolder = false
  375. publicShare.permissions = READ_PERMISSION_FLAG
  376. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  377. // allow editing
  378. publicShare.permissions = 17 // from server
  379. assertFalse(popup.menu.findItem(R.id.allow_editing).isChecked)
  380. publicShare.permissions = 19 // from server
  381. sut.prepareLinkOptionsMenu(popup.menu, publicShare)
  382. assertTrue(popup.menu.findItem(R.id.allow_editing).isChecked)
  383. }
  384. @Test
  385. @Suppress("MagicNumber")
  386. // also applies for
  387. // group
  388. // conversation
  389. // circle
  390. // federated share
  391. fun userOptionMenuFile() {
  392. val sut = FileDetailSharingFragment.newInstance(file, user)
  393. activity.addFragment(sut)
  394. shortSleep()
  395. sut.refreshCapabilitiesFromDB()
  396. val overflowMenuShareLink = ImageView(targetContext)
  397. val popup = PopupMenu(targetContext, overflowMenuShareLink)
  398. popup.inflate(R.menu.item_user_sharing_settings)
  399. val userShare = OCShare().apply {
  400. isFolder = false
  401. shareType = ShareType.USER
  402. permissions = 17
  403. }
  404. sut.prepareUserOptionsMenu(popup.menu, userShare)
  405. assertFalse(popup.menu.findItem(R.id.allow_creating).isVisible)
  406. assertFalse(popup.menu.findItem(R.id.allow_deleting).isVisible)
  407. // allow editing
  408. userShare.permissions = 17 // from server
  409. assertFalse(popup.menu.findItem(R.id.allow_editing).isChecked)
  410. userShare.permissions = 19 // from server
  411. sut.prepareUserOptionsMenu(popup.menu, userShare)
  412. assertTrue(popup.menu.findItem(R.id.allow_editing).isChecked)
  413. // allow reshare
  414. userShare.permissions = 1 // from server
  415. sut.prepareUserOptionsMenu(popup.menu, userShare)
  416. assertFalse(popup.menu.findItem(R.id.allow_resharing).isChecked)
  417. userShare.permissions = 17 // from server
  418. sut.prepareUserOptionsMenu(popup.menu, userShare)
  419. assertTrue(popup.menu.findItem(R.id.allow_resharing).isChecked)
  420. // set expiration date
  421. userShare.expirationDate = 1582019340000
  422. sut.prepareUserOptionsMenu(popup.menu, userShare)
  423. assertTrue(
  424. popup.menu.findItem(R.id.action_expiration_date).title
  425. .startsWith(targetContext.getString(R.string.share_expiration_date_label).split(" ")[0])
  426. )
  427. userShare.expirationDate = 0
  428. sut.prepareUserOptionsMenu(popup.menu, userShare)
  429. assertTrue(
  430. popup.menu.findItem(R.id.action_expiration_date).title ==
  431. targetContext.getString(R.string.share_no_expiration_date_label)
  432. )
  433. // note
  434. assertTrue(popup.menu.findItem(R.id.action_share_send_note).isVisible)
  435. }
  436. @Test
  437. @Suppress("MagicNumber")
  438. // also applies for
  439. // group
  440. // conversation
  441. // circle
  442. // federated share
  443. fun userOptionMenuFolder() {
  444. val sut = FileDetailSharingFragment.newInstance(file, user)
  445. activity.addFragment(sut)
  446. shortSleep()
  447. sut.refreshCapabilitiesFromDB()
  448. val overflowMenuShareLink = ImageView(targetContext)
  449. val popup = PopupMenu(targetContext, overflowMenuShareLink)
  450. popup.inflate(R.menu.item_user_sharing_settings)
  451. val userShare = OCShare().apply {
  452. isFolder = true
  453. shareType = ShareType.USER
  454. permissions = 17
  455. }
  456. sut.prepareUserOptionsMenu(popup.menu, userShare)
  457. assertTrue(popup.menu.findItem(R.id.allow_creating).isVisible)
  458. assertTrue(popup.menu.findItem(R.id.allow_deleting).isVisible)
  459. // allow editing
  460. userShare.permissions = 17 // from server
  461. assertFalse(popup.menu.findItem(R.id.allow_editing).isChecked)
  462. userShare.permissions = 19 // from server
  463. sut.prepareUserOptionsMenu(popup.menu, userShare)
  464. assertTrue(popup.menu.findItem(R.id.allow_editing).isChecked)
  465. // allow reshare
  466. userShare.permissions = 1 // from server
  467. sut.prepareUserOptionsMenu(popup.menu, userShare)
  468. assertFalse(popup.menu.findItem(R.id.allow_resharing).isChecked)
  469. userShare.permissions = 17 // from server
  470. sut.prepareUserOptionsMenu(popup.menu, userShare)
  471. assertTrue(popup.menu.findItem(R.id.allow_resharing).isChecked)
  472. // set expiration date
  473. userShare.expirationDate = 1582019340000
  474. sut.prepareUserOptionsMenu(popup.menu, userShare)
  475. assertTrue(
  476. popup.menu.findItem(R.id.action_expiration_date).title
  477. .startsWith(targetContext.getString(R.string.share_expiration_date_label).split(" ")[0])
  478. )
  479. userShare.expirationDate = 0
  480. sut.prepareUserOptionsMenu(popup.menu, userShare)
  481. assertTrue(
  482. popup.menu.findItem(R.id.action_expiration_date).title ==
  483. targetContext.getString(R.string.share_no_expiration_date_label)
  484. )
  485. // note
  486. assertTrue(popup.menu.findItem(R.id.action_share_send_note).isVisible)
  487. }
  488. @Test
  489. fun testUploadAndEditingSharePermissions() {
  490. val sut = FileDetailSharingFragment()
  491. val share = OCShare().apply {
  492. permissions = MAXIMUM_PERMISSIONS_FOR_FOLDER
  493. }
  494. assertTrue(sut.isUploadAndEditingAllowed(share))
  495. share.permissions = NO_PERMISSION
  496. assertFalse(sut.isUploadAndEditingAllowed(share))
  497. share.permissions = READ_PERMISSION_FLAG
  498. assertFalse(sut.isUploadAndEditingAllowed(share))
  499. share.permissions = CREATE_PERMISSION_FLAG
  500. assertFalse(sut.isUploadAndEditingAllowed(share))
  501. share.permissions = DELETE_PERMISSION_FLAG
  502. assertFalse(sut.isUploadAndEditingAllowed(share))
  503. share.permissions = SHARE_PERMISSION_FLAG
  504. assertFalse(sut.isUploadAndEditingAllowed(share))
  505. }
  506. @Test
  507. @Suppress("MagicNumber")
  508. fun testReadOnlySharePermissions() {
  509. val sut = FileDetailSharingFragment()
  510. val share = OCShare().apply {
  511. permissions = 17
  512. }
  513. assertTrue(sut.isReadOnly(share))
  514. share.permissions = NO_PERMISSION
  515. assertFalse(sut.isReadOnly(share))
  516. share.permissions = READ_PERMISSION_FLAG
  517. assertTrue(sut.isReadOnly(share))
  518. share.permissions = CREATE_PERMISSION_FLAG
  519. assertFalse(sut.isReadOnly(share))
  520. share.permissions = DELETE_PERMISSION_FLAG
  521. assertFalse(sut.isReadOnly(share))
  522. share.permissions = SHARE_PERMISSION_FLAG
  523. assertFalse(sut.isReadOnly(share))
  524. share.permissions = MAXIMUM_PERMISSIONS_FOR_FOLDER
  525. assertFalse(sut.isReadOnly(share))
  526. share.permissions = MAXIMUM_PERMISSIONS_FOR_FILE
  527. assertFalse(sut.isReadOnly(share))
  528. }
  529. @Test
  530. @Suppress("MagicNumber")
  531. fun testFileDropSharePermissions() {
  532. val sut = FileDetailSharingFragment()
  533. val share = OCShare().apply {
  534. permissions = 4
  535. }
  536. assertTrue(sut.isFileDrop(share))
  537. share.permissions = NO_PERMISSION
  538. assertFalse(sut.isFileDrop(share))
  539. share.permissions = READ_PERMISSION_FLAG
  540. assertFalse(sut.isFileDrop(share))
  541. share.permissions = CREATE_PERMISSION_FLAG
  542. assertTrue(sut.isFileDrop(share))
  543. share.permissions = DELETE_PERMISSION_FLAG
  544. assertFalse(sut.isFileDrop(share))
  545. share.permissions = SHARE_PERMISSION_FLAG
  546. assertFalse(sut.isFileDrop(share))
  547. share.permissions = MAXIMUM_PERMISSIONS_FOR_FOLDER
  548. assertFalse(sut.isFileDrop(share))
  549. share.permissions = MAXIMUM_PERMISSIONS_FOR_FILE
  550. assertFalse(sut.isFileDrop(share))
  551. }
  552. @After
  553. fun after() {
  554. activity.storageManager.cleanShares()
  555. }
  556. }