From 1cd71773170f8d478c80aa58719e504bc29ea598 Mon Sep 17 00:00:00 2001 From: Niraj Acharya Date: Fri, 18 Aug 2023 09:25:41 +0545 Subject: [PATCH] adding test for deprovisioning notification using date format --- .../deprovisioningNotification.feature | 240 ++++++++++++++++++ .../bootstrap/NotificationContext.php | 107 ++++++++ 2 files changed, 347 insertions(+) create mode 100644 tests/acceptance/features/apiNotification/deprovisioningNotification.feature diff --git a/tests/acceptance/features/apiNotification/deprovisioningNotification.feature b/tests/acceptance/features/apiNotification/deprovisioningNotification.feature new file mode 100644 index 00000000000..84139f9d543 --- /dev/null +++ b/tests/acceptance/features/apiNotification/deprovisioningNotification.feature @@ -0,0 +1,240 @@ +@skipOnStable3.0 +Feature: Deprovisioning notification + As a user admin + I want to inform users about shutting down and deprovisioning the instance + So they can download and save their data in time + + Background: + Given these users have been created with default attributes and without skeleton files: + | username | + | Alice | + + + Scenario: administrator creates a deprovisioning notification about shutting down the instance + When the administrator creates a deprovisioning notification + Then the HTTP status code should be "200" + When user "Alice" lists all notifications + Then the HTTP status code should be "200" + And the JSON response should contain a notification message with the subject "Instance will be shut down and deprovisioned" 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": [ + "Attention! The instance will be shut down and deprovisioned on 2043-07-04T11:23:12Z. Download all your data before that date as no access past that date is possible." + ] + }, + "messageRich": { + "type": "string", + "enum": [ + "Attention! The instance will be shut down and deprovisioned on {date}. Download all your data before that date as no access past that date is possible." + ] + }, + "messageRichParameters": { + "type": "object" + }, + "notification_id": { + "type": "string", + "enum": [ + "deprovision" + ] + }, + "object_id": { + "type": "string" + }, + "object_type": { + "type": "string", + "enum": [ + "resource" + ] + }, + "subject": { + "type": "string", + "enum": [ + "Instance will be shut down and deprovisioned" + ] + }, + "subjectRich": { + "type": "string", + "enum": [ + "Instance will be shut down and deprovisioned" + ] + }, + "user": { + "type": "string" + } + } + } + """ + + + Scenario Outline: non-admin user tries to create a deprovisioning notification + Given the administrator has assigned the role "" to user "Alice" using the Graph API + When user "Alice" tries to create a deprovisioning notification + Then the HTTP status code should be "404" + And user "Alice" should not have any notification + Examples: + | role | + | Space Admin | + | User | + | User Light | + + + Scenario Outline: get a deprovisioning notification in various languages + Given the administrator has created a deprovisioning notification + And user "Alice" has switched the system language to "" + When user "Alice" lists all notifications + Then the HTTP status code should be "200" + And the JSON response should contain a notification message with the subject "" and the message-details should match + """ + { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string", + "enum": [ + "" + ] + } + } + } + """ + Examples: + | language | subject | message | + | de | Instanz wird heruntergefahren und außer Betrieb genommen werden. | Achtung! Diese Instanz wird am 2043-07-04T11:23:12Z heruntergefahren und außer Betrieb genommen werden. Laden Sie Ihre Daten vor diesem Tag herunter, da Sie danach nicht mehr darauf zugreifen können. | + | es | La instancia se cerrará y se desaprovisionará | ¡Atención! La instancia se cerrará y se desaprovisionará el 2043-07-04T11:23:12Z. Descarga todos tus datos antes de esa fecha, puesto que el acceso pasada la fecha no será posible. | + + + Scenario: deprovisioning notification reappears again even after being marked as read + Given the administrator has created a deprovisioning notification + And user "Alice" has deleted all notifications + When user "Alice" lists all notifications + Then the HTTP status code should be "200" + And the JSON response should contain a notification message with the subject "Instance will be shut down and deprovisioned" and the message-details should match + """ + { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string", + "enum": [ + "Attention! The instance will be shut down and deprovisioned on 2043-07-04T11:23:12Z. Download all your data before that date as no access past that date is possible." + ] + } + } + } + """ + + + Scenario: administrator tries to delete the deprovisioning notification + Given the administrator has created a deprovisioning notification + When the administrator deletes the deprovisioning notification + Then the HTTP status code should be "200" + And user "Alice" should not have any notification + + + Scenario Outline: non-admin user tries to delete the deprovisioning notification + Given the administrator has assigned the role "" to user "Alice" using the Graph API + When user "Alice" tries to delete the deprovisioning notification + Then the HTTP status code should be "404" + And user "Alice" should not have any notification + Examples: + | role | + | Space Admin | + | User | + | User Light | + + + Scenario Outline: administrator creates a deprovisioning notification with different date formats + When the administrator creates a deprovisioning notification for date "" of format "" + Then the HTTP status code should be "200" + When user "Alice" lists all notifications + Then the HTTP status code should be "200" + And the JSON response should contain a notification message with the subject "Instance will be shut down and deprovisioned" and the message-details should match + """ + { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string", + "enum": [ + "Attention! The instance will be shut down and deprovisioned on . Download all your data before that date as no access past that date is possible." + ] + } + } + } + """ + Examples: + | deprovision_date | deprovision_date_format | + | 2030-04-09T15:04:05.999999999+07:00 | 2006-01-02T15:04:05.999999999Z07:00 | + | 5:15PM | 3:04PM | + # with date format like `Jan _2 15:04:05`, `_` gets replaced with a space in the response. + | Jan 8 23:04:05 | Jan _2 15:04:05 | + | Jan 12 15:04:05.000000000 | Jan _2 15:04:05.000000000 | + | 2023-01-02 15:04:05 | 2006-01-02 15:04:05 | + | 2023-01-02 | 2006-01-02 | + | 18:24:55 | 15:04:05 | + + + Scenario Outline: administrator change a deprovisioning notification with different date formats + Given the administrator has created a deprovisioning notification + When the administrator creates a deprovisioning notification for date "" of format "" + Then the HTTP status code should be "200" + When user "Alice" lists all notifications + Then the HTTP status code should be "200" + And the JSON response should contain a notification message with the subject "Instance will be shut down and deprovisioned" and the message-details should match + """ + { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string", + "enum": [ + "Attention! The instance will be shut down and deprovisioned on . Download all your data before that date as no access past that date is possible." + ] + } + } + } + """ + Examples: + | deprovision_date | deprovision_date_format | + | 01/02 03:04:05PM '23 -0700 | 01/02 03:04:05PM '06 -0700 | + | Mon Jan 2 15:04:05 UTC 2023 | Mon Jan _2 15:04:05 UTC 2006 | + | Mon Jan 02 15:04:05 -0700 2023 | Mon Jan 02 15:04:05 -0700 2006 | + | 02 Jan 23 15:04 -0700 | 02 Jan 06 15:04 -0700 | + | Monday, 02-Jan-23 15:04:05 UTC | Monday, 02-Jan-06 15:04:05 UTC | + | Mon, 02 Jan 2023 15:04:05 -0700 | Mon, 02 Jan 2006 15:04:05 -0700 | + | 2023-01-02T15:04:05+07:00 | 2006-01-02T15:04:05Z07:00 | diff --git a/tests/acceptance/features/bootstrap/NotificationContext.php b/tests/acceptance/features/bootstrap/NotificationContext.php index 6dcb0bdfddb..8ecf67cd81a 100644 --- a/tests/acceptance/features/bootstrap/NotificationContext.php +++ b/tests/acceptance/features/bootstrap/NotificationContext.php @@ -27,6 +27,7 @@ class NotificationContext implements Context { private SpacesContext $spacesContext; private SettingsContext $settingsContext; private string $notificationEndpointPath = '/apps/notifications/api/v1/notifications?format=json'; + private string $globalNotificationEndpointPath = '/apps/notifications/api/v1/notifications/global'; private array $notificationIds; @@ -44,6 +45,15 @@ public function getLastNotificationId():array { return \end($this->notificationIds); } + /** + * @AfterScenario + * + * @return void + */ + public function deleteDeprovisioningNotification(): void { + $this->userDeletesDeprovisioningNotification(); + } + /** * @var string */ @@ -127,6 +137,20 @@ public function userDeletesAllNotifications(string $user):void { $this->featureContext->setResponse($this->userDeletesNotification($user)); } + /** + * @Given user :user has deleted all notifications + * + * @param string $user + * + * @return void + * @throws GuzzleException + * @throws JsonException + */ + public function userHasDeletedAllNotifications(string $user):void { + $this->userDeletesAllNotifications($user); + $this->featureContext->thenTheHTTPStatusCodeShouldBe(200); + } + /** * @When user :user deletes a notification related to resource :resource with subject :subject * @@ -490,4 +514,87 @@ public function clearInbucketMessages():void { $e->getMessage(); } } + + /** + * @When the administrator creates a deprovisioning notification + * @When user :user tries to create a deprovisioning notification + * + * @param string|null $user + * @param string|null $deprovision_date + * @param string|null $deprovision_date_format + * + * @return void + * + * @throws GuzzleException + * + * @throws JsonException + */ + public function userCreatesDeprovisioningNotification( + ?string $user = null, + ?string $deprovision_date = "2043-07-04T11:23:12Z", + ?string $deprovision_date_format= "2006-01-02T15:04:05Z07:00" + ):void { + $payload["type"] = "deprovision"; + $payload["data"] = ["deprovision_date" => $deprovision_date, "deprovision_date_format" => $deprovision_date_format]; + $response = OcsApiHelper::sendRequest( + $this->featureContext->getBaseUrl(), + $user ? $this->featureContext->getActualUsername($user) : $this->featureContext->getAdminUsername(), + $user ? $this->featureContext->getPasswordForUser($user) : $this->featureContext->getAdminPassword(), + 'POST', + $this->globalNotificationEndpointPath, + '', + json_encode($payload), + 2 + ); + $this->featureContext->setResponse($response); + } + + /** + * @When the administrator creates a deprovisioning notification for date :deprovision_date of format :deprovision_date_format + * + * @param $deprovision_date + * @param $deprovision_date_format + * + * @return void + * + * @throws GuzzleException + * @throws JsonException + */ + public function theAdministratorCreatesADeprovisioningNotificationUsingDateFormat($deprovision_date, $deprovision_date_format) { + $this->userCreatesDeprovisioningNotification(null, $deprovision_date, $deprovision_date_format); + } + + /** + * @Given the administrator has created a deprovisioning notification + * + * @return void + */ + public function userHasCreatedDeprovisioningNotification():void { + $this->userCreatesDeprovisioningNotification(); + $this->featureContext->thenTheHTTPStatusCodeShouldBe(200); + } + + /** + * @When the administrator deletes the deprovisioning notification + * @When user :user tries to delete the deprovisioning notification + * + * @param string|null $user + * + * @return void + */ + public function userDeletesDeprovisioningNotification(?string $user = null):void { + $payload["ids"] = ["deprovision"]; + + $response = OcsApiHelper::sendRequest( + $this->featureContext->getBaseUrl(), + $user ? $this->featureContext->getActualUsername($user) : $this->featureContext->getAdminUsername(), + $user ? $this->featureContext->getPasswordForUser($user) : $this->featureContext->getAdminPassword(), + 'DELETE', + $this->globalNotificationEndpointPath, + '', + json_encode($payload), + 2 + ); + $this->featureContext->setResponse($response); + } }