From 75b734ec98156d4d1ca1b94dc99964e9c51b68bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= <danxuliu@gmail.com>
Date: Fri, 23 Nov 2018 12:56:52 +0100
Subject: [PATCH] Add acceptance tests for folders that can not be reshared
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
---
 tests/acceptance/features/app-files.feature   | 49 ++++++++++
 .../features/bootstrap/FilesAppContext.php    | 93 +++++++++++++++++++
 2 files changed, 142 insertions(+)

diff --git a/tests/acceptance/features/app-files.feature b/tests/acceptance/features/app-files.feature
index 140001505b4..656e86c8ae3 100644
--- a/tests/acceptance/features/app-files.feature
+++ b/tests/acceptance/features/app-files.feature
@@ -514,6 +514,55 @@ Feature: app-files
     And I enter in the folder named "Shared folder"
     Then I see that the file list contains a file named "Subfolder"
 
+  Scenario: sharee can not reshare a folder if the sharer disables it
+    Given I act as John
+    And I am logged in as the admin
+    And I act as Jane
+    And I am logged in
+    And I act as John
+    And I create a new folder named "Shared folder"
+    And I see that the file list contains a file named "Shared folder"
+    And I share "Shared folder" with "user0"
+    And I see that the file is shared with "user0"
+    And I set the share with "user0" as not reshareable
+    And I see that "user0" can not reshare the share
+    When I act as Jane
+    # The Files app is open again to reload the file list
+    And I open the Files app
+    Then I see that the file list contains a file named "Shared folder"
+    And I open the details view for "Shared folder"
+    And I see that the details view is open
+    And I open the "Sharing" tab in the details view
+    And I see that the "Sharing" tab in the details view is eventually loaded
+    And I see that the file is shared with me by "admin"
+    And I see that resharing the file is not allowed
+
+  Scenario: sharee can not reshare a subfolder if the sharer disables it for the parent folder
+    Given I act as John
+    And I am logged in as the admin
+    And I act as Jane
+    And I am logged in
+    And I act as John
+    And I create a new folder named "Shared folder"
+    And I see that the file list contains a file named "Shared folder"
+    And I share "Shared folder" with "user0"
+    And I see that the file is shared with "user0"
+    And I set the share with "user0" as not reshareable
+    And I see that "user0" can not reshare the share
+    And I enter in the folder named "Shared folder"
+    And I create a new folder named "Subfolder"
+    And I see that the file list contains a file named "Subfolder"
+    When I act as Jane
+    # The Files app is open again to reload the file list
+    And I open the Files app
+    And I enter in the folder named "Shared folder"
+    Then I see that the file list contains a file named "Subfolder"
+    And I open the details view for "Subfolder"
+    And I see that the details view is open
+    And I open the "Sharing" tab in the details view
+    And I see that the "Sharing" tab in the details view is eventually loaded
+    And I see that resharing the file is not allowed
+
   Scenario: marking a file as favorite causes the file list to be sorted again
     Given I am logged in
     And I create a new folder named "A name alphabetically lower than welcome.txt"
diff --git a/tests/acceptance/features/bootstrap/FilesAppContext.php b/tests/acceptance/features/bootstrap/FilesAppContext.php
index a0d877a1aa9..b6c4e465ecb 100644
--- a/tests/acceptance/features/bootstrap/FilesAppContext.php
+++ b/tests/acceptance/features/bootstrap/FilesAppContext.php
@@ -266,6 +266,45 @@ class FilesAppContext implements Context, ActorAwareInterface {
 				describedAs("Shared with $sharedWithName row in the details view in Files app");
 	}
 
+	/**
+	 * @return Locator
+	 */
+	public static function shareWithMenuButton($sharedWithName) {
+		return Locator::forThe()->css(".share-menu > .icon")->
+				descendantOf(self::sharedWithRow($sharedWithName))->
+				describedAs("Share with $sharedWithName menu button in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function shareWithMenu($sharedWithName) {
+		return Locator::forThe()->css(".share-menu > .menu")->
+				descendantOf(self::sharedWithRow($sharedWithName))->
+				describedAs("Share with $sharedWithName menu in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function canReshareCheckbox($sharedWithName) {
+		// forThe()->checkbox("Can reshare") can not be used here; that would
+		// return the checkbox itself, but the element that the user interacts
+		// with is the label.
+		return Locator::forThe()->xpath("//label[normalize-space() = 'Can reshare']")->
+				descendantOf(self::shareWithMenu($sharedWithName))->
+				describedAs("Can reshare checkbox in the share with $sharedWithName menu in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function canReshareCheckboxInput($sharedWithName) {
+		return Locator::forThe()->checkbox("Can reshare")->
+				descendantOf(self::shareWithMenu($sharedWithName))->
+				describedAs("Can reshare checkbox input in the share with $sharedWithName menu in the details view in Files app");
+	}
+
 	/**
 	 * @return Locator
 	 */
@@ -570,6 +609,17 @@ class FilesAppContext implements Context, ActorAwareInterface {
 		$this->actor->find(self::passwordProtectByTalkCheckbox(), 2)->click();
 	}
 
+	/**
+	 * @When I set the share with :shareWithName as not reshareable
+	 */
+	public function iSetTheShareWithAsNotReshareable($shareWithName) {
+		$this->showShareWithMenuIfNeeded($shareWithName);
+
+		$this->iSeeThatCanReshareTheShare($shareWithName);
+
+		$this->actor->find(self::canReshareCheckbox($shareWithName), 2)->click();
+	}
+
 	/**
 	 * @Then I see that the current page is the Files app
 	 */
@@ -708,6 +758,36 @@ class FilesAppContext implements Context, ActorAwareInterface {
 				$this->actor->find(self::sharedWithRow($sharedWithName), 10)->isVisible());
 	}
 
+	/**
+	 * @Then I see that resharing the file is not allowed
+	 */
+	public function iSeeThatResharingTheFileIsNotAllowed() {
+		PHPUnit_Framework_Assert::assertEquals(
+				$this->actor->find(self::shareWithInput(), 10)->getWrappedElement()->getAttribute("disabled"), "disabled");
+		PHPUnit_Framework_Assert::assertEquals(
+				$this->actor->find(self::shareWithInput(), 10)->getWrappedElement()->getAttribute("placeholder"), "Resharing is not allowed");
+	}
+
+	/**
+	 * @Then I see that :sharedWithName can reshare the share
+	 */
+	public function iSeeThatCanReshareTheShare($sharedWithName) {
+		$this->showShareWithMenuIfNeeded($sharedWithName);
+
+		PHPUnit_Framework_Assert::assertTrue(
+				$this->actor->find(self::canReshareCheckboxInput($sharedWithName), 10)->isChecked());
+	}
+
+	/**
+	 * @Then I see that :sharedWithName can not reshare the share
+	 */
+	public function iSeeThatCanNotReshareTheShare($sharedWithName) {
+		$this->showShareWithMenuIfNeeded($sharedWithName);
+
+		PHPUnit_Framework_Assert::assertFalse(
+				$this->actor->find(self::canReshareCheckboxInput($sharedWithName), 10)->isChecked());
+	}
+
 	/**
 	 * @Then I see that the download of the link share is hidden
 	 */
@@ -809,4 +889,17 @@ class FilesAppContext implements Context, ActorAwareInterface {
 		}
 	}
 
+	private function showShareWithMenuIfNeeded($shareWithName) {
+		// In some cases the share menu is hidden after clicking on an action of
+		// the menu. Therefore, if the menu is visible, wait a little just in
+		// case it is in the process of being hidden due to a previous action,
+		// in which case it is shown again.
+		if (WaitFor::elementToBeEventuallyNotShown(
+				$this->actor,
+				self::shareWithMenu($shareWithName),
+				$timeout = 2 * $this->actor->getFindTimeoutMultiplier())) {
+			$this->actor->find(self::shareWithMenuButton($shareWithName), 10)->click();
+		}
+	}
+
 }
-- 
GitLab