. * */ use Behat\Behat\Context\Context; use PHPUnit\Framework\Assert; class SettingsMenuContext implements Context, ActorAwareInterface { use ActorAware; /** * @return Locator */ public static function settingsSectionInHeader() { return Locator::forThe()->xpath("//*[@id = 'header']//*[@id = 'user-menu']")-> describedAs("Settings menu section in the header"); } /** * @return Locator */ public static function settingsMenuButton() { return Locator::forThe()->css(".header-menu__trigger")-> descendantOf(self::settingsSectionInHeader())-> describedAs("Settings menu button"); } /** * @return Locator */ public static function settingsMenu() { return Locator::forThe()->css(".user-menu__nav")-> 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' or contains(@class, 'app-navigation')]//ul//li[@class = 'app-navigation-caption' and normalize-space() = '$itemText']")-> describedAs($itemText . " item in Settings panel"); } /** * @param string $itemText * @return Locator */ private static function settingsPanelEntryFor($itemText) { return Locator::forThe()->xpath("//div[@id = 'app-navigation' or contains(@class, 'app-navigation')]//ul//li[normalize-space() = '$itemText']")-> describedAs($itemText . " entry 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 visit the admin settings page */ public function iVisitTheAdminSettingsPage() { $this->iOpenTheSettingsMenu(); $this->actor->find(self::menuItemFor('Administration 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() { Assert::assertTrue( $this->actor->find(self::settingsMenu(), 10)->isVisible()); } /** * @Then I see that the Settings menu has only :items items */ public function iSeeThatTheSettingsMenuHasOnlyXItems($items) { Assert::assertCount(intval($items), self::menuItems()); } /** * @Then I see that the :itemText item in the Settings menu is shown */ public function iSeeThatTheItemInTheSettingsMenuIsShown($itemText) { 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 { 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) { Assert::assertTrue( $this->actor->find(self::settingsPanelFor($itemText), 10)->isVisible() ); } /** * @Then I see that the :itemText entry in the settings panel is shown */ public function iSeeThatTheItemEntryInTheSettingsPanelIsShown($itemText) { Assert::assertTrue( $this->actor->find(self::settingsPanelEntryFor($itemText), 10)->isVisible() ); } /** * @Then I see that the :itemText settings panel is not shown */ public function iSeeThatTheItemSettingsPanelIsNotShown($itemText) { try { Assert::assertFalse( $this->actor->find(self::settingsPanelFor($itemText), 10)->isVisible() ); } catch (NoSuchElementException $exception) { } } }