diff --git a/tests/acceptance/bootstrap/PublicWebDavContext.php b/tests/acceptance/bootstrap/PublicWebDavContext.php index 9baf4ada67b..e0c9dd5bff5 100644 --- a/tests/acceptance/bootstrap/PublicWebDavContext.php +++ b/tests/acceptance/bootstrap/PublicWebDavContext.php @@ -216,7 +216,6 @@ public function renameFileFromPublicShare(string $fileName, string $toFileName, * @return void */ public function thePublicRenamesFileFromTheLastPublicShareUsingThePasswordPasswordAndOldPublicWebdavApi(string $fileName, string $toName, string $password):void { - $this->featureContext->setResponse( $this->renameFileFromPublicShare($fileName, $toName, $password) ); @@ -496,7 +495,6 @@ public function thePublicUploadsFileWithPasswordAndContentUsingPublicWebDAVApi( * @return void */ public function thePublicOverwritesFileWithContentUsingWebDavApi(string $filename, string $body):void { - $response = $this->publicUploadContent($filename, '', $body); $this->featureContext->setResponse($response); } @@ -544,7 +542,6 @@ public function checkLastPublicSharedFileWithPasswordDownload( string $password, string $expectedContent ):void { - $response = $this->downloadPublicFileWithRange( "", $password @@ -617,7 +614,6 @@ public function shouldBeAbleToDownloadFileInsidePublicSharedFolderWithPasswordAn string $password, string $content ):void { - $response = $this->downloadFileFromPublicFolder( $path, $password, diff --git a/tests/acceptance/bootstrap/SpacesContext.php b/tests/acceptance/bootstrap/SpacesContext.php index 623c9972d07..40d9995fc6d 100644 --- a/tests/acceptance/bootstrap/SpacesContext.php +++ b/tests/acceptance/bootstrap/SpacesContext.php @@ -254,6 +254,42 @@ public function getSpaceIdByName(string $user, string $spaceName): string { return $space["id"]; } + /** + * Retrieves the remoteItem ID for a given share in the Shares space. + * + * @param string $user + * @param string $share //share + * + * @return string + * + * @throws Exception|GuzzleException + */ + public function getSharesRemoteItemId(string $user, string $share): string { + $credentials = $this->featureContext->graphContext->getAdminOrUserCredentials($user); + $response = GraphHelper::getSharesSharedWithMe( + $this->featureContext->getBaseUrl(), + $this->featureContext->getStepLineRef(), + $credentials['username'], + $credentials['password'] + ); + + $jsonBody = $this->featureContext->getJsonDecodedResponseBodyContent($response); + + // Search for the folder name in the response to find the remoteItem ID + foreach ($jsonBody->value as $item) { + if (isset($item->name) && $item->name === $share) { + if (isset($item->remoteItem->id)) { + return $item->remoteItem->id; + } else { + throw new Exception("Failed to find remoteItem ID for share: $share"); + } + } + } + + //no share + throw new Exception("Failed to find remoteItem ID for folder: $share in Shares space."); + } + /** * The method finds file by fileName and spaceName and returns data of file which contains in responseHeader * fileName contains the path, if the file is in the folder @@ -261,14 +297,23 @@ public function getSpaceIdByName(string $user, string $spaceName): string { * @param string $user * @param string $spaceName * @param string $fileName + * @param bool|null $federatedShare * * @return ResponseInterface * @throws GuzzleException */ - public function getFileData(string $user, string $spaceName, string $fileName): ResponseInterface { - $space = $this->getSpaceByName($user, $spaceName); + public function getFileData(string $user, string $spaceName, string $fileName, ?bool $federatedShare = false): ResponseInterface { $baseUrl = $this->featureContext->getBaseUrl(); - $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $space["id"]); + + if ($federatedShare) { + $remoteItemId = $this->getSharesRemoteItemId($user, $spaceName); + $spaceId = \rawurlencode($remoteItemId); + } else { + $space = $this->getSpaceByName($user, $spaceName); + $spaceId = $space["id"]; + } + + $davPath = WebdavHelper::getDavPath(WebDavHelper::DAV_VERSION_SPACES, $spaceId); $fullUrl = "$baseUrl/$davPath/$fileName"; return HttpRequestHelper::get( @@ -874,6 +919,32 @@ public function checkFileContent( Assert::assertEquals($fileContent, $actualFileContent, "$file does not contain $fileContent"); } + /** + * @Then /^for user "([^"]*)" the content of file "([^"]*)" of federated share "([^"]*)" should be "([^"]*)"$/ + * + * @param string $user + * @param string $file + * @param string $share + * @param string $fileContent + * + * @return void + * + * @throws Exception|GuzzleException + */ + public function checkFileContentOfRemoteShare( + string $user, + string $file, + string $share, + string $fileContent + ): void { + // trimming the resource 'FOLDER/file.txt' to get the destination path 'file.txt' + // 'FOLDER' is represented by remoteItem id in the federation + $file = \ltrim($file, "/"); + + $actualFileContent = $this->getFileData($user, $share, $file, true)->getBody()->getContents(); + Assert::assertEquals($fileContent, $actualFileContent, "$file does not contain $fileContent"); + } + /** * @Then /^the JSON response should contain space called "([^"]*)" (?:|(?:owned by|granted to) "([^"]*)" )(?:|(?:with description file|with space image) "([^"]*)" )and match$/ * diff --git a/tests/acceptance/bootstrap/SpacesTUSContext.php b/tests/acceptance/bootstrap/SpacesTUSContext.php index 283c383c569..7a6ed162125 100644 --- a/tests/acceptance/bootstrap/SpacesTUSContext.php +++ b/tests/acceptance/bootstrap/SpacesTUSContext.php @@ -16,6 +16,8 @@ use PHPUnit\Framework\Assert; use TestHelpers\WebDavHelper; use TestHelpers\BehatHelper; +use TestHelpers\GraphHelper; +use TestHelpers\HttpRequestHelper; require_once 'bootstrap.php'; @@ -89,11 +91,10 @@ public function userUploadsAFileViaTusInsideOfTheSpaceUsingTheWebdavApi( } /** - * @Given user :user has created a new TUS resource for the space :spaceName with content :content using the WebDAV API with these headers: + * @Given user :user has created a new TUS resource in the space :spaceName with the following headers: * * @param string $user * @param string $spaceName - * @param string $content * @param TableNode $headers * * @return void @@ -104,11 +105,10 @@ public function userUploadsAFileViaTusInsideOfTheSpaceUsingTheWebdavApi( public function userHasCreatedANewTusResourceForTheSpaceUsingTheWebdavApiWithTheseHeaders( string $user, string $spaceName, - string $content, TableNode $headers ): void { $spaceId = $this->spacesContext->getSpaceIdByName($user, $spaceName); - $response = $this->tusContext->createNewTUSResourceWithHeaders($user, $headers, $content, $spaceId); + $response = $this->tusContext->createNewTUSResourceWithHeaders($user, $headers, '', $spaceId); $this->featureContext->theHTTPStatusCodeShouldBe(201, "Expected response status code should be 201", $response); } @@ -164,6 +164,31 @@ private function uploadFileViaTus(string $user, string $content, string $resourc \unlink($tmpFile); } + /** + * @When /^user "([^"]*)" uploads a file with content "([^"]*)" to "([^"]*)" inside federated share "([^"]*)" via TUS using the WebDAV API$/ + * + * @param string $user + * @param string $content + * @param string $file + * @param string $destination + * + * @return void + * @throws Exception|GuzzleException + */ + public function userUploadsAFileWithContentToInsideFederatedShareViaTusUsingTheWebdavApi(string $user, string $content, string $file, string $destination): void { + $remoteItemId = $this->spacesContext->getSharesRemoteItemId($user, $destination); + $remoteItemId = \rawurlencode($remoteItemId); + $tmpFile = $this->tusContext->writeDataToTempFile($content); + $this->tusContext->uploadFileUsingTus( + $user, + \basename($tmpFile), + $file, + $remoteItemId + ); + $this->featureContext->setLastUploadDeleteTime(\time()); + \unlink($tmpFile); + } + /** * @When /^user "([^"]*)" uploads a file with content "([^"]*)" to "([^"]*)" via TUS inside of the space "([^"]*)" using the WebDAV API$/ * @@ -330,11 +355,10 @@ public function userSendsAChunkToTheLastCreatedTusLocationWithOffsetAndDataWithC } /** - * @When /^user "([^"]*)" sends a chunk to the last created TUS Location with data "([^"]*)" inside of the space "([^"]*)" with headers:$/ + * @When /^user "([^"]*)" sends a chunk to the last created TUS Location with data "([^"]*)" with the following headers:$/ * * @param string $user * @param string $data - * @param string $spaceName * @param TableNode $headers * * @return void @@ -343,7 +367,6 @@ public function userSendsAChunkToTheLastCreatedTusLocationWithOffsetAndDataWithC public function userSendsAChunkToTheLastCreatedTusLocationWithDataInsideOfTheSpaceWithHeaders( string $user, string $data, - string $spaceName, TableNode $headers ): void { $rows = $headers->getRowsHash(); diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml index 43fb2fca485..32ce04ca861 100644 --- a/tests/acceptance/config/behat.yml +++ b/tests/acceptance/config/behat.yml @@ -394,6 +394,7 @@ default: - OcisConfigContext: - NotificationContext: - SettingsContext: + - SpacesTUSContext: apiActivities: paths: diff --git a/tests/acceptance/features/apiCors/cors.feature b/tests/acceptance/features/apiCors/cors.feature index eb63930da3b..7b008cde57e 100644 --- a/tests/acceptance/features/apiCors/cors.feature +++ b/tests/acceptance/features/apiCors/cors.feature @@ -110,13 +110,13 @@ Feature: CORS headers @issue-8380 Scenario: CORS headers should be returned when uploading file using Tus and when CORS domain sending origin header in the Webdav api - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | | Tus-Resumable | 1.0.0 | | Origin | https://aphno.badal | - When user "Alice" sends a chunk to the last created TUS Location with data "01234" inside of the space "Personal" with headers: + When user "Alice" sends a chunk to the last created TUS Location with data "01234" with the following headers: | Origin | https://aphno.badal | | Upload-Checksum | MD5 4100c4d44da9177247e44a5fc1546778 | | Upload-Offset | 0 | @@ -128,13 +128,13 @@ Feature: CORS headers @issue-8380 Scenario: uploading file using Tus using different CORS headers - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | | Tus-Resumable | 1.0.0 | | Origin | https://something.else | - When user "Alice" sends a chunk to the last created TUS Location with data "01234" inside of the space "Personal" with headers: + When user "Alice" sends a chunk to the last created TUS Location with data "01234" with the following headers: | Origin | https://something.else | | Upload-Checksum | MD5 4100c4d44da9177247e44a5fc1546778 | | Upload-Offset | 0 | @@ -144,7 +144,7 @@ Feature: CORS headers # The Access-Control-Request-Headers need to be in lower-case and alphabetically order to comply with the rs/cors # package see: https://github.com/rs/cors/commit/4c32059b2756926619f6bf70281b91be7b5dddb2#diff-bf80d8fbedf172fab9ba2604da7f7be972e48b2f78a8d0cd21619d5f93665895R367 Scenario Outline: CORS headers should be returned when an preflight request is sent to Tus upload - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | diff --git a/tests/acceptance/features/apiOcm/share.feature b/tests/acceptance/features/apiOcm/share.feature index e943a038b75..f130ad05f93 100755 --- a/tests/acceptance/features/apiOcm/share.feature +++ b/tests/acceptance/features/apiOcm/share.feature @@ -695,4 +695,23 @@ Feature: an user shares resources using ScienceMesh application } } } - """ \ No newline at end of file + """ + + @issue-10285 @issue-10536 + Scenario: local user upload file to a federated shared folder via TUS + Given using spaces DAV path + And using server "LOCAL" + And "Alice" has created the federation share invitation + And using server "REMOTE" + And "Brian" has accepted invitation + And using server "LOCAL" + And user "Alice" has created a folder "FOLDER" in space "Personal" + And user "Alice" has sent the following resource share invitation to federated user: + | resource | FOLDER | + | space | Personal | + | sharee | Brian | + | shareType | user | + | permissionsRole | Editor | + When using server "REMOTE" + And user "Brian" uploads a file with content "lorem" to "file.txt" inside federated share "FOLDER" via TUS using the WebDAV API + Then for user "Brian" the content of file "file.txt" of federated share "FOLDER" should be "lorem" diff --git a/tests/acceptance/features/apiSpacesShares/shareUploadTUS.feature b/tests/acceptance/features/apiSpacesShares/shareUploadTUS.feature index fa8628ba3ec..b353b9504fb 100644 --- a/tests/acceptance/features/apiSpacesShares/shareUploadTUS.feature +++ b/tests/acceptance/features/apiSpacesShares/shareUploadTUS.feature @@ -193,7 +193,7 @@ Feature: upload resources on share using TUS protocol | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "FOLDER" synced - And user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + And user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # L0ZPTERFUi90ZXh0RmlsZS50eHQ= is the base64 encode of /FOLDER/textFile.txt | Upload-Metadata | filename L0ZPTERFUi90ZXh0RmlsZS50eHQ= | @@ -213,7 +213,7 @@ Feature: upload resources on share using TUS protocol | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "FOLDER" synced - And user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + And user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # L0ZPTERFUi90ZXh0RmlsZS50eHQ= is the base64 encode of /FOLDER/textFile.txt | Upload-Metadata | filename L0ZPTERFUi90ZXh0RmlsZS50eHQ= | @@ -224,7 +224,7 @@ Feature: upload resources on share using TUS protocol Scenario: sharer shares a file with correct checksum should return the checksum in the propfind for sharee - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | @@ -243,7 +243,7 @@ Feature: upload resources on share using TUS protocol Scenario: sharer shares a file with correct checksum should return the checksum in the download header for sharee - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 5 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | @@ -309,7 +309,7 @@ Feature: upload resources on share using TUS protocol | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "FOLDER" synced - And user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + And user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 16 | # L0ZPTERFUi90ZXh0RmlsZS50eHQ= is the base64 encode of /FOLDER/textFile.txt | Upload-Metadata | filename L0ZPTERFUi90ZXh0RmlsZS50eHQ= | @@ -323,7 +323,7 @@ Feature: upload resources on share using TUS protocol Scenario: sharer uploads a chunked file with correct checksum and share it with sharee should work - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 10 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | @@ -345,7 +345,7 @@ Feature: upload resources on share using TUS protocol | shareType | user | | permissionsRole | Editor | And user "Brian" has a share "FOLDER" synced - And user "Brian" has created a new TUS resource for the space "Shares" with content "" using the WebDAV API with these headers: + And user "Brian" has created a new TUS resource in the space "Shares" with the following headers: | Upload-Length | 10 | # L0ZPTERFUi90ZXh0RmlsZS50eHQ= is the base64 encode of /FOLDER/textFile.txt | Upload-Metadata | filename L0ZPTERFUi90ZXh0RmlsZS50eHQ= | @@ -359,7 +359,7 @@ Feature: upload resources on share using TUS protocol Scenario: sharer uploads a file with checksum and as a sharee overwrites the shared file with new data and correct checksum - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 16 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | @@ -382,7 +382,7 @@ Feature: upload resources on share using TUS protocol @issue-1755 Scenario: sharer uploads a file with checksum and as a sharee overwrites the shared file with new data and invalid checksum - Given user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + Given user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 16 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 | diff --git a/tests/acceptance/features/cliCommands/uploadSessions.feature b/tests/acceptance/features/cliCommands/uploadSessions.feature index 8190a2346f9..9262c954ce7 100644 --- a/tests/acceptance/features/cliCommands/uploadSessions.feature +++ b/tests/acceptance/features/cliCommands/uploadSessions.feature @@ -135,7 +135,7 @@ Feature: List upload sessions via CLI command | POSTPROCESSING_DELAY | 10s | And user "Alice" has uploaded file "filesForUpload/filesWithVirus/eicar.com" to "/virusFile.txt" And user "Alice" has uploaded file with content "upload content" to "/file1.txt" - And user "Alice" has created a new TUS resource for the space "Personal" with content "" using the WebDAV API with these headers: + And user "Alice" has created a new TUS resource in the space "Personal" with the following headers: | Upload-Length | 10 | # dGV4dEZpbGUudHh0 is the base64 encode of textFile.txt | Upload-Metadata | filename dGV4dEZpbGUudHh0 |