Merge PR #1393 branch 'yii2-basic-codeception' of https://github.com/Ragazzo/yii2 into Ragazzo-yii2-basic-codeception

* 'yii2-basic-codeception' of https://github.com/Ragazzo/yii2:
  small typo fix
  added readme, changelog, license and composer files.
  added new extension yii2-codeception, modified composer settings
  modified tests according yii2-codeception extension
  added testcase for unit tests, bootstrap files improved, tests inherited from base testcase
  configs fixed and improved
  tests modified, bootstrap added
  colors added
  new entry points for application
  codeception configs, web config modifed for db-settings

Conflicts:
	composer.json
This commit is contained in:
Carsten Brandt 2013-12-16 19:20:37 +01:00
commit 60bdb6b7cf
36 changed files with 2292 additions and 1205 deletions

View File

@ -8,6 +8,7 @@ settings:
suite_class: \PHPUnit_Framework_TestSuite suite_class: \PHPUnit_Framework_TestSuite
memory_limit: 1024M memory_limit: 1024M
log: true log: true
colors: true
modules: modules:
config: config:
Db: Db:

View File

@ -18,6 +18,7 @@
"yiisoft/yii2": "*", "yiisoft/yii2": "*",
"yiisoft/yii2-swiftmailer": "*", "yiisoft/yii2-swiftmailer": "*",
"yiisoft/yii2-bootstrap": "*", "yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*", "yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*" "yiisoft/yii2-gii": "*"
}, },

View File

@ -0,0 +1,9 @@
<?php
return [
'components' => [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=yii2basic_acceptance',
],
],
];

View File

@ -0,0 +1,9 @@
<?php
return [
'components' => [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=yii2basic_functional',
],
],
];

View File

@ -0,0 +1,13 @@
<?php
return [
'components' => [
'fixture' => [
'class' => 'yii\test\DbFixtureManager',
'basePath' => '@app/tests/unit/fixtures',
],
'db' => [
'dsn' => 'mysql:host=localhost;dbname=yii2basic_unit',
],
],
];

View File

@ -1,5 +1,7 @@
<?php <?php
Yii::setAlias('tests', realpath(__DIR__ . '/../tests'));
$config = require(__DIR__ . '/web.php'); $config = require(__DIR__ . '/web.php');
// ... customize $config for the "test" environment here... // ... customize $config for the "test" environment here...

View File

@ -1,5 +1,9 @@
<?php <?php
Yii::setAlias('tests', realpath(__DIR__ . '/../tests'));
$params = require(__DIR__ . '/params.php'); $params = require(__DIR__ . '/params.php');
$config = [ $config = [
'id' => 'basic', 'id' => 'basic',
'basePath' => dirname(__DIR__), 'basePath' => dirname(__DIR__),
@ -26,6 +30,13 @@ $config = [
], ],
], ],
], ],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
], ],
'params' => $params, 'params' => $params,
]; ];

3
tests/_bootstrap.php Normal file
View File

@ -0,0 +1,3 @@
<?php
require_once(__DIR__.'/yii_bootstrap.php');

View File

@ -0,0 +1,10 @@
<?php
namespace tests\_pages;
class AboutPage extends \yii\codeception\BasePage
{
public static $URL = '?r=site/about';
}

View File

@ -0,0 +1,63 @@
<?php
namespace tests\_pages;
class ContactPage extends \yii\codeception\BasePage
{
public static $URL = '?r=site/contact';
/**
* contact form name text field locator
* @var string
*/
public $name = 'input[name="ContactForm[name]"]';
/**
* contact form email text field locator
* @var string
*/
public $email = 'input[name="ContactForm[email]"]';
/**
* contact form subject text field locator
* @var string
*/
public $subject = 'input[name="ContactForm[subject]"]';
/**
* contact form body textarea locator
* @var string
*/
public $body = 'textarea[name="ContactForm[body]"]';
/**
* contact form verification code text field locator
* @var string
*/
public $verifyCode = 'input[name="ContactForm[verifyCode]"]';
/**
* contact form submit button
* @var string
*/
public $button = 'button[type=submit]';
/**
*
* @param array $contactData
*/
public function submit(array $contactData)
{
if (!empty($contactData))
{
$this->guy->fillField($this->name,$contactData['name']);
$this->guy->fillField($this->email,$contactData['email']);
$this->guy->fillField($this->subject,$contactData['subject']);
$this->guy->fillField($this->body,$contactData['body']);
$this->guy->fillField($this->verifyCode,$contactData['verifyCode']);
}
$this->guy->click($this->button);
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace tests\_pages;
class LoginPage extends \yii\codeception\BasePage
{
public static $URL = '?r=site/login';
/**
* login form username text field locator
* @var string
*/
public $username = 'input[name="LoginForm[username]"]';
/**
* login form password text field locator
* @var string
*/
public $password = 'input[name="LoginForm[password]"]';
/**
* login form submit button locator
* @var string
*/
public $button = 'button[type=submit]';
/**
*
* @param string $username
* @param string $password
*/
public function login($username, $password)
{
$this->guy->fillField($this->username,$username);
$this->guy->fillField($this->password,$password);
$this->guy->click($this->button);
}
}

View File

@ -11,8 +11,9 @@
class_name: WebGuy class_name: WebGuy
modules: modules:
enabled: enabled:
- PhpBrowser
- WebHelper - WebHelper
- WebDriver
config: config:
PhpBrowser: WebDriver:
url: 'http://localhost/index-test.php' url: 'http://localhost/basic/web/index-test-accept.php'
browser: firefox

View File

@ -1,5 +1,7 @@
<?php <?php
use tests\_pages\AboutPage;
$I = new WebGuy($scenario); $I = new WebGuy($scenario);
$I->wantTo('ensure that about works'); $I->wantTo('ensure that about works');
$I->amOnPage('?r=site/about'); $I->amOnPage(AboutPage::$URL);
$I->see('About', 'h1'); $I->see('About', 'h1');

View File

@ -1,10 +1,16 @@
<?php <?php
use tests\_pages\ContactPage;
$I = new WebGuy($scenario); $I = new WebGuy($scenario);
$I->wantTo('ensure that contact works'); $I->wantTo('ensure that contact works');
$I->amOnPage('?r=site/contact'); $contactPage = ContactPage::of($I);
$I->amOnPage(ContactPage::$URL);
$I->see('Contact', 'h1'); $I->see('Contact', 'h1');
$I->submitForm('#contact-form', []); $I->amGoingTo('submit contact form with no data');
$contactPage->submit([]);
$I->expectTo('see validations errors');
$I->see('Contact', 'h1'); $I->see('Contact', 'h1');
$I->see('Name cannot be blank'); $I->see('Name cannot be blank');
$I->see('Email cannot be blank'); $I->see('Email cannot be blank');
@ -12,25 +18,29 @@ $I->see('Subject cannot be blank');
$I->see('Body cannot be blank'); $I->see('Body cannot be blank');
$I->see('The verification code is incorrect'); $I->see('The verification code is incorrect');
$I->submitForm('#contact-form', [ $I->amGoingTo('submit contact form with not correct email');
'ContactForm[name]' => 'tester', $contactPage->submit([
'ContactForm[email]' => 'tester.email', 'name' => 'tester',
'ContactForm[subject]' => 'test subject', 'email' => 'tester.email',
'ContactForm[body]' => 'test content', 'subject' => 'test subject',
'ContactForm[verifyCode]' => 'testme', 'body' => 'test content',
'verifyCode' => 'testme',
]); ]);
$I->expectTo('see that email adress is wrong');
$I->dontSee('Name cannot be blank', '.help-inline'); $I->dontSee('Name cannot be blank', '.help-inline');
$I->see('Email is not a valid email address.'); $I->see('Email is not a valid email address.');
$I->dontSee('Subject cannot be blank', '.help-inline'); $I->dontSee('Subject cannot be blank', '.help-inline');
$I->dontSee('Body cannot be blank', '.help-inline'); $I->dontSee('Body cannot be blank', '.help-inline');
$I->dontSee('The verification code is incorrect', '.help-inline'); $I->dontSee('The verification code is incorrect', '.help-inline');
$I->submitForm('#contact-form', [ $I->amGoingTo('submit contact form with correct data');
'ContactForm[name]' => 'tester', $contactPage->submit([
'ContactForm[email]' => 'tester@example.com', 'name' => 'tester',
'ContactForm[subject]' => 'test subject', 'email' => 'tester@example.com',
'ContactForm[body]' => 'test content', 'subject' => 'test subject',
'ContactForm[verifyCode]' => 'testme', 'body' => 'test content',
'verifyCode' => 'testme',
]); ]);
$I->wait(3);
$I->dontSeeElement('#contact-form'); $I->dontSeeElement('#contact-form');
$I->see('Thank you for contacting us. We will respond to you as soon as possible.'); $I->see('Thank you for contacting us. We will respond to you as soon as possible.');

View File

@ -1,23 +1,26 @@
<?php <?php
use tests\_pages\LoginPage;
$I = new WebGuy($scenario); $I = new WebGuy($scenario);
$I->wantTo('ensure that login works'); $I->wantTo('ensure that login works');
$I->amOnPage('?r=site/login'); $loginPage = LoginPage::of($I);
$I->amOnPage(LoginPage::$URL);
$I->see('Login', 'h1'); $I->see('Login', 'h1');
$I->submitForm('#login-form', []); $I->amGoingTo('try to login with empty credentials');
$I->dontSee('Logout (admin)'); $loginPage->login('', '');
$I->see('Username cannot be blank'); $I->expectTo('see validations errors');
$I->see('Password cannot be blank'); $I->see('Username cannot be blank.');
$I->see('Password cannot be blank.');
$I->submitForm('#login-form', [ $I->amGoingTo('try to login with wrong credentials');
'LoginForm[username]' => 'admin', $loginPage->login('admin', 'wrong');
'LoginForm[password]' => 'wrong', $I->expectTo('see validations errors');
]); $I->see('Incorrect username or password.');
$I->dontSee('Logout (admin)');
$I->see('Incorrect username or password');
$I->submitForm('#login-form', [ $I->amGoingTo('try to login with correct credentials');
'LoginForm[username]' => 'admin', $loginPage->login('admin', 'admin');
'LoginForm[password]' => 'admin', $I->wait(3);
]); $I->expectTo('see user info');
$I->see('Logout (admin)'); $I->see('Logout (admin)');

File diff suppressed because it is too large Load Diff

View File

@ -1,2 +1,11 @@
<?php <?php
// Here you can initialize variables that will for your tests // Here you can initialize variables that will for your tests
$config = require(__DIR__.'/../yii_bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
$config,
require(__DIR__ . '/../../config/codeception/acceptance.php')
);
$application = new yii\web\Application($config);

View File

@ -5,11 +5,11 @@
# (tip: better to use with frameworks). # (tip: better to use with frameworks).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES. # RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
#basic/web/index-test-func.php
class_name: TestGuy class_name: TestGuy
modules: modules:
enabled: [Filesystem, TestHelper, Yii2] enabled: [Filesystem, TestHelper, Yii2]
config: config:
Yii2: Yii2:
entryScript: 'web/index-test.php' entryScript: 'web/index-test-func.php'
url: 'http://localhost/' url: 'http://localhost/'

View File

@ -1,5 +1,8 @@
<?php <?php
use tests\_pages\AboutPage;
$I = new TestGuy($scenario); $I = new TestGuy($scenario);
$I->wantTo('ensure that about works'); $I->wantTo('ensure that about works');
$I->amOnPage('?r=site/about'); $I->amOnPage(AboutPage::$URL);
$I->see('About', 'h1'); $I->see('About', 'h1');

View File

@ -1,10 +1,16 @@
<?php <?php
use tests\functional\_pages\ContactPage;
$I = new TestGuy($scenario); $I = new TestGuy($scenario);
$I->wantTo('ensure that contact works'); $I->wantTo('ensure that contact works');
$I->amOnPage('?r=site/contact'); $contactPage = ContactPage::of($I);
$I->amOnPage(ContactPage::$URL);
$I->see('Contact', 'h1'); $I->see('Contact', 'h1');
$I->submitForm('#contact-form', []); $I->amGoingTo('submit contact form with no data');
$contactPage->submit([]);
$I->expectTo('see validations errors');
$I->see('Contact', 'h1'); $I->see('Contact', 'h1');
$I->see('Name cannot be blank'); $I->see('Name cannot be blank');
$I->see('Email cannot be blank'); $I->see('Email cannot be blank');
@ -12,25 +18,28 @@ $I->see('Subject cannot be blank');
$I->see('Body cannot be blank'); $I->see('Body cannot be blank');
$I->see('The verification code is incorrect'); $I->see('The verification code is incorrect');
$I->submitForm('#contact-form', [ $I->amGoingTo('submit contact form with not correct email');
'ContactForm[name]' => 'tester', $contactPage->submit([
'ContactForm[email]' => 'tester.email', 'name' => 'tester',
'ContactForm[subject]' => 'test subject', 'email' => 'tester.email',
'ContactForm[body]' => 'test content', 'subject' => 'test subject',
'ContactForm[verifyCode]' => 'testme', 'body' => 'test content',
'verifyCode' => 'testme',
]); ]);
$I->expectTo('see that email adress is wrong');
$I->dontSee('Name cannot be blank', '.help-inline'); $I->dontSee('Name cannot be blank', '.help-inline');
$I->see('Email is not a valid email address.'); $I->see('Email is not a valid email address.');
$I->dontSee('Subject cannot be blank', '.help-inline'); $I->dontSee('Subject cannot be blank', '.help-inline');
$I->dontSee('Body cannot be blank', '.help-inline'); $I->dontSee('Body cannot be blank', '.help-inline');
$I->dontSee('The verification code is incorrect', '.help-inline'); $I->dontSee('The verification code is incorrect', '.help-inline');
$I->submitForm('#contact-form', [ $I->amGoingTo('submit contact form with correct data');
'ContactForm[name]' => 'tester', $contactPage->submit([
'ContactForm[email]' => 'tester@example.com', 'name' => 'tester',
'ContactForm[subject]' => 'test subject', 'email' => 'tester@example.com',
'ContactForm[body]' => 'test content', 'subject' => 'test subject',
'ContactForm[verifyCode]' => 'testme', 'body' => 'test content',
'verifyCode' => 'testme',
]); ]);
$I->dontSeeElement('#contact-form'); $I->dontSeeElement('#contact-form');
$I->see('Thank you for contacting us. We will respond to you as soon as possible.'); $I->see('Thank you for contacting us. We will respond to you as soon as possible.');

View File

@ -1,23 +1,25 @@
<?php <?php
use tests\functional\_pages\LoginPage;
$I = new TestGuy($scenario); $I = new TestGuy($scenario);
$I->wantTo('ensure that login works'); $I->wantTo('ensure that login works');
$I->amOnPage('?r=site/login'); $loginPage = LoginPage::of($I);
$I->amOnPage(LoginPage::$URL);
$I->see('Login', 'h1'); $I->see('Login', 'h1');
$I->submitForm('#login-form', []); $I->amGoingTo('try to login with empty credentials');
$I->dontSee('Logout (admin)'); $loginPage->login('', '');
$I->see('Username cannot be blank'); $I->expectTo('see validations errors');
$I->see('Password cannot be blank'); $I->see('Username cannot be blank.');
$I->see('Password cannot be blank.');
$I->submitForm('#login-form', [ $I->amGoingTo('try to login with wrong credentials');
'LoginForm[username]' => 'admin', $loginPage->login('admin', 'wrong');
'LoginForm[password]' => 'wrong', $I->expectTo('see validations errors');
]); $I->see('Incorrect username or password.');
$I->dontSee('Logout (admin)');
$I->see('Incorrect username or password');
$I->submitForm('#login-form', [ $I->amGoingTo('try to login with correct credentials');
'LoginForm[username]' => 'admin', $loginPage->login('admin', 'admin');
'LoginForm[password]' => 'admin', $I->expectTo('see user info');
]);
$I->see('Logout (admin)'); $I->see('Logout (admin)');

View File

@ -440,6 +440,25 @@ class TestGuy extends \Codeception\AbstractGuy
} }
/**
* This method is generated.
* Documentation taken from corresponding module.
* ----------------------------------------------
*
*
* @see Codeception\Module::getName()
* @return \Codeception\Maybe
*/
public function getName() {
$this->scenario->addStep(new \Codeception\Step\Action('getName', func_get_args()));
if ($this->scenario->running()) {
$result = $this->scenario->runStep();
return new Maybe($result);
}
return new Maybe();
}
/** /**
* This method is generated. * This method is generated.
* Documentation taken from corresponding module. * Documentation taken from corresponding module.

View File

@ -1,2 +1,10 @@
<?php <?php
// Here you can initialize variables that will for your tests
$config = require(__DIR__.'/../yii_bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
$config,
require(__DIR__ . '/../../config/codeception/functional.php')
);
$application = new yii\web\Application($config);

View File

@ -0,0 +1,56 @@
<?php
namespace tests\functional\_pages;
class ContactPage extends \tests\_pages\ContactPage
{
/**
* contact form name text field locator
* @var string
*/
public $name = 'ContactForm[name]';
/**
* contact form email text field locator
* @var string
*/
public $email = 'ContactForm[email]';
/**
* contact form subject text field locator
* @var string
*/
public $subject = 'ContactForm[subject]';
/**
* contact form body textarea locator
* @var string
*/
public $body = 'ContactForm[body]';
/**
* contact form verification code text field locator
* @var string
*/
public $verifyCode = 'ContactForm[verifyCode]';
/**
*
* @param array $contactData
*/
public function submit(array $contactData)
{
if (empty($contactData))
$this->guy->submitForm('#contact-form',[]);
else
$this->guy->submitForm('#contact-form',[
$this->name => $contactData['name'],
$this->email => $contactData['email'],
$this->subject => $contactData['subject'],
$this->body => $contactData['body'],
$this->verifyCode => $contactData['verifyCode'],
]);
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace tests\functional\_pages;
class LoginPage extends \tests\_pages\LoginPage
{
/**
* login form username text field locator
* @var string
*/
public $username = 'LoginForm[username]';
/**
* login form password text field locator
* @var string
*/
public $password = 'LoginForm[password]';
/**
*
* @param string $username
* @param string $password
*/
public function login($username, $password)
{
$this->guy->submitForm('#login-form',[
$this->username => $username,
$this->password => $password,
]);
}
}

View File

@ -26,5 +26,22 @@ use Codeception\Module\CodeHelper;
class CodeGuy extends \Codeception\AbstractGuy class CodeGuy extends \Codeception\AbstractGuy
{ {
/**
* This method is generated.
* Documentation taken from corresponding module.
* ----------------------------------------------
*
*
* @see Codeception\Module::getName()
* @return \Codeception\Maybe
*/
public function getName() {
$this->scenario->addStep(new \Codeception\Step\Action('getName', func_get_args()));
if ($this->scenario->running()) {
$result = $this->scenario->runStep();
return new Maybe($result);
}
return new Maybe();
}
} }

View File

@ -1,2 +1,8 @@
<?php <?php
// Here you can initialize variables that will for your tests
$config = require(__DIR__.'/../yii_bootstrap.php');
return yii\helpers\ArrayHelper::merge(
$config,
require(__DIR__ . '/../../config/codeception/unit.php')
);

View File

@ -0,0 +1,8 @@
<?php
namespace tests\unit\models;
class ContactFormTest extends \yii\codeception\TestCase
{
}

View File

@ -0,0 +1,8 @@
<?php
namespace tests\unit\models;
class LoginFormTest extends \yii\codeception\TestCase
{
}

View File

@ -0,0 +1,25 @@
<?php
namespace tests\unit\models;
#use yii\test\DbTestTrait;
class UserTest extends \yii\codeception\TestCase
{
use DbTestTrait;
protected function setUp()
{
/*
*
* you can load fixtures in this way
*
parent::setUp();
$this->loadFixtures([
'tbl_user',
]);
*/
}
}

10
tests/yii_bootstrap.php Normal file
View File

@ -0,0 +1,10 @@
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');
return require(__DIR__ . '/../config/web.php');

13
web/index-debug.php Normal file
View File

@ -0,0 +1,13 @@
<?php
// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');
$config = require(__DIR__ . '/../config/web.php');
$application = new yii\web\Application($config);
$application->run();

16
web/index-test-accept.php Normal file
View File

@ -0,0 +1,16 @@
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/web-test.php'),
require(__DIR__ . '/../config/codeception/acceptance.php')
);
$application = new yii\web\Application($config);
$application->run();

16
web/index-test-func.php Normal file
View File

@ -0,0 +1,16 @@
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../config/web-test.php'),
require(__DIR__ . '/../config/codeception/functional.php')
);
$config['class'] = 'yii\web\Application';
return $config;

View File

@ -1,24 +0,0 @@
<?php
if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
die('You are not allowed to access this file.');
}
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');
$config = require(__DIR__ . '/../config/web-test.php');
if (isset($this)) {
// run in functional tests
$config['class'] = 'yii\web\Application';
return $config;
} else {
// run in acceptance tests
$application = new yii\web\Application($config);
$application->run();
}

View File

@ -1,8 +1,8 @@
<?php <?php
// comment out the following two lines when deployed to production // comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'dev'); defined('YII_ENV') or define('YII_ENV', 'prod');
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php');