diff --git a/tests/TestHelpers/GraphHelper.php b/tests/TestHelpers/GraphHelper.php index ea1106670b..68dd799303 100644 --- a/tests/TestHelpers/GraphHelper.php +++ b/tests/TestHelpers/GraphHelper.php @@ -586,6 +586,37 @@ class GraphHelper { ); } + /** + * returns single group information along with its member information when groupId is provided + * else return all group information along with its member information + * + * @param string $baseUrl + * @param string $xRequestId + * @param string $adminUser + * @param string $adminPassword + * @param string|null $groupId + * + * @return ResponseInterface + * @throws GuzzleException + */ + public static function getSingleOrAllGroupsAlongWithMembers( + string $baseUrl, + string $xRequestId, + string $adminUser, + string $adminPassword, + ?string $groupId = null + ): ResponseInterface { + // we can expand to get list of members for a single group with groupId and also expand to get all groups with all its members + $endPath = ($groupId) ? '/' . $groupId . '?$expand=members' : '?$expand=members'; + $url = self::getFullUrl($baseUrl, 'groups' . $endPath); + return HttpRequestHelper::get( + $url, + $xRequestId, + $adminUser, + $adminPassword + ); + } + /** * returns json encoded payload for user creating request * diff --git a/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md b/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md index 92ce1b8c96..db1be7a5f9 100644 --- a/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-localAPI-on-OCIS-storage.md @@ -105,5 +105,8 @@ The expected failures in this file are from features in the owncloud/ocis repo. #### [Space admin should not not be able to change the user quota](https://github.com/owncloud/ocis/issues/5475) - [apiSpaces/spaceManagement.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiSpaces/spaceManagement.feature#L69) +#### [Normal user can get expanded members information of a group](https://github.com/owncloud/ocis/issues/5604) +- [apiGraph/getGroup.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/getGroup.feature#L100) + Note: always have an empty line at the end of this file. The bash script that processes this file requires that the last line has a newline on the end. diff --git a/tests/acceptance/features/apiGraph/getGroup.feature b/tests/acceptance/features/apiGraph/getGroup.feature index d4fc69ac72..f75c466b15 100644 --- a/tests/acceptance/features/apiGraph/getGroup.feature +++ b/tests/acceptance/features/apiGraph/getGroup.feature @@ -52,3 +52,56 @@ Feature: get groups and their members When user "Brian" gets all the members of group "tea-lover" using the Graph API Then the HTTP status code should be "401" And the last response should be an unauthorized response + + + Scenario: admin user gets all groups along with its member's information + Given these users have been created with default attributes and without skeleton files: + | username | + | Brian | + | Carol | + And group "tea-lover" has been created + And group "coffee-lover" has been created + And user "Alice" has been added to group "tea-lover" + And user "Brian" has been added to group "coffee-lover" + And user "Carol" has been added to group "tea-lover" + When user "Alice" retrieves all groups along with their members using the Graph API + Then the HTTP status code should be "200" + And the group 'coffee-lover' should have the following member information + | displayName | id | mail | onPremisesSamAccountName | + | Brian Murphy | %uuid_v4% | brian@example.org | Brian | + And the group 'tea-lover' should have the following member information + | displayName | id | mail | onPremisesSamAccountName | + | Alice Hansen | %uuid_v4% | alice@example.org | Alice | + | Carol King | %uuid_v4% | carol@example.org | Carol | + + + Scenario: normal user gets all groups along with their members information + Given user "Brian" has been created with default attributes and without skeleton files + And group "tea-lover" has been created + And group "coffee-lover" has been created + And user "Alice" has been added to group "tea-lover" + And user "Brian" has been added to group "coffee-lover" + When user "Brian" retrieves all groups along with their members using the Graph API + Then the HTTP status code should be "401" + And the last response should be an unauthorized response + + + Scenario: admin user gets a group along with their members information + Given user "Brian" has been created with default attributes and without skeleton files + And group "tea-lover" has been created + And user "Alice" has been added to group "tea-lover" + And user "Brian" has been added to group "tea-lover" + When user "Alice" gets all the members information of group "tea-lover" using the Graph API + And the group 'tea-lover' should have the following member information + | displayName | id | mail | onPremisesSamAccountName | + | Alice Hansen | %uuid_v4% | alice@example.org | Alice | + | Brian Murphy | %uuid_v4% | brian@example.org | Brian | + + Scenario: normal user gets a group along with their members information + Given user "Brian" has been created with default attributes and without skeleton files + And group "tea-lover" has been created + And user "Alice" has been added to group "tea-lover" + And user "Brian" has been added to group "tea-lover" + When user "Brian" gets all the members information of group "tea-lover" using the Graph API + Then the HTTP status code should be "401" + And the last response should be an unauthorized response diff --git a/tests/acceptance/features/bootstrap/GraphContext.php b/tests/acceptance/features/bootstrap/GraphContext.php index 96b0b780ad..64e62163ff 100644 --- a/tests/acceptance/features/bootstrap/GraphContext.php +++ b/tests/acceptance/features/bootstrap/GraphContext.php @@ -598,6 +598,26 @@ class GraphContext implements Context { ); } + /** + * + * @param string $user + * @param string|null $group + * + * @return ResponseInterface + * @throws GuzzleException + */ + public function listSingleOrAllGroupsAlongWithAllMemberInformation(string $user, ?string $group = null): ResponseInterface { + $credentials = $this->getAdminOrUserCredentials($user); + + return GraphHelper::getSingleOrAllGroupsAlongWithMembers( + $this->featureContext->getBaseUrl(), + $this->featureContext->getStepLineRef(), + $credentials["username"], + $credentials["password"], + ($group) ? $this->featureContext->getAttributeOfCreatedGroup($group, 'id') : null + ); + } + /** * returns list of users of a group * @@ -996,6 +1016,59 @@ class GraphContext implements Context { $this->featureContext->setResponse($this->listGroupMembers($group, $user)); } + /** + * @When user :user retrieves all groups along with their members using the Graph API + * @When user :user gets all the members information of group :group using the Graph API + * + * @param string $user + * @param string $group + * + * @return void + * @throws GuzzleException + */ + public function userRetrievesAllMemberInformationOfSingleOrAllGroups(string $user, string $group = ''): void { + $this->featureContext->setResponse($this->listSingleOrAllGroupsAlongWithAllMemberInformation($user, $group)); + } + + /** + * @Then the group :group should have the following member information + * + * @param string $group + * @param TableNode $table + * + * @return void + * @throws GuzzleException + */ + public function theGroupShouldHaveTheFollowingMemberInformation(string $group, TableNode $table): void { + $response = $this->featureContext->getJsonDecodedResponse($this->featureContext->getResponse()); + $rows = $table->getHash(); + $currentMemberIndex = 0; + if (isset($response['value'])) { + $response = $response['value']; + $groupFoundInResponse = false; + foreach ($response as $value) { + if ($value['displayName'] === $group) { + $groupFoundInResponse = true; + foreach ($rows as $row) { + $this->checkUserInformation($row, $value['members'][$currentMemberIndex]); + $currentMemberIndex++; + } + break; + } + } + if (!$groupFoundInResponse) { + throw new Error( + 'Group ' . $group . " could not be found in the response." + ); + } + } else { + foreach ($rows as $row) { + $this->checkUserInformation($row, $response['members'][$currentMemberIndex]); + $currentMemberIndex++; + } + } + } + /** * @Then the last response should be an unauthorized response *