Update integration tests for system tags with groups
This commit is contained in:
parent
5963128342
commit
d288eb062e
3 changed files with 232 additions and 17 deletions
|
@ -97,28 +97,36 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
}
|
||||
|
||||
/**
|
||||
* @When :user creates a :type tag with name :name
|
||||
* @param string $user
|
||||
* @param string $type
|
||||
* @param string $name
|
||||
* @throws \Exception
|
||||
* @param string $groups
|
||||
*/
|
||||
public function createsATagWithName($user, $type, $name) {
|
||||
$userVisible = 'true';
|
||||
$userAssignable = 'true';
|
||||
private function createTag($user, $type, $name, $groups = null) {
|
||||
$userVisible = true;
|
||||
$userAssignable = true;
|
||||
switch ($type) {
|
||||
case 'normal':
|
||||
break;
|
||||
case 'not user-assignable':
|
||||
$userAssignable = 'false';
|
||||
$userAssignable = false;
|
||||
break;
|
||||
case 'not user-visible':
|
||||
$userVisible = 'false';
|
||||
$userVisible = false;
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Unsupported type');
|
||||
}
|
||||
|
||||
$body = [
|
||||
'name' => $name,
|
||||
'userVisible' => $userVisible,
|
||||
'userAssignable' => $userAssignable,
|
||||
];
|
||||
if ($groups !== null) {
|
||||
$body['groups'] = $groups;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->response = $this->client->post(
|
||||
$this->baseUrl . '/remote.php/dav/systemtags/',
|
||||
|
@ -130,14 +138,37 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
'headers' => [
|
||||
'Content-Type' => 'application/json',
|
||||
],
|
||||
'body' => '{"name":"'.$name.'","userVisible":'.$userVisible.',"userAssignable":'.$userAssignable.'}',
|
||||
'body' => json_encode($body)
|
||||
]
|
||||
);
|
||||
} catch (\GuzzleHttp\Exception\ClientException $e){
|
||||
} catch (\GuzzleHttp\Exception\ClientException $e) {
|
||||
$this->response = $e->getResponse();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @When :user creates a :type tag with name :name
|
||||
* @param string $user
|
||||
* @param string $type
|
||||
* @param string $name
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function createsATagWithName($user, $type, $name) {
|
||||
$this->createTag($user, $type, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @When :user creates a :type tag with name :name and groups :groups
|
||||
* @param string $user
|
||||
* @param string $type
|
||||
* @param string $name
|
||||
* @param string $groups
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function createsATagWithNameAndGroups($user, $type, $name, $groups) {
|
||||
$this->createTag($user, $type, $name, $groups);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Then The response should have a status code :statusCode
|
||||
* @param int $statusCode
|
||||
|
@ -155,21 +186,30 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
* @param string $user
|
||||
* @return array
|
||||
*/
|
||||
private function requestTagsForUser($user) {
|
||||
private function requestTagsForUser($user, $withGroups = false) {
|
||||
try {
|
||||
$request = $this->client->createRequest(
|
||||
'PROPFIND',
|
||||
$this->baseUrl . '/remote.php/dav/systemtags/',
|
||||
[
|
||||
'body' => '<?xml version="1.0"?>
|
||||
$body = '<?xml version="1.0"?>
|
||||
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
|
||||
<d:prop>
|
||||
<oc:id />
|
||||
<oc:display-name />
|
||||
<oc:user-visible />
|
||||
<oc:user-assignable />
|
||||
<oc:user-assignable />
|
||||
<oc:can-assign />
|
||||
';
|
||||
|
||||
if ($withGroups) {
|
||||
$body .= '<oc:groups />';
|
||||
}
|
||||
|
||||
$body .= '
|
||||
</d:prop>
|
||||
</d:propfind>',
|
||||
</d:propfind>';
|
||||
$request = $this->client->createRequest(
|
||||
'PROPFIND',
|
||||
$this->baseUrl . '/remote.php/dav/systemtags/',
|
||||
[
|
||||
'body' => $body,
|
||||
'auth' => [
|
||||
$user,
|
||||
$this->getPasswordForUser($user),
|
||||
|
@ -193,11 +233,16 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
continue;
|
||||
}
|
||||
|
||||
// FIXME: use actual property names instead of guessing index position
|
||||
$tags[$singleEntry[0]['value']] = [
|
||||
'display-name' => $singleEntry[1]['value'],
|
||||
'user-visible' => $singleEntry[2]['value'],
|
||||
'user-assignable' => $singleEntry[3]['value'],
|
||||
'can-assign' => $singleEntry[4]['value'],
|
||||
];
|
||||
if (isset($singleEntry[5])) {
|
||||
$tags[$singleEntry[0]['value']]['groups'] = $singleEntry[5]['value'];
|
||||
}
|
||||
}
|
||||
|
||||
return $tags;
|
||||
|
@ -238,6 +283,42 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Then the user :user :can assign The :type tag with name :tagName
|
||||
*/
|
||||
public function theUserCanAssignTheTag($user, $can, $type, $tagName) {
|
||||
$foundTag = $this->findTag($type, $tagName, $user);
|
||||
if ($foundTag === null) {
|
||||
throw new \Exception('No matching tag found');
|
||||
}
|
||||
|
||||
if ($can === 'can') {
|
||||
$expected = 'true';
|
||||
} else if ($can === 'cannot') {
|
||||
$expected = 'false';
|
||||
} else {
|
||||
throw new \Exception('Invalid condition, must be "can" or "cannot"');
|
||||
}
|
||||
|
||||
if ($foundTag['can-assign'] !== $expected) {
|
||||
throw new \Exception('Tag cannot be assigned by user');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Then The :type tag with name :tagName has the groups :groups
|
||||
*/
|
||||
public function theTagHasGroup($type, $tagName, $groups) {
|
||||
$foundTag = $this->findTag($type, $tagName, 'admin', true);
|
||||
if ($foundTag === null) {
|
||||
throw new \Exception('No matching tag found');
|
||||
}
|
||||
|
||||
if ($foundTag['groups'] !== $groups) {
|
||||
throw new \Exception('Tag has groups "' . $foundTag['group'] . '" instead of the expected "' . $groups . '"');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Then :count tags should exist for :user
|
||||
* @param int $count
|
||||
|
@ -250,6 +331,45 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find tag by type and name
|
||||
*
|
||||
* @param string $type tag type
|
||||
* @param string $tagName tag name
|
||||
* @param string $user retrieved from which user
|
||||
* @param bool $withGroups whether to also query the tag's groups
|
||||
*
|
||||
* @return array tag values or null if not found
|
||||
*/
|
||||
private function findTag($type, $tagName, $user = 'admin', $withGroups = false) {
|
||||
$tags = $this->requestTagsForUser($user, $withGroups);
|
||||
$userAssignable = 'true';
|
||||
$userVisible = 'true';
|
||||
switch ($type) {
|
||||
case 'normal':
|
||||
break;
|
||||
case 'not user-assignable':
|
||||
$userAssignable = 'false';
|
||||
break;
|
||||
case 'not user-visible':
|
||||
$userVisible = 'false';
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Unsupported type');
|
||||
}
|
||||
|
||||
$foundTag = null;
|
||||
foreach ($tags as $tag) {
|
||||
if ($tag['display-name'] === $tagName
|
||||
&& $tag['user-visible'] === $userVisible
|
||||
&& $tag['user-assignable'] === $userAssignable) {
|
||||
$foundTag = $tag;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $foundTag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @return int
|
||||
|
@ -304,6 +424,44 @@ class TagsContext implements \Behat\Behat\Context\Context {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @When :user edits the tag with name :oldNmae and sets its groups to :groups
|
||||
* @param string $user
|
||||
* @param string $oldName
|
||||
* @param string $groups
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function editsTheTagWithNameAndSetsItsGroupsTo($user, $oldName, $groups) {
|
||||
$tagId = $this->findTagIdByName($oldName);
|
||||
if($tagId === 0) {
|
||||
throw new \Exception('Could not find tag to rename');
|
||||
}
|
||||
|
||||
try {
|
||||
$request = $this->client->createRequest(
|
||||
'PROPPATCH',
|
||||
$this->baseUrl . '/remote.php/dav/systemtags/' . $tagId,
|
||||
[
|
||||
'body' => '<?xml version="1.0"?>
|
||||
<d:propertyupdate xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
|
||||
<d:set>
|
||||
<d:prop>
|
||||
<oc:groups>' . $groups . '</oc:groups>
|
||||
</d:prop>
|
||||
</d:set>
|
||||
</d:propertyupdate>',
|
||||
'auth' => [
|
||||
$user,
|
||||
$this->getPasswordForUser($user),
|
||||
],
|
||||
]
|
||||
);
|
||||
$this->response = $this->client->send($request);
|
||||
} catch (\GuzzleHttp\Exception\ClientException $e) {
|
||||
$this->response = $e->getResponse();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @When :user deletes the tag with name :name
|
||||
* @param string $user
|
||||
|
|
|
@ -21,6 +21,18 @@ Feature: tags
|
|||
Then The response should have a status code "400"
|
||||
And "0" tags should exist for "admin"
|
||||
|
||||
Scenario: Creating a not user-assignable tag with groups as admin should work
|
||||
Given user "user0" exists
|
||||
When "admin" creates a "not user-assignable" tag with name "TagWithGroups" and groups "group1|group2"
|
||||
Then The response should have a status code "201"
|
||||
And The "not user-assignable" tag with name "TagWithGroups" has the groups "group1|group2"
|
||||
|
||||
Scenario: Creating a normal tag with groups as regular user should fail
|
||||
Given user "user0" exists
|
||||
When "user0" creates a "normal" tag with name "MySuperAwesomeTagName" and groups "group1|group2"
|
||||
Then The response should have a status code "400"
|
||||
And "0" tags should exist for "user0"
|
||||
|
||||
Scenario: Renaming a normal tag as regular user should work
|
||||
Given user "user0" exists
|
||||
Given "admin" creates a "normal" tag with name "MySuperAwesomeTagName"
|
||||
|
@ -45,6 +57,19 @@ Feature: tags
|
|||
And The following tags should exist for "admin"
|
||||
|MySuperAwesomeTagName|false|true|
|
||||
|
||||
Scenario: Editing tag groups as admin should work
|
||||
Given user "user0" exists
|
||||
Given "admin" creates a "not user-assignable" tag with name "TagWithGroups" and groups "group1|group2"
|
||||
When "admin" edits the tag with name "TagWithGroups" and sets its groups to "group1|group3"
|
||||
Then The response should have a status code "207"
|
||||
And The "not user-assignable" tag with name "TagWithGroups" has the groups "group1|group3"
|
||||
|
||||
Scenario: Editing tag groups as regular user should fail
|
||||
Given user "user0" exists
|
||||
Given "admin" creates a "not user-assignable" tag with name "TagWithGroups"
|
||||
When "user0" edits the tag with name "TagWithGroups" and sets its groups to "group1|group3"
|
||||
Then The response should have a status code "403"
|
||||
|
||||
Scenario: Deleting a normal tag as regular user should work
|
||||
Given user "user0" exists
|
||||
Given "admin" creates a "normal" tag with name "MySuperAwesomeTagName"
|
||||
|
@ -122,6 +147,23 @@ Feature: tags
|
|||
And "/myFileToTag.txt" shared by "user0" has the following tags
|
||||
|MyFirstTag|
|
||||
|
||||
Scenario: Assigning a not user-assignable tag to a file shared by someone else as regular user belongs to tag's groups should work
|
||||
Given user "user0" exists
|
||||
Given user "user1" exists
|
||||
Given group "group1" exists
|
||||
Given user "user1" belongs to group "group1"
|
||||
Given "admin" creates a "not user-assignable" tag with name "MySuperAwesomeTagName" and groups "group1"
|
||||
Given user "user0" uploads file "data/textfile.txt" to "/myFileToTag.txt"
|
||||
Given As "user0" sending "POST" to "/apps/files_sharing/api/v1/shares" with
|
||||
| path | myFileToTag.txt |
|
||||
| shareWith | user1 |
|
||||
| shareType | 0 |
|
||||
When "user1" adds the tag "MySuperAwesomeTagName" to "/myFileToTag.txt" shared by "user0"
|
||||
Then The response should have a status code "201"
|
||||
And "/myFileToTag.txt" shared by "user0" has the following tags
|
||||
|MySuperAwesomeTagName|
|
||||
|
||||
|
||||
Scenario: Assigning a not user-visible tag to a file shared by someone else as regular user should fail
|
||||
Given user "user0" exists
|
||||
Given user "user1" exists
|
||||
|
@ -368,3 +410,18 @@ Feature: tags
|
|||
And "/myFileToTag.txt" shared by "user0" has the following tags for "user1"
|
||||
||
|
||||
And The response should have a status code "404"
|
||||
|
||||
Scenario: User can assign tags when in the tag's groups
|
||||
Given user "user0" exists
|
||||
Given group "group1" exists
|
||||
Given user "user0" belongs to group "group1"
|
||||
When "admin" creates a "not user-assignable" tag with name "TagWithGroups" and groups "group1|group2"
|
||||
Then The response should have a status code "201"
|
||||
And the user "user0" can assign the "not user-assignable" tag with name "TagWithGroups"
|
||||
|
||||
Scenario: User cannot assign tags when not in the tag's groups
|
||||
Given user "user0" exists
|
||||
When "admin" creates a "not user-assignable" tag with name "TagWithGroups" and groups "group1|group2"
|
||||
Then The response should have a status code "201"
|
||||
And the user "user0" cannot assign the "not user-assignable" tag with name "TagWithGroups"
|
||||
|
||||
|
|
BIN
build/jsdocs9.tar.bz2
Normal file
BIN
build/jsdocs9.tar.bz2
Normal file
Binary file not shown.
Loading…
Reference in a new issue