mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-04 03:09:33 -06:00
[full-ci][tests-only]Extend notification api tests (#6324)
* Add api tests for notification * Address review
This commit is contained in:
@@ -117,9 +117,9 @@ config = {
|
||||
"skip": False,
|
||||
"earlyFail": True,
|
||||
},
|
||||
"apiEmailNotification": {
|
||||
"apiNotification": {
|
||||
"suites": [
|
||||
"apiEmailNotification",
|
||||
"apiNotification",
|
||||
],
|
||||
"skip": False,
|
||||
"earlyFail": True,
|
||||
|
||||
@@ -352,7 +352,7 @@ TEST_OCIS=true \
|
||||
TEST_SERVER_URL="https://localhost:9200" \
|
||||
EMAIL_HOST="localhost" \
|
||||
EMAIL_PORT=9000 \
|
||||
BEHAT_FEATURE="tests/acceptance/features/apiEmailNotification/emailNotification.feature" \
|
||||
BEHAT_FEATURE="tests/acceptance/features/apiNotification/emailNotification.feature" \
|
||||
make test-acceptance-api
|
||||
```
|
||||
|
||||
|
||||
@@ -170,9 +170,9 @@ default:
|
||||
- GraphContext:
|
||||
- OcisConfigContext:
|
||||
|
||||
apiEmailNotification:
|
||||
apiNotification:
|
||||
paths:
|
||||
- '%paths.base%/../features/apiEmailNotification'
|
||||
- '%paths.base%/../features/apiNotification'
|
||||
context: *common_ldap_suite_context
|
||||
contexts:
|
||||
- NotificationContext:
|
||||
|
||||
242
tests/acceptance/features/apiNotification/notification.feature
Normal file
242
tests/acceptance/features/apiNotification/notification.feature
Normal file
@@ -0,0 +1,242 @@
|
||||
@api
|
||||
Feature: Notification
|
||||
As a user
|
||||
I want to be notified of various events
|
||||
So that I can stay updated about the information
|
||||
|
||||
Background:
|
||||
Given these users have been created with default attributes and without skeleton files:
|
||||
| username |
|
||||
| Alice |
|
||||
| Brian |
|
||||
| Carol |
|
||||
And user "Alice" has uploaded file with content "other data" to "/textfile1.txt"
|
||||
And user "Alice" has created folder "my_data"
|
||||
|
||||
|
||||
Scenario Outline: user gets a notification of resource sharing
|
||||
Given user "Alice" has shared entry "<resource>" with user "Brian"
|
||||
When user "Brian" lists all notifications
|
||||
Then the HTTP status code should be "200"
|
||||
And the JSON response should contain a notification message with the subject "Resource shared" and the message-details should match
|
||||
"""
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"app",
|
||||
"datetime",
|
||||
"message",
|
||||
"messageRich",
|
||||
"messageRichParameters",
|
||||
"notification_id",
|
||||
"object_id",
|
||||
"object_type",
|
||||
"subject",
|
||||
"subjectRich",
|
||||
"user"
|
||||
],
|
||||
"properties": {
|
||||
"app": {
|
||||
"type": "string",
|
||||
"enum": ["userlog"]
|
||||
},
|
||||
"message": {
|
||||
"type": "string",
|
||||
"enum": ["Alice Hansen shared <resource> with you"]
|
||||
},
|
||||
"messageRich": {
|
||||
"type": "string",
|
||||
"enum": ["{user} shared {resource} with you"]
|
||||
},
|
||||
"messageRichParameters": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"resource",
|
||||
"user"
|
||||
],
|
||||
"properties": {
|
||||
"resource": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\\$[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}![a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"enum": ["<resource>"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"displayname",
|
||||
"id",
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"displayname": {
|
||||
"type": "string",
|
||||
"enum": ["Alice Hansen"]
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"enim": ["%user_id%"]
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"enum": ["Alice"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"notification_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"object_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"object_type": {
|
||||
"type": "string",
|
||||
"enum": ["share"]
|
||||
},
|
||||
"subject": {
|
||||
"type": "string",
|
||||
"enum": ["Resource shared"]
|
||||
},
|
||||
"subjectRich": {
|
||||
"type": "string",
|
||||
"enum": ["Resource shared"]
|
||||
},
|
||||
"user": {
|
||||
"type": "string",
|
||||
"enum": ["Alice"]
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
Examples:
|
||||
| resource |
|
||||
| textfile1.txt |
|
||||
| my_data |
|
||||
|
||||
|
||||
Scenario Outline: user gets a notification of unsharing resource
|
||||
Given user "Alice" has shared entry "<resource>" with user "Brian"
|
||||
And user "Brian" has accepted share "/<resource>" offered by user "Alice"
|
||||
And user "Alice" has unshared entity "<resource>" shared to "Brian"
|
||||
When user "Brian" lists all notifications
|
||||
Then the HTTP status code should be "200"
|
||||
And the JSON response should contain a notification message with the subject "Resource unshared" and the message-details should match
|
||||
"""
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"app",
|
||||
"datetime",
|
||||
"message",
|
||||
"messageRich",
|
||||
"messageRichParameters",
|
||||
"notification_id",
|
||||
"object_id",
|
||||
"object_type",
|
||||
"subject",
|
||||
"subjectRich",
|
||||
"user"
|
||||
],
|
||||
"properties": {
|
||||
"app": {
|
||||
"type": "string",
|
||||
"enum": ["userlog"]
|
||||
},
|
||||
"message": {
|
||||
"type": "string",
|
||||
"enum": ["Alice Hansen unshared <resource> with you"]
|
||||
},
|
||||
"messageRich": {
|
||||
"type": "string",
|
||||
"enum": ["{user} unshared {resource} with you"]
|
||||
},
|
||||
"messageRichParameters": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"resource",
|
||||
"user"
|
||||
],
|
||||
"properties": {
|
||||
"resource": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\\$[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}![a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"enum": ["<resource>"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"displayname",
|
||||
"id",
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"displayname": {
|
||||
"type": "string",
|
||||
"enum": ["Alice Hansen"]
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"enim": ["%user_id%"]
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"enum": ["Alice"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"notification_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"object_id": {
|
||||
"type": "string"
|
||||
},
|
||||
"object_type": {
|
||||
"type": "string",
|
||||
"enum": ["share"]
|
||||
},
|
||||
"subject": {
|
||||
"type": "string",
|
||||
"enum": ["Resource unshared"]
|
||||
},
|
||||
"subjectRich": {
|
||||
"type": "string",
|
||||
"enum": ["Resource unshared"]
|
||||
},
|
||||
"user": {
|
||||
"type": "string",
|
||||
"enum": ["Alice"]
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
Examples:
|
||||
| resource |
|
||||
| textfile1.txt |
|
||||
| my_data |
|
||||
@@ -3023,13 +3023,13 @@ trait Sharing {
|
||||
public function userHasRemovedAllSharesFromTheFileNamed(string $user, string $fileName):void {
|
||||
$user = $this->getActualUsername($user);
|
||||
$this->removeAllSharesFromResource($user, $fileName);
|
||||
$dataResponded = $this->getShares($user, $fileName);
|
||||
$response = $this->getShares($user, $fileName);
|
||||
Assert::assertEquals(
|
||||
0,
|
||||
\count($dataResponded),
|
||||
\count($response),
|
||||
__METHOD__
|
||||
. " Expected all shares to be removed from '$fileName' but got '"
|
||||
. \count($dataResponded)
|
||||
. \count($response)
|
||||
. "' shares still present"
|
||||
);
|
||||
}
|
||||
@@ -3075,7 +3075,7 @@ trait Sharing {
|
||||
*/
|
||||
public function checkPublicShares(string $user, string $path, ?TableNode $TableNode):void {
|
||||
$user = $this->getActualUsername($user);
|
||||
$dataResponded = $this->getShares($user, $path);
|
||||
$response = $this->getShares($user, $path);
|
||||
|
||||
$this->verifyTableNodeColumns($TableNode, ['path', 'permissions', 'name']);
|
||||
if ($TableNode instanceof TableNode) {
|
||||
@@ -3083,7 +3083,7 @@ trait Sharing {
|
||||
|
||||
foreach ($elementRows as $expectedElementsArray) {
|
||||
$nameFound = false;
|
||||
foreach ($dataResponded as $elementResponded) {
|
||||
foreach ($response as $elementResponded) {
|
||||
if ((string) $elementResponded->name[0] === $expectedElementsArray['name']) {
|
||||
Assert::assertEquals(
|
||||
$expectedElementsArray['path'],
|
||||
@@ -3126,14 +3126,14 @@ trait Sharing {
|
||||
public function checkPublicSharesAreEmpty(string $user, string $entry, string $path):void {
|
||||
$user = $this->getActualUsername($user);
|
||||
$this->asFileOrFolderShouldExist($user, $entry, $path);
|
||||
$dataResponded = $this->getShares($user, $path);
|
||||
$response = $this->getShares($user, $path);
|
||||
//It shouldn't have public shares
|
||||
Assert::assertEquals(
|
||||
0,
|
||||
\count($dataResponded),
|
||||
\count($response),
|
||||
__METHOD__
|
||||
. " As '$user', '$path' was expected to have no shares, but got '"
|
||||
. \count($dataResponded)
|
||||
. \count($response)
|
||||
. "' shares present"
|
||||
);
|
||||
}
|
||||
@@ -3146,8 +3146,8 @@ trait Sharing {
|
||||
* @return string|null
|
||||
*/
|
||||
public function getPublicShareIDByName(string $user, string $path, string $name):?string {
|
||||
$dataResponded = $this->getShares($user, $path);
|
||||
foreach ($dataResponded as $elementResponded) {
|
||||
$response = $this->getShares($user, $path);
|
||||
foreach ($response as $elementResponded) {
|
||||
if ((string) $elementResponded->name[0] === $name) {
|
||||
return (string) $elementResponded->id[0];
|
||||
}
|
||||
@@ -3236,9 +3236,9 @@ trait Sharing {
|
||||
$user = $this->getActualUsername($user);
|
||||
$offeredBy = $this->getActualUsername($offeredBy);
|
||||
|
||||
$dataResponded = $this->getAllSharesSharedWithUser($user);
|
||||
$response = $this->getAllSharesSharedWithUser($user);
|
||||
$shareId = null;
|
||||
foreach ($dataResponded as $shareElement) {
|
||||
foreach ($response as $shareElement) {
|
||||
// SharingHelper::SHARE_STATES has the mapping between the words for share states
|
||||
// like "accepted", "pending",... and the integer constants 0, 1,... that are in
|
||||
// the "state" field of the share data.
|
||||
@@ -3479,6 +3479,46 @@ trait Sharing {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Given /^user "([^"]*)" has unshared (?:folder|file|entity) "([^"]*)" shared to "([^"]*)"$/
|
||||
*
|
||||
* @param string $sharer
|
||||
* @param string $path
|
||||
* @param string $sharee
|
||||
*
|
||||
* @return void
|
||||
* @throws JsonException
|
||||
*/
|
||||
public function userHasUnsharedResourceSharedTo(string $sharer, string $path, string $sharee): void {
|
||||
$sharer = $this->getActualUsername($sharer);
|
||||
$sharee = $this->getActualUsername($sharee);
|
||||
|
||||
$response = $this->getShares($sharer, "$path&share_types=0");
|
||||
$shareId = null;
|
||||
foreach ($response as $shareElement) {
|
||||
if ((string)$shareElement->share_with[0] === $sharee) {
|
||||
$shareId = (string) $shareElement->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Assert::assertNotNull(
|
||||
$shareId,
|
||||
__METHOD__ . " could not find share, offered by $sharer to $sharee"
|
||||
);
|
||||
|
||||
$this->ocsContext->userSendsHTTPMethodToOcsApiEndpointWithBody(
|
||||
$sharer,
|
||||
'DELETE',
|
||||
'/apps/files_sharing/api/v' . $this->sharingApiVersion . '/shares/' . $shareId
|
||||
);
|
||||
|
||||
$this->ocsContext->assertOCSResponseIndicatesSuccess(
|
||||
'The ocs share response does not indicate success.',
|
||||
);
|
||||
$this->emptyLastHTTPStatusCodesArray();
|
||||
$this->emptyLastOCSStatusCodesArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Then the sharing API should report that no shares are shared with user :user
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user