diff --git a/.drone.star b/.drone.star index d0623e6677..4941f0d1fb 100644 --- a/.drone.star +++ b/.drone.star @@ -1506,6 +1506,7 @@ def ocisServer(storage, accounts_hash_difficulty = 4, volumes = []): environment = { #'OCIS_LOG_LEVEL': 'debug', "OCIS_URL": "https://ocis-server:9200", + "GRAPH_SPACES_WEBDAV_BASE": "https://ocis-server:9200/dav/spaces/", "STORAGE_HOME_DRIVER": "%s" % (storage), "STORAGE_USERS_DRIVER": "%s" % (storage), "STORAGE_DRIVER_OCIS_ROOT": "/srv/app/tmp/ocis/storage/users", diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml index 131a0d0afd..9eb1c5c94d 100644 --- a/tests/acceptance/config/behat.yml +++ b/tests/acceptance/config/behat.yml @@ -6,6 +6,7 @@ default: apiAccountsHashDifficulty: paths: - '%paths.base%/../features/apiAccountsHashDifficulty' + - '%paths.base%/../features/apiSpaces' context: &common_ldap_suite_context parameters: ldapAdminPassword: admin @@ -13,7 +14,7 @@ default: ldapGroupsOU: TestGroups ldapInitialUserFilePath: /../../config/ldap-users.ldif contexts: - - RevaContext: + - GraphApiContext: - OccContext: - FeatureContext: &common_feature_context_params baseUrl: http://localhost:8080 diff --git a/tests/acceptance/features/apiSpaces/ListSpaces.feature b/tests/acceptance/features/apiSpaces/ListSpaces.feature new file mode 100644 index 0000000000..6bee716143 --- /dev/null +++ b/tests/acceptance/features/apiSpaces/ListSpaces.feature @@ -0,0 +1,15 @@ +@api @skipOnOcV10 +Feature: List and create spaces + As a user + I want to be able to work with personal and project spaces to collaborate with individuals and teams + + Note - this feature is run in CI with ACCOUNTS_HASH_DIFFICULTY set to the default for production + See https://github.com/owncloud/ocis/issues/1542 and https://github.com/owncloud/ocis/pull/839 + + Scenario: list own spaces + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" lists all available spaces via the GraphApi + Then the HTTP status code should be "200" + And the webDavUrl of the personal space has been found + And user "Alice" lists the content of the personal space root using the WebDav Api + And the HTTP status code should be "207" diff --git a/tests/acceptance/features/bootstrap/GraphApiContext.php b/tests/acceptance/features/bootstrap/GraphApiContext.php new file mode 100644 index 0000000000..a7429b606e --- /dev/null +++ b/tests/acceptance/features/bootstrap/GraphApiContext.php @@ -0,0 +1,211 @@ +personalDriveWebDavUrl; + } + + /** + * @param string $personalDriveWebDavUrl + */ + public function setPersonalDriveWebDavUrl(string $personalDriveWebDavUrl): void + { + $this->personalDriveWebDavUrl = $personalDriveWebDavUrl; + } + /** + * @BeforeScenario + * + * @param BeforeScenarioScope $scope + * + * @return void + * @throws Exception + */ + public function setUpScenario(BeforeScenarioScope $scope): void + { + // Get the environment + $environment = $scope->getEnvironment(); + // Get all the contexts you need in this context + $this->featureContext = $environment->getContext('FeatureContext'); + SetupHelper::init( + $this->featureContext->getAdminUsername(), + $this->featureContext->getAdminPassword(), + $this->featureContext->getBaseUrl(), + $this->featureContext->getOcPath() + ); + } + + /** + * Send Graph List Drives Request + * + * @param $baseUrl + * @param $user + * @param $password + * @param $arguments + * @param string $xRequestId + * @param array $body + * @param array $headers + * @return ResponseInterface + */ + public function listSpacesRequest( + $baseUrl, + $user, + $password, + $arguments, + string $xRequestId = '', + array $body = [], + array $headers = [] + ) { + $fullUrl = $baseUrl; + if (!str_ends_with($fullUrl, '/')) { + $fullUrl .= '/'; + } + $fullUrl .= "graph/v1.0/me/drives/" . $arguments; + + return HttpRequestHelper::sendRequest($fullUrl, $xRequestId, 'GET', $user, $password, $headers, $body); + } + + /** + * Send Graph List Drives Request + * + * @param $baseUrl + * @param $user + * @param $password + * @param string $spaceName + * @param string $xRequestId + * @param array $headers + * @return ResponseInterface + */ + public function sendCreateSpaceRequest( + $baseUrl, + $user, + $password, + string $spaceName, + string $xRequestId = '', + array $headers = [] + ): ResponseInterface + { + $fullUrl = $baseUrl; + if (!str_ends_with($fullUrl, '/')) { + $fullUrl .= '/'; + } + $fullUrl .= "drives/" . $spaceName; + + return HttpRequestHelper::sendRequest($fullUrl, $xRequestId, 'POST', $user, $password, $headers); + } + + /** + * Send Propfind Request to Url + * + * @param $fullUrl + * @param $user + * @param $password + * @param string $xRequestId + * @param array $headers + * @return ResponseInterface + */ + public function sendPropfindRequestToUrl( + $fullUrl, + $user, + $password, + string $xRequestId = '', + array $headers = [] + ): ResponseInterface + { + return HttpRequestHelper::sendRequest($fullUrl, $xRequestId, 'PROPFIND', $user, $password, $headers); + } + + /** + * @When /^user "([^"]*)" lists all available spaces via the GraphApi$/ + * + * @param $user + * @return void + */ + public function theUserListsAllHisAvailableSpacesUsingTheGraphApi($user): void + { + $this->featureContext->setResponse( + $this->listSpacesRequest( + $this->featureContext->getBaseUrl(), + $user, + $this->featureContext->getPasswordForUser($user), + "", + "" + ) + ); + } + + /** + * @Then the webDavUrl of the personal space has been found + * + * @return void + */ + public function theWebDavUrlOfThePersonalSpaceHasBeenFound(): void + { + $rawBody = $this->featureContext->getResponse()->getBody()->getContents(); + $drives = []; + if (isset(\json_decode($rawBody, true)["value"])) { + $drives = \json_decode($rawBody, true)["value"]; + } + + Assert::assertArrayHasKey(0, $drives, "No drives were found on that endpoint"); + + foreach($drives as $drive) { + if (isset($drive["driveType"]) && $drive["driveType"] === "personal") { + $this->setPersonalDriveWebDavUrl($drive["root"]["webDavUrl"]); + + Assert::assertNotEmpty( + $drive["root"]["webDavUrl"], + "The personal space attributes contain no webDavUrl" + ); + } + } + } + + /** + * @When /^user "([^"]*)" lists the content of the personal space root using the WebDav Api$/ + * + * @param $user + * + * @return void + */ + public function theUserListsTheContentOfASpaceRootUsingTheWebDAvApi($user): void + { + $this->featureContext->setResponse( + $this->sendPropfindRequestToUrl( + $this->getPersonalDriveWebDavUrl(), + $user, + $this->featureContext->getPasswordForUser($user), + "", + [], + [], + [] + ) + ); + } +} diff --git a/tests/acceptance/features/bootstrap/RevaContext.php b/tests/acceptance/features/bootstrap/RevaContext.php deleted file mode 100644 index 2a41222029..0000000000 --- a/tests/acceptance/features/bootstrap/RevaContext.php +++ /dev/null @@ -1,40 +0,0 @@ -getEnvironment(); - // Get all the contexts you need in this context - $this->featureContext = $environment->getContext('FeatureContext'); - SetupHelper::init( - $this->featureContext->getAdminUsername(), - $this->featureContext->getAdminPassword(), - $this->featureContext->getBaseUrl(), - $this->featureContext->getOcPath() - ); - } -}