First commit
This commit is contained in:
commit
c6e2478c40
13918 changed files with 2303184 additions and 0 deletions
171
sites/all/modules/civicrm/Civi/Test.php
Normal file
171
sites/all/modules/civicrm/Civi/Test.php
Normal file
|
@ -0,0 +1,171 @@
|
|||
<?php
|
||||
namespace Civi;
|
||||
|
||||
use PDO;
|
||||
use PDOException;
|
||||
|
||||
/**
|
||||
* Class Test
|
||||
*
|
||||
* A facade for managing the test environment.
|
||||
*/
|
||||
class Test {
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $singletons = array();
|
||||
|
||||
/**
|
||||
* Get the data source used for testing.
|
||||
*
|
||||
* @param string|NULL $part
|
||||
* One of NULL, 'hostspec', 'port', 'username', 'password', 'database'.
|
||||
* @return string|array|NULL
|
||||
* If $part is omitted, return full DSN array.
|
||||
* If $part is a string, return that part of the DSN.
|
||||
*/
|
||||
public static function dsn($part = NULL) {
|
||||
if (!isset(self::$singletons['dsn'])) {
|
||||
require_once "DB.php";
|
||||
self::$singletons['dsn'] = \DB::parseDSN(CIVICRM_DSN);
|
||||
}
|
||||
|
||||
if ($part === NULL) {
|
||||
return self::$singletons['dsn'];
|
||||
}
|
||||
|
||||
if (isset(self::$singletons['dsn'][$part])) {
|
||||
return self::$singletons['dsn'][$part];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a connection to the test database.
|
||||
*
|
||||
* @return PDO
|
||||
*/
|
||||
public static function pdo() {
|
||||
if (!isset(self::$singletons['pdo'])) {
|
||||
$dsninfo = self::dsn();
|
||||
$host = $dsninfo['hostspec'];
|
||||
$port = @$dsninfo['port'];
|
||||
try {
|
||||
self::$singletons['pdo'] = new PDO("mysql:host={$host}" . ($port ? ";port=$port" : ""),
|
||||
$dsninfo['username'], $dsninfo['password'],
|
||||
array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE)
|
||||
);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
echo "Can't connect to MySQL server:" . PHP_EOL . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
return self::$singletons['pdo'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for the headless environment.
|
||||
*
|
||||
* @return \Civi\Test\CiviEnvBuilder
|
||||
*
|
||||
* @code
|
||||
* \Civi\Test::headless()->apply();
|
||||
* \Civi\Test::headless()->sqlFile('ex.sql')->apply();
|
||||
* @endCode
|
||||
*/
|
||||
public static function headless() {
|
||||
$civiRoot = dirname(__DIR__);
|
||||
$builder = new \Civi\Test\CiviEnvBuilder('CiviEnvBuilder');
|
||||
$builder
|
||||
->callback(function ($ctx) {
|
||||
if (CIVICRM_UF !== 'UnitTests') {
|
||||
throw new \RuntimeException("\\Civi\\Test::headless() requires CIVICRM_UF=UnitTests");
|
||||
}
|
||||
$dbName = \Civi\Test::dsn('database');
|
||||
echo "Installing {$dbName} schema\n";
|
||||
\Civi\Test::schema()->dropAll();
|
||||
}, 'headless-drop')
|
||||
->sqlFile($civiRoot . "/sql/civicrm.mysql")
|
||||
->sql("DELETE FROM civicrm_extension")
|
||||
->callback(function ($ctx) {
|
||||
\Civi\Test::data()->populate();
|
||||
}, 'populate');
|
||||
return $builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder for end-to-end testing on the live environment.
|
||||
*
|
||||
* @return \Civi\Test\CiviEnvBuilder
|
||||
*
|
||||
* @code
|
||||
* \Civi\Test::e2e()->apply();
|
||||
* \Civi\Test::e2e()->install('foo.bar')->apply();
|
||||
* @endCode
|
||||
*/
|
||||
public static function e2e() {
|
||||
$builder = new \Civi\Test\CiviEnvBuilder('CiviEnvBuilder');
|
||||
$builder
|
||||
->callback(function ($ctx) {
|
||||
if (CIVICRM_UF === 'UnitTests') {
|
||||
throw new \RuntimeException("\\Civi\\Test::e2e() requires a real CMS. Found CIVICRM_UF=UnitTests.");
|
||||
}
|
||||
}, 'e2e-check');
|
||||
return $builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Civi\Test\Schema
|
||||
*/
|
||||
public static function schema() {
|
||||
if (!isset(self::$singletons['schema'])) {
|
||||
self::$singletons['schema'] = new \Civi\Test\Schema();
|
||||
}
|
||||
return self::$singletons['schema'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return \Civi\Test\Data
|
||||
*/
|
||||
public static function data() {
|
||||
if (!isset(self::$singletons['data'])) {
|
||||
self::$singletons['data'] = new \Civi\Test\Data('CiviTesterData');
|
||||
}
|
||||
return self::$singletons['data'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare and execute a batch of SQL statements.
|
||||
*
|
||||
* @param string $query
|
||||
* @return bool
|
||||
*/
|
||||
public static function execute($query) {
|
||||
$pdo = \Civi\Test::pdo();
|
||||
|
||||
$string = preg_replace("/^#[^\n]*$/m", "\n", $query);
|
||||
$string = preg_replace("/^(--[^-]).*/m", "\n", $string);
|
||||
|
||||
$queries = preg_split('/;\s*$/m', $string);
|
||||
foreach ($queries as $query) {
|
||||
$query = trim($query);
|
||||
if (!empty($query)) {
|
||||
$result = $pdo->query($query);
|
||||
if ($pdo->errorCode() == 0) {
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
var_dump($result);
|
||||
var_dump($pdo->errorInfo());
|
||||
// die( "Cannot execute $query: " . $pdo->errorInfo() );
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue