diff --git a/tests/acceptance/bootstrap/CollaborationContext.php b/tests/acceptance/bootstrap/CollaborationContext.php index abf6ae73b9..4dbf203750 100644 --- a/tests/acceptance/bootstrap/CollaborationContext.php +++ b/tests/acceptance/bootstrap/CollaborationContext.php @@ -22,6 +22,7 @@ use Behat\Behat\Context\Context; use Behat\Behat\Hook\Scope\BeforeScenarioScope; +use Behat\Gherkin\Node\TableNode; use GuzzleHttp\Exception\GuzzleException; use TestHelpers\HttpRequestHelper; use TestHelpers\WebDavHelper; @@ -33,6 +34,7 @@ use TestHelpers\CollaborationHelper; class CollaborationContext implements Context { private FeatureContext $featureContext; private SpacesContext $spacesContext; + private string $lastAppOpenData; /** * This will run before EVERY scenario. @@ -52,6 +54,22 @@ class CollaborationContext implements Context { $this->spacesContext = $environment->getContext('SpacesContext'); } + /** + * @param string $data + * + * @return void + */ + public function setLastAppOpenData(string $data): void { + $this->lastAppOpenData = $data; + } + + /** + * @return string + */ + public function getLastAppOpenData(): string { + return $this->lastAppOpenData; + } + /** * @When user :user checks the information of file :file of space :space using office :app * @When user :user checks the information of file :file of space :space using office :app with view mode :view @@ -255,4 +273,53 @@ class CollaborationContext implements Context { ) ); } + + /** + * @Given user :user has sent the following app-open request: + * + * @param string $user + * @param TableNode $properties + * + * @return void + * @throws GuzzleException + */ + public function userHasSentTheFollowingAppOpenRequest(string $user, TableNode $properties): void { + $rows = $properties->getRowsHash(); + $appResponse = CollaborationHelper::sendPOSTRequestToAppOpen( + $this->spacesContext->getFileId($user, $rows['space'], $rows['resource']), + $rows['app'], + $this->featureContext->getActualUsername($user), + $this->featureContext->getPasswordForUser($user), + $this->featureContext->getBaseUrl(), + $this->featureContext->getStepLineRef() + ); + $this->featureContext->theHTTPStatusCodeShouldBe(200, '', $appResponse); + $this->setLastAppOpenData($appResponse->getBody()->getContents()); + } + + /** + * @When user :user tries to get the information of the last opened file using wopi endpoint + * @When user :user gets the information of the last opened file using wopi endpoint + * + * @param string $user + * + * @return void + * @throws GuzzleException + */ + public function userGetsTheInformationOfTheLastOpenedFileUsingWopiEndpoint(string $user): void { + $response = json_decode($this->getLastAppOpenData()); + $accessToken = $response->form_parameters->access_token; + + // Extract the WOPISrc from the app_url + $parsedUrl = parse_url($response->app_url); + parse_str($parsedUrl['query'], $queryParams); + $wopiSrc = $queryParams['WOPISrc']; + + $this->featureContext->setResponse( + HttpRequestHelper::get( + $wopiSrc . "?access_token=$accessToken", + $this->featureContext->getStepLineRef() + ) + ); + } } diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml index 80426135cd..77adc1a097 100644 --- a/tests/acceptance/config/behat.yml +++ b/tests/acceptance/config/behat.yml @@ -412,6 +412,7 @@ default: - FeatureContext: *common_feature_context_params - SharingNgContext: - CollaborationContext: + - TrashbinContext: cliCommands: diff --git a/tests/acceptance/features/apiCollaboration/checkFileInfo.feature b/tests/acceptance/features/apiCollaboration/checkFileInfo.feature index f881aa34e8..f9767905c8 100644 --- a/tests/acceptance/features/apiCollaboration/checkFileInfo.feature +++ b/tests/acceptance/features/apiCollaboration/checkFileInfo.feature @@ -599,3 +599,620 @@ Feature: check file info with different wopi apps | Collabora | | FakeOffice | | OnlyOffice | + + @issue-10097 + Scenario Outline: try to get file info of deleted file with office suites + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | | + And user "Alice" has deleted file "/textfile0.txt" + When user "Alice" tries to get the information of the last opened file using wopi endpoint + Then the HTTP status code should be "404" + Examples: + | office-suites | + | Collabora | + | FakeOffice | + | OnlyOffice | + + + Scenario: get file info of restored file from trashbin (collabora) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | Collabora | + And user "Alice" has deleted file "/textfile0.txt" + And user "Alice" has restored the file with original path "/textfile0.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "DisablePrint", + "OwnerId", + "PostMessageOrigin", + "Size", + "UserCanWrite", + "UserCanNotWriteRelative", + "UserId", + "UserFriendlyName", + "EnableOwnerTermination", + "SupportsLocks", + "SupportsRename", + "UserCanRename", + "BreadcrumbDocName" + ], + "properties": { + "BaseFileName": { + "const": "textfile0.txt" + }, + "PostMessageOrigin": { + "const": "https://localhost:9200" + }, + "DisablePrint": { + "const": false + }, + "OwnerId": { + "type": "string" + }, + "Size": { + "const": 11 + }, + "UserCanWrite": { + "const": true + }, + "UserCanNotWriteRelative": { + "const": false + }, + "EnableOwnerTermination": { + "const": true + }, + "UserId": { + "type": "string" + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "UserCanRename": { + "const": true + }, + "BreadcrumbDocName": { + "const": "textfile0.txt" + } + } + } + """ + + + Scenario: get file info of restored file from trashbin (fakeOffice) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | FakeOffice | + And user "Alice" has deleted file "/textfile0.txt" + And user "Alice" has restored the file with original path "/textfile0.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "OwnerId", + "Size", + "UserId", + "Version", + "SupportsCobalt", + "SupportsContainers", + "SupportsDeleteFile", + "SupportsEcosystem", + "SupportsExtendedLockLength", + "SupportsFolders", + "SupportsGetLock", + "SupportsLocks", + "SupportsRename", + "SupportsUpdate", + "SupportsUserInfo", + "UserFriendlyName", + "ReadOnly", + "RestrictedWebViewOnly", + "UserCanAttend", + "UserCanNotWriteRelative", + "UserCanPresent", + "UserCanRename", + "UserCanWrite", + "AllowAdditionalMicrosoftServices", + "AllowExternalMarketplace", + "DisablePrint", + "DisableTranslation", + "BreadcrumbDocName" + ], + "properties": { + "BaseFileName": { + "const": "textfile0.txt" + }, + "OwnerId": { + "type": "string" + }, + "Size": { + "const": 11 + }, + "UserId": { + "type": "string" + }, + "Version": { + "type": "string" + }, + "SupportsCobalt": { + "const": false + }, + "SupportsContainers": { + "const": false + }, + "SupportsDeleteFile": { + "const": true + }, + "SupportsEcosystem": { + "const": false + }, + "SupportsExtendedLockLength": { + "const": true + }, + "SupportsFolders": { + "const": false + }, + "SupportsGetLock": { + "const": true + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "SupportsUpdate": { + "const": true + }, + "SupportsUserInfo": { + "const": false + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "ReadOnly": { + "const": false + }, + "RestrictedWebViewOnly": { + "const": false + }, + "UserCanAttend": { + "const": false + }, + "UserCanNotWriteRelative": { + "const": false + }, + "UserCanPresent": { + "const": false + }, + "UserCanRename": { + "const": true + }, + "UserCanWrite": { + "const": true + }, + "AllowAdditionalMicrosoftServices": { + "const": false + }, + "AllowExternalMarketplace": { + "const": false + }, + "DisablePrint": { + "const": false + }, + "DisableTranslation": { + "const": false + }, + "BreadcrumbDocName": { + "const": "textfile0.txt" + } + } + } + """ + + + Scenario: get file info of restored file from trashbin (onlyOffice) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | OnlyOffice | + And user "Alice" has deleted file "/textfile0.txt" + And user "Alice" has restored the file with original path "/textfile0.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "Version", + "BreadcrumbDocName", + "BreadcrumbFolderName", + "BreadcrumbFolderUrl", + "PostMessageOrigin", + "DisablePrint", + "UserFriendlyName", + "UserId", + "ReadOnly", + "UserCanNotWriteRelative", + "UserCanRename", + "UserCanWrite", + "SupportsLocks", + "SupportsRename", + "SupportsUpdate" + ], + "properties": { + "BaseFileName": { + "const": "textfile0.txt" + }, + "UserId": { + "type": "string" + }, + "Version": { + "type": "string" + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "SupportsUpdate": { + "const": true + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "ReadOnly": { + "const": false + }, + "UserCanNotWriteRelative": { + "const": false + }, + "UserCanRename": { + "const": true + }, + "UserCanWrite": { + "const": true + }, + "DisablePrint": { + "const": false + }, + "BreadcrumbDocName": { + "const": "textfile0.txt" + }, + "BreadcrumbFolderName": { + "const": "Alice Hansen" + }, + "BreadcrumbFolderUrl": { + "type": "string" + }, + "PostMessageOrigin": { + "type": "string" + } + } + } + """ + + + Scenario: get file info after renaming file (onlyOffice) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | OnlyOffice | + And user "Alice" has moved file "textfile0.txt" to "renamedfile.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "Version", + "BreadcrumbDocName", + "BreadcrumbFolderName", + "BreadcrumbFolderUrl", + "PostMessageOrigin", + "DisablePrint", + "UserFriendlyName", + "UserId", + "ReadOnly", + "UserCanNotWriteRelative", + "UserCanRename", + "UserCanWrite", + "SupportsLocks", + "SupportsRename", + "SupportsUpdate" + ], + "properties": { + "BaseFileName": { + "const": "renamedfile.txt" + }, + "UserId": { + "type": "string" + }, + "Version": { + "type": "string" + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "SupportsUpdate": { + "const": true + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "ReadOnly": { + "const": false + }, + "UserCanNotWriteRelative": { + "const": false + }, + "UserCanRename": { + "const": true + }, + "UserCanWrite": { + "const": true + }, + "DisablePrint": { + "const": false + }, + "BreadcrumbDocName": { + "const": "renamedfile.txt" + }, + "BreadcrumbFolderName": { + "const": "Alice Hansen" + }, + "BreadcrumbFolderUrl": { + "type": "string" + }, + "PostMessageOrigin": { + "type": "string" + } + } + } + """ + + + Scenario: get file info after renaming file (collabora) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | Collabora | + And user "Alice" has moved file "textfile0.txt" to "renamedfile.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "DisablePrint", + "OwnerId", + "PostMessageOrigin", + "Size", + "UserCanWrite", + "UserCanNotWriteRelative", + "UserId", + "UserFriendlyName", + "EnableOwnerTermination", + "SupportsLocks", + "SupportsRename", + "UserCanRename", + "BreadcrumbDocName" + ], + "properties": { + "BaseFileName": { + "const": "renamedfile.txt" + }, + "PostMessageOrigin": { + "const": "https://localhost:9200" + }, + "DisablePrint": { + "const": false + }, + "OwnerId": { + "type": "string" + }, + "Size": { + "const": 11 + }, + "UserCanWrite": { + "const": true + }, + "UserCanNotWriteRelative": { + "const": false + }, + "EnableOwnerTermination": { + "const": true + }, + "UserId": { + "type": "string" + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "UserCanRename": { + "const": true + }, + "BreadcrumbDocName": { + "const": "renamedfile.txt" + } + } + } + """ + + + Scenario: get file info after renaming file with (fakeOffice) + Given user "Alice" has uploaded file with content "hello world" to "/textfile0.txt" + And user "Alice" has sent the following app-open request: + | resource | textfile0.txt | + | space | Personal | + | app | FakeOffice | + And user "Alice" has moved file "textfile0.txt" to "renamedfile.txt" + When user "Alice" gets the information of the last opened file using wopi endpoint + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "BaseFileName", + "OwnerId", + "Size", + "UserId", + "Version", + "SupportsCobalt", + "SupportsContainers", + "SupportsDeleteFile", + "SupportsEcosystem", + "SupportsExtendedLockLength", + "SupportsFolders", + "SupportsGetLock", + "SupportsLocks", + "SupportsRename", + "SupportsUpdate", + "SupportsUserInfo", + "UserFriendlyName", + "ReadOnly", + "RestrictedWebViewOnly", + "UserCanAttend", + "UserCanNotWriteRelative", + "UserCanPresent", + "UserCanRename", + "UserCanWrite", + "AllowAdditionalMicrosoftServices", + "AllowExternalMarketplace", + "DisablePrint", + "DisableTranslation", + "BreadcrumbDocName" + ], + "properties": { + "BaseFileName": { + "const": "renamedfile.txt" + }, + "OwnerId": { + "type": "string" + }, + "Size": { + "const": 11 + }, + "UserId": { + "type": "string" + }, + "Version": { + "type": "string" + }, + "SupportsCobalt": { + "const": false + }, + "SupportsContainers": { + "const": false + }, + "SupportsDeleteFile": { + "const": true + }, + "SupportsEcosystem": { + "const": false + }, + "SupportsExtendedLockLength": { + "const": true + }, + "SupportsFolders": { + "const": false + }, + "SupportsGetLock": { + "const": true + }, + "SupportsLocks": { + "const": true + }, + "SupportsRename": { + "const": true + }, + "SupportsUpdate": { + "const": true + }, + "SupportsUserInfo": { + "const": false + }, + "UserFriendlyName": { + "const": "Alice Hansen" + }, + "ReadOnly": { + "const": false + }, + "RestrictedWebViewOnly": { + "const": false + }, + "UserCanAttend": { + "const": false + }, + "UserCanNotWriteRelative": { + "const": false + }, + "UserCanPresent": { + "const": false + }, + "UserCanRename": { + "const": true + }, + "UserCanWrite": { + "const": true + }, + "AllowAdditionalMicrosoftServices": { + "const": false + }, + "AllowExternalMarketplace": { + "const": false + }, + "DisablePrint": { + "const": false + }, + "DisableTranslation": { + "const": false + }, + "BreadcrumbDocName": { + "const": "renamedfile.txt" + } + } + } + """