FileDetailSharingFragmentIT.kt 24 KB

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