Merge pull request #2679 from owncloud/api-tests-forSpace

Api tests for space
This commit is contained in:
Viktor Scharf
2021-10-28 08:32:44 +02:00
committed by GitHub
2 changed files with 184 additions and 17 deletions
@@ -1,28 +1,66 @@
@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
I want to be able to work with personal and project spaces
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
Background:
Given user "Alice" has been created with default attributes and without skeleton files
Scenario: Alice request her space via the Graph api, she expects a 200 code and the correct data in the response
When user "Alice" lists all available spaces via the GraphApi
Then the HTTP status code should be "200"
When user "Alice" lists the content of the space with the name "Alice Hansen" using the WebDav Api
And the json responded should contain a space "Alice Hansen" with these key and value pairs:
| key | value |
| driveType | personal |
| id | %space_id% |
| name | Alice Hansen |
| quota@@@state | normal |
| root@@@webDavUrl | %base_url%/dav/spaces/%space_id% |
Scenario: Alice requests her space via webDav api, she expects a 207 code
When user "Alice" lists all available spaces via the GraphApi
And user "Alice" lists the content of the space with the name "Alice Hansen" using the WebDav Api
Then the HTTP status code should be "207"
#Then the propfind result of the space should contain these entries:
#| .space/ |
Then the propfind result of the space should not contain these entries:
| file |
Scenario: Alice tries to create Space via Graph api without permission, she expects a response of 401
When user "Alice" creates a space "Project Mars" of type "project" with the default quota using the GraphApi
Then the HTTP status code should be "401"
When the administrator gives "Alice" the role "Admin" using the settings api
Scenario: Alice creates Space via Graph api with default quota, she expects a 201 code the correct data and that space exists
Given the administrator gives "Alice" the role "Admin" using the settings api
When user "Alice" creates a space "Project Mars" of type "project" with the default quota using the GraphApi
Then the HTTP status code should be "201"
Then the json responded should contain these key and value pairs
| key | value |
| driveType | project |
| name | Project Mars |
And the json responded should contain a space "Project Mars" with these key and value pairs:
| key | value |
| driveType | project |
| name | Project Mars |
| quota@@@total | 1000000000 |
| root@@@webDavUrl | %base_url%/dav/spaces/%space_id% |
When user "Alice" lists all available spaces via the GraphApi
And user "Alice" lists the content of the space with the name "Project Mars" using the WebDav Api
Then the propfind result of the space should contain these entries:
| .space/ |
Scenario: Alice creates Space via Graph api with certain quota, she expects a 201 code and the correct data in the response
Given the administrator gives "Alice" the role "Admin" using the settings api
When user "Alice" creates a space "Project Venus" of type "project" with quota "2000" using the GraphApi
Then the HTTP status code should be "201"
And the json responded should contain a space "Project Venus" with these key and value pairs:
| key | value |
| driveType | project |
| name | Project Venus |
| quota@@@total | 2000 |
| root@@@webDavUrl | %base_url%/dav/spaces/%space_id% |
Scenario: Alice creates folder via Graph api in space, she expects a 201 code and she checks that folder exists
Given the administrator gives "Alice" the role "Admin" using the settings api
When user "Alice" creates a space "Project Venus" of type "project" with quota "2000" using the GraphApi
And user "Alice" lists all available spaces via the GraphApi
And user "Alice" creates a folder "mainFolder" in space "Project Venus" using the WebDav Api
Then the HTTP status code should be "201"
When user "Alice" lists the content of the space with the name "Project Venus" using the WebDav Api
Then the propfind result of the space should contain these entries:
| mainFolder/ |
@@ -87,6 +87,47 @@ class SpacesContext implements Context {
return $this->responseSpaceId;
}
/**
* Get SpaceId by Name
*
* @param $name string
* @return string
*/
public function getSpaceIdByName(string $name): string
{
$response = json_decode($this->featureContext->getResponse()->getBody(), true);
if (isset($response['name']) && $response['name'] === $name) {
return $response["id"];
}
foreach ($response["value"] as $spaceCandidate) {
if ($spaceCandidate['name'] === $name) {
return $spaceCandidate["id"];
}
}
return false;
}
/**
* Get Space Array by name
*
* @param string $name
* @return array
*/
public function getSpaceByName(string $name): array
{
$response = json_decode($this->featureContext->getResponse()->getBody(), true);
$spaceAsArray = $response;
if (isset($response['name']) && $response['name'] === $name) {
return $response;
}
foreach ($spaceAsArray["value"] as $spaceCandidate) {
if ($spaceCandidate['name'] === $name) {
return $spaceCandidate;
}
}
return [];
}
/**
* @BeforeScenario
*
@@ -404,18 +445,45 @@ class SpacesContext implements Context {
}
/**
* @Then the json responded should contain these key and value pairs
* @Then /^the json responded should contain a space "([^"]*)" with these key and value pairs:$/
*
* @param string $spaceName
* @param TableNode $table
*
* @return void
*/
public function jsonRespondedShouldContain(TableNode $table) {
public function jsonRespondedShouldContain($spaceName, TableNode $table) {
$this->featureContext->verifyTableNodeColumns($table, ['key', 'value']);
$responseJson = json_decode($this->featureContext->getResponse()->getBody(), true);
Assert::assertIsArray($spaceAsArray = $this->getSpaceByName($spaceName), "No space with name $spaceName found");
foreach ($table->getHash() as $row) {
$expected = [$row["key"] => $row["value"]];
Assert::assertEquals($row["value"], $responseJson[$row["key"]]);
// remember the original Space Array
$original = $spaceAsArray;
$row['value'] = $this->featureContext->substituteInLineCodes(
$row['value'],
$this->featureContext->getCurrentUser(),
[],
[
[
"code" => "%space_id%",
"function" =>
[$this, "getSpaceIdByName"],
"parameter" => ["$spaceName"]
]
]
);
$segments = explode("@@@", $row["key"]);
// traverse down in the array
foreach ($segments as $segment) {
$arrayKeyExists = array_key_exists($segment, $spaceAsArray);
$key = $row["key"];
Assert::assertTrue($arrayKeyExists, "The key $key does not exist on the response");
if ($arrayKeyExists) {
$spaceAsArray = $spaceAsArray[$segment];
}
}
Assert::assertEquals($row["value"], $spaceAsArray);
// set the spaceArray to the point before traversing
$spaceAsArray = $original;
}
}
@@ -452,6 +520,7 @@ class SpacesContext implements Context {
}
}
}
/**
* Verify that the tableNode contains expected number of columns
*
@@ -533,4 +602,64 @@ class SpacesContext implements Context {
}
return false;
}
/**
* @When /^user "([^"]*)" creates a folder "([^"]*)" in space "([^"]*)" using the WebDav Api$/
*
* @param string $user
* @param string $folder
* @param string $spaceName
*
* @return void
* @throws JsonException
*/
public function theUserCreatesAFolderUsingTheGraphApi($user, $folder, $spaceName): void
{
$this->featureContext->setResponse(
$this->sendCreateFolderRequest(
$this->featureContext->getBaseUrl(),
"",
"MKCOL",
$user,
$this->featureContext->getPasswordForUser($user),
$folder,
$spaceName
)
);
}
/**
* Send Graph Create Space Request
*
* @param $baseUrl
* @param $user
* @param $password
* @param string $method
* @param string $xRequestId
* @param array $headers
* @param string $folder
* @param string $spaceName
* @return ResponseInterface
*/
public function sendCreateFolderRequest(
$baseUrl,
string $xRequestId = '',
string $method,
$user,
$password,
$folder,
$spaceName,
array $headers = []
): ResponseInterface
{
$spaceId = $this->getAvailableSpaces()[$spaceName]["id"];
$fullUrl = $baseUrl;
if (!str_ends_with($fullUrl, '/')) {
$fullUrl .= '/';
}
$fullUrl .= "dav/spaces/" . $spaceId . '/' . $folder;
return HttpRequestHelper::sendRequest($fullUrl, $xRequestId, $method, $user, $password, $headers);
}
}