diff --git a/tests/acceptance/features/app-files.feature b/tests/acceptance/features/app-files.feature index 7adc618e02..6779b37e14 100644 --- a/tests/acceptance/features/app-files.feature +++ b/tests/acceptance/features/app-files.feature @@ -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" diff --git a/tests/acceptance/features/bootstrap/FilesAppContext.php b/tests/acceptance/features/bootstrap/FilesAppContext.php index 7e7f592a44..bc926fbe52 100644 --- a/tests/acceptance/features/bootstrap/FilesAppContext.php +++ b/tests/acceptance/features/bootstrap/FilesAppContext.php @@ -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 */