From 955f351e6d56727ca492e68b31f748c8be875738 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sat, 22 Jun 2013 20:26:22 -0400 Subject: [PATCH] Added acceptance tests for the basic app. --- codeception.yml | 18 + config/web-test.php | 7 + config/{main.php => web.php} | 12 +- controllers/SiteController.php | 1 + tests/_data/dump.sql | 1 + tests/_helpers/CodeHelper.php | 8 + tests/_helpers/TestHelper.php | 8 + tests/_helpers/WebHelper.php | 8 + tests/_log/.gitignore | 2 + tests/acceptance.suite.dist.yml | 18 + tests/acceptance/AboutCept.php | 5 + tests/acceptance/ContactCept.php | 36 + tests/acceptance/HomeCept.php | 8 + tests/acceptance/LoginCept.php | 23 + tests/acceptance/WebGuy.php | 1206 ++++++++++++++++++++++++++++++ tests/acceptance/_bootstrap.php | 2 + tests/functional.suite.dist.yml | 11 + tests/functional/TestGuy.php | 248 ++++++ tests/functional/_bootstrap.php | 2 + tests/unit.suite.dist.yml | 8 + tests/unit/CodeGuy.php | 27 + tests/unit/_bootstrap.php | 2 + views/site/contact.php | 2 +- views/site/login.php | 2 +- www/index-test.php | 17 + www/index.php | 2 +- 26 files changed, 1671 insertions(+), 13 deletions(-) create mode 100644 codeception.yml create mode 100644 config/web-test.php rename config/{main.php => web.php} (71%) create mode 100644 tests/_data/dump.sql create mode 100644 tests/_helpers/CodeHelper.php create mode 100644 tests/_helpers/TestHelper.php create mode 100644 tests/_helpers/WebHelper.php create mode 100644 tests/_log/.gitignore create mode 100644 tests/acceptance.suite.dist.yml create mode 100644 tests/acceptance/AboutCept.php create mode 100644 tests/acceptance/ContactCept.php create mode 100644 tests/acceptance/HomeCept.php create mode 100644 tests/acceptance/LoginCept.php create mode 100644 tests/acceptance/WebGuy.php create mode 100644 tests/acceptance/_bootstrap.php create mode 100644 tests/functional.suite.dist.yml create mode 100644 tests/functional/TestGuy.php create mode 100644 tests/functional/_bootstrap.php create mode 100644 tests/unit.suite.dist.yml create mode 100644 tests/unit/CodeGuy.php create mode 100644 tests/unit/_bootstrap.php create mode 100644 www/index-test.php diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000..5b1f441 --- /dev/null +++ b/codeception.yml @@ -0,0 +1,18 @@ +paths: + tests: tests + log: tests/_log + data: tests/_data + helpers: tests/_helpers +settings: + bootstrap: _bootstrap.php + suite_class: \PHPUnit_Framework_TestSuite + colors: true + memory_limit: 1024M + log: true +modules: + config: + Db: + dsn: '' + user: '' + password: '' + dump: tests/_data/dump.sql diff --git a/config/web-test.php b/config/web-test.php new file mode 100644 index 0000000..ca0be86 --- /dev/null +++ b/config/web-test.php @@ -0,0 +1,7 @@ + 'bootstrap', 'basePath' => dirname(__DIR__), 'preload' => array('log'), - 'modules' => array( -// 'debug' => array( -// 'class' => 'yii\debug\Module', -// ) - ), 'components' => array( 'cache' => array( 'class' => 'yii\caching\FileCache', @@ -27,11 +22,8 @@ return array( 'class' => 'yii\logging\FileTarget', 'levels' => array('error', 'warning'), ), -// array( -// 'class' => 'yii\logging\DebugTarget', -// ) ), ), ), - 'params' => $params, + 'params' => require(__DIR__ . '/params.php'), ); diff --git a/controllers/SiteController.php b/controllers/SiteController.php index d79b728..3a6ef5c 100644 --- a/controllers/SiteController.php +++ b/controllers/SiteController.php @@ -14,6 +14,7 @@ class SiteController extends Controller return array( 'captcha' => array( 'class' => 'yii\web\CaptchaAction', + 'fixedVerifyCode' => YII_ENV === 'test' ? 'testme' : null, ), ); } diff --git a/tests/_data/dump.sql b/tests/_data/dump.sql new file mode 100644 index 0000000..4bc742c --- /dev/null +++ b/tests/_data/dump.sql @@ -0,0 +1 @@ +/* Replace this file with actual dump of your database */ \ No newline at end of file diff --git a/tests/_helpers/CodeHelper.php b/tests/_helpers/CodeHelper.php new file mode 100644 index 0000000..972c8f3 --- /dev/null +++ b/tests/_helpers/CodeHelper.php @@ -0,0 +1,8 @@ +wantTo('ensure that about works'); +$I->amOnPage('?r=site/about'); +$I->see('About', 'h1'); diff --git a/tests/acceptance/ContactCept.php b/tests/acceptance/ContactCept.php new file mode 100644 index 0000000..73527ab --- /dev/null +++ b/tests/acceptance/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/tests/acceptance/HomeCept.php b/tests/acceptance/HomeCept.php new file mode 100644 index 0000000..03dc4d5 --- /dev/null +++ b/tests/acceptance/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/tests/acceptance/LoginCept.php b/tests/acceptance/LoginCept.php new file mode 100644 index 0000000..77c4a07 --- /dev/null +++ b/tests/acceptance/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/tests/acceptance/WebGuy.php b/tests/acceptance/WebGuy.php new file mode 100644 index 0000000..1662492 --- /dev/null +++ b/tests/acceptance/WebGuy.php @@ -0,0 +1,1206 @@ +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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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(); + } + + + /** + * Asserts that current page has 404 response status code. + * @see PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * Adds HTTP authentication via username/password. + * + * @param $username + * @param $password + * @see PhpBrowser::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(); + } + + + /** + * Low-level API method. + * If Codeception commands are not enough, use [Guzzle HTTP Client](http://guzzlephp.org/) methods directly + * + * Example: + * + * ``` php + * amGoingTo('Sign all requests with OAuth'); + * $I->executeInGuzzle(function (\Guzzle\Http\Client $client) { + * $client->addSubscriber(new Guzzle\Plugin\Oauth\OauthPlugin(array( + * 'consumer_key' => '***', + * 'consumer_secret' => '***', + * 'token' => '***', + * 'token_secret' => '***' + * ))); + * }); + * ?> + * ``` + * + * Not recommended this command too be used on regular basis. + * If Codeception lacks important Guzzle Client methods implement then and submit patches. + * + * @param callable $function + * @see PhpBrowser::executeInGuzzle() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function executeInGuzzle($function) { + $this->scenario->action('executeInGuzzle', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Opens the page. + * + * @param $page + * @see PhpBrowser::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(); + } + + + /** + * Sets 'url' configuration parameter to hosts subdomain. + * It does not open a page on subdomain. Use `amOnPage` for that + * + * ``` php + * amOnSubdomain('user'); + * $I->amOnPage('/'); + * // moves to http://user.mysite.com/ + * ?> + * ``` + * @param $subdomain + * @return mixed + * @see PhpBrowser::amOnSubdomain() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function amOnSubdomain($subdomain) { + $this->scenario->condition('amOnSubdomain', 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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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(); + } + + + /** + * Checks if element exists on a page, matching it by CSS or XPath + * + * ``` php + * seeElement('.error'); + * $I->seeElement(//form/input[1]); + * ?> + * ``` + * @param $selector + * @see PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * Reloads current page + * @see PhpBrowser::reloadPage() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function reloadPage() { + $this->scenario->action('reloadPage', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Moves back in history + * @see PhpBrowser::moveBack() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function moveBack() { + $this->scenario->action('moveBack', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Moves forward in history + * @see PhpBrowser::moveForward() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function moveForward() { + $this->scenario->action('moveForward', 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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * Checks that current uri contains a value + * + * ``` php + * seeInCurrentUrl('home'); + * // to match: /users/1 + * $I->seeInCurrentUrl('/users/'); + * ?> + * ``` + * + * @param $uri + * @see PhpBrowser::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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * + * @see PhpBrowser::seeCookie() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeCookie($cookie) { + $this->scenario->assertion('seeCookie', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * + * @see PhpBrowser::dontSeeCookie() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeCookie($cookie) { + $this->scenario->action('dontSeeCookie', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * + * @see PhpBrowser::setCookie() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function setCookie($cookie, $value) { + $this->scenario->action('setCookie', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * + * @see PhpBrowser::resetCookie() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function resetCookie($cookie) { + $this->scenario->action('resetCookie', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * + * @see PhpBrowser::grabCookie() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function grabCookie($cookie) { + $this->scenario->action('grabCookie', 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 PhpBrowser::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(); + } + + + /** + * Attaches file from Codeception data directory to upload field. + * + * Example: + * + * ``` php + * attachFile('prices.xls'); + * ?> + * ``` + * + * @param $field + * @param $filename + * @see PhpBrowser::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(); + } + + + /** + * Checks if option is selected in select field. + * + * ``` php + * seeOptionIsSelected('#form input[name=payment]', 'Visa'); + * ?> + * ``` + * + * @param $selector + * @param $optionText + * @return mixed + * @see PhpBrowser::seeOptionIsSelected() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeOptionIsSelected($select, $text) { + $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 PhpBrowser::dontSeeOptionIsSelected() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeOptionIsSelected($select, $text) { + $this->scenario->action('dontSeeOptionIsSelected', 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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * 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 PhpBrowser::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 PhpBrowser::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(); + } + + + /** + * + * @see PhpBrowser::grabAttribute() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function grabAttribute() { + $this->scenario->action('grabAttribute', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } +} + diff --git a/tests/acceptance/_bootstrap.php b/tests/acceptance/_bootstrap.php new file mode 100644 index 0000000..7dfa7c3 --- /dev/null +++ b/tests/acceptance/_bootstrap.php @@ -0,0 +1,2 @@ +scenario->condition('amInPath', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Opens a file and stores it's content. + * + * Usage: + * + * ``` php + * openFile('composer.json'); + * $I->seeInThisFile('codeception/codeception'); + * ?> + * ``` + * + * @param $filename + * @see Filesystem::openFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function openFile($filename) { + $this->scenario->action('openFile', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Deletes a file + * + * ``` php + * deleteFile('composer.lock'); + * ?> + * ``` + * + * @param $filename + * @see Filesystem::deleteFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function deleteFile($filename) { + $this->scenario->action('deleteFile', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Deletes directory with all subdirectories + * + * ``` php + * deleteDir('vendor'); + * ?> + * ``` + * + * @param $dirname + * @see Filesystem::deleteDir() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function deleteDir($dirname) { + $this->scenario->action('deleteDir', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Copies directory with all contents + * + * ``` php + * copyDir('vendor','old_vendor'); + * ?> + * ``` + * + * @param $src + * @param $dst + * @see Filesystem::copyDir() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function copyDir($src, $dst) { + $this->scenario->action('copyDir', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks If opened file has `text` in it. + * + * Usage: + * + * ``` php + * openFile('composer.json'); + * $I->seeInThisFile('codeception/codeception'); + * ?> + * ``` + * + * @param $text + * @see Filesystem::seeInThisFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeInThisFile($text) { + $this->scenario->assertion('seeInThisFile', 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 + * openFile('composer.json'); + * $I->seeInThisFile('codeception/codeception'); + * ?> + * ``` + * + * @param $text + * @see Filesystem::dontSeeInThisFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function dontSeeInThisFile($text) { + $this->scenario->action('dontSeeInThisFile', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Deletes a file + * @see Filesystem::deleteThisFile() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function deleteThisFile() { + $this->scenario->action('deleteThisFile', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } + + + /** + * Checks if file exists in path. + * Opens a file when it's exists + * + * ``` php + * seeFileFound('UserModel.php','app/models'); + * ?> + * ``` + * + * @param $filename + * @param string $path + * @see Filesystem::seeFileFound() + * @return \Codeception\Maybe + * ! This method is generated. DO NOT EDIT. ! + * ! Documentation taken from corresponding module ! + */ + public function seeFileFound($filename, $path = null) { + $this->scenario->assertion('seeFileFound', func_get_args()); + if ($this->scenario->running()) { + $result = $this->scenario->runStep(); + return new Maybe($result); + } + return new Maybe(); + } +} + diff --git a/tests/functional/_bootstrap.php b/tests/functional/_bootstrap.php new file mode 100644 index 0000000..7dfa7c3 --- /dev/null +++ b/tests/functional/_bootstrap.php @@ -0,0 +1,2 @@ +params['breadcrumbs'][] = $this->title;

array('class' => 'form-horizontal'), + 'options' => array('class' => 'form-horizontal', 'id' => 'contact-form'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ?> field($model, 'name')->textInput(); ?> diff --git a/views/site/login.php b/views/site/login.php index ea9f456..a80652d 100644 --- a/views/site/login.php +++ b/views/site/login.php @@ -14,7 +14,7 @@ $this->params['breadcrumbs'][] = $this->title;

Please fill out the following fields to login:

- array('class' => 'form-horizontal'))); ?> + array('class' => 'form-horizontal', 'id' => 'login-form'))); ?> field($model, 'username')->textInput(); ?> field($model, 'password')->passwordInput(); ?> field($model, 'rememberMe')->checkbox(); ?> diff --git a/www/index-test.php b/www/index-test.php new file mode 100644 index 0000000..a2f7737 --- /dev/null +++ b/www/index-test.php @@ -0,0 +1,17 @@ +run(); diff --git a/www/index.php b/www/index.php index 3b7b2fc..1290d10 100644 --- a/www/index.php +++ b/www/index.php @@ -6,7 +6,7 @@ defined('YII_DEBUG') or define('YII_DEBUG', true); require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/../vendor/autoload.php'); -$config = require(__DIR__ . '/../config/main.php'); +$config = require(__DIR__ . '/../config/web.php'); $application = new yii\web\Application($config); $application->run();