File manager - Edit - /usr/local/prospamfilter/vendor/codeception/codeception/src/Codeception/Module/Db.php
Back
<?php namespace Codeception\Module; use Codeception\Module as CodeceptionModule; use Codeception\Configuration; use Codeception\Exception\ModuleException; use Codeception\Exception\ModuleConfigException; use Codeception\Lib\Interfaces\Db as DbInterface; use Codeception\Lib\Driver\Db as Driver; use Codeception\TestInterface; /** * Works with SQL database. * * The most important function of this module is to clean a database before each test. * That's why this module was added to the global configuration file `codeception.yml`. * To have your database properly cleaned you should configure it to access the database. * This module also provides actions to perform checks in a database. * * In order to have your database populated with data you need a raw SQL dump. * Simply put the dump in the `tests/_data` directory (by default) and specify the path in the config. * The next time after the database is cleared, all your data will be restored from the dump. * Don't forget to include `CREATE TABLE` statements in the dump. * * Supported and tested databases are: * * * MySQL * * SQLite (only file) * * PostgreSQL * * Supported but not tested. * * * MSSQL * * Oracle * * Connection is done by database Drivers, which are stored in the `Codeception\Lib\Driver` namespace. * [Check out the drivers](https://github.com/Codeception/Codeception/tree/2.1/src/Codeception/Lib/Driver) * if you run into problems loading dumps and cleaning databases. * * ## Status * * * Maintainer: **Gintautas Miselis** * * stability: * - Mysql: **stable** * - SQLite: **stable** * - Postgres: **beta** * - MSSQL: **alpha** * - Oracle: **alpha** * * *Please review the code of non-stable modules and provide patches if you have issues.* * * ## Config * * * dsn *required* - PDO DSN * * user *required* - user to access database * * password *required* - password * * dump - path to database dump * * populate: true - whether the the dump should be loaded before the test suite is started * * cleanup: true - whether the dump should be reloaded after each test * * reconnect: false - whether the module should reconnect to the database before each test * * ## Example * * modules: * enabled: * - Db: * dsn: 'mysql:host=localhost;dbname=testdb' * user: 'root' * password: '' * dump: 'tests/_data/dump.sql' * populate: true * cleanup: false * reconnect: true * * ## SQL data dump * * * Comments are permitted. * * The `dump.sql` may contain multiline statements. * * The delimiter, a semi-colon in this case, must be on the same line as the last statement: * * ```sql * -- Add a few contacts to the table. * REPLACE INTO `Contacts` (`created`, `modified`, `status`, `contact`, `first`, `last`) VALUES * (NOW(), NOW(), 1, 'Bob Ross', 'Bob', 'Ross'), * (NOW(), NOW(), 1, 'Fred Flintstone', 'Fred', 'Flintstone'); * * -- Remove existing orders for testing. * DELETE FROM `Order`; * ``` * ## Query generation * * seeInDatabase, dontSeeInDatabase, seeNumRecords, grabFromDatabase and grabNumRecords methods * accept arrays as criteria. WHERE condition is generated using item key as a field name and * item value as a field value. * * Example: * ```php * <?php * $I->seeInDatabase('users', array('name' => 'Davert', 'email' => 'davert@mail.com')); * * ``` * Will generate: * * ```sql * SELECT COUNT(*) FROM `users` WHERE `name` = 'Davert' AND `email` = 'davert@mail.com' * ``` * New addition to 2.1.9 is ability to use LIKE in condition. It is achieved by adding ' like' to column name. * * Example: * ```php * <?php * $I->seeInDatabase('users', array('name' => 'Davert', 'email like' => 'davert%')); * * ``` * Will generate: * * ```sql * SELECT COUNT(*) FROM `users` WHERE `name` = 'Davert' AND `email` LIKE 'davert%' * ``` * ## Public Properties * * dbh - contains the PDO connection * * driver - contains the Connection Driver * */ class Db extends CodeceptionModule implements DbInterface { /** * @api * @var */ public $dbh; /** * @var array */ protected $sql = []; /** * @var array */ protected $config = [ 'populate' => true, 'cleanup' => true, 'reconnect' => false, 'dump' => null ]; /** * @var bool */ protected $populated = false; /** * @var \Codeception\Lib\Driver\Db */ public $driver; /** * @var array */ protected $insertedRows = []; /** * @var array */ protected $requiredFields = ['dsn', 'user', 'password']; public function _initialize() { if ($this->config['dump'] && ($this->config['cleanup'] or ($this->config['populate']))) { $this->readSql(); } $this->connect(); // starting with loading dump if ($this->config['populate']) { if ($this->config['cleanup']) { $this->cleanup(); } $this->loadDump(); $this->populated = true; } } private function readSql() { if (!file_exists(Configuration::projectDir() . $this->config['dump'])) { throw new ModuleConfigException( __CLASS__, "\nFile with dump doesn't exist.\n" . "Please, check path for sql file: " . $this->config['dump'] ); } $sql = file_get_contents(Configuration::projectDir() . $this->config['dump']); // remove C-style comments (except MySQL directives) $sql = preg_replace('%/\*(?!!\d+).*?\*/%s', '', $sql); if (!empty($sql)) { // split SQL dump into lines $this->sql = preg_split('/\r\n|\n|\r/', $sql, -1, PREG_SPLIT_NO_EMPTY); } } private function connect() { try { $this->driver = Driver::create($this->config['dsn'], $this->config['user'], $this->config['password']); } catch (\PDOException $e) { $message = $e->getMessage(); if ($message === 'could not find driver') { list ($missingDriver, ) = explode(':', $this->config['dsn'], 2); $message = "could not find $missingDriver driver"; } throw new ModuleException(__CLASS__, $message . ' while creating PDO connection'); } $this->dbh = $this->driver->getDbh(); } private function disconnect() { $this->dbh = null; $this->driver = null; } public function _before(TestInterface $test) { if ($this->config['reconnect']) { $this->connect(); } if ($this->config['cleanup'] && !$this->populated) { $this->cleanup(); $this->loadDump(); } parent::_before($test); } public function _after(TestInterface $test) { $this->populated = false; $this->removeInserted(); if ($this->config['reconnect']) { $this->disconnect(); } parent::_after($test); } protected function removeInserted() { foreach (array_reverse($this->insertedRows) as $row) { try { $this->driver->deleteQueryByCriteria($row['table'], $row['primary']); } catch (\Exception $e) { $this->debug("coudn't delete record " . json_encode($row['primary']) ." from {$row['table']}"); } } $this->insertedRows = []; } protected function cleanup() { $dbh = $this->driver->getDbh(); if (!$dbh) { throw new ModuleConfigException( __CLASS__, 'No connection to database. Remove this module from config if you don\'t need database repopulation' ); } try { // don't clear database for empty dump if (!count($this->sql)) { return; } $this->driver->cleanup(); } catch (\Exception $e) { throw new ModuleException(__CLASS__, $e->getMessage()); } } protected function loadDump() { if (!$this->sql) { return; } try { $this->driver->load($this->sql); } catch (\PDOException $e) { throw new ModuleException( __CLASS__, $e->getMessage() . "\nSQL query being executed: " . $this->driver->sqlToRun ); } } /** * Inserts an SQL record into a database. This record will be erased after the test. * * ```php * <?php * $I->haveInDatabase('users', array('name' => 'miles', 'email' => 'miles@davis.com')); * ?> * ``` * * @param string $table * @param array $data * * @return integer $id */ public function haveInDatabase($table, array $data) { $query = $this->driver->insert($table, $data); $parameters = array_values($data); $this->debugSection('Query', $query); $this->debugSection('Parameters', $parameters); $this->driver->executeQuery($query, $parameters); try { $lastInsertId = (int)$this->driver->lastInsertId($table); } catch (\PDOException $e) { // ignore errors due to uncommon DB structure, // such as tables without _id_seq in PGSQL $lastInsertId = 0; } $this->addInsertedRow($table, $data, $lastInsertId); return $lastInsertId; } private function addInsertedRow($table, array $row, $id) { $primaryKey = $this->driver->getPrimaryKey($table); $primary = []; if ($primaryKey) { if ($id && count($primaryKey) === 1) { $primary [$primaryKey[0]] = $id; } else { foreach ($primaryKey as $column) { if (isset($row[$column])) { $primary[$column] = $row[$column]; } else { throw new \InvalidArgumentException( 'Primary key field ' . $column . ' is not set for table ' . $table ); } } } } else { $primary = $row; } $this->insertedRows[] = [ 'table' => $table, 'primary' => $primary, ]; } public function seeInDatabase($table, $criteria = []) { $res = $this->countInDatabase($table, $criteria); $this->assertGreaterThan( 0, $res, 'No matching records found for criteria ' . json_encode($criteria) . ' in table ' . $table ); } /** * Asserts that the given number of records were found in the database. * * ```php * <?php * $I->seeNumRecords(1, 'users', ['name' => 'davert']) * ?> * ``` * * @param int $expectedNumber Expected number * @param string $table Table name * @param array $criteria Search criteria [Optional] */ public function seeNumRecords($expectedNumber, $table, array $criteria = []) { $actualNumber = $this->countInDatabase($table, $criteria); $this->assertEquals( $expectedNumber, $actualNumber, sprintf( 'The number of found rows (%d) does not match expected number %d for criteria %s in table %s', $actualNumber, $expectedNumber, json_encode($criteria), $table ) ); } public function dontSeeInDatabase($table, $criteria = []) { $count = $this->countInDatabase($table, $criteria); $this->assertLessThan( 1, $count, 'Unexpectedly found matching records for criteria ' . json_encode($criteria) . ' in table ' . $table ); } /** * Count rows in a database * * @param string $table Table name * @param array $criteria Search criteria [Optional] * * @return int */ protected function countInDatabase($table, array $criteria = []) { return (int) $this->proceedSeeInDatabase($table, 'count(*)', $criteria); } protected function proceedSeeInDatabase($table, $column, $criteria) { $query = $this->driver->select($column, $table, $criteria); $parameters = array_values($criteria); $this->debugSection('Query', $query); if (!empty($parameters)) { $this->debugSection('Parameters', $parameters); } $sth = $this->driver->executeQuery($query, $parameters); return $sth->fetchColumn(); } public function grabFromDatabase($table, $column, $criteria = []) { return $this->proceedSeeInDatabase($table, $column, $criteria); } /** * Returns the number of rows in a database * * @param string $table Table name * @param array $criteria Search criteria [Optional] * * @return int */ public function grabNumRecords($table, array $criteria = []) { return $this->countInDatabase($table, $criteria); } }
| ver. 1.4 |
Github
|
.
| PHP 8.2.30 | Generation time: 0 |
proxy
|
phpinfo
|
Settings