diff --git a/tests/TestHelpers/GraphHelper.php b/tests/TestHelpers/GraphHelper.php index 8ff0c9c252..b4f5863b49 100644 --- a/tests/TestHelpers/GraphHelper.php +++ b/tests/TestHelpers/GraphHelper.php @@ -1756,7 +1756,7 @@ class GraphHelper { * @return ResponseInterface * @throws GuzzleException */ - public static function updateLinkShare( + public static function updateShare( string $baseUrl, string $xRequestId, string $user, diff --git a/tests/acceptance/features/apiSharingNg/sharedByMe.feature b/tests/acceptance/features/apiSharingNg/sharedByMe.feature index b9f0836763..1f30c008f6 100644 --- a/tests/acceptance/features/apiSharingNg/sharedByMe.feature +++ b/tests/acceptance/features/apiSharingNg/sharedByMe.feature @@ -1451,74 +1451,3 @@ Feature: resources shared by user } } """ - - - Scenario: user updates expiration date of a share - Given user "Alice" has uploaded file with content "hello world" to "testfile.txt" - And user "Alice" has sent the following share invitation: - | resource | testfile.txt | - | space | Personal | - | sharee | Brian | - | shareType | user | - | permissionsRole | Viewer | - When user "Alice" updates the last share with the following using the Graph API: - | space | Personal | - | resource | testfile.txt | - | expirationDateTime | 2200-07-15T14:00:00Z | - Then the HTTP status code should be "200" - And the JSON data of the response should match - """ - { - "type": "object", - "required": [ - "expirationDateTime", - "grantedToV2", - "id", - "roles" - ], - "properties": { - "expirationDateTime": { - "type": "string", - "enum": ["2200-07-15T14:00:00Z"] - }, - "grantedToV2": { - "type": "object", - "required": [ - "user" - ], - "properties":{ - "user": { - "type": "object", - "required": [ - "displayName", - "id" - ], - "properties": { - "displayName": { - "type": "string", - "enum": ["Brian Murphy"] - }, - "id": { - "type": "string", - "pattern": "^%user_id_pattern%$" - } - } - } - } - }, - "id": { - "type": "string", - "pattern": "^%permissions_id_pattern%$" - }, - "roles": { - "type": "array", - "items": [ - { - "type": "string", - "pattern": "^%role_id_pattern%$" - } - ] - } - } - } - """ diff --git a/tests/acceptance/features/apiSharingNg/updateShareInvitations.feature b/tests/acceptance/features/apiSharingNg/updateShareInvitations.feature new file mode 100644 index 0000000000..0ba82e457d --- /dev/null +++ b/tests/acceptance/features/apiSharingNg/updateShareInvitations.feature @@ -0,0 +1,160 @@ +Feature: Update permission of a share + As a user + I want to update resources shared with me + So that I can have more control over my shares and manage it + https://owncloud.dev/libre-graph-api/#/drives.permissions/UpdatePermission + + Background: + Given these users have been created with default attributes and without skeleton files: + | username | + | Alice | + | Brian | + + + Scenario: user updates expiration date of a share + Given user "Alice" has uploaded file with content "hello world" to "testfile.txt" + And user "Alice" has sent the following share invitation: + | resource | testfile.txt | + | space | Personal | + | sharee | Brian | + | shareType | user | + | permissionsRole | Viewer | + | expirationDateTime | 2025-07-15T14:00:00Z | + When user "Alice" updates the last share with the following using the Graph API: + | space | Personal | + | resource | testfile.txt | + | expirationDateTime | 2200-07-15T14:00:00Z | + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "expirationDateTime", + "grantedToV2", + "id", + "roles" + ], + "properties": { + "expirationDateTime": { + "type": "string", + "enum": ["2200-07-15T14:00:00Z"] + }, + "grantedToV2": { + "type": "object", + "required": [ + "user" + ], + "properties":{ + "user": { + "type": "object", + "required": [ + "displayName", + "id" + ], + "properties": { + "displayName": { + "type": "string", + "enum": ["Brian Murphy"] + }, + "id": { + "type": "string", + "pattern": "^%user_id_pattern%$" + } + } + } + } + }, + "id": { + "type": "string", + "pattern": "^%permissions_id_pattern%$" + }, + "roles": { + "type": "array", + "items": [ + { + "type": "string", + "pattern": "^%role_id_pattern%$" + } + ] + } + } + } + """ + + + Scenario Outline: user updates role of a share + Given user "Alice" has uploaded file with content "to share" to "/textfile1.txt" + And user "Alice" has created folder "FolderToShare" + And user "Alice" has sent the following share invitation: + | resource | | + | space | Personal | + | sharee | Brian | + | shareType | user | + | permissionsRole | | + When user "Alice" updates the last share with the following using the Graph API: + | permissionsRole | | + | space | Personal | + | resource | | + Then the HTTP status code should be "200" + And the JSON data of the response should match + """ + { + "type": "object", + "required": [ + "grantedToV2", + "id", + "roles" + ], + "properties": { + "grantedToV2": { + "type": "object", + "required": [ + "user" + ], + "properties":{ + "user": { + "type": "object", + "required": [ + "displayName", + "id" + ], + "properties": { + "displayName": { + "type": "string", + "enum": ["Brian Murphy"] + }, + "id": { + "type": "string", + "pattern": "^%user_id_pattern%$" + } + } + } + } + }, + "id": { + "type": "string", + "pattern": "^%permissions_id_pattern%$" + }, + "roles": { + "type": "array", + "items": [ + { + "type": "string", + "pattern": "^%role_id_pattern%$" + } + ] + } + } + } + """ + Examples: + | previous-permissions-role | path | new-permissions-role | + | Viewer | textfile1.txt | File Editor | + | File Editor | textfile1.txt | Viewer | + | Viewer | FolderToShare | Uploader | + | Viewer | FolderToShare | Editor | + | Editor | FolderToShare | Viewer | + | Editor | FolderToShare | Uploader | + | Uploader | FolderToShare | Editor | + | Uploader | FolderToShare | Viewer | \ No newline at end of file diff --git a/tests/acceptance/features/bootstrap/SharingNgContext.php b/tests/acceptance/features/bootstrap/SharingNgContext.php index da74b95607..bdd91d4d59 100644 --- a/tests/acceptance/features/bootstrap/SharingNgContext.php +++ b/tests/acceptance/features/bootstrap/SharingNgContext.php @@ -243,7 +243,7 @@ class SharingNgContext implements Context { $response = $this->featureContext->shareNgGetLastCreatedUserGroupShare(); $permissionID = json_decode($response->getBody()->getContents())->value[0]->id; $this->featureContext->setResponse( - $this->updateShare( + $this->updateResourceShare( $user, $table, $permissionID @@ -251,6 +251,41 @@ class SharingNgContext implements Context { ); } + /** + * @param string $user + * @param TableNode $body + * @param string $permissionID + * + * @return ResponseInterface + */ + public function updateResourceShare(string $user, TableNode $body, string $permissionID): ResponseInterface { + $bodyRows = $body->getRowsHash(); + $space = $bodyRows['space']; + $resource = $bodyRows['resource']; + $spaceId = ($this->spacesContext->getSpaceByName($user, $space))["id"]; + $itemId = $this->spacesContext->getResourceId($user, $space, $resource); + $body = []; + + if (\array_key_exists('permissionsRole', $bodyRows)) { + $body["roles"] = [GraphHelper::getPermissionsRoleIdByName($bodyRows['permissionsRole'])]; + } + + if (\array_key_exists('expirationDateTime', $bodyRows)) { + $body["expirationDateTime"] = $bodyRows['expirationDateTime']; + } + + return GraphHelper::updateShare( + $this->featureContext->getBaseUrl(), + $this->featureContext->getStepLineRef(), + $user, + $this->featureContext->getPasswordForUser($user), + $spaceId, + $itemId, + \json_encode($body), + $permissionID + ); + } + /** * @When user :user sends the following share invitation with file-id :fileId using the Graph API: * @@ -308,7 +343,7 @@ class SharingNgContext implements Context { */ public function userUpdatesLastPublicLinkShareUsingTheGraphApiWith(string $user, TableNode $body):void { $this->featureContext->setResponse( - $this->updateShare( + $this->updateLinkShare( $user, $body, $this->featureContext->shareNgGetLastCreatedLinkShareID() @@ -323,35 +358,23 @@ class SharingNgContext implements Context { * * @return ResponseInterface */ - public function updateShare(string $user, TableNode $body, string $permissionID): ResponseInterface { + public function updateLinkShare(string $user, TableNode $body, string $permissionID): ResponseInterface { $bodyRows = $body->getRowsHash(); $space = $bodyRows['space']; $resource = $bodyRows['resource']; $spaceId = ($this->spacesContext->getSpaceByName($user, $space))["id"]; $itemId = $this->spacesContext->getResourceId($user, $space, $resource); + $body = []; - if (\array_key_exists('role', $bodyRows) && \array_key_exists('expirationDateTime', $bodyRows)) { - $body = [ - "expirationDateTime" => $bodyRows['expirationDateTime'], - "link" => [ - "type" => $bodyRows['permissionsRole'] - ] - ]; - } elseif (\array_key_exists('permissionsRole', $bodyRows)) { - $body = [ - "link" => [ - "type" => $bodyRows['permissionsRole'] - ] - ]; - } elseif (\array_key_exists('expirationDateTime', $bodyRows)) { - $body = [ - "expirationDateTime" => $bodyRows['expirationDateTime'] - ]; - } else { - throw new Error('Expiration date or role is missing to update for share link!'); + if (\array_key_exists('permissionsRole', $bodyRows)) { + $body["link"]["type"] = $bodyRows['permissionsRole']; } - return GraphHelper::updateLinkShare( + if (\array_key_exists('expirationDateTime', $bodyRows)) { + $body["expirationDateTime"] = $bodyRows['expirationDateTime']; + } + + return GraphHelper::updateShare( $this->featureContext->getBaseUrl(), $this->featureContext->getStepLineRef(), $user,