aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLuka Trovic <luka@nextcloud.com>2024-08-07 11:13:35 +0200
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2024-12-19 14:16:47 +0000
commitdfbaa103f95ca58df0680e47bde10c72e51ca200 (patch)
treed758d39f4d15e0cca90ce0b909e754533f579e13 /tests
parent8de467c60ea59a2a7b5564d829e29758c10c7fca (diff)
downloadnextcloud-server-dfbaa103f95ca58df0680e47bde10c72e51ca200.tar.gz
nextcloud-server-dfbaa103f95ca58df0680e47bde10c72e51ca200.zip
fix: delete re-shares when deleting the parent share
Note: Removed part about fix command from original PR Signed-off-by: Luka Trovic <luka@nextcloud.com> Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com> (cherry picked from commit 42181c2f490025860e22907255b6917583c798af)
Diffstat (limited to 'tests')
-rw-r--r--tests/lib/Share20/ManagerTest.php120
1 files changed, 116 insertions, 4 deletions
diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php
index 8094f573332..3a220692693 100644
--- a/tests/lib/Share20/ManagerTest.php
+++ b/tests/lib/Share20/ManagerTest.php
@@ -60,6 +60,7 @@ use OCP\Share\Events\ShareCreatedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\Share\Events\ShareDeletedFromSelfEvent;
use OCP\Share\Exceptions\AlreadySharedException;
+use OCP\Share\Exceptions\GenericShareException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
@@ -241,7 +242,7 @@ class ManagerTest extends \Test\TestCase {
*/
public function testDelete($shareType, $sharedWith) {
$manager = $this->createManagerMock()
- ->setMethods(['getShareById', 'deleteChildren'])
+ ->setMethods(['getShareById', 'deleteChildren', 'deleteReshare'])
->getMock();
$manager->method('deleteChildren')->willReturn([]);
@@ -259,6 +260,7 @@ class ManagerTest extends \Test\TestCase {
->setTarget('myTarget');
$manager->expects($this->once())->method('deleteChildren')->with($share);
+ $manager->expects($this->once())->method('deleteReshare')->with($share);
$this->defaultProvider
->expects($this->once())
@@ -283,7 +285,7 @@ class ManagerTest extends \Test\TestCase {
public function testDeleteLazyShare() {
$manager = $this->createManagerMock()
- ->setMethods(['getShareById', 'deleteChildren'])
+ ->setMethods(['getShareById', 'deleteChildren', 'deleteReshare'])
->getMock();
$manager->method('deleteChildren')->willReturn([]);
@@ -302,6 +304,7 @@ class ManagerTest extends \Test\TestCase {
$this->rootFolder->expects($this->never())->method($this->anything());
$manager->expects($this->once())->method('deleteChildren')->with($share);
+ $manager->expects($this->once())->method('deleteReshare')->with($share);
$this->defaultProvider
->expects($this->once())
@@ -326,7 +329,7 @@ class ManagerTest extends \Test\TestCase {
public function testDeleteNested() {
$manager = $this->createManagerMock()
- ->setMethods(['getShareById'])
+ ->setMethods(['getShareById', 'deleteReshare'])
->getMock();
$path = $this->createMock(File::class);
@@ -483,7 +486,116 @@ class ManagerTest extends \Test\TestCase {
$this->assertSame($shares, $result);
}
- public function testGetShareById() {
+ public function testDeleteReshareWhenUserHasOneShare(): void {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare', 'getSharesInFolder', 'generalCreateChecks'])
+ ->getMock();
+
+ $folder = $this->createMock(Folder::class);
+
+ $share = $this->createMock(IShare::class);
+ $share->method('getShareType')->willReturn(IShare::TYPE_USER);
+ $share->method('getNodeType')->willReturn('folder');
+ $share->method('getSharedWith')->willReturn('UserB');
+ $share->method('getNode')->willReturn($folder);
+
+ $reShare = $this->createMock(IShare::class);
+ $reShare->method('getSharedBy')->willReturn('UserB');
+ $reShare->method('getSharedWith')->willReturn('UserC');
+ $reShare->method('getNode')->willReturn($folder);
+
+ $reShareInSubFolder = $this->createMock(IShare::class);
+ $reShareInSubFolder->method('getSharedBy')->willReturn('UserB');
+
+ $manager->method('getSharesInFolder')->willReturn([$reShareInSubFolder]);
+ $manager->method('generalCreateChecks')->willThrowException(new GenericShareException());
+
+ $this->defaultProvider->method('getSharesBy')
+ ->willReturn([$reShare]);
+
+ $manager->expects($this->atLeast(2))->method('deleteShare')->withConsecutive([$reShare], [$reShareInSubFolder]);
+
+ $manager->deleteReshare($share);
+ }
+
+ public function testDeleteReshareWhenUserHasAnotherShare(): void {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare', 'getSharesInFolder', 'getSharedWith', 'generalCreateChecks'])
+ ->getMock();
+
+ $folder = $this->createMock(Folder::class);
+
+ $share = $this->createMock(IShare::class);
+ $share->method('getShareType')->willReturn(IShare::TYPE_USER);
+ $share->method('getNodeType')->willReturn('folder');
+ $share->method('getSharedWith')->willReturn('UserB');
+ $share->method('getNode')->willReturn($folder);
+
+ $reShare = $this->createMock(IShare::class);
+ $reShare->method('getShareType')->willReturn(IShare::TYPE_USER);
+ $reShare->method('getNodeType')->willReturn('folder');
+ $reShare->method('getSharedBy')->willReturn('UserB');
+ $reShare->method('getNode')->willReturn($folder);
+
+ $this->defaultProvider->method('getSharesBy')->willReturn([$reShare]);
+ $manager->method('getSharesInFolder')->willReturn([]);
+ $manager->method('generalCreateChecks')->willReturn(true);
+
+ $manager->expects($this->never())->method('deleteShare');
+
+ $manager->deleteReshare($share);
+ }
+
+ public function testDeleteReshareOfUsersInGroupShare(): void {
+ $manager = $this->createManagerMock()
+ ->setMethods(['deleteShare', 'getSharesInFolder', 'getSharedWith', 'generalCreateChecks'])
+ ->getMock();
+
+ $folder = $this->createMock(Folder::class);
+
+ $userA = $this->createMock(IUser::class);
+ $userA->method('getUID')->willReturn('userA');
+
+ $share = $this->createMock(IShare::class);
+ $share->method('getShareType')->willReturn(IShare::TYPE_GROUP);
+ $share->method('getNodeType')->willReturn('folder');
+ $share->method('getSharedWith')->willReturn('Group');
+ $share->method('getNode')->willReturn($folder);
+ $share->method('getShareOwner')->willReturn($userA);
+
+ $reShare1 = $this->createMock(IShare::class);
+ $reShare1->method('getShareType')->willReturn(IShare::TYPE_USER);
+ $reShare1->method('getNodeType')->willReturn('folder');
+ $reShare1->method('getSharedBy')->willReturn('UserB');
+ $reShare1->method('getNode')->willReturn($folder);
+
+ $reShare2 = $this->createMock(IShare::class);
+ $reShare2->method('getShareType')->willReturn(IShare::TYPE_USER);
+ $reShare2->method('getNodeType')->willReturn('folder');
+ $reShare2->method('getSharedBy')->willReturn('UserC');
+ $reShare2->method('getNode')->willReturn($folder);
+
+ $userB = $this->createMock(IUser::class);
+ $userB->method('getUID')->willReturn('userB');
+ $userC = $this->createMock(IUser::class);
+ $userC->method('getUID')->willReturn('userC');
+ $group = $this->createMock(IGroup::class);
+ $group->method('getUsers')->willReturn([$userB, $userC]);
+ $this->groupManager->method('get')->with('Group')->willReturn($group);
+
+ $this->defaultProvider->method('getSharesBy')
+ ->willReturn([]);
+ $manager->method('generalCreateChecks')->willThrowException(new GenericShareException());
+
+ $manager->method('getSharedWith')->willReturn([]);
+ $manager->expects($this->exactly(2))->method('getSharesInFolder')->willReturnOnConsecutiveCalls([[$reShare1]], [[$reShare2]]);
+
+ $manager->expects($this->exactly(2))->method('deleteShare')->withConsecutive([$reShare1], [$reShare2]);
+
+ $manager->deleteReshare($share);
+ }
+
+ public function testGetShareById(): void {
$share = $this->createMock(IShare::class);
$this->defaultProvider