Merge pull request #2679 from owncloud/api-tests-forSpace
Api tests for space
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user