diff --git a/.travis.yml b/.travis.yml
index 8f8fd7b95c47..91a0fb9effad 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -103,6 +103,12 @@ matrix:
apt: *common_apt
hosts: *common_hosts
sauce_connect: true
+ - php: 5.6
+ env: DB=pgsql TC=selenium BROWSER="chrome" BROWSER_VERSION="latest" BEHAT_SUITE="upload" PLATFORM="Windows 10" TEST_DAV=0
+ addons:
+ apt: *common_apt
+ hosts: *common_hosts
+ sauce_connect: true
- php: 5.6
if: type = cron
env: DB=pgsql TC=selenium BROWSER="firefox" BROWSER_VERSION="47.0" BEHAT_SUITE="other" PLATFORM="Windows 10" TEST_DAV=0
@@ -159,6 +165,13 @@ matrix:
apt: *common_apt
hosts: *common_hosts
sauce_connect: true
+ - php: 5.6
+ if: type = cron
+ env: DB=pgsql TC=selenium BROWSER="firefox" BROWSER_VERSION="47.0" BEHAT_SUITE="upload" PLATFORM="Windows 10" TEST_DAV=0
+ addons:
+ apt: *common_apt
+ hosts: *common_hosts
+ sauce_connect: true
- php: 5.6
env: DB=pgsql TC=litmus-v1
- php: 5.6
@@ -229,6 +242,13 @@ matrix:
apt: *common_apt
hosts: *common_hosts
sauce_connect: true
+ - php: 5.6
+ if: type = cron
+ env: DB=pgsql TC=selenium BROWSER="chrome" BROWSER_VERSION="latest-1" BEHAT_SUITE="upload" PLATFORM="Windows 10" TEST_DAV=0
+ addons:
+ apt: *common_apt
+ hosts: *common_hosts
+ sauce_connect: true
- php: 5.6
if: type = cron
env: DB=pgsql TC=selenium BROWSER="MicrosoftEdge" BROWSER_VERSION="latest" BEHAT_SUITE="other" PLATFORM="Windows 10" TEST_DAV=0
@@ -285,6 +305,13 @@ matrix:
apt: *common_apt
hosts: *common_hosts
sauce_connect: true
+ - php: 5.6
+ if: type = cron
+ env: DB=pgsql TC=selenium BROWSER="MicrosoftEdge" BROWSER_VERSION="latest" BEHAT_SUITE="upload" PLATFORM="Windows 10" TEST_DAV=0
+ addons:
+ apt: *common_apt
+ hosts: *common_hosts
+ sauce_connect: true
- php: 5.6
if: type = cron
env: DB=pgsql TC=selenium BROWSER="internet explorer" BROWSER_VERSION="11.0" BEHAT_SUITE="other" PLATFORM="Windows 7" TEST_DAV=0
@@ -341,4 +368,11 @@ matrix:
apt: *common_apt
hosts: *common_hosts
sauce_connect: true
+ - php: 5.6
+ if: type = cron
+ env: DB=pgsql TC=selenium BROWSER="internet explorer" BROWSER_VERSION="11.0" BEHAT_SUITE="upload" PLATFORM="Windows 7" TEST_DAV=0
+ addons:
+ apt: *common_apt
+ hosts: *common_hosts
+ sauce_connect: true
fast_finish: true
diff --git a/tests/TestHelpers/WebDavHelper.php b/tests/TestHelpers/WebDavHelper.php
index dca845adeebb..e78918e62efe 100644
--- a/tests/TestHelpers/WebDavHelper.php
+++ b/tests/TestHelpers/WebDavHelper.php
@@ -103,6 +103,9 @@ public static function makeDavRequest(
) {
$baseUrl = self::sanitizeUrl($baseUrl, true);
$davPath = self::getDavPath($user, $davPathVersionToUse, $type);
+ //replace # and ? in the path, Guzzle will not encode them
+ $path = str_replace("#", "%23", $path);
+ $path = str_replace("?", "%3F", $path);
$fullUrl = self::sanitizeUrl($baseUrl . $davPath . $path);
$client = new GClient();
@@ -116,7 +119,7 @@ public static function makeDavRequest(
$options['config']
= [ 'curl' => [ CURLOPT_INTERFACE => $sourceIpAddress ]];
}
-
+
$request = $client->createRequest($method, $fullUrl, $options);
if (!is_null($headers)) {
foreach ($headers as $key => $value) {
diff --git a/tests/travis/start_ui_tests.sh b/tests/travis/start_ui_tests.sh
index 78f565666e16..ec5a4689951e 100755
--- a/tests/travis/start_ui_tests.sh
+++ b/tests/travis/start_ui_tests.sh
@@ -195,7 +195,8 @@ EXTRA_CAPABILITIES=$EXTRA_CAPABILITIES'"maxDuration":"3600"'
#Set up personalized skeleton
PREVIOUS_SKELETON_DIR=$($OCC --no-warnings config:system:get skeletondirectory)
-$OCC config:system:set skeletondirectory --value="$(pwd)/tests/ui/skeleton" >/dev/null
+export SKELETON_DIR=$(pwd)/tests/ui/skeleton
+$OCC config:system:set skeletondirectory --value="$SKELETON_DIR" >/dev/null
TEST_LOG_FILE=$(mktemp)
@@ -204,6 +205,7 @@ export BEHAT_PARAMS='{"extensions" : {"Behat\\MinkExtension" : {"browser_name":
export IPV4_URL
export IPV6_URL
export REMOTE_FED_BASE_URL
+export FILES_FOR_UPLOAD="$(pwd)/tests/ui/filesForUpload/"
lib/composer/bin/behat -c $BEHAT_YML $BEHAT_SUITE_OPTION $BEHAT_TAG_OPTION $BEHAT_TAGS $BEHAT_FEATURE -v 2>&1 | tee -a $TEST_LOG_FILE
diff --git a/tests/ui/config/behat.yml b/tests/ui/config/behat.yml
index 6a443fd77615..573b34ca5868 100644
--- a/tests/ui/config/behat.yml
+++ b/tests/ui/config/behat.yml
@@ -74,6 +74,16 @@ default:
- FilesContext:
- SharingContext:
+ upload:
+ paths:
+ - %paths.base%/../features/upload
+ context: *common_suite_context
+ contexts:
+ - FeatureContext:
+ - LoginContext:
+ - UsersContext:
+ - FilesContext:
+
restrictSharing:
paths:
- %paths.base%/../features/restrictSharing
diff --git a/tests/ui/features/bootstrap/FeatureContext.php b/tests/ui/features/bootstrap/FeatureContext.php
index e7f2328a0df1..98346d8e792e 100644
--- a/tests/ui/features/bootstrap/FeatureContext.php
+++ b/tests/ui/features/bootstrap/FeatureContext.php
@@ -43,7 +43,8 @@ class FeatureContext extends RawMinkContext implements Context {
private $owncloudPage;
private $loginPage;
private $oldCSRFSetting = null;
-
+ private $currentUser = null;
+
/**
*
* @var Page\OwncloudPage
@@ -101,6 +102,21 @@ class FeatureContext extends RawMinkContext implements Context {
]
];
+ /**
+ * @return string
+ */
+ public function getCurrentUser() {
+ return $this->currentUser;
+ }
+
+ /**
+ * @param string $currentUser
+ * @return void
+ */
+ public function setCurrentUser($currentUser) {
+ $this->currentUser = $currentUser;
+ }
+
/**
* FeatureContext constructor.
*
diff --git a/tests/ui/features/bootstrap/FilesContext.php b/tests/ui/features/bootstrap/FilesContext.php
index edaef512f78f..dc3c24703a0f 100644
--- a/tests/ui/features/bootstrap/FilesContext.php
+++ b/tests/ui/features/bootstrap/FilesContext.php
@@ -28,6 +28,8 @@
use SensioLabs\Behat\PageObjectExtension\PageObject\Exception\ElementNotFoundException;
use Page\TrashbinPage;
use Page\OwncloudPage;
+use Page\FilesPageElement\ConflictDialog;
+use TestHelpers\DownloadHelper;
require_once 'bootstrap.php';
@@ -38,7 +40,11 @@ class FilesContext extends RawMinkContext implements Context {
private $filesPage;
private $trashbinPage;
-
+ /**
+ *
+ * @var ConflictDialog
+ */
+ private $conflictDialog;
/**
* Table of all files and folders that should have been deleted, stored so
* that other steps can use the list to check if the deletion happened correctly
@@ -57,23 +63,36 @@ class FilesContext extends RawMinkContext implements Context {
*/
private $movedElementsTable = null;
+ /**
+ * variable to remember in which folder we are currently working
+ *
+ * @var string
+ */
+ private $currentFolder = "";
+
/**
*
* @var FeatureContext
*/
private $featureContext;
-
+ private $uploadConflictDialogTitle = "file conflict";
+
/**
* FilesContext constructor.
*
* @param FilesPage $filesPage
* @param TrashbinPage $trashbinPage
+ * @param ConflictDialog $conflictDialog
+ * @return void
*/
public function __construct(
- FilesPage $filesPage, TrashbinPage $trashbinPage
+ FilesPage $filesPage,
+ TrashbinPage $trashbinPage,
+ ConflictDialog $conflictDialog
) {
$this->trashbinPage = $trashbinPage;
$this->filesPage = $filesPage;
+ $this->conflictDialog = $conflictDialog;
}
/**
@@ -333,6 +352,51 @@ public function iBatchMoveTheseFilesIntoTheFolder(
$this->movedElementsTable = $files;
}
+ /**
+ * @When I upload the file :name
+ * @param string $name
+ * @return void
+ */
+ public function iUploadTheFile($name) {
+ $this->filesPage->uploadFile($this->getSession(), $name);
+ }
+
+ /**
+ * @When /^I choose to keep the (new|existing) files$/
+ * @param string $choice
+ */
+ public function choiceInUploadConflict($choice) {
+ $dialogs = $this->filesPage->getOcDialogs();
+ foreach ($dialogs as $dialog) {
+ $isConflictDialog = strstr(
+ $dialog->getTitle(), $this->uploadConflictDialogTitle
+ );
+ if ($isConflictDialog !== false) {
+ $this->conflictDialog->setElement($dialog->getOwnElement());
+ break;
+ }
+ }
+ if ($choice === "new") {
+ $this->conflictDialog->keepNewFiles();
+ } elseif ($choice === "existing") {
+ $this->conflictDialog->keepExistingFiles();
+ } else {
+ throw new Exception("the choice can only be 'new' or 'existing'");
+ }
+
+ }
+
+ /**
+ * @When I click the :label button
+ * @return void
+ */
+ public function iClickTheButton($label) {
+ $dialogs = $this->filesPage->getOcDialogs();
+ $dialog = end($dialogs);
+ $this->conflictDialog->setElement($dialog->getOwnElement());
+ $this->conflictDialog->clickButton($this->getSession(), $label);
+ }
+
/**
* @Then /^the (?:deleted|moved) elements should (not|)\s?be listed$/
* @param string $shouldOrNot
@@ -411,33 +475,42 @@ public function iMarkTheseFilesForBatchAction(TableNode $files) {
}
/**
- * @When /^I open the (trashbin|)\s?(?:file|folder) ((?:'[^']*')|(?:"[^"]*"))$/
+ * @When /^I open the (trashbin|)\s?(file|folder) ((?:'[^']*')|(?:"[^"]*"))$/
* @param string $typeOfFilesPage
+ * @param string $fileOrFolder
* @param string $name enclosed in single or double quotes
* @return void
*/
- public function iOpenTheFolderNamed($typeOfFilesPage, $name) {
+ public function iOpenTheFolderNamed($typeOfFilesPage, $fileOrFolder, $name) {
// The capturing groups of the regex include the quotes at each
// end of the captured string, so trim them.
- $this->iOpenTheFolder($typeOfFilesPage, trim($name, $name[0]));
+ $this->iOpenTheFolder($typeOfFilesPage, $fileOrFolder, trim($name, $name[0]));
}
/**
* @param string $typeOfFilesPage
+ * @param string $fileOrFolder
* @param string|array $name
* @return void
*/
- public function iOpenTheFolder($typeOfFilesPage, $name) {
+ public function iOpenTheFolder($typeOfFilesPage, $fileOrFolder, $name) {
if ($typeOfFilesPage === "trashbin") {
$this->iAmOnTheTrashbinPage();
}
-
+ if ($fileOrFolder === "folder") {
+ if (is_array($name)) {
+ $this->currentFolder .= "/" . implode($name);
+ } else {
+ $this->currentFolder .= "/" . $name;
+ }
+ }
$pageObject = $this->getCurrentPageObject();
$pageObject->waitTillPageIsLoaded($this->getSession());
$pageObject->openFile($name, $this->getSession());
$pageObject->waitTillPageIsLoaded($this->getSession());
}
-
+
+
/**
* @Then /^the (?:file|folder) ((?:'[^']*')|(?:"[^"]*")) should (not|)\s?be listed\s?(?:in the |)(trashbin|)\s?(?:folder ((?:'[^']*')|(?:"[^"]*")))?$/
* @param string $name enclosed in single or double quotes
@@ -475,16 +548,13 @@ public function checkIfFileFolderIsListed(
) {
$should = ($shouldOrNot !== "not");
$message = null;
-
if ($typeOfFilesPage === "trashbin") {
$this->iAmOnTheTrashbinPage();
}
-
$pageObject = $this->getCurrentPageObject();
$pageObject->waitTillPageIsLoaded($this->getSession());
-
if ($folder !== "") {
- $this->iOpenTheFolder($typeOfFilesPage, $folder);
+ $this->iOpenTheFolder($typeOfFilesPage, "folder", $folder);
}
try {
@@ -494,14 +564,12 @@ public function checkIfFileFolderIsListed(
$message = $e->getMessage();
$fileRowElement = null;
}
-
if ($should) {
PHPUnit_Framework_Assert::assertNotNull($fileRowElement);
} else {
if (is_array($name)) {
$name = implode($name);
}
-
PHPUnit_Framework_Assert::assertContains(
"could not find file with the name '" . $name . "'",
$message
@@ -518,7 +586,7 @@ public function checkIfFileFolderIsListed(
public function theMovedElementsShouldBeListedInTheFolder(
$shouldOrNot, $folderName
) {
- $this->iOpenTheFolder("", $folderName);
+ $this->iOpenTheFolder("", "folder", $folderName);
$this->filesPage->waitTillPageIsLoaded($this->getSession());
$this->theDeletedMovedElementsShouldBeListed($shouldOrNot);
}
@@ -539,7 +607,7 @@ public function theFollowingFileFolderShouldBeListedInTheFollowingFolder(
$folderNameParts[] = $namePartsRow['folder-name-parts'];
$toBeListedTableArray[] = [$namePartsRow['item-name-parts']];
}
- $this->iOpenTheFolder("", $folderNameParts);
+ $this->iOpenTheFolder("", "folder",$folderNameParts);
$this->filesPage->waitTillPageIsLoaded($this->getSession());
$toBeListedTable = new TableNode($toBeListedTableArray);
@@ -638,6 +706,58 @@ public function theFilesactionmenuShouldBeCompletelyVisibleAfterClickingOnIt() {
}
}
+ /**
+ * @Then /^the content of ((?:'[^']*')|(?:"[^"]*")) should be the same as the local ((?:'[^']*')|(?:"[^"]*"))$/
+ * @param string $remoteFile enclosed in single or double quotes
+ * @param string $localFile enclosed in single or double quotes
+ * @return void
+ */
+ public function theContentOfShouldBeTheSameAsTheLocal($remoteFile, $localFile) {
+ // The capturing group of the regex always includes the quotes at each
+ // end of the captured string, so trim them.
+ $remoteFile = $this->currentFolder . "/" . trim($remoteFile, $remoteFile[0]);
+ $localFile = getenv("FILES_FOR_UPLOAD") . "/" . trim($localFile, $localFile[0]);
+ $this->assertContentOfRemoteAndLocalFileIsSame($remoteFile, $localFile);
+ }
+
+ /**
+ * @Then /^the content of ((?:'[^']*')|(?:"[^"]*")) should not have changed$/
+ * @param string $fileName
+ * @return void
+ */
+ public function theContentOfShouldNotHaveChanged($fileName) {
+ // The capturing group of the regex always includes the quotes at each
+ // end of the captured string, so trim them.
+ $fileName = trim($fileName, $fileName[0]);
+ $remoteFile = $this->currentFolder . "/" . $fileName;
+ $localFile = getenv("SKELETON_DIR") . "/" . $fileName;
+ $this->assertContentOfRemoteAndLocalFileIsSame($remoteFile, $localFile);
+ }
+
+ /**
+ * Asserts that the content of a remote and a local file is the same
+ * uses the current user to download the remote file
+ *
+ * @param string $remoteFile
+ * @param string $localFile
+ * @return void
+ */
+ private function assertContentOfRemoteAndLocalFileIsSame(
+ $remoteFile, $localFile
+ ) {
+ $username = $this->featureContext->getCurrentUser();
+ $result = DownloadHelper::download(
+ $this->getMinkParameter("base_url"),
+ $username,
+ $this->featureContext->getUserPassword($username),
+ $remoteFile
+ );
+
+ PHPUnit_Framework_Assert::assertSame(
+ file_get_contents($localFile), $result->getBody()->getContents()
+ );
+ }
+
/**
* @BeforeScenario
* This will run before EVERY scenario.
diff --git a/tests/ui/features/bootstrap/LoginContext.php b/tests/ui/features/bootstrap/LoginContext.php
index d7bc9210961e..3e4e63318f2c 100644
--- a/tests/ui/features/bootstrap/LoginContext.php
+++ b/tests/ui/features/bootstrap/LoginContext.php
@@ -36,6 +36,10 @@ class LoginContext extends RawMinkContext implements Context {
private $loginPage;
private $filesPage;
private $expectedPage;
+ /**
+ *
+ * @var FeatureContext
+ */
private $featureContext;
/**
@@ -64,6 +68,7 @@ public function iAmOnTheLoginPage() {
public function iLoginWithUsernameAndPassword($username, $password) {
$this->filesPage = $this->loginPage->loginAs($username, $password);
$this->filesPage->waitTillPageIsLoaded($this->getSession());
+ $this->featureContext->setCurrentUser($username);
}
/**
@@ -113,6 +118,7 @@ public function iLoginWithUsernameAndPasswordAfterRedirectFromThePage(
str_replace(' ', '', ucwords($page)) . 'Page'
);
$this->expectedPage->waitTillPageIsLoaded($this->getSession());
+ $this->featureContext->setCurrentUser($username);
}
/**
@@ -120,11 +126,13 @@ public function iLoginWithUsernameAndPasswordAfterRedirectFromThePage(
* @return void
*/
public function iLoginAsARegularUserWithACorrectPassword() {
+ $username = $this->featureContext->getRegularUserName();
$this->filesPage = $this->loginPage->loginAs(
- $this->featureContext->getRegularUserName(),
+ $username,
$this->featureContext->getRegularUserPassword()
);
$this->filesPage->waitTillPageIsLoaded($this->getSession());
+ $this->featureContext->setCurrentUser($username);
}
/**
diff --git a/tests/ui/features/files/deleteFilesFolders.feature b/tests/ui/features/files/deleteFilesFolders.feature
index 3bc156f25581..f3503009be49 100644
--- a/tests/ui/features/files/deleteFilesFolders.feature
+++ b/tests/ui/features/files/deleteFilesFolders.feature
@@ -15,7 +15,7 @@ So that I can keep my filing system clean and tidy
| simple-folder |
| lorem.txt |
| strängé नेपाली folder |
- | strängé filename (duplicate #2).txt |
+ | strängé filename (duplicate #2 &).txt |
Then the deleted elements should not be listed
And the deleted elements should not be listed after a page reload
diff --git a/tests/ui/features/lib/FilesPage.php b/tests/ui/features/lib/FilesPage.php
index 622e3cea4536..06f5c017544b 100644
--- a/tests/ui/features/lib/FilesPage.php
+++ b/tests/ui/features/lib/FilesPage.php
@@ -43,7 +43,7 @@ class FilesPage extends FilesPageBasic {
protected $newFileFolderButtonXpath = './/*[@id="controls"]//a[@class="button new"]';
protected $newFolderButtonXpath = './/div[contains(@class, "newFileMenu")]//a[@data-templatename="New folder"]';
protected $newFolderNameInputLabel = 'New folder';
-
+ protected $fileUploadInputId = "file_upload_start";
private $strForNormalFileName = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
/**
@@ -134,6 +134,25 @@ public function createFolder($name = null) {
return $name;
}
+ /**
+ *
+ * @param Session $session
+ * @param string $name
+ * @return void
+ */
+ public function uploadFile(Session $session, $name) {
+ $uploadField = $this->findById($this->fileUploadInputId);
+ if (is_null($uploadField)) {
+ throw new ElementNotFoundException(
+ __METHOD__ .
+ " id $this->fileUploadInputId " .
+ "could not find file upload input field"
+ );
+ }
+ $uploadField->attachFile(getenv("FILES_FOR_UPLOAD") . $name);
+ $this->waitForAjaxCallsToStartAndFinish($session);
+ }
+
/**
* opens the sharing dialog for a given file/folder name
* returns the SharingDialog Object
diff --git a/tests/ui/features/lib/FilesPageElement/ConflictDialog.php b/tests/ui/features/lib/FilesPageElement/ConflictDialog.php
new file mode 100644
index 000000000000..44dbb661599d
--- /dev/null
+++ b/tests/ui/features/lib/FilesPageElement/ConflictDialog.php
@@ -0,0 +1,67 @@
+
+ * @copyright 2017 Artur Neumann artur@jankaritech.com
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License,
+ * as published by the Free Software Foundation;
+ * either version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ *
+ */
+
+namespace Page\FilesPageElement;
+
+use Behat\Mink\Exception\ElementNotFoundException;
+use Page\OwncloudPageElement\OCDialog;
+
+class ConflictDialog extends OCDialog {
+ private $keepNewFilesCheckXpath = "//label[@for='checkbox-allnewfiles']";
+ private $keepExistingFilesCheckXpath = "//label[@for='checkbox-allexistingfiles']";
+
+ /**
+ * takes the xpath and selects the option with that xpath
+ *
+ * @param string $xpath
+ * @throws ElementNotFoundException
+ * @return void
+ */
+ private function keepFiles($xpath) {
+ $checkBox = $this->dialogElement->find("xpath", $xpath);
+ if ($checkBox === null) {
+ throw new ElementNotFoundException(
+ __METHOD__ .
+ " xpath $xpath " .
+ "could not find checkbox/label"
+ );
+ }
+ $checkBox->click();
+ }
+
+ /**
+ * @throws ElementNotFoundException
+ * @return void
+ */
+ public function keepExistingFiles() {
+ $this->keepFiles($this->keepExistingFilesCheckXpath);
+ }
+
+ /**
+ * @throws ElementNotFoundException
+ * @return void
+ */
+ public function keepNewFiles() {
+ $this->keepFiles($this->keepNewFilesCheckXpath);
+ }
+}
\ No newline at end of file
diff --git a/tests/ui/features/lib/OwncloudPageElement/OCDialog.php b/tests/ui/features/lib/OwncloudPageElement/OCDialog.php
index 83fe19e20290..895581b29197 100644
--- a/tests/ui/features/lib/OwncloudPageElement/OCDialog.php
+++ b/tests/ui/features/lib/OwncloudPageElement/OCDialog.php
@@ -40,6 +40,7 @@ class OCDialog extends OwncloudPage {
protected $dialogElement;
protected $titleClassXpath = ".//*[@class='oc-dialog-title']";
protected $contentClassXpath = ".//*[@class='oc-dialog-content']";
+ protected $buttonByLabelXpath = "//button[.='%s']";
/**
* the accept button, regardless of the label
*
@@ -60,6 +61,14 @@ public function setElement(NodeElement $dialogElement) {
$this->dialogElement = $dialogElement;
}
+ /**
+ * returns the Element that was set by setElement()
+ *
+ * @return \Behat\Mink\Element\NodeElement
+ */
+ public function getOwnElement() {
+ return $this->dialogElement;
+ }
/**
*
* @throws ElementNotFoundException
@@ -115,5 +124,27 @@ public function accept(Session $session) {
$primaryButton->click();
$this->waitForOutstandingAjaxCalls($session);
}
+
+ /**
+ * clicks the button with the given label
+ *
+ * @param Session $session
+ * @param string $label
+ * @return void
+ */
+ public function clickButton(Session $session, $label) {
+ $button = $this->dialogElement->find(
+ "xpath", sprintf($this->buttonByLabelXpath, $label)
+ );
+ if (is_null($button)) {
+ throw new ElementNotFoundException(
+ __METHOD__ .
+ " xpath " . sprintf($this->buttonByLabelXpath, $label) .
+ " could not find button with the given label"
+ );
+ }
+ $button->click();
+ $this->waitForOutstandingAjaxCalls($session);
+ }
}
\ No newline at end of file
diff --git a/tests/ui/features/moveFilesFolders/moveFiles.feature b/tests/ui/features/moveFilesFolders/moveFiles.feature
index d86f2a7ed0e4..65082d61bc48 100644
--- a/tests/ui/features/moveFilesFolders/moveFiles.feature
+++ b/tests/ui/features/moveFilesFolders/moveFiles.feature
@@ -19,21 +19,25 @@ So that I can organise my data structure
Then the file "data.tar.gz" should not be listed
But the file "data.tar.gz" should be listed in the folder "strängé नेपाली folder empty"
When I am on the files page
- And I move the file "strängé filename (duplicate #2).txt" into the folder "strängé नेपाली folder empty"
- Then the file "strängé filename (duplicate #2).txt" should not be listed
- But the file "strängé filename (duplicate #2).txt" should be listed in the folder "strängé नेपाली folder empty"
+ And I move the file "strängé filename (duplicate #2 &).txt" into the folder "strängé नेपाली folder empty"
+ Then the file "strängé filename (duplicate #2 &).txt" should not be listed
+ But the file "strängé filename (duplicate #2 &).txt" should be listed in the folder "strängé नेपाली folder empty"
@skipOnFIREFOX47+
Scenario: move a file into a folder where a file with the same name already exists
When I move the file "data.zip" into the folder "simple-folder"
And I move the file "data.zip" into the folder "strängé नेपाली folder"
- And I move the file "strängé filename (duplicate #2).txt" into the folder "strängé नेपाली folder"
Then notifications should be displayed with the text
|Could not move "data.zip", target exists|
|Could not move "data.zip", target exists|
- |Could not move "strängé filename (duplicate #2).txt", target exists|
And the file "data.zip" should be listed
- And the file "strängé filename (duplicate #2).txt" should be listed
+
+ @skip @issue-29556
+ Scenario: move a file into a folder where a file with the same name already exists
+ When I move the file "strängé filename (duplicate #2 &).txt" into the folder "strängé नेपाली folder"
+ Then notifications should be displayed with the text
+ |Could not move "strängé filename (duplicate #2 &).txt", target exists|
+ And the file "strängé filename (duplicate #2 &).txt" should be listed
@skipOnFIREFOX47+
Scenario: Move multiple files at once
diff --git a/tests/ui/features/renameFiles/renameFiles.feature b/tests/ui/features/renameFiles/renameFiles.feature
index 6695086e7ec7..3e3eb20709df 100644
--- a/tests/ui/features/renameFiles/renameFiles.feature
+++ b/tests/ui/features/renameFiles/renameFiles.feature
@@ -27,7 +27,7 @@ So that I can organise my data structure
Then the file should be listed
Examples:
|from_name |to_name |
- |"strängé filename (duplicate #2).txt"|"strängé filename (duplicate #3).txt"|
+ |"strängé filename (duplicate #2 &).txt"|"strängé filename (duplicate #3).txt"|
|"'single'quotes.txt" |"single-quotes.txt" |
Scenario: Rename a file using special characters and check its existence after page reload
diff --git a/tests/ui/features/sharing/shareByPublicLink.feature b/tests/ui/features/sharing/shareByPublicLink.feature
index 6e2a15e9e807..cadf65fdc30d 100644
--- a/tests/ui/features/sharing/shareByPublicLink.feature
+++ b/tests/ui/features/sharing/shareByPublicLink.feature
@@ -28,7 +28,7 @@ So that public sharing is limited according to organization policy
| name |
| simple-empty-folder |
| lorem.txt |
- | strängé filename (duplicate #2).txt |
+ | strängé filename (duplicate #2 &).txt |
| zzzz-must-be-last-file-in-folder.txt |
Then the deleted elements should not be listed
And the deleted elements should not be listed after a page reload
diff --git a/tests/ui/features/trashbin/trashbinFilesFolders.feature b/tests/ui/features/trashbin/trashbinFilesFolders.feature
index c5211e015712..9a473a886c9b 100644
--- a/tests/ui/features/trashbin/trashbinFilesFolders.feature
+++ b/tests/ui/features/trashbin/trashbinFilesFolders.feature
@@ -15,7 +15,7 @@ Feature: files and folders exist in the trashbin after being deleted
| simple-folder |
| lorem.txt |
| strängé नेपाली folder |
- | strängé filename (duplicate #2).txt |
+ | strängé filename (duplicate #2 &).txt |
Then the deleted elements should be listed in the trashbin
And the file "lorem.txt" should be listed in the trashbin folder "simple-folder"
diff --git a/tests/ui/features/upload/upload.feature b/tests/ui/features/upload/upload.feature
new file mode 100644
index 000000000000..9efb99b431e9
--- /dev/null
+++ b/tests/ui/features/upload/upload.feature
@@ -0,0 +1,49 @@
+@insulated
+Feature: File Upload
+
+As a user
+I would like to be able to upload files via the WebUI
+So that I can store files in ownCloud
+
+ Background:
+ Given these users exist:
+ |username|password|displayname|email |
+ |user1 |1234 |User One |u1@oc.com.np|
+ And I am on the login page
+ And I login with username "user1" and password "1234"
+
+ Scenario: simple upload of a file that does not exist before
+ When I upload the file "new-lorem.txt"
+ Then the file "new-lorem.txt" should be listed
+ And the content of "new-lorem.txt" should be the same as the local "new-lorem.txt"
+
+ Scenario: upload a new file into a sub folder
+ When I open the folder "simple-folder"
+ And I upload the file "new-lorem.txt"
+ Then the file "new-lorem.txt" should be listed
+ And the content of "new-lorem.txt" should be the same as the local "new-lorem.txt"
+
+ Scenario: overwrite an existing file
+ When I upload the file "lorem.txt"
+ And I choose to keep the new files
+ And I click the "Continue" button
+ Then the file "lorem.txt" should be listed
+ And the content of "lorem.txt" should be the same as the local "lorem.txt"
+ But the file "lorem (2).txt" should not be listed
+
+ Scenario: keep new and existing file
+ When I upload the file "lorem.txt"
+ And I choose to keep the new files
+ And I choose to keep the existing files
+ And I click the "Continue" button
+ Then the file "lorem.txt" should be listed
+ And the content of "lorem.txt" should not have changed
+ And the file "lorem (2).txt" should be listed
+ And the content of "lorem (2).txt" should be the same as the local "lorem.txt"
+
+ Scenario: cancel conflict dialog
+ When I upload the file "lorem.txt"
+ And I click the "Cancel" button
+ Then the file "lorem.txt" should be listed
+ And the content of "lorem.txt" should not have changed
+ And the file "lorem (2).txt" should not be listed
\ No newline at end of file
diff --git a/tests/ui/features/upload/uploadEdgecases.feature b/tests/ui/features/upload/uploadEdgecases.feature
new file mode 100644
index 000000000000..86b274499596
--- /dev/null
+++ b/tests/ui/features/upload/uploadEdgecases.feature
@@ -0,0 +1,90 @@
+@insulated
+Feature: File Upload
+
+As a QA engineer
+I would like to test uploads of all kind of funny filenames via the WebUI
+
+These tests are written in a way that multiple file names are tested in one scenario
+that is not academically correct but saves a lot of time
+
+ Background:
+ Given these users exist:
+ |username|password|displayname|email |
+ |user1 |1234 |User One |u1@oc.com.np|
+ And I am on the login page
+ And I login with username "user1" and password "1234"
+
+ Scenario: simple upload of a file that does not exist before
+ When I upload the file "new-'single'quotes.txt"
+ Then the file "new-'single'quotes.txt" should be listed
+ And the content of "new-'single'quotes.txt" should be the same as the local "new-'single'quotes.txt"
+ When I upload the file "new-strängé filename (duplicate #2 &).txt"
+ Then the file "new-strängé filename (duplicate #2 &).txt" should be listed
+ And the content of "new-strängé filename (duplicate #2 &).txt" should be the same as the local "new-strängé filename (duplicate #2 &).txt"
+ When I upload the file "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt"
+ Then the file "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt" should be listed
+ And the content of "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt" should be the same as the local "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt"
+
+ Scenario Outline: upload a new file into a sub folder
+ When I open the folder
+ When I upload the file "0"
+ Then the file "0" should be listed
+ And the content of "0" should be the same as the local "0"
+ When I upload the file "new-'single'quotes.txt"
+ Then the file "new-'single'quotes.txt" should be listed
+ And the content of "new-'single'quotes.txt" should be the same as the local "new-'single'quotes.txt"
+ When I upload the file "new-strängé filename (duplicate #2 &).txt"
+ Then the file "new-strängé filename (duplicate #2 &).txt" should be listed
+ And the content of "new-strängé filename (duplicate #2 &).txt" should be the same as the local "new-strängé filename (duplicate #2 &).txt"
+ When I upload the file "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt"
+ Then the file "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt" should be listed
+ And the content of "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt" should be the same as the local "zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt"
+ Examples:
+ | folder-to-upload-to |
+ | "0" |
+ | "'single'quotes" |
+ | "strängé नेपाली folder" |
+
+ Scenario: overwrite an existing file
+ When I upload the file "'single'quotes.txt"
+ And I choose to keep the new files
+ And I click the "Continue" button
+ Then the file "'single'quotes.txt" should be listed
+ And the content of "'single'quotes.txt" should be the same as the local "'single'quotes.txt"
+ When I upload the file "strängé filename (duplicate #2 &).txt"
+ And I choose to keep the new files
+ And I click the "Continue" button
+ Then the file "strängé filename (duplicate #2 &).txt" should be listed
+ And the content of "strängé filename (duplicate #2 &).txt" should be the same as the local "strängé filename (duplicate #2 &).txt"
+ When I upload the file "zzzz-must-be-last-file-in-folder.txt"
+ And I choose to keep the new files
+ And I click the "Continue" button
+ Then the file "zzzz-must-be-last-file-in-folder.txt" should be listed
+ And the content of "zzzz-must-be-last-file-in-folder.txt" should be the same as the local "zzzz-must-be-last-file-in-folder.txt"
+
+ Scenario: keep new and existing file
+ When I upload the file "'single'quotes.txt"
+ And I choose to keep the new files
+ And I choose to keep the existing files
+ And I click the "Continue" button
+ Then the file "'single'quotes.txt" should be listed
+ And the content of "'single'quotes.txt" should not have changed
+ And the file "'single'quotes (2).txt" should be listed
+ And the content of "'single'quotes (2).txt" should be the same as the local "'single'quotes.txt"
+ When I upload the file "strängé filename (duplicate #2 &).txt"
+ And I choose to keep the new files
+ And I choose to keep the existing files
+ And I click the "Continue" button
+ Then the file "strängé filename (duplicate #2 &).txt" should be listed
+ And the content of "strängé filename (duplicate #2 &).txt" should not have changed
+ And the file "strängé filename (duplicate #2 &) (2).txt" should be listed
+ And the content of "strängé filename (duplicate #2 &) (2).txt" should be the same as the local "strängé filename (duplicate #2 &).txt"
+
+ When I upload the file "zzzz-must-be-last-file-in-folder.txt"
+ And I choose to keep the new files
+ And I choose to keep the existing files
+ And I click the "Continue" button
+ Then the file "zzzz-must-be-last-file-in-folder.txt" should be listed
+ And the content of "zzzz-must-be-last-file-in-folder.txt" should not have changed
+ And the file "zzzz-must-be-last-file-in-folder (2).txt" should be listed
+ And the content of "zzzz-must-be-last-file-in-folder (2).txt" should be the same as the local "zzzz-must-be-last-file-in-folder.txt"
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/'single'quotes.txt b/tests/ui/filesForUpload/'single'quotes.txt
new file mode 100644
index 000000000000..96abcb4f020b
--- /dev/null
+++ b/tests/ui/filesForUpload/'single'quotes.txt
@@ -0,0 +1,9 @@
+a file with a single quote i its name
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/0 b/tests/ui/filesForUpload/0
new file mode 100644
index 000000000000..81f2343500b3
--- /dev/null
+++ b/tests/ui/filesForUpload/0
@@ -0,0 +1,9 @@
+a file called "0"
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/data.tar.gz b/tests/ui/filesForUpload/data.tar.gz
new file mode 100644
index 000000000000..05c74a335f04
Binary files /dev/null and b/tests/ui/filesForUpload/data.tar.gz differ
diff --git a/tests/ui/filesForUpload/data.zip b/tests/ui/filesForUpload/data.zip
new file mode 100644
index 000000000000..d79780eada8f
Binary files /dev/null and b/tests/ui/filesForUpload/data.zip differ
diff --git a/tests/ui/filesForUpload/lorem-big.txt b/tests/ui/filesForUpload/lorem-big.txt
new file mode 100644
index 000000000000..7c3df7df5150
--- /dev/null
+++ b/tests/ui/filesForUpload/lorem-big.txt
@@ -0,0 +1,93 @@
+a big lorem file
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/lorem.txt b/tests/ui/filesForUpload/lorem.txt
new file mode 100644
index 000000000000..9d3b7a654c16
--- /dev/null
+++ b/tests/ui/filesForUpload/lorem.txt
@@ -0,0 +1,7 @@
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/new-'single'quotes.txt b/tests/ui/filesForUpload/new-'single'quotes.txt
new file mode 100644
index 000000000000..603f2187aaea
--- /dev/null
+++ b/tests/ui/filesForUpload/new-'single'quotes.txt
@@ -0,0 +1,9 @@
+a file with a single quote i its name, but different to the original one
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/new-data.tar.gz b/tests/ui/filesForUpload/new-data.tar.gz
new file mode 100644
index 000000000000..05c74a335f04
Binary files /dev/null and b/tests/ui/filesForUpload/new-data.tar.gz differ
diff --git a/tests/ui/filesForUpload/new-data.zip b/tests/ui/filesForUpload/new-data.zip
new file mode 100644
index 000000000000..d79780eada8f
Binary files /dev/null and b/tests/ui/filesForUpload/new-data.zip differ
diff --git a/tests/ui/filesForUpload/new-lorem-big.txt b/tests/ui/filesForUpload/new-lorem-big.txt
new file mode 100644
index 000000000000..2c1c631e0308
--- /dev/null
+++ b/tests/ui/filesForUpload/new-lorem-big.txt
@@ -0,0 +1,93 @@
+a big lorem file but different to the original one
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/new-lorem.txt b/tests/ui/filesForUpload/new-lorem.txt
new file mode 100644
index 000000000000..b935db537dd6
--- /dev/null
+++ b/tests/ui/filesForUpload/new-lorem.txt
@@ -0,0 +1,9 @@
+lorem file that is different from the original one
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git "a/tests/ui/filesForUpload/new-str\303\244ng\303\251 filename (duplicate #2 &).txt" "b/tests/ui/filesForUpload/new-str\303\244ng\303\251 filename (duplicate #2 &).txt"
new file mode 100644
index 000000000000..ac6c70ca53fe
--- /dev/null
+++ "b/tests/ui/filesForUpload/new-str\303\244ng\303\251 filename (duplicate #2 &).txt"
@@ -0,0 +1,9 @@
+a file with funny characters in the file name but different from the original one
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git "a/tests/ui/filesForUpload/str\303\244ng\303\251 filename (duplicate #2 &).txt" "b/tests/ui/filesForUpload/str\303\244ng\303\251 filename (duplicate #2 &).txt"
new file mode 100644
index 000000000000..a771bf79ea6d
--- /dev/null
+++ "b/tests/ui/filesForUpload/str\303\244ng\303\251 filename (duplicate #2 &).txt"
@@ -0,0 +1,9 @@
+a file with funny characters in the file name
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/zzzz-must-be-last-file-in-folder.txt b/tests/ui/filesForUpload/zzzz-must-be-last-file-in-folder.txt
new file mode 100644
index 000000000000..dcc19d17f8a8
--- /dev/null
+++ b/tests/ui/filesForUpload/zzzz-must-be-last-file-in-folder.txt
@@ -0,0 +1,11 @@
+This must be the last skeleton file in this folder, when sorted alphabetically.
+Tests for performing actions on the last file in the folder try to find and use
+this file name.
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/filesForUpload/zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt b/tests/ui/filesForUpload/zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt
new file mode 100644
index 000000000000..1db21f1fb9be
--- /dev/null
+++ b/tests/ui/filesForUpload/zzzz-zzzz-will-be-at-the-end-of-the-folder-when-uploaded.txt
@@ -0,0 +1,11 @@
+This file has a name so it would be the last after the upload, when sorted alphabetically.
+Tests for performing actions on the last file in the folder try to find and use
+this file name.
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
+totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
+dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
+sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est
+qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
+incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
+exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
\ No newline at end of file
diff --git a/tests/ui/skeleton/0/for-git-commit b/tests/ui/skeleton/0/for-git-commit
new file mode 100644
index 000000000000..86459fd55043
--- /dev/null
+++ b/tests/ui/skeleton/0/for-git-commit
@@ -0,0 +1 @@
+this file is only here because git does not allow to commit empty folders
\ No newline at end of file
diff --git "a/tests/ui/skeleton/folder with space/str\303\244ng\303\251 filename (duplicate #2).txt" "b/tests/ui/skeleton/folder with space/str\303\244ng\303\251 filename (duplicate #2 &).txt"
similarity index 100%
rename from "tests/ui/skeleton/folder with space/str\303\244ng\303\251 filename (duplicate #2).txt"
rename to "tests/ui/skeleton/folder with space/str\303\244ng\303\251 filename (duplicate #2 &).txt"
diff --git "a/tests/ui/skeleton/simple-folder/str\303\244ng\303\251 filename (duplicate #2).txt" "b/tests/ui/skeleton/simple-folder/str\303\244ng\303\251 filename (duplicate #2 &).txt"
similarity index 100%
rename from "tests/ui/skeleton/simple-folder/str\303\244ng\303\251 filename (duplicate #2).txt"
rename to "tests/ui/skeleton/simple-folder/str\303\244ng\303\251 filename (duplicate #2 &).txt"
diff --git "a/tests/ui/skeleton/str\303\244ng\303\251 filename (duplicate #2).txt" "b/tests/ui/skeleton/str\303\244ng\303\251 filename (duplicate #2 &).txt"
similarity index 100%
rename from "tests/ui/skeleton/str\303\244ng\303\251 filename (duplicate #2).txt"
rename to "tests/ui/skeleton/str\303\244ng\303\251 filename (duplicate #2 &).txt"
diff --git "a/tests/ui/skeleton/str\303\244ng\303\251 \340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 folder/str\303\244ng\303\251 filename (duplicate #2).txt" "b/tests/ui/skeleton/str\303\244ng\303\251 \340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 folder/str\303\244ng\303\251 filename (duplicate #2 &).txt"
similarity index 100%
rename from "tests/ui/skeleton/str\303\244ng\303\251 \340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 folder/str\303\244ng\303\251 filename (duplicate #2).txt"
rename to "tests/ui/skeleton/str\303\244ng\303\251 \340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 folder/str\303\244ng\303\251 filename (duplicate #2 &).txt"