From aa695dca0dfa10e00e71021a906e45b3256d9e99 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= <danxuliu@gmail.com>
Date: Thu, 22 Nov 2018 18:56:15 +0100
Subject: [PATCH] Add acceptance tests for sharing a file with another user
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   | 56 ++++++++++++
 .../features/bootstrap/FilesAppContext.php    | 87 +++++++++++++++++++
 2 files changed, 143 insertions(+)

diff --git a/tests/acceptance/features/app-files.feature b/tests/acceptance/features/app-files.feature
index 61b7678e843..a76b41151c6 100644
--- a/tests/acceptance/features/app-files.feature
+++ b/tests/acceptance/features/app-files.feature
@@ -295,6 +295,62 @@ Feature: app-files
     # download starts no page redirection
     And I see that the current page is the Authenticate page for the direct download shared link I wrote down
 
+  Scenario: share a file with another user
+    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 rename "welcome.txt" to "farewell.txt"
+    And I see that the file list contains a file named "farewell.txt"
+    When I share "farewell.txt" with "user0"
+    And I see that the file is shared with "user0"
+    And 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 "farewell.txt"
+    And I open the details view for "farewell.txt"
+    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"
+
+  Scenario: share a file with another user who already has a file with that name
+    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
+    When I share "welcome.txt" with "user0"
+    And I see that the file is shared with "user0"
+    And 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 "welcome (2).txt"
+    And I open the details view for "welcome (2).txt"
+    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"
+
+  Scenario: share a skeleton file with another user before first login
+    # If a file is shared with a user before her first login the skeleton would
+    # not have been created, so if the shared file has the same name as one from
+    # the skeleton the shared file will take its place and the skeleton file
+    # will not be added.
+    Given I act as John
+    And I am logged in as the admin
+    When I share "welcome.txt" with "user0"
+    And I see that the file is shared with "user0"
+    And I act as Jane
+    And I am logged in
+    Then I see that the file list contains a file named "welcome.txt"
+    And I open the details view for "welcome.txt"
+    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"
+
   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 a5d2c636f3e..a0d877a1aa9 100644
--- a/tests/acceptance/features/bootstrap/FilesAppContext.php
+++ b/tests/acceptance/features/bootstrap/FilesAppContext.php
@@ -42,6 +42,23 @@ class FilesAppContext implements Context, ActorAwareInterface {
 				 "Deleted files" => "trashbin" ];
 	}
 
+	/**
+	 * @return Locator
+	 */
+	private static function appMenu() {
+		return Locator::forThe()->id("appmenu")->
+				describedAs("App menu in header");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function filesItemInAppMenu() {
+		return Locator::forThe()->xpath("/li[@data-id = 'files']")->
+				descendantOf(self::appMenu())->
+				describedAs("Files item in app menu in header");
+	}
+
 	/**
 	 * @return Locator
 	 */
@@ -211,6 +228,44 @@ class FilesAppContext implements Context, ActorAwareInterface {
 				describedAs("Loading icon for tab named $tabName in details view in Files app");
 	}
 
+	/**
+	 * @return Locator
+	 */
+	public static function sharedByLabel() {
+		return Locator::forThe()->css(".reshare")->
+				descendantOf(self::detailsView())->
+				describedAs("Shared by label in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function shareWithInput() {
+		return Locator::forThe()->css(".shareWithField")->
+				descendantOf(self::detailsView())->
+				describedAs("Share with input in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function shareeList() {
+		return Locator::forThe()->css(".shareeListView")->
+				descendantOf(self::detailsView())->
+				describedAs("Sharee list in the details view in Files app");
+	}
+
+	/**
+	 * @return Locator
+	 */
+	public static function sharedWithRow($sharedWithName) {
+		// "username" class is used for any type of share, not only for shares
+		// with users.
+		return Locator::forThe()->xpath("//span[contains(concat(' ', normalize-space(@class), ' '), ' username ') and normalize-space() = '$sharedWithName']/ancestor::li")->
+				descendantOf(self::shareeList())->
+				describedAs("Shared with $sharedWithName row in the details view in Files app");
+	}
+
 	/**
 	 * @return Locator
 	 */
@@ -349,6 +404,13 @@ class FilesAppContext implements Context, ActorAwareInterface {
 				describedAs("Password protect by Talk checkbox input in the details view in Files app");
 	}
 
+	/**
+	 * @Given I open the Files app
+	 */
+	public function iOpenTheFilesApp() {
+		$this->actor->find(self::filesItemInAppMenu(), 10)->click();
+	}
+
 	/**
 	 * @Given I close the details view
 	 */
@@ -387,6 +449,15 @@ class FilesAppContext implements Context, ActorAwareInterface {
 		}
 	}
 
+	/**
+	 * @Given I share :fileName with :shareWithName
+	 */
+	public function iShareWith($fileName, $shareWithName) {
+		$this->actor->find(FileListContext::shareActionForFile(self::currentSectionMainView(), $fileName), 10)->click();
+
+		$this->actor->find(self::shareWithInput(), 5)->setValue($shareWithName . "\r");
+	}
+
 	/**
 	 * @Given I write down the shared link
 	 */
@@ -621,6 +692,22 @@ class FilesAppContext implements Context, ActorAwareInterface {
 		}
 	}
 
+	/**
+	 * @Then I see that the file is shared with me by :sharedByName
+	 */
+	public function iSeeThatTheFileIsSharedWithMeBy($sharedByName) {
+		PHPUnit_Framework_Assert::assertEquals(
+				$this->actor->find(self::sharedByLabel(), 10)->getText(), "Shared with you by $sharedByName");
+	}
+
+	/**
+	 * @Then I see that the file is shared with :sharedWithName
+	 */
+	public function iSeeThatTheFileIsSharedWith($sharedWithName) {
+		PHPUnit_Framework_Assert::assertTrue(
+				$this->actor->find(self::sharedWithRow($sharedWithName), 10)->isVisible());
+	}
+
 	/**
 	 * @Then I see that the download of the link share is hidden
 	 */
-- 
GitLab