From ba420d5a08233bd4559990d3818485cdc751efb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Sun, 31 Mar 2024 03:21:42 +0200 Subject: [PATCH] Add unit tests for removing federated group shares MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel Calviño Sánchez --- .../tests/External/ManagerTest.php | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/apps/files_sharing/tests/External/ManagerTest.php b/apps/files_sharing/tests/External/ManagerTest.php index 349c24f77c8c1..da8f336014c24 100644 --- a/apps/files_sharing/tests/External/ManagerTest.php +++ b/apps/files_sharing/tests/External/ManagerTest.php @@ -672,6 +672,213 @@ public function testDeclineThenAcceptGroupShareAgainThroughSubShare() { $this->verifyAcceptedGroupShare($shareData); } + public function testRemoveGroupShare() { + [$shareData, $groupShare] = $this->createTestGroupShare(); + $this->assertTrue($this->manager->acceptShare($groupShare['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare['name']); + + // Refresh mounts after removing share + $this->setupMounts(); + + $this->assertNotMount($groupShare['name']); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(1, $openShares); + // After removing/declining a group share the sub-share of the user + // rather than the group share is listed, so the mountpoint is no longer + // a temporary one, even if it was removed. + $this->assertExternalShareEntry($shareData, $openShares[0], 1, $shareData['name'], $this->uid); + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(0, $acceptedShares); + } + + public function testRemoveGroupShareWhenAcceptedByOtherUser() { + $manager2 = $this->createManagerForUser($this->uid2); + + [$shareData, $groupShare] = $this->createTestGroupShare(); + $this->assertTrue($this->manager->acceptShare($groupShare['id'])); + $this->assertTrue($manager2->acceptShare($groupShare['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare['name']); + + // Refresh mounts after removing share + $this->setupMounts(); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(1, $openShares); + // After removing/declining a group share the sub-share of the user + // rather than the group share is listed, so the mountpoint is no longer + // a temporary one, even if it was removed. + $this->assertExternalShareEntry($shareData, $openShares[0], 1, $shareData['name'], $this->uid); + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(0, $acceptedShares); + + $user2OpenShares = $manager2->getOpenShares(); + $this->assertCount(0, $user2OpenShares); + + $user2ShareData = $shareData; + $user2ShareData['accepted'] = true; + + $user2AcceptedShares = $manager2->getAcceptedShares(); + $this->assertCount(1, $user2AcceptedShares); + $this->assertExternalShareEntry($user2ShareData, $user2AcceptedShares[0], 1, $shareData['name'], $this->uid2); + } + + public function testRemoveGroupShareWhenThereAreSeveralShares() { + $manager2 = $this->createManagerForUser($this->uid2); + + [$shareData1, $groupShare1] = $this->createTestGroupShare('group1', 'token1', '/SharedFolder', '2341'); + $this->assertTrue($this->manager->acceptShare($groupShare1['id'])); + [$shareData2, $groupShare2] = $this->createTestGroupShare('group1', 'token2', '/SharedFolder2', '2342'); + $this->assertTrue($this->manager->acceptShare($groupShare2['id'])); + [$shareData3, $groupShare3] = $this->createTestGroupShare('group1', 'token3', '/SharedFolder3', '2343'); + [$shareData4, $groupShare4] = $this->createTestGroupShare('group2', 'token4', '/SharedFolder4', '2344'); + [$shareData5, $groupShare5] = $this->createTestGroupShare('group3', 'token1', '/SharedFolder', '2341', $manager2); + $this->assertTrue($manager2->acceptShare($groupShare5['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare2['name']); + + // Refresh mounts after removing share + $this->setupMounts(); + + $this->assertNotMount($groupShare2['name']); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(3, $openShares); + // After removing/declining a group share the sub-share of the user + // rather than the group share is listed, so the mountpoint is no longer + // a temporary one, even if it was removed. + $this->assertExternalShareEntry($shareData2, $openShares[0], 2, $shareData2['name'], $this->uid); + $this->assertExternalShareEntry($shareData3, $openShares[1], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}', 'group1'); + $this->assertExternalShareEntry($shareData4, $openShares[2], 4, '{{TemporaryMountPointName#' . $shareData4['name'] . '}}', 'group2'); + + $user1ShareData1 = $shareData1; + $user1ShareData1['accepted'] = true; + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(1, $acceptedShares); + $this->assertExternalShareEntry($user1ShareData1, $acceptedShares[0], 1, $user1ShareData1['name'], $this->uid); + + $user2OpenShares = $manager2->getOpenShares(); + $this->assertCount(3, $user2OpenShares); + $this->assertExternalShareEntry($shareData1, $user2OpenShares[0], 1, '{{TemporaryMountPointName#' . $shareData1['name'] . '}}', 'group1'); + $this->assertExternalShareEntry($shareData2, $user2OpenShares[1], 2, '{{TemporaryMountPointName#' . $shareData2['name'] . '}}', 'group1'); + $this->assertExternalShareEntry($shareData3, $user2OpenShares[2], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}', 'group1'); + + $shareData5['accepted'] = true; + + $user2AcceptedShares = $manager2->getAcceptedShares(); + $this->assertCount(1, $user2AcceptedShares); + $this->assertExternalShareEntry($shareData5, $user2AcceptedShares[0], 5, $shareData1['name'], $this->uid2); + } + + public function testForceRemoveGroupShare() { + [$shareData, $groupShare] = $this->createTestGroupShare(); + $this->assertTrue($this->manager->acceptShare($groupShare['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare['name'], true); + + // Refresh mounts after removing share + $this->setupMounts(); + + $this->assertNotMount($groupShare['name']); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(0, $openShares); + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(0, $acceptedShares); + } + + public function testForceRemoveGroupShareWhenAcceptedByOtherUser() { + $manager2 = $this->createManagerForUser($this->uid2); + + [$shareData, $groupShare] = $this->createTestGroupShare(); + $this->assertTrue($this->manager->acceptShare($groupShare['id'])); + $this->assertTrue($manager2->acceptShare($groupShare['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare['name'], true); + + // Refresh mounts after removing share + $this->setupMounts(); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(0, $openShares); + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(0, $acceptedShares); + + $user2OpenShares = $manager2->getOpenShares(); + $this->assertCount(0, $openShares); + + $user2AcceptedShares = $manager2->getAcceptedShares(); + $this->assertCount(0, $user2AcceptedShares); + } + + public function testForceRemoveGroupShareWhenThereAreSeveralShares() { + $manager2 = $this->createManagerForUser($this->uid2); + + [$shareData1, $groupShare1] = $this->createTestGroupShare('group1', 'token1', '/SharedFolder', '2341'); + $this->assertTrue($this->manager->acceptShare($groupShare1['id'])); + [$shareData2, $groupShare2] = $this->createTestGroupShare('group1', 'token2', '/SharedFolder2', '2342'); + $this->assertTrue($this->manager->acceptShare($groupShare2['id'])); + [$shareData3, $groupShare3] = $this->createTestGroupShare('group1', 'token3', '/SharedFolder3', '2343'); + [$shareData4, $groupShare4] = $this->createTestGroupShare('group2', 'token4', '/SharedFolder4', '2344'); + [$shareData5, $groupShare5] = $this->createTestGroupShare('group3', 'token1', '/SharedFolder', '2341', $manager2); + $this->assertTrue($manager2->acceptShare($groupShare5['id'])); + + // Setup mounts to remove share through mountpoint + $this->setupMounts(); + + $this->manager->removeShare($this->uid . '/files/' . $groupShare2['name'], true); + + // Refresh mounts after removing share + $this->setupMounts(); + + $this->assertNotMount($groupShare2['name']); + + $openShares = $this->manager->getOpenShares(); + $this->assertCount(2, $openShares); + $this->assertExternalShareEntry($shareData3, $openShares[0], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}', 'group1'); + $this->assertExternalShareEntry($shareData4, $openShares[1], 4, '{{TemporaryMountPointName#' . $shareData4['name'] . '}}', 'group2'); + + $user1ShareData1 = $shareData1; + $user1ShareData1['accepted'] = true; + + $acceptedShares = $this->manager->getAcceptedShares(); + $this->assertCount(1, $acceptedShares); + $this->assertExternalShareEntry($user1ShareData1, $acceptedShares[0], 1, $user1ShareData1['name'], $this->uid); + + $user2OpenShares = $manager2->getOpenShares(); + $this->assertCount(2, $user2OpenShares); + $this->assertExternalShareEntry($shareData1, $user2OpenShares[0], 1, '{{TemporaryMountPointName#' . $shareData1['name'] . '}}', 'group1'); + $this->assertExternalShareEntry($shareData3, $user2OpenShares[1], 3, '{{TemporaryMountPointName#' . $shareData3['name'] . '}}', 'group1'); + + $shareData5['accepted'] = true; + + $user2AcceptedShares = $manager2->getAcceptedShares(); + $this->assertCount(1, $user2AcceptedShares); + $this->assertExternalShareEntry($shareData5, $user2AcceptedShares[0], 5, $shareData1['name'], $this->uid2); + } + public function testDeleteUserShares() { // user 1 shares