From 414a99535bc4f7fe5d6dd7fdb0e7a802c0bbaf7c Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Wed, 2 Nov 2022 10:36:37 +0800 Subject: [PATCH] MDL-76169 behat: Add improved steps for using action menus This commit adds new steps related to action menus to support: * Choosing an item in a named action menu * Choosing an item in a named action menu within a container * Confirming that an action menu item does or does not exist in a named action menu * Confirming that an action menu item does or does not exist in a named action menu within a container The existing action menu steps were insufficient as they assume that there is only one action menu within he container, which is not necessarily the case. The existing action menu steps are not non-JS friendly and will error if JS is disabled, without providing any fallback when one is easily available. Unfortunately these steps cannot be used to replace the existing steps without manual intervention. --- lib/behat/classes/partial_named_selector.php | 12 ++ lib/tests/behat/behat_action_menu.php | 122 ++++++++++++++++++- 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/lib/behat/classes/partial_named_selector.php b/lib/behat/classes/partial_named_selector.php index f0d0ddcb96e..99c7d1b12a6 100644 --- a/lib/behat/classes/partial_named_selector.php +++ b/lib/behat/classes/partial_named_selector.php @@ -86,6 +86,7 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele */ protected static $allowedselectors = array( 'activity' => 'activity', + 'actionmenu' => 'actionmenu', 'badge' => 'badge', 'block' => 'block', 'button' => 'button', @@ -138,6 +139,17 @@ class behat_partial_named_selector extends \Behat\Mink\Selector\PartialNamedSele protected static $moodleselectors = array( 'activity' => << << <<ensure_node_is_visible($node); $node->click(); } + + /** + * Select a specific item in an action menu. + * + * @When /^I choose the "(?P(?:[^"]|\\")*)" item in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to choose + * @param string $actionmenu The text used in the description of the action menu + */ + public function i_choose_in_the_named_menu(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->select_item_in_action_menu($item, $menu); + } + + /** + * Select a specific item in an action menu within a container. + * + * @When /^I choose the "(?P(?:[^"]|\\")*)" item in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to choose + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function i_choose_in_the_named_menu_in_container(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->select_item_in_action_menu($item, $menu); + } + + /** + * Select an item in the specified menu. + * + * Note: This step does work both with, and without, JavaScript. + * + * @param string $item Item string value + * @param NodeElement $menu The menu NodeElement to select from + */ + protected function select_item_in_action_menu(string $item, NodeElement $menu): void { + if ($this->running_javascript()) { + // Open the menu by clicking on the trigger. + $this->execute( + 'behat_general::i_click_on', + [$menu, "NodeElement"] + ); + } + + // Select the menu item. + $this->execute( + 'behat_general::i_click_on_in_the', + [$item, "link", $menu, "NodeElement"] + ); + } + + /** + * The action menu item should not exist. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should not exist in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + */ + public function item_should_not_exist(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->execute('behat_general::should_not_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + /** + * The action menu item should not exist within a container. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should not exist in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function item_should_not_exist_in_the(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->execute('behat_general::should_not_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + + /** + * The action menu item should exist. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should exist in the "(?P(?:[^"]|\\")*)" action menu$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + */ + public function item_should_exist(string $item, string $actionmenu): void { + $menu = $this->find('actionmenu', $actionmenu); + $this->execute('behat_general::should_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } + + /** + * The action menu item should exist within a container. + * + * @Then /^the "(?P(?:[^"]|\\")*)" item should exist in the "(?P(?:[^"]|\\")*)" action menu of the "(?P(?:[^"]|\\")*)" "(?P(?:[^"]|\\")*)"$/ + * @param string $item The item to check + * @param string $actionmenu The text used in the description of the action menu + * @param string|NodeElement $locator The identifer used for the container + * @param string $selector The type of container to locate + */ + public function item_should_exist_in_the(string $item, string $actionmenu, $locator, $selector): void { + $container = $this->find($selector, $locator); + $menu = $this->find('actionmenu', $actionmenu, false, $container); + $this->execute('behat_general::should_exist_in_the', [ + $item, 'link', + $menu, 'NodeElement' + ]); + } }