Add acceptance tests for closing details view in Files app

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
Daniel Calviño Sánchez 2017-04-22 18:20:32 +02:00
parent 8ef25a7628
commit 16b4eecb05
2 changed files with 213 additions and 0 deletions

View File

@ -1,5 +1,28 @@
Feature: app-files
Scenario: viewing a favorite file in its folder closes the details view
Given I am logged in
And I mark "welcome.txt" as favorite
And I see that "welcome.txt" is marked as favorite
And I open the "Favorites" section
And I open the details view for "welcome.txt"
And I see that the details view for "Favorites" section is open
When I view "welcome.txt" in folder
Then I see that the current section is "All files"
And I see that the details view is closed
Scenario: viewing a favorite file in its folder does not prevent opening the details view in "All files" section
Given I am logged in
And I mark "welcome.txt" as favorite
And I see that "welcome.txt" is marked as favorite
And I open the "Favorites" section
And I open the details view for "welcome.txt"
And I see that the details view for "Favorites" section is open
And I view "welcome.txt" in folder
And I see that the current section is "All files"
When I open the details view for "welcome.txt"
Then I see that the details view for "All files" section is open
Scenario: set a password to a shared link
Given I am logged in
And I share the link for "welcome.txt"

View File

@ -27,6 +27,55 @@ class FilesAppContext implements Context, ActorAwareInterface {
use ActorAware;
/**
* @return array
*/
public static function sections() {
return [ "All files" => "files",
"Recent" => "recent",
"Favorites" => "favorites",
"Shared with you" => "sharingin",
"Shared with others" => "sharingout",
"Shared by link" => "sharinglinks",
"Tags" => "systemtagsfilter",
"Deleted files" => "trashbin" ];
}
/**
* @return Locator
*/
public static function appNavigation() {
return Locator::forThe()->id("app-navigation")->
describedAs("App navigation");
}
/**
* @return Locator
*/
public static function appNavigationSectionItemFor($sectionText) {
return Locator::forThe()->xpath("//li[normalize-space() = '$sectionText']")->
descendantOf(self::appNavigation())->
describedAs($sectionText . " section item in App Navigation");
}
/**
* @return Locator
*/
public static function appNavigationCurrentSectionItem() {
return Locator::forThe()->css(".active")->descendantOf(self::appNavigation())->
describedAs("Current section item in App Navigation");
}
/**
* @return Locator
*/
public static function mainViewForSection($section) {
$sectionId = self::sections()[$section];
return Locator::forThe()->id("app-content-$sectionId")->
describedAs("Main view for section $section in Files app");
}
/**
* @return Locator
*/
@ -35,6 +84,15 @@ class FilesAppContext implements Context, ActorAwareInterface {
describedAs("Current section main view in Files app");
}
/**
* @return Locator
*/
public static function detailsViewForSection($section) {
return Locator::forThe()->xpath("/preceding-sibling::*[position() = 1 and @id = 'app-sidebar']")->
descendantOf(self::mainViewForSection($section))->
describedAs("Details view for section $section in Files app");
}
/**
* @return Locator
*/
@ -93,6 +151,30 @@ class FilesAppContext implements Context, ActorAwareInterface {
describedAs("Row for file $fileName in Files app");
}
/**
* @return Locator
*/
public static function favoriteActionForFile($fileName) {
return Locator::forThe()->css(".action-favorite")->descendantOf(self::rowForFile($fileName))->
describedAs("Favorite action for file $fileName in Files app");
}
/**
* @return Locator
*/
public static function favoritedStateIconForFile($fileName) {
return Locator::forThe()->content("Favorited")->descendantOf(self::favoriteActionForFile($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
*/
@ -101,6 +183,58 @@ class FilesAppContext implements Context, ActorAwareInterface {
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 viewFileInFolderMenuItem() {
return self::fileActionsMenuItemFor("View in folder");
}
/**
* @return Locator
*/
private static function fileActionsMenuItemFor($itemText) {
return Locator::forThe()->content($itemText)->descendantOf(self::fileActionsMenu())->
describedAs($itemText . " item in file actions menu in Files app");
}
/**
* @Given I open the :section section
*/
public function iOpenTheSection($section) {
$this->actor->find(self::appNavigationSectionItemFor($section), 10)->click();
}
/**
* @Given I open the details view for :fileName
*/
public function iOpenTheDetailsViewFor($fileName) {
$this->actor->find(self::mainLinkForFile($fileName), 10)->click();
}
/**
* @Given I mark :fileName as favorite
*/
public function iMarkAsFavorite($fileName) {
$this->actor->find(self::favoriteActionForFile($fileName), 10)->click();
}
/**
* @Given I share the link for :fileName
*/
@ -117,6 +251,15 @@ class FilesAppContext implements Context, ActorAwareInterface {
$this->actor->getSharedNotebook()["shared link"] = $this->actor->find(self::shareLinkField(), 10)->getValue();
}
/**
* @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 protect the shared link with the password :password
*/
@ -135,6 +278,53 @@ class FilesAppContext implements Context, ActorAwareInterface {
$this->actor->getSession()->getCurrentUrl());
}
/**
* @Then I see that the current section is :section
*/
public function iSeeThatTheCurrentSectionIs($section) {
PHPUnit_Framework_Assert::assertEquals($this->actor->find(self::appNavigationCurrentSectionItem(), 10)->getText(), $section);
}
/**
* @Then I see that the details view for :section section is open
*/
public function iSeeThatTheDetailsViewForSectionIsOpen($section) {
PHPUnit_Framework_Assert::assertTrue(
$this->actor->find(self::detailsViewForSection($section), 10)->isVisible());
$otherSections = self::sections();
unset($otherSections[$section]);
$this->assertDetailsViewForSectionsAreClosed($otherSections);
}
/**
* @Then I see that the details view is closed
*/
public function iSeeThatTheDetailsViewIsClosed() {
PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::currentSectionMainView(), 10));
$this->assertDetailsViewForSectionsAreClosed(self::sections());
}
private function assertDetailsViewForSectionsAreClosed($sections) {
foreach ($sections as $section => $id) {
try {
PHPUnit_Framework_Assert::assertFalse(
$this->actor->find(self::detailsViewForSection($section))->isVisible(),
"Details view for section $section is open but it should be closed");
} catch (NoSuchElementException $exception) {
}
}
}
/**
* @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 the working icon for password protect is shown
*/