diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml index 77951dd6ed2..616c27e1d8b 100644 --- a/tests/acceptance/config/behat.yml +++ b/tests/acceptance/config/behat.yml @@ -55,6 +55,7 @@ default: - SpacesTUSContext: - GraphContext: - OcisConfigContext: + - ArchiverContext: apiSpacesShares: paths: diff --git a/tests/acceptance/features/apiSpaces/spaceDownload.feature b/tests/acceptance/features/apiSpaces/spaceDownload.feature new file mode 100644 index 00000000000..89cb68a68c5 --- /dev/null +++ b/tests/acceptance/features/apiSpaces/spaceDownload.feature @@ -0,0 +1,22 @@ +@api +Feature: Download space + As a user + I want to be able to download space + So that I can store it in my local storage + + + Scenario: user downloads a space + Given user "Alice" has been created with default attributes and without skeleton files + And using spaces DAV path + And the administrator has assigned the role "Space Admin" to user "Alice" using the Graph API + And user "Alice" has created a space "project-space" with the default quota using the GraphApi + And user "Alice" has uploaded a file inside space "project-space" with content "some data" to "file1.txt" + And user "Alice" has uploaded a file inside space "project-space" with content "other data" to "file2.txt" + And user "Alice" has uploaded a file inside space "project-space" with content "more data" to "file3.txt" + When user "Alice" downloads the space "project-space" using the WebDAV API + Then the HTTP status code should be "200" + And the downloaded "tar" archive should contain these files: + | name | content | + | file1.txt | some data | + | file2.txt | other data | + | file3.txt | more data | diff --git a/tests/acceptance/features/bootstrap/ArchiverContext.php b/tests/acceptance/features/bootstrap/ArchiverContext.php index fbd93b3d2aa..8c854bf7a57 100644 --- a/tests/acceptance/features/bootstrap/ArchiverContext.php +++ b/tests/acceptance/features/bootstrap/ArchiverContext.php @@ -26,7 +26,6 @@ use GuzzleHttp\Exception\GuzzleException; use TestHelpers\HttpRequestHelper; use TestHelpers\SetupHelper; -use wapmorgan\UnifiedArchive\UnifiedArchive; use PHPUnit\Framework\Assert; use \Psr\Http\Message\ResponseInterface; @@ -219,18 +218,41 @@ public function userDownloadsTheArchiveOfTheseItems( */ public function theDownloadedArchiveShouldContainTheseFiles(string $type, TableNode $expectedFiles):void { $this->featureContext->verifyTableNodeColumns($expectedFiles, ['name', 'content']); + $contents = $this->featureContext->getResponse()->getBody()->getContents(); $tempFile = \tempnam(\sys_get_temp_dir(), 'OcAcceptanceTests_'); \unlink($tempFile); // we only need the name $tempFile = $tempFile . '.' . $type; // it needs the extension - \file_put_contents($tempFile, $this->featureContext->getResponse()->getBody()->getContents()); - $archive = UnifiedArchive::open($tempFile); - foreach ($expectedFiles->getHash() as $expectedFile) { - Assert::assertEquals( - $expectedFile['content'], - $archive->getFileContent($expectedFile['name']), - __METHOD__ . - " content of '" . $expectedFile['name'] . "' not as expected" - ); + \file_put_contents($tempFile, $contents); + + // open the archive + $archiveData = new RecursiveIteratorIterator( + new PharData($tempFile), + RecursiveIteratorIterator::SELF_FIRST + ); + foreach ($expectedFiles->getHash() as $expectedItem) { + $expectedPath = trim($expectedItem['name'], "/"); + $found = false; + foreach ($archiveData as $info) { + // get only the parent folder path for the given item + $actualPath = explode(".$type", $info->getPathname())[1]; + $actualPath = trim($actualPath, "/"); + + if ($expectedPath === $actualPath) { + if (!$info->isDir()) { + Assert::assertEquals( + $expectedItem['content'], + $info->getContent(), + __METHOD__ . + " content of '" . $expectedPath . "' not as expected" + ); + } + $found = true; + break; + } + } + if (!$found) { + Assert::fail("Resource '" . $expectedPath . "' is not in the downloaded archive."); + } } \unlink($tempFile); } diff --git a/tests/acceptance/features/bootstrap/SpacesContext.php b/tests/acceptance/features/bootstrap/SpacesContext.php index 402b43ff1f8..0d39b1b0cd6 100644 --- a/tests/acceptance/features/bootstrap/SpacesContext.php +++ b/tests/acceptance/features/bootstrap/SpacesContext.php @@ -3240,4 +3240,27 @@ public function theUserShouldHaveSpaceWithRecipient( } Assert::assertTrue($foundRoleInResponse, "the response does not contain the $recipientType $recipient"); } + + /** + * @When user :user downloads the space :spaceName using the WebDAV API + * + * @param string $user + * @param string $spaceName + * + * @return void + * + * @throws GuzzleException + */ + public function userDownloadsTheSpaceUsingTheWebdavApi(string $user, string $spaceName):void { + $space = $this->getSpaceByName($user, $spaceName); + $url = $this->featureContext->getBaseUrl() . '/archiver?id=' . $space["id"]; + $this->featureContext->setResponse( + HttpRequestHelper::get( + $url, + '', + $user, + $this->featureContext->getPasswordForUser($user), + ) + ); + } }