Generalize file list locators so a specific ancestor can be used

The file list is used in other places besides the Files app (for
example, the File sharing app); in those cases the locators for the file
list elements are the same, but not for the ancestor of the file list.
To make possible to reuse the file list locators in those cases too now
they receive the ancestor to use.

Note that the locators for the file actions menu were not using an
ancestor locator because it is expected that there is only one file
actions menu at a time in the whole page; that may change in the future,
but for the time being it is a valid assumption and thus the ancestor
was not added to those locators in this commit.

Although the locators were generalized the steps themselves still use
the "FilesAppContext::currentSectionMainView" locator as ancestor; the
steps will be generalized in a following commit.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
Daniel Calviño Sánchez 2018-02-19 14:24:01 +01:00
parent 292e95566e
commit 3c6a269138
2 changed files with 43 additions and 31 deletions

View File

@ -27,67 +27,79 @@ class FileListContext implements Context, ActorAwareInterface {
use ActorAware; use ActorAware;
/**
* @var Locator
*/
private $fileListAncestor;
/**
* @BeforeScenario
*/
public function initializeFileListAncestor() {
$this->fileListAncestor = FilesAppContext::currentSectionMainView();
}
/** /**
* @return Locator * @return Locator
*/ */
public static function rowForFile($fileName) { public static function rowForFile($fileListAncestor, $fileName) {
return Locator::forThe()->xpath("//*[@id = 'fileList']//span[contains(concat(' ', normalize-space(@class), ' '), ' nametext ') and normalize-space() = '$fileName']/ancestor::tr")-> return Locator::forThe()->xpath("//*[@id = 'fileList']//span[contains(concat(' ', normalize-space(@class), ' '), ' nametext ') and normalize-space() = '$fileName']/ancestor::tr")->
descendantOf(FilesAppContext::currentSectionMainView())-> descendantOf($fileListAncestor)->
describedAs("Row for file $fileName in Files app"); describedAs("Row for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function favoriteActionForFile($fileName) { public static function favoriteActionForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css(".action-favorite")-> return Locator::forThe()->css(".action-favorite")->
descendantOf(self::rowForFile($fileName))-> descendantOf(self::rowForFile($fileListAncestor, $fileName))->
describedAs("Favorite action for file $fileName in Files app"); describedAs("Favorite action for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function favoritedStateIconForFile($fileName) { public static function favoritedStateIconForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css(".icon-starred")-> return Locator::forThe()->css(".icon-starred")->
descendantOf(self::favoriteActionForFile($fileName))-> descendantOf(self::favoriteActionForFile($fileListAncestor, $fileName))->
describedAs("Favorited state icon for file $fileName in Files app"); describedAs("Favorited state icon for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function mainLinkForFile($fileName) { public static function mainLinkForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css(".name")-> return Locator::forThe()->css(".name")->
descendantOf(self::rowForFile($fileName))-> descendantOf(self::rowForFile($fileListAncestor, $fileName))->
describedAs("Main link for file $fileName in Files app"); describedAs("Main link for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function renameInputForFile($fileName) { public static function renameInputForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css("input.filename")-> return Locator::forThe()->css("input.filename")->
descendantOf(self::rowForFile($fileName))-> descendantOf(self::rowForFile($fileListAncestor, $fileName))->
describedAs("Rename input for file $fileName in Files app"); describedAs("Rename input for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function shareActionForFile($fileName) { public static function shareActionForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css(".action-share")-> return Locator::forThe()->css(".action-share")->
descendantOf(self::rowForFile($fileName))-> descendantOf(self::rowForFile($fileListAncestor, $fileName))->
describedAs("Share action for file $fileName in Files app"); describedAs("Share action for file $fileName in file list");
} }
/** /**
* @return Locator * @return Locator
*/ */
public static function fileActionsMenuButtonForFile($fileName) { public static function fileActionsMenuButtonForFile($fileListAncestor, $fileName) {
return Locator::forThe()->css(".action-menu")-> return Locator::forThe()->css(".action-menu")->
descendantOf(self::rowForFile($fileName))-> descendantOf(self::rowForFile($fileListAncestor, $fileName))->
describedAs("File actions menu button for file $fileName in Files app"); describedAs("File actions menu button for file $fileName in file list");
} }
/** /**
@ -95,7 +107,7 @@ class FileListContext implements Context, ActorAwareInterface {
*/ */
public static function fileActionsMenu() { public static function fileActionsMenu() {
return Locator::forThe()->css(".fileActionsMenu")-> return Locator::forThe()->css(".fileActionsMenu")->
describedAs("File actions menu in Files app"); describedAs("File actions menu in file list");
} }
/** /**
@ -104,7 +116,7 @@ class FileListContext implements Context, ActorAwareInterface {
private static function fileActionsMenuItemFor($itemText) { private static function fileActionsMenuItemFor($itemText) {
return Locator::forThe()->xpath("//a[normalize-space() = '$itemText']")-> return Locator::forThe()->xpath("//a[normalize-space() = '$itemText']")->
descendantOf(self::fileActionsMenu())-> descendantOf(self::fileActionsMenu())->
describedAs($itemText . " item in file actions menu in Files app"); describedAs($itemText . " item in file actions menu in file list");
} }
/** /**
@ -132,7 +144,7 @@ class FileListContext implements Context, ActorAwareInterface {
* @Given I open the details view for :fileName * @Given I open the details view for :fileName
*/ */
public function iOpenTheDetailsViewFor($fileName) { public function iOpenTheDetailsViewFor($fileName) {
$this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click(); $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click();
$this->actor->find(self::detailsMenuItem(), 2)->click(); $this->actor->find(self::detailsMenuItem(), 2)->click();
} }
@ -141,25 +153,25 @@ class FileListContext implements Context, ActorAwareInterface {
* @Given I rename :fileName1 to :fileName2 * @Given I rename :fileName1 to :fileName2
*/ */
public function iRenameTo($fileName1, $fileName2) { public function iRenameTo($fileName1, $fileName2) {
$this->actor->find(self::fileActionsMenuButtonForFile($fileName1), 10)->click(); $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName1), 10)->click();
$this->actor->find(self::renameMenuItem(), 2)->click(); $this->actor->find(self::renameMenuItem(), 2)->click();
$this->actor->find(self::renameInputForFile($fileName1), 10)->setValue($fileName2 . "\r"); $this->actor->find(self::renameInputForFile($this->fileListAncestor, $fileName1), 10)->setValue($fileName2 . "\r");
} }
/** /**
* @Given I mark :fileName as favorite * @Given I mark :fileName as favorite
*/ */
public function iMarkAsFavorite($fileName) { public function iMarkAsFavorite($fileName) {
$this->actor->find(self::favoriteActionForFile($fileName), 10)->click(); $this->actor->find(self::favoriteActionForFile($this->fileListAncestor, $fileName), 10)->click();
} }
/** /**
* @When I view :fileName in folder * @When I view :fileName in folder
*/ */
public function iViewInFolder($fileName) { public function iViewInFolder($fileName) {
$this->actor->find(self::fileActionsMenuButtonForFile($fileName), 10)->click(); $this->actor->find(self::fileActionsMenuButtonForFile($this->fileListAncestor, $fileName), 10)->click();
$this->actor->find(self::viewFileInFolderMenuItem(), 2)->click(); $this->actor->find(self::viewFileInFolderMenuItem(), 2)->click();
} }
@ -168,14 +180,14 @@ class FileListContext implements Context, ActorAwareInterface {
* @Then I see that the file list contains a file named :fileName * @Then I see that the file list contains a file named :fileName
*/ */
public function iSeeThatTheFileListContainsAFileNamed($fileName) { public function iSeeThatTheFileListContainsAFileNamed($fileName) {
PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::rowForFile($fileName), 10)); PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::rowForFile($this->fileListAncestor, $fileName), 10));
} }
/** /**
* @Then I see that :fileName is marked as favorite * @Then I see that :fileName is marked as favorite
*/ */
public function iSeeThatIsMarkedAsFavorite($fileName) { public function iSeeThatIsMarkedAsFavorite($fileName) {
PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::favoritedStateIconForFile($fileName), 10)); PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::favoritedStateIconForFile($this->fileListAncestor, $fileName), 10));
} }
} }

View File

@ -250,7 +250,7 @@ class FilesAppContext implements Context, ActorAwareInterface {
* @Given I share the link for :fileName * @Given I share the link for :fileName
*/ */
public function iShareTheLinkFor($fileName) { public function iShareTheLinkFor($fileName) {
$this->actor->find(FileListContext::shareActionForFile($fileName), 10)->click(); $this->actor->find(FileListContext::shareActionForFile(self::currentSectionMainView(), $fileName), 10)->click();
$this->actor->find(self::shareLinkCheckbox(), 5)->click(); $this->actor->find(self::shareLinkCheckbox(), 5)->click();
} }