|
|
|
@ -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 |
|
|
|
|
*/ |
|
|
|
|