6.2. Codeception and database - shinokada/php_notes GitHub Wiki

Setting up database module

Doc file

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

Verifying rows in db

//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.

Testing to see in a list

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.

Cest format

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'
  ]);
}
}
⚠️ **GitHub.com Fallback** ⚠️