From 5698a10c81848622b750398401a3e4f127bb5395 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sun, 23 Jun 2013 19:26:16 -0400 Subject: [PATCH] Added functional tests for the basic app. --- apps/basic/tests/acceptance/WebGuy.php | 85 ++- apps/basic/tests/functional.suite.dist.yml | 6 +- apps/basic/tests/functional/ContactCept.php | 36 + apps/basic/tests/functional/HomeCept.php | 8 + apps/basic/tests/functional/LoginCept.php | 23 + apps/basic/tests/functional/TestGuy.php | 1048 ++++++++++++++++++++++++++- apps/basic/www/index-test.php | 4 +- framework/yii/base/ErrorHandler.php | 2 +- framework/yii/web/User.php | 4 +- 9 files changed, 1163 insertions(+), 53 deletions(-) create mode 100644 apps/basic/tests/functional/ContactCept.php create mode 100644 apps/basic/tests/functional/HomeCept.php create mode 100644 apps/basic/tests/functional/LoginCept.php diff --git a/apps/basic/tests/acceptance/WebGuy.php b/apps/basic/tests/acceptance/WebGuy.php index 1662492..397761c 100644 --- a/apps/basic/tests/acceptance/WebGuy.php +++ b/apps/basic/tests/acceptance/WebGuy.php @@ -1,19 +1,18 @@ * ``` * @param $selector - * @see PhpBrowser::seeElement() + * @see Mink::seeElement() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -482,7 +481,7 @@ class WebGuy extends \Codeception\AbstractGuy * ?> * ``` * @param $selector - * @see PhpBrowser::dontSeeElement() + * @see Mink::dontSeeElement() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -499,7 +498,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * Reloads current page - * @see PhpBrowser::reloadPage() + * @see Mink::reloadPage() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -516,7 +515,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * Moves back in history - * @see PhpBrowser::moveBack() + * @see Mink::moveBack() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -533,7 +532,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * Moves forward in history - * @see PhpBrowser::moveForward() + * @see Mink::moveForward() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -553,7 +552,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $field * @param $value - * @see PhpBrowser::fillField() + * @see Mink::fillField() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -583,7 +582,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $select * @param $option - * @see PhpBrowser::selectOption() + * @see Mink::selectOption() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -611,7 +610,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $option - * @see PhpBrowser::checkOption() + * @see Mink::checkOption() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -638,7 +637,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $option - * @see PhpBrowser::uncheckOption() + * @see Mink::uncheckOption() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -666,7 +665,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $uri - * @see PhpBrowser::seeInCurrentUrl() + * @see Mink::seeInCurrentUrl() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -691,7 +690,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $uri - * @see PhpBrowser::dontSeeInCurrentUrl() + * @see Mink::dontSeeInCurrentUrl() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -716,7 +715,7 @@ class WebGuy extends \Codeception\AbstractGuy * ?> * * @param $uri - * @see PhpBrowser::seeCurrentUrlEquals() + * @see Mink::seeCurrentUrlEquals() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -741,7 +740,7 @@ class WebGuy extends \Codeception\AbstractGuy * ?> * * @param $uri - * @see PhpBrowser::dontSeeCurrentUrlEquals() + * @see Mink::dontSeeCurrentUrlEquals() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -765,7 +764,7 @@ class WebGuy extends \Codeception\AbstractGuy * ?> * * @param $uri - * @see PhpBrowser::seeCurrentUrlMatches() + * @see Mink::seeCurrentUrlMatches() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -789,7 +788,7 @@ class WebGuy extends \Codeception\AbstractGuy * ?> * * @param $uri - * @see PhpBrowser::dontSeeCurrentUrlMatches() + * @see Mink::dontSeeCurrentUrlMatches() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -806,7 +805,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::seeCookie() + * @see Mink::seeCookie() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -823,7 +822,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::dontSeeCookie() + * @see Mink::dontSeeCookie() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -840,7 +839,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::setCookie() + * @see Mink::setCookie() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -857,7 +856,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::resetCookie() + * @see Mink::resetCookie() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -874,7 +873,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::grabCookie() + * @see Mink::grabCookie() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -903,7 +902,7 @@ class WebGuy extends \Codeception\AbstractGuy * @param null $uri * @internal param $url * @return mixed - * @see PhpBrowser::grabFromCurrentUrl() + * @see Mink::grabFromCurrentUrl() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -932,7 +931,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $field * @param $filename - * @see PhpBrowser::attachFile() + * @see Mink::attachFile() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -959,7 +958,7 @@ class WebGuy extends \Codeception\AbstractGuy * @param $selector * @param $optionText * @return mixed - * @see PhpBrowser::seeOptionIsSelected() + * @see Mink::seeOptionIsSelected() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -986,7 +985,7 @@ class WebGuy extends \Codeception\AbstractGuy * @param $selector * @param $optionText * @return mixed - * @see PhpBrowser::dontSeeOptionIsSelected() + * @see Mink::dontSeeOptionIsSelected() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1016,7 +1015,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $checkbox - * @see PhpBrowser::seeCheckboxIsChecked() + * @see Mink::seeCheckboxIsChecked() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1045,7 +1044,7 @@ class WebGuy extends \Codeception\AbstractGuy * ``` * * @param $checkbox - * @see PhpBrowser::dontSeeCheckboxIsChecked() + * @see Mink::dontSeeCheckboxIsChecked() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1078,7 +1077,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $field * @param $value - * @see PhpBrowser::seeInField() + * @see Mink::seeInField() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1110,7 +1109,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $field * @param $value - * @see PhpBrowser::dontSeeInField() + * @see Mink::dontSeeInField() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1141,7 +1140,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $cssOrXPathOrRegex * @return mixed - * @see PhpBrowser::grabTextFrom() + * @see Mink::grabTextFrom() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1172,7 +1171,7 @@ class WebGuy extends \Codeception\AbstractGuy * * @param $field * @return mixed - * @see PhpBrowser::grabValueFrom() + * @see Mink::grabValueFrom() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! @@ -1189,7 +1188,7 @@ class WebGuy extends \Codeception\AbstractGuy /** * - * @see PhpBrowser::grabAttribute() + * @see Mink::grabAttribute() * @return \Codeception\Maybe * ! This method is generated. DO NOT EDIT. ! * ! Documentation taken from corresponding module ! diff --git a/apps/basic/tests/functional.suite.dist.yml b/apps/basic/tests/functional.suite.dist.yml index f263e75..aa777ac 100644 --- a/apps/basic/tests/functional.suite.dist.yml +++ b/apps/basic/tests/functional.suite.dist.yml @@ -8,4 +8,8 @@ class_name: TestGuy modules: - enabled: [Filesystem, TestHelper] + enabled: [Filesystem, TestHelper, Yii2] + config: + Yii2: + entryScript: 'www/index-test.php' + url: 'http://localhost/' diff --git a/apps/basic/tests/functional/ContactCept.php b/apps/basic/tests/functional/ContactCept.php new file mode 100644 index 0000000..6feafd9 --- /dev/null +++ b/apps/basic/tests/functional/ContactCept.php @@ -0,0 +1,36 @@ +wantTo('ensure that contact works'); +$I->amOnPage('?r=site/contact'); +$I->see('Contact', 'h1'); + +$I->submitForm('#contact-form', array()); +$I->see('Contact', 'h1'); +$I->see('Name cannot be blank'); +$I->see('Email cannot be blank'); +$I->see('Subject cannot be blank'); +$I->see('Body cannot be blank'); +$I->see('The verification code is incorrect'); + +$I->submitForm('#contact-form', array( + 'ContactForm[name]' => 'tester', + 'ContactForm[email]' => 'tester.email', + 'ContactForm[subject]' => 'test subject', + 'ContactForm[body]' => 'test content', + 'ContactForm[verifyCode]' => 'testme', +)); +$I->dontSee('Name cannot be blank', '.help-inline'); +$I->see('Email is not a valid email address.'); +$I->dontSee('Subject cannot be blank', '.help-inline'); +$I->dontSee('Body cannot be blank', '.help-inline'); +$I->dontSee('The verification code is incorrect', '.help-inline'); + +$I->submitForm('#contact-form', array( + 'ContactForm[name]' => 'tester', + 'ContactForm[email]' => 'tester@example.com', + 'ContactForm[subject]' => 'test subject', + 'ContactForm[body]' => 'test content', + 'ContactForm[verifyCode]' => 'testme', +)); +$I->dontSeeElement('#contact-form'); +$I->see('Thank you for contacting us. We will respond to you as soon as possible.'); diff --git a/apps/basic/tests/functional/HomeCept.php b/apps/basic/tests/functional/HomeCept.php new file mode 100644 index 0000000..1d24af6 --- /dev/null +++ b/apps/basic/tests/functional/HomeCept.php @@ -0,0 +1,8 @@ +wantTo('ensure that home page works'); +$I->amOnPage(''); +$I->see('My Company'); +$I->seeLink('About'); +$I->click('About'); +$I->see('This is the About page.'); diff --git a/apps/basic/tests/functional/LoginCept.php b/apps/basic/tests/functional/LoginCept.php new file mode 100644 index 0000000..11f8f6b --- /dev/null +++ b/apps/basic/tests/functional/LoginCept.php @@ -0,0 +1,23 @@ +wantTo('ensure that login works'); +$I->amOnPage('?r=site/login'); +$I->see('Login', 'h1'); + +$I->submitForm('#login-form', array()); +$I->dontSee('Logout (admin)'); +$I->see('Username cannot be blank'); +$I->see('Password cannot be blank'); + +$I->submitForm('#login-form', array( + 'LoginForm[username]' => 'admin', + 'LoginForm[password]' => 'wrong', +)); +$I->dontSee('Logout (admin)'); +$I->see('Incorrect username or password'); + +$I->submitForm('#login-form', array( + 'LoginForm[username]' => 'admin', + 'LoginForm[password]' => 'admin', +)); +$I->see('Logout (admin)'); diff --git a/apps/basic/tests/functional/TestGuy.php b/apps/basic/tests/functional/TestGuy.php index e49e07c..767d564 100644 --- a/apps/basic/tests/functional/TestGuy.php +++ b/apps/basic/tests/functional/TestGuy.php @@ -1,19 +1,19 @@ openFile('process.pid'); + * $I->seeFileContentsEqual('3192'); + * ?> + * ``` + * + * @param $text + * @see Filesystem::seeFileContentsEqual() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeFileContentsEqual($text) { + $this->scenario->assertion('seeFileContentsEqual', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** * Checks If opened file doesn't contain `text` in it * * ``` php @@ -244,5 +273,1014 @@ class TestGuy extends \Codeception\AbstractGuy } return new Maybe(); } + + + /** + * Erases directory contents + * + * ``` php + * cleanDir('logs'); + * ?> + * ``` + * + * @param $dirname + * @see Filesystem::cleanDir() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function cleanDir($dirname) { + $this->scenario->action('cleanDir', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Adds HTTP authentication via username/password. + * + * @param $username + * @param $password + * @see Framework::amHttpAuthenticated() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function amHttpAuthenticated($username, $password) { + $this->scenario->condition('amHttpAuthenticated', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Opens the page. + * Requires relative uri as parameter + * + * Example: + * + * ``` php + * amOnPage('/'); + * // opens /register page + * $I->amOnPage('/register'); + * ?> + * ``` + * + * @param $page + * @see Framework::amOnPage() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function amOnPage($page) { + $this->scenario->condition('amOnPage', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Perform a click on link or button. + * Link or button are found by their names or CSS selector. + * Submits a form if button is a submit type. + * + * If link is an image it's found by alt attribute value of image. + * If button is image button is found by it's value + * If link or button can't be found by name they are searched by CSS selector. + * + * The second parameter is a context: CSS or XPath locator to narrow the search. + * + * Examples: + * + * ``` php + * click('Logout'); + * // button of form + * $I->click('Submit'); + * // CSS button + * $I->click('#form input[type=submit]'); + * // XPath + * $I->click('//form/*[@type=submit]') + * // link in context + * $I->click('Logout', '#nav'); + * ?> + * ``` + * @param $link + * @param $context + * @see Framework::click() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function click($link, $context = null) { + $this->scenario->action('click', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Check if current page contains the text specified. + * Specify the css selector to match only specific region. + * + * Examples: + * + * ``` php + * see('Logout'); // I can suppose user is logged in + * $I->see('Sign Up','h1'); // I can suppose it's a signup page + * $I->see('Sign Up','//body/h1'); // with XPath + * + * ``` + * + * @param $text + * @param null $selector + * @see Framework::see() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function see($text, $selector = null) { + $this->scenario->assertion('see', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Check if current page doesn't contain the text specified. + * Specify the css selector to match only specific region. + * + * Examples: + * + * ```php + * dontSee('Login'); // I can suppose user is already logged in + * $I->dontSee('Sign Up','h1'); // I can suppose it's not a signup page + * $I->dontSee('Sign Up','//body/h1'); // with XPath + * ``` + * + * @param $text + * @param null $selector + * @see Framework::dontSee() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSee($text, $selector = null) { + $this->scenario->action('dontSee', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if there is a link with text specified. + * Specify url to match link with exact this url. + * + * Examples: + * + * ``` php + * seeLink('Logout'); // matches Logout + * $I->seeLink('Logout','/logout'); // matches Logout + * + * ``` + * + * @param $text + * @param null $url + * @see Framework::seeLink() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeLink($text, $url = null) { + $this->scenario->assertion('seeLink', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if page doesn't contain the link with text specified. + * Specify url to narrow the results. + * + * Examples: + * + * ``` php + * dontSeeLink('Logout'); // I suppose user is not logged in + * + * ``` + * + * @param $text + * @param null $url + * @see Framework::dontSeeLink() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeLink($text, $url = null) { + $this->scenario->action('dontSeeLink', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current uri contains a value + * + * ``` php + * seeInCurrentUrl('home'); + * // to match: /users/1 + * $I->seeInCurrentUrl('/users/'); + * ?> + * ``` + * + * @param $uri + * @see Framework::seeInCurrentUrl() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeInCurrentUrl($uri) { + $this->scenario->assertion('seeInCurrentUrl', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current uri does not contain a value + * + * ``` php + * dontSeeInCurrentUrl('/users/'); + * ?> + * ``` + * + * @param $uri + * @see Framework::dontSeeInCurrentUrl() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeInCurrentUrl($uri) { + $this->scenario->action('dontSeeInCurrentUrl', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current url is equal to value. + * Unlike `seeInCurrentUrl` performs a strict check. + * + * seeCurrentUrlEquals('/'); + * ?> + * + * @param $uri + * @see Framework::seeCurrentUrlEquals() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeCurrentUrlEquals($uri) { + $this->scenario->assertion('seeCurrentUrlEquals', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current url is not equal to value. + * Unlike `dontSeeInCurrentUrl` performs a strict check. + * + * dontSeeCurrentUrlEquals('/'); + * ?> + * + * @param $uri + * @see Framework::dontSeeCurrentUrlEquals() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeCurrentUrlEquals($uri) { + $this->scenario->action('dontSeeCurrentUrlEquals', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current url is matches a RegEx value + * + * seeCurrentUrlMatches('~$/users/(\d+)~'); + * ?> + * + * @param $uri + * @see Framework::seeCurrentUrlMatches() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeCurrentUrlMatches($uri) { + $this->scenario->assertion('seeCurrentUrlMatches', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that current url does not match a RegEx value + * + * dontSeeCurrentUrlMatches('~$/users/(\d+)~'); + * ?> + * + * @param $uri + * @see Framework::dontSeeCurrentUrlMatches() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeCurrentUrlMatches($uri) { + $this->scenario->action('dontSeeCurrentUrlMatches', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Takes a parameters from current URI by RegEx. + * If no url provided returns full URI. + * + * ``` php + * grabFromCurrentUrl('~$/user/(\d+)/~'); + * $uri = $I->grabFromCurrentUrl(); + * ?> + * ``` + * + * @param null $uri + * @internal param $url + * @return mixed + * @see Framework::grabFromCurrentUrl() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function grabFromCurrentUrl($uri = null) { + $this->scenario->action('grabFromCurrentUrl', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Assert if the specified checkbox is checked. + * Use css selector or xpath to match. + * + * Example: + * + * ``` php + * seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms + * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user agreed to terms, If there is only one checkbox in form. + * $I->seeCheckboxIsChecked('//form/input[@type=checkbox and @name=agree]'); + * + * ``` + * + * @param $checkbox + * @see Framework::seeCheckboxIsChecked() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeCheckboxIsChecked($checkbox) { + $this->scenario->assertion('seeCheckboxIsChecked', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Assert if the specified checkbox is unchecked. + * Use css selector or xpath to match. + * + * Example: + * + * ``` php + * dontSeeCheckboxIsChecked('#agree'); // I suppose user didn't agree to terms + * $I->seeCheckboxIsChecked('#signup_form input[type=checkbox]'); // I suppose user didn't check the first checkbox in form. + * + * ``` + * + * @param $checkbox + * @see Framework::dontSeeCheckboxIsChecked() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeCheckboxIsChecked($checkbox) { + $this->scenario->action('dontSeeCheckboxIsChecked', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that an input field or textarea contains value. + * Field is matched either by label or CSS or Xpath + * + * Example: + * + * ``` php + * seeInField('Body','Type your comment here'); + * $I->seeInField('form textarea[name=body]','Type your comment here'); + * $I->seeInField('form input[type=hidden]','hidden_value'); + * $I->seeInField('#searchform input','Search'); + * $I->seeInField('//form/*[@name=search]','Search'); + * ?> + * ``` + * + * @param $field + * @param $value + * @see Framework::seeInField() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeInField($field, $value) { + $this->scenario->assertion('seeInField', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that an input field or textarea doesn't contain value. + * Field is matched either by label or CSS or Xpath + * Example: + * + * ``` php + * dontSeeInField('Body','Type your comment here'); + * $I->dontSeeInField('form textarea[name=body]','Type your comment here'); + * $I->dontSeeInField('form input[type=hidden]','hidden_value'); + * $I->dontSeeInField('#searchform input','Search'); + * $I->dontSeeInField('//form/*[@name=search]','Search'); + * ?> + * ``` + * + * @param $field + * @param $value + * @see Framework::dontSeeInField() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeInField($field, $value) { + $this->scenario->action('dontSeeInField', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Submits a form located on page. + * Specify the form by it's css or xpath selector. + * Fill the form fields values as array. + * + * Skipped fields will be filled by their values from page. + * You don't need to click the 'Submit' button afterwards. + * This command itself triggers the request to form's action. + * + * Examples: + * + * ``` php + * submitForm('#login', array('login' => 'davert', 'password' => '123456')); + * + * ``` + * + * For sample Sign Up form: + * + * ``` html + *
+ * Login:
+ * Password:
+ * Do you agree to out terms?
+ * Select pricing plan + * + *
+ * ``` + * I can write this: + * + * ``` php + * submitForm('#userForm', array('user' => array('login' => 'Davert', 'password' => '123456', 'agree' => true))); + * + * ``` + * Note, that pricing plan will be set to Paid, as it's selected on page. + * + * @param $selector + * @param $params + * @see Framework::submitForm() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function submitForm($selector, $params) { + $this->scenario->action('submitForm', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Fills a text field or textarea with value. + * + * @param $field + * @param $value + * @see Framework::fillField() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function fillField($field, $value) { + $this->scenario->action('fillField', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Selects an option in select tag or in radio button group. + * + * Example: + * + * ``` php + * selectOption('form select[name=account]', 'Premium'); + * $I->selectOption('form input[name=payment]', 'Monthly'); + * $I->selectOption('//form/select[@name=account]', 'Monthly'); + * ?> + * ``` + * + * @param $select + * @param $option + * @see Framework::selectOption() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function selectOption($select, $option) { + $this->scenario->action('selectOption', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Ticks a checkbox. + * For radio buttons use `selectOption` method. + * + * Example: + * + * ``` php + * checkOption('#agree'); + * ?> + * ``` + * + * @param $option + * @see Framework::checkOption() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function checkOption($option) { + $this->scenario->action('checkOption', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Unticks a checkbox. + * + * Example: + * + * ``` php + * uncheckOption('#notify'); + * ?> + * ``` + * + * @param $option + * @see Framework::uncheckOption() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function uncheckOption($option) { + $this->scenario->action('uncheckOption', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Attaches file from Codeception data directory to upload field. + * + * Example: + * + * ``` php + * attachFile('prices.xls'); + * ?> + * ``` + * + * @param $field + * @param $filename + * @see Framework::attachFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function attachFile($field, $filename) { + $this->scenario->action('attachFile', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * If your page triggers an ajax request, you can perform it manually. + * This action sends a GET ajax request with specified params. + * + * See ->sendAjaxPostRequest for examples. + * + * @param $uri + * @param $params + * @see Framework::sendAjaxGetRequest() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function sendAjaxGetRequest($uri, $params = null) { + $this->scenario->action('sendAjaxGetRequest', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * If your page triggers an ajax request, you can perform it manually. + * This action sends a POST ajax request with specified params. + * Additional params can be passed as array. + * + * Example: + * + * Imagine that by clicking checkbox you trigger ajax request which updates user settings. + * We emulate that click by running this ajax request manually. + * + * ``` php + * sendAjaxPostRequest('/updateSettings', array('notifications' => true); // POST + * $I->sendAjaxGetRequest('/updateSettings', array('notifications' => true); // GET + * + * ``` + * + * @param $uri + * @param $params + * @see Framework::sendAjaxPostRequest() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function sendAjaxPostRequest($uri, $params = null) { + $this->scenario->action('sendAjaxPostRequest', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * + * @see Framework::formatResponse() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function formatResponse($response) { + $this->scenario->action('formatResponse', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Finds and returns text contents of element. + * Element is searched by CSS selector, XPath or matcher by regex. + * + * Example: + * + * ``` php + * grabTextFrom('h1'); + * $heading = $I->grabTextFrom('descendant-or-self::h1'); + * $value = $I->grabTextFrom('~ + * ``` + * + * @param $cssOrXPathOrRegex + * @return mixed + * @see Framework::grabTextFrom() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function grabTextFrom($cssOrXPathOrRegex) { + $this->scenario->action('grabTextFrom', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Finds and returns field and returns it's value. + * Searches by field name, then by CSS, then by XPath + * + * Example: + * + * ``` php + * grabValueFrom('Name'); + * $name = $I->grabValueFrom('input[name=username]'); + * $name = $I->grabValueFrom('descendant-or-self::form/descendant::input[@name = 'username']'); + * ?> + * ``` + * + * @param $field + * @return mixed + * @see Framework::grabValueFrom() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function grabValueFrom($field) { + $this->scenario->action('grabValueFrom', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if element exists on a page, matching it by CSS or XPath + * + * ``` php + * seeElement('.error'); + * $I->seeElement(//form/input[1]); + * ?> + * ``` + * @param $selector + * @see Framework::seeElement() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeElement($selector) { + $this->scenario->assertion('seeElement', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if element does not exist (or is visible) on a page, matching it by CSS or XPath + * + * ``` php + * dontSeeElement('.error'); + * $I->dontSeeElement(//form/input[1]); + * ?> + * ``` + * @param $selector + * @see Framework::dontSeeElement() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeElement($selector) { + $this->scenario->action('dontSeeElement', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if option is selected in select field. + * + * ``` php + * seeOptionIsSelected('#form input[name=payment]', 'Visa'); + * ?> + * ``` + * + * @param $selector + * @param $optionText + * @return mixed + * @see Framework::seeOptionIsSelected() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeOptionIsSelected($select, $optionText) { + $this->scenario->assertion('seeOptionIsSelected', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if option is not selected in select field. + * + * ``` php + * dontSeeOptionIsSelected('#form input[name=payment]', 'Visa'); + * ?> + * ``` + * + * @param $selector + * @param $optionText + * @return mixed + * @see Framework::dontSeeOptionIsSelected() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeOptionIsSelected($select, $optionText) { + $this->scenario->action('dontSeeOptionIsSelected', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Asserts that current page has 404 response status code. + * @see Framework::seePageNotFound() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seePageNotFound() { + $this->scenario->assertion('seePageNotFound', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks that response code is equal to value provided. + * + * @param $code + * @return mixed + * @see Framework::seeResponseCodeIs() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeResponseCodeIs($code) { + $this->scenario->assertion('seeResponseCodeIs', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } } diff --git a/apps/basic/www/index-test.php b/apps/basic/www/index-test.php index a2f7737..4a00b37 100644 --- a/apps/basic/www/index-test.php +++ b/apps/basic/www/index-test.php @@ -8,8 +8,8 @@ defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'test'); -require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); -require(__DIR__ . '/../vendor/autoload.php'); +require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); +require_once(__DIR__ . '/../vendor/autoload.php'); $config = require(__DIR__ . '/../config/web-test.php'); diff --git a/framework/yii/base/ErrorHandler.php b/framework/yii/base/ErrorHandler.php index 6fb1ee2..54a1dcb 100644 --- a/framework/yii/base/ErrorHandler.php +++ b/framework/yii/base/ErrorHandler.php @@ -82,7 +82,7 @@ class ErrorHandler extends Component */ protected function renderException($exception) { - if (Yii::$app instanceof \yii\console\Application) { + if (Yii::$app instanceof \yii\console\Application || YII_ENV === 'test') { echo Yii::$app->renderException($exception); return; } diff --git a/framework/yii/web/User.php b/framework/yii/web/User.php index d4646a6..54831ba 100644 --- a/framework/yii/web/User.php +++ b/framework/yii/web/User.php @@ -416,7 +416,9 @@ class User extends Component public function switchIdentity($identity, $duration = 0) { $session = Yii::$app->getSession(); - $session->regenerateID(true); + if (YII_ENV !== 'test') { + $session->regenerateID(true); + } $this->setIdentity($identity); $session->remove($this->idVar); $session->remove($this->authTimeoutVar);