summaryrefslogtreecommitdiffstats
path: root/tests/acceptance/features/bootstrap/FilesAppContext.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/acceptance/features/bootstrap/FilesAppContext.php')
-rw-r--r--tests/acceptance/features/bootstrap/FilesAppContext.php309
1 files changed, 29 insertions, 280 deletions
diff --git a/tests/acceptance/features/bootstrap/FilesAppContext.php b/tests/acceptance/features/bootstrap/FilesAppContext.php
index 117f3b54fb8..50997d98b0f 100644
--- a/tests/acceptance/features/bootstrap/FilesAppContext.php
+++ b/tests/acceptance/features/bootstrap/FilesAppContext.php
@@ -26,6 +26,7 @@ use Behat\Behat\Context\Context;
class FilesAppContext implements Context, ActorAwareInterface {
use ActorAware;
+ use FileListAncestorSetter;
/**
* @return array
@@ -216,6 +217,18 @@ class FilesAppContext implements Context, ActorAwareInterface {
/**
* @return Locator
*/
+ public static function allowUploadAndEditingRadioButton() {
+ // forThe()->radio("Allow upload and editing") can not be used here;
+ // that would return the radio button itself, but the element that the
+ // user interacts with is the label.
+ return Locator::forThe()->xpath("//label[normalize-space() = 'Allow upload and editing']")->
+ descendantOf(self::currentSectionDetailsView())->
+ describedAs("Allow upload and editing radio button in the details view in Files app");
+ }
+
+ /**
+ * @return Locator
+ */
public static function passwordProtectCheckbox() {
// forThe()->checkbox("Password protect") can not be used here; that
// would return the checkbox itself, but the element that the user
@@ -242,185 +255,6 @@ class FilesAppContext implements Context, ActorAwareInterface {
}
/**
- * @return Locator
- */
- public static function createMenuButton() {
- return Locator::forThe()->css("#controls .button.new")->
- descendantOf(self::currentSectionMainView())->
- describedAs("Create menu button in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function createNewFolderMenuItem() {
- return self::createMenuItemFor("New folder");
- }
-
- /**
- * @return Locator
- */
- public static function createNewFolderMenuItemNameInput() {
- return Locator::forThe()->css(".filenameform input")->
- descendantOf(self::createNewFolderMenuItem())->
- describedAs("Name input in create new folder menu item in Files app");
- }
-
- /**
- * @return Locator
- */
- private static function createMenuItemFor($newType) {
- return Locator::forThe()->xpath("//div[contains(concat(' ', normalize-space(@class), ' '), ' newFileMenu ')]//span[normalize-space() = '$newType']/ancestor::li")->
- descendantOf(self::currentSectionMainView())->
- describedAs("Create $newType menu item in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function rowForFile($fileName) {
- return Locator::forThe()->xpath("//*[@id = 'fileList']//span[contains(concat(' ', normalize-space(@class), ' '), ' nametext ') and normalize-space() = '$fileName']/ancestor::tr")->
- descendantOf(self::currentSectionMainView())->
- describedAs("Row for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function rowForFilePreceding($fileName1, $fileName2) {
- return Locator::forThe()->xpath("//preceding-sibling::tr//span[contains(concat(' ', normalize-space(@class), ' '), ' nametext ') and normalize-space() = '$fileName1']/ancestor::tr")->
- descendantOf(self::rowForFile($fileName2))->
- describedAs("Row for file $fileName1 preceding $fileName2 in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function favoriteMarkForFile($fileName) {
- return Locator::forThe()->css(".favorite-mark")->descendantOf(self::rowForFile($fileName))->
- describedAs("Favorite mark for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function notFavoritedStateIconForFile($fileName) {
- return Locator::forThe()->css(".icon-star")->descendantOf(self::favoriteMarkForFile($fileName))->
- describedAs("Not favorited state icon for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function favoritedStateIconForFile($fileName) {
- return Locator::forThe()->css(".icon-starred")->descendantOf(self::favoriteMarkForFile($fileName))->
- describedAs("Favorited state icon for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function mainLinkForFile($fileName) {
- return Locator::forThe()->css(".name")->descendantOf(self::rowForFile($fileName))->
- describedAs("Main link for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function renameInputForFile($fileName) {
- return Locator::forThe()->css("input.filename")->descendantOf(self::rowForFile($fileName))->
- describedAs("Rename input for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function shareActionForFile($fileName) {
- return Locator::forThe()->css(".action-share")->descendantOf(self::rowForFile($fileName))->
- describedAs("Share action for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function fileActionsMenuButtonForFile($fileName) {
- return Locator::forThe()->css(".action-menu")->descendantOf(self::rowForFile($fileName))->
- describedAs("File actions menu button for file $fileName in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function fileActionsMenu() {
- return Locator::forThe()->css(".fileActionsMenu")->
- describedAs("File actions menu in Files app");
- }
-
- /**
- * @return Locator
- */
- public static function detailsMenuItem() {
- return self::fileActionsMenuItemFor("Details");
- }
-
- /**
- * @return Locator
- */
- public static function renameMenuItem() {
- return self::fileActionsMenuItemFor("Rename");
- }
-
- /**
- * @return Locator
- */
- public static function addToFavoritesMenuItem() {
- return self::fileActionsMenuItemFor("Add to favorites");
- }
-
- /**
- * @return Locator
- */
- public static function removeFromFavoritesMenuItem() {
- return self::fileActionsMenuItemFor("Remove from favorites");
- }
-
- /**
- * @return Locator
- */
- public static function viewFileInFolderMenuItem() {
- return self::fileActionsMenuItemFor("View in folder");
- }
-
- /**
- * @return Locator
- */
- private static function fileActionsMenuItemFor($itemText) {
- return Locator::forThe()->xpath("//a[normalize-space() = '$itemText']")->
- descendantOf(self::fileActionsMenu())->
- describedAs($itemText . " item in file actions menu in Files app");
- }
-
- /**
- * @Given I create a new folder named :folderName
- */
- public function iCreateANewFolderNamed($folderName) {
- $this->actor->find(self::createMenuButton(), 10)->click();
-
- $this->actor->find(self::createNewFolderMenuItem(), 2)->click();
- $this->actor->find(self::createNewFolderMenuItemNameInput(), 2)->setValue($folderName . "\r");
- }
-
- /**
- * @Given I open the details view for :fileName
- */
- public function iOpenTheDetailsViewFor($fileName) {
- $this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click();
-
- $this->actor->find(self::detailsMenuItem(), 2)->click();
- }
-
- /**
* @Given I close the details view
*/
public function iCloseTheDetailsView() {
@@ -442,43 +276,10 @@ class FilesAppContext implements Context, ActorAwareInterface {
}
/**
- * @Given I rename :fileName1 to :fileName2
- */
- public function iRenameTo($fileName1, $fileName2) {
- $this->actor->find(self::fileActionsMenuButtonForFile($fileName1), 10)->click();
-
- $this->actor->find(self::renameMenuItem(), 2)->click();
-
- $this->actor->find(self::renameInputForFile($fileName1), 10)->setValue($fileName2 . "\r");
- }
-
- /**
- * @Given I mark :fileName as favorite
- */
- public function iMarkAsFavorite($fileName) {
- $this->iSeeThatIsNotMarkedAsFavorite($fileName);
-
- $this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click();
-
- $this->actor->find(self::addToFavoritesMenuItem(), 2)->click();
- }
-
- /**
- * @Given I unmark :fileName as favorite
- */
- public function iUnmarkAsFavorite($fileName) {
- $this->iSeeThatIsMarkedAsFavorite($fileName);
-
- $this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click();
-
- $this->actor->find(self::removeFromFavoritesMenuItem(), 2)->click();
- }
-
- /**
* @Given I share the link for :fileName
*/
public function iShareTheLinkFor($fileName) {
- $this->actor->find(self::shareActionForFile($fileName), 10)->click();
+ $this->actor->find(FileListContext::shareActionForFile(self::currentSectionMainView(), $fileName), 10)->click();
$this->actor->find(self::shareLinkCheckbox(), 5)->click();
}
@@ -490,7 +291,8 @@ class FilesAppContext implements Context, ActorAwareInterface {
// The shared link field always exists in the DOM (once the "Sharing"
// tab is loaded), but its value is the actual shared link only when it
// is visible.
- if (!$this->waitForElementToBeEventuallyShown(
+ if (!WaitFor::elementToBeEventuallyShown(
+ $this->actor,
self::shareLinkField(),
$timeout = 10 * $this->actor->getFindTimeoutMultiplier())) {
PHPUnit_Framework_Assert::fail("The shared link was not shown yet after $timeout seconds");
@@ -500,15 +302,6 @@ class FilesAppContext implements Context, ActorAwareInterface {
}
/**
- * @When I view :fileName in folder
- */
- public function iViewInFolder($fileName) {
- $this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click();
-
- $this->actor->find(self::viewFileInFolderMenuItem(), 2)->click();
- }
-
- /**
* @When I check the tag :tag in the dropdown for tags in the details view
*/
public function iCheckTheTagInTheDropdownForTagsInTheDetailsView($tag) {
@@ -527,6 +320,13 @@ class FilesAppContext implements Context, ActorAwareInterface {
}
/**
+ * @When I set the shared link as editable
+ */
+ public function iSetTheSharedLinkAsEditable() {
+ $this->actor->find(self::allowUploadAndEditingRadioButton(), 10)->click();
+ }
+
+ /**
* @When I protect the shared link with the password :password
*/
public function iProtectTheSharedLinkWithThePassword($password) {
@@ -542,6 +342,8 @@ class FilesAppContext implements Context, ActorAwareInterface {
PHPUnit_Framework_Assert::assertStringStartsWith(
$this->actor->locatePath("/apps/files/"),
$this->actor->getSession()->getCurrentUrl());
+
+ $this->setFileListAncestorForActor(self::currentSectionMainView(), $this->actor);
}
/**
@@ -578,34 +380,6 @@ class FilesAppContext implements Context, ActorAwareInterface {
}
/**
- * @Then I see that the file list contains a file named :fileName
- */
- public function iSeeThatTheFileListContainsAFileNamed($fileName) {
- PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::rowForFile($fileName), 10));
- }
-
- /**
- * @Then I see that :fileName1 precedes :fileName2 in the file list
- */
- public function iSeeThatPrecedesInTheFileList($fileName1, $fileName2) {
- PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::rowForFilePreceding($fileName1, $fileName2), 10));
- }
-
- /**
- * @Then I see that :fileName is marked as favorite
- */
- public function iSeeThatIsMarkedAsFavorite($fileName) {
- PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::favoritedStateIconForFile($fileName), 10));
- }
-
- /**
- * @Then I see that :fileName is not marked as favorite
- */
- public function iSeeThatIsNotMarkedAsFavorite($fileName) {
- PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::notFavoritedStateIconForFile($fileName), 10));
- }
-
- /**
* @Then I see that the file name shown in the details view is :fileName
*/
public function iSeeThatTheFileNameShownInTheDetailsViewIs($fileName) {
@@ -665,7 +439,8 @@ class FilesAppContext implements Context, ActorAwareInterface {
* @When I see that the :tabName tab in the details view is eventually loaded
*/
public function iSeeThatTheTabInTheDetailsViewIsEventuallyLoaded($tabName) {
- if (!$this->waitForElementToBeEventuallyNotShown(
+ if (!WaitFor::elementToBeEventuallyNotShown(
+ $this->actor,
self::loadingIconForTabInCurrentSectionDetailsViewNamed($tabName),
$timeout = 10 * $this->actor->getFindTimeoutMultiplier())) {
PHPUnit_Framework_Assert::fail("The $tabName tab in the details view has not been loaded after $timeout seconds");
@@ -683,7 +458,8 @@ class FilesAppContext implements Context, ActorAwareInterface {
* @Then I see that the working icon for password protect is eventually not shown
*/
public function iSeeThatTheWorkingIconForPasswordProtectIsEventuallyNotShown() {
- if (!$this->waitForElementToBeEventuallyNotShown(
+ if (!WaitFor::elementToBeEventuallyNotShown(
+ $this->actor,
self::passwordProtectWorkingIcon(),
$timeout = 10 * $this->actor->getFindTimeoutMultiplier())) {
PHPUnit_Framework_Assert::fail("The working icon for password protect is still shown after $timeout seconds");
@@ -700,31 +476,4 @@ class FilesAppContext implements Context, ActorAwareInterface {
$this->iSeeThatTheWorkingIconForPasswordProtectIsEventuallyNotShown();
}
- private function waitForElementToBeEventuallyShown($elementLocator, $timeout = 10, $timeoutStep = 1) {
- $actor = $this->actor;
-
- $elementShownCallback = function() use ($actor, $elementLocator) {
- try {
- return $actor->find($elementLocator)->isVisible();
- } catch (NoSuchElementException $exception) {
- return false;
- }
- };
-
- return Utils::waitFor($elementShownCallback, $timeout, $timeoutStep);
- }
-
- private function waitForElementToBeEventuallyNotShown($elementLocator, $timeout = 10, $timeoutStep = 1) {
- $actor = $this->actor;
-
- $elementNotShownCallback = function() use ($actor, $elementLocator) {
- try {
- return !$actor->find($elementLocator)->isVisible();
- } catch (NoSuchElementException $exception) {
- return true;
- }
- };
-
- return Utils::waitFor($elementNotShownCallback, $timeout, $timeoutStep);
- }
}