From 603f4a0e7d13105aaf11f808295924c3a5156043 Mon Sep 17 00:00:00 2001 From: Salipa-Gurung Date: Fri, 30 Jun 2023 14:27:53 +0545 Subject: [PATCH] add test for downloading space --- tests/acceptance/config/behat.yml | 1 + .../features/apiSpaces/spaceDownload.feature | 24 +++++++ .../features/bootstrap/SpacesContext.php | 72 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 tests/acceptance/features/apiSpaces/spaceDownload.feature 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..68d1ea029ee --- /dev/null +++ b/tests/acceptance/features/apiSpaces/spaceDownload.feature @@ -0,0 +1,24 @@ +@api +Feature: Download space + As a user + I want to be able to download space + So that I can have it in my local storage + + + Scenario: user downloads a space + Given these users have been created with default attributes and without skeleton files: + | username | + | Alice | + 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 "download space" with the default quota using the GraphApi + And user "Alice" has uploaded a file inside space "download space" with content "some data" to "file1.txt" + And user "Alice" has uploaded a file inside space "download space" with content "other data" to "file2.txt" + And user "Alice" has uploaded a file inside space "download space" with content "more data" to "file3.txt" + When user "Alice" downloads the space "download space" using the WebDAV API + Then the HTTP status code should be "200" + And the downloaded "tar" space 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/SpacesContext.php b/tests/acceptance/features/bootstrap/SpacesContext.php index ccc20fc81a8..0fbcf50f839 100644 --- a/tests/acceptance/features/bootstrap/SpacesContext.php +++ b/tests/acceptance/features/bootstrap/SpacesContext.php @@ -33,6 +33,7 @@ use TestHelpers\SetupHelper; use TestHelpers\GraphHelper; use PHPUnit\Framework\Assert; +use wapmorgan\UnifiedArchive\UnifiedArchive; require_once 'bootstrap.php'; @@ -3198,4 +3199,75 @@ public function theUserShouldHaveSpaceWithRecipient( } Assert::assertTrue($foundRoleInResponse, "the response does not contain the $recipientType $recipient"); } + + /** + * @When /^user "([^"]*)" downloads the space "([^"]*)" using the WebDAV API/ + * + * @param string $user + * @param string $spaceName + * + * @return void + * + * @throws Exception + * @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), + ) + ); + } + + /** + * @Then the downloaded :arg1 space archive should contain these files: + * + * @param string $type + * @param TableNode $expectedFiles + * + * @return void + * + * @throws NonExistentArchiveFileException + */ + public function theDownloadedSpaceArchiveShouldContainTheseFiles(string $type, TableNode $expectedFiles):void { + $dataVal = $this->featureContext->getResponse()->getBody()->getContents(); + $placeValue = []; + $filePos = ''; + + foreach ($expectedFiles->getHash() as $file) { + $place = stripos($dataVal, $file['name']); + $placeValue[] = $place; + } + + $min = min($placeValue); + + foreach ($expectedFiles->getHash() as $file) { + $place = stripos($dataVal, $file['name']); + if ($place == $min) { + $filePos = $file['name']; + } + } + + $fileData = strstr($dataVal, $filePos); + + $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, $fileData); + $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" + ); + } + \unlink($tempFile); + } }