. * */ use Behat\Behat\Context\Context; class SettingsMenuContext implements Context, ActorAwareInterface { use ActorAware; /** * @return Locator */ public static function settingsSectionInHeader() { return Locator::forThe()->xpath("//*[@id = 'header']//*[@id = 'settings']")-> describedAs("Settings menu section in the header"); } /** * @return Locator */ public static function settingsMenuButton() { return Locator::forThe()->id("expand")-> descendantOf(self::settingsSectionInHeader())-> describedAs("Settings menu button"); } /** * @return Locator */ public static function settingsMenu() { return Locator::forThe()->id("expanddiv")-> descendantOf(self::settingsSectionInHeader())-> describedAs("Settings menu"); } /** * @return Locator */ public static function usersMenuItem() { return self::menuItemFor("Users"); } /** * @return Locator */ public static function usersAppsItem() { return self::menuItemFor("Apps"); } /** * @return Locator */ public static function logOutMenuItem() { return self::menuItemFor("Log out"); } /** * @return Locator */ private static function menuItemFor($itemText) { return Locator::forThe()->xpath("//a[normalize-space() = '$itemText']")-> descendantOf(self::settingsMenu())-> describedAs($itemText . " item in Settings menu"); } /** * @param string $itemText * @return Locator */ private static function settingsPanelFor($itemText) { return Locator::forThe()->xpath("//div[@id = 'app-navigation']//ul//li[@class = 'app-navigation-caption' and normalize-space() = '$itemText']")-> describedAs($itemText . " item in Settings panel"); } /** * @return array */ public function menuItems() { return $this->actor->find(self::settingsMenu(), 10) ->getWrappedElement()->findAll('xpath', '//a'); } /** * @When I open the Settings menu */ public function iOpenTheSettingsMenu() { $this->actor->find(self::settingsMenuButton(), 10)->click(); } /** * @When I open the User settings */ public function iOpenTheUserSettings() { $this->iOpenTheSettingsMenu(); $this->actor->find(self::usersMenuItem(), 2)->click(); } /** * @When I open the Apps management */ public function iOpenTheAppsManagement() { $this->iOpenTheSettingsMenu(); $this->actor->find(self::usersAppsItem(), 2)->click(); } /** * @When I visit the settings page */ public function iVisitTheSettingsPage() { $this->iOpenTheSettingsMenu(); $this->actor->find(self::menuItemFor('Settings'), 2)->click(); } /** * @When I log out */ public function iLogOut() { $this->iOpenTheSettingsMenu(); $this->actor->find(self::logOutMenuItem(), 2)->click(); } /** * @Then I see that the Settings menu is shown */ public function iSeeThatTheSettingsMenuIsShown() { PHPUnit_Framework_Assert::assertTrue( $this->actor->find(self::settingsMenu(), 10)->isVisible()); } /** * @Then I see that the Settings menu has only :items items */ public function iSeeThatTheSettingsMenuHasOnlyXItems($items) { PHPUnit_Framework_Assert::assertCount(intval($items), self::menuItems()); } /** * @Then I see that the :itemText item in the Settings menu is shown */ public function iSeeThatTheItemInTheSettingsMenuIsShown($itemText) { PHPUnit_Framework_Assert::assertTrue( $this->actor->find(self::menuItemFor($itemText), 10)->isVisible()); } /** * @Then I see that the :itemText item in the Settings menu is not shown */ public function iSeeThatTheItemInTheSettingsMenuIsNotShown($itemText) { $this->iSeeThatTheSettingsMenuIsShown(); try { PHPUnit_Framework_Assert::assertFalse( $this->actor->find(self::menuItemFor($itemText))->isVisible()); } catch (NoSuchElementException $exception) { } } /** * @Then I see that the :itemText settings panel is shown */ public function iSeeThatTheItemSettingsPanelIsShown($itemText) { PHPUnit_Framework_Assert::assertTrue( $this->actor->find(self::settingsPanelFor($itemText), 10)->isVisible() ); } /** * @Then I see that the :itemText settings panel is not shown */ public function iSeeThatTheItemSettingsPanelIsNotShown($itemText) { try { PHPUnit_Framework_Assert::assertFalse( $this->actor->find(self::settingsPanelFor($itemText), 10)->isVisible() ); } catch (NoSuchElementException $exception) { } } }