6.2. Codeception and database - shinokada/php_notes GitHub Wiki
Add the following to a database 'codeception-learning'.
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) unsigned NOT NULL,
`email` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '',
`password` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
In codeception.yml, add database details. Use your localhost mysql login info.
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=codeception-learning'
user: 'root'
password: 'sokada'
dump: tests/_data/dump.sql
Check if you have musqldump. If you have it use mysqldump to write Db in tests/_data/dump.sql. Codeception will use this as a database.
// terminal
mysqldump --opt --user="root" --password="sokada" codeception-learning > tests/_data/dump.sql
Add Db module to acceptance.suite.yml
modules:
enabled:
- PhpBrowser
- AcceptanceHelper
- Db
In terminal run codecept build to include Db module.
codecept build
// this will add methods
Building Actor classes for suites: acceptance, functional, unit
\AcceptanceTester includes modules: PhpBrowser, AcceptanceHelper, Db
AcceptanceTester.php generated successfully. 52 methods added
\FunctionalTester includes modules: Filesystem, FunctionalHelper
FunctionalTester.php generated successfully. 13 methods added
\UnitTester includes modules: Asserts, UnitHelper
UnitTester.php generated successfully. 17 methods added
//terminal
codecept generate:cept acceptance AddUsers
In tests/acceptance/AddUsersCept.php
$I = new AcceptanceTester($scenario);
$I->wantTo('add a new user and see it in the database');
$I->amOnPage('/');
$I->fillField('email','[email protected]');
$I->click('Add User');
$I->seeInDatabase('users',['email'=>'[email protected]']);
Run test and see to fail.
// terminal
codecept run acceptance
Add a form to index.php and run codecept run acceptance to fail.
<form method="post">
<input type="email" name"email">
<button type="submit" name="submit" value="Add User">
</form>
Add PHP at the top of index.php
$conn = new PDO('mysql:host=localhost;dbname=codeception-learning', 'root', 'sokada' );
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
function addUser($user, $conn)
{
$stmt = $conn->prepare('INSERT INTO users (email) VALUES( :email)');
$stmt->execute(array(
':email' => $user['email']
));
}
if(isset($_POST['submit']))
{
addUser(['email' => $_POST['email']], $conn);
}
Run codecept run acceptance to see pass all tests.
In AddUsersCept.php
$I->see('[email protected]', 'li');
Now if you want to add the following to index.php
<ul>
<?php foreach(getUsers($conn) as $user) :?>
<li> <?= $user->email ?></li>
<?php endforeach; ?>
</ul>
And getUsers() at the top.
function getUsers($conn)
{
return $conn->query('SELECT * FROM users')->fetchAll(PDO::FETCH_OBJ);
}
Check all coded at index.php
Test to see pass.
Traditional way of format using class and methods.
codecept generate:cest acceptance Test
This will create odeception/tests/acceptance/TestCest.php.
Sample code.
class TestCest {
public function tryToTest(AcceptanceTester $I)
{
$this->login($I);
$I->see('Admin Page');
}
protected function login($I)
{
$I->submitForm('login-form', [
'username' => 'joe',
'password' => '1234'
]);
}
}