Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[full-ci][tests-only]Extend notification api tests #6324

Merged
merged 2 commits into from
May 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .drone.star
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ config = {
"skip": False,
"earlyFail": True,
},
"apiEmailNotification": {
"apiNotification": {
"suites": [
"apiEmailNotification",
"apiNotification",
],
"skip": False,
"earlyFail": True,
Expand Down
2 changes: 1 addition & 1 deletion docs/ocis/development/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

Expand Down
4 changes: 2 additions & 2 deletions tests/acceptance/config/behat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
242 changes: 242 additions & 0 deletions tests/acceptance/features/apiNotification/notification.feature
Original file line number Diff line number Diff line change
@@ -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 |
64 changes: 52 additions & 12 deletions tests/acceptance/features/bootstrap/Sharing.php
Original file line number Diff line number Diff line change
Expand Up @@ -3023,13 +3023,13 @@ public function userRemovesAllSharesFromTheFileNamed(string $user, string $fileN
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"
);
}
Expand Down Expand Up @@ -3075,15 +3075,15 @@ public function getShares(string $user, string $path):SimpleXMLElement {
*/
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) {
$elementRows = $TableNode->getHash();

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'],
Expand Down Expand Up @@ -3126,14 +3126,14 @@ public function checkPublicShares(string $user, string $path, ?TableNode $TableN
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"
);
}
Expand All @@ -3146,8 +3146,8 @@ public function checkPublicSharesAreEmpty(string $user, string $entry, string $p
* @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];
}
Expand Down Expand Up @@ -3236,9 +3236,9 @@ public function userReactsToShareOfferedBy(string $user, string $action, string
$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.
Expand Down Expand Up @@ -3479,6 +3479,46 @@ public function assertNoSharesOfUserAreInState(string $user, string $state):void
);
}

/**
* @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
*
Expand Down