Files
meekrodb/simpletest/HookTest.php
Sergey Tsalkov 50ed9675f3 fix pre_parse and pre_run hooks
add testing for all hooks (roll into previous ErrorTest group)
2021-06-26 00:52:37 +00:00

188 lines
6.0 KiB
PHP

<?php
function my_error_handler($hash) {
global $error_callback_worked;
if (substr_count($hash['error'], 'You have an error in your SQL syntax')) $error_callback_worked = 1;
return false;
}
function my_success_handler($hash) {
global $debug_callback_worked;
if (substr_count($hash['query'], 'SELECT')) $debug_callback_worked = 1;
return false;
}
class HookTest extends SimpleTest {
static function static_error_callback($hash) {
global $static_error_callback_worked;
if (substr_count($hash['error'], 'You have an error in your SQL syntax')) $static_error_callback_worked = 1;
return false;
}
function nonstatic_error_callback($hash) {
global $nonstatic_error_callback_worked;
if (substr_count($hash['error'], 'You have an error in your SQL syntax')) $nonstatic_error_callback_worked = 1;
return false;
}
function test_1_error_handler() {
global $error_callback_worked, $static_error_callback_worked, $nonstatic_error_callback_worked;
DB::addHook('run_failed', 'my_error_handler');
DB::query("SELET * FROM accounts");
$this->assert($error_callback_worked === 1);
DB::removeHooks('run_failed');
DB::addHook('run_failed', array('HookTest', 'static_error_callback'));
DB::query("SELET * FROM accounts");
$this->assert($static_error_callback_worked === 1);
DB::removeHooks('run_failed');
DB::addHook('run_failed', array($this, 'nonstatic_error_callback'));
DB::query("SELET * FROM accounts");
$this->assert($nonstatic_error_callback_worked === 1);
DB::removeHooks('run_failed');
}
function test_2_exception_catch() {
$dbname = DB::$dbName;
try {
DB::query("SELET * FROM accounts");
} catch(MeekroDBException $e) {
$this->assert(substr_count($e->getMessage(), 'You have an error in your SQL syntax'));
$this->assert($e->getQuery() === 'SELET * FROM accounts');
$exception_was_caught = 1;
}
$this->assert($exception_was_caught === 1);
$this->assert(DB::lastQuery() === 'SELET * FROM accounts');
try {
DB::insert("`$dbname`.`accounts`", array(
'id' => 2,
'username' => 'Another Dude\'s \'Mom"',
'password' => 'asdfsdse',
'age' => 35,
'height' => 555.23
));
} catch(MeekroDBException $e) {
$this->assert(substr_count($e->getMessage(), 'Duplicate entry'));
$exception_was_caught = 2;
}
$this->assert($exception_was_caught === 2);
}
function test_3_success_handler() {
global $debug_callback_worked;
DB::addHook('run_success', 'my_success_handler');
DB::query("SELECT * FROM accounts WHERE username!=%s", "Charlie's Friend");
$this->assert($debug_callback_worked === 1);
DB::removeHooks('run_success');
}
function test_4_error_handler() {
global $anonymous_error_callback_worked;
$error_handler = function($hash) {
global $anonymous_error_callback_worked;
if (substr_count($hash['error'], 'You have an error in your SQL syntax')) {
$anonymous_error_callback_worked = 1;
}
return false;
};
DB::addHook('run_failed', $error_handler);
DB::query("SELET * FROM accounts");
$this->assert($anonymous_error_callback_worked === 1);
DB::removeHooks('run_failed');
}
function test_5_post_run_success() {
$callback_worked = false;
$fn = function($hash) use (&$callback_worked) {
if (!isset($hash['error']) && !isset($hash['exception'])) {
$callback_worked = true;
}
};
DB::addHook('post_run', $fn);
DB::query("SELECT * FROM accounts WHERE username!=%s", "Charlie's Friend");
$this->assert($callback_worked);
DB::removeHooks('post_run');
}
function test_6_post_run_failed() {
$callback_worked = false;
$fn = function($hash) use (&$callback_worked) {
if ($hash['error'] && $hash['exception']) {
$expected_query = "SELEC * FROM accounts WHERE username!='Charlie\'s Friend'";
$expected_error = "error in your SQL syntax";
if ($hash['exception']->getQuery() == $expected_query && substr_count($hash['error'], $expected_error)) {
$callback_worked = true;
}
}
};
DB::addHook('post_run', $fn);
DB::addHook('run_failed', function() { return false; }); // disable exception throwing
DB::query("SELEC * FROM accounts WHERE username!=%s", "Charlie's Friend");
$this->assert($callback_worked);
DB::removeHooks('post_run');
DB::removeHooks('run_failed');
}
function test_7_pre_run() {
$callback_worked = false;
$fn = function($args) { return str_replace('SLCT', 'SELET', $args['query']); };
$fn2 = function($args) { return str_replace('SELET', 'SELECT', $args['query']); };
$fn3 = function($args) use (&$callback_worked) { $callback_worked = true; };
DB::addHook('pre_run', $fn);
DB::addHook('pre_run', $fn2);
$last_hook = DB::addHook('pre_run', $fn3);
$results = DB::query("SLCT * FROM accounts WHERE username!=%s", "Charlie's Friend");
$this->assert(count($results) == 4);
$this->assert($callback_worked);
$callback_worked = false;
DB::removeHook('pre_run', $last_hook);
$results = DB::query("SLCT * FROM accounts WHERE username!=%s", "Charlie's Friend");
$this->assert(count($results) == 4);
$this->assert(!$callback_worked);
DB::removeHooks('pre_run');
}
function test_8_pre_parse() {
$callback_worked = false;
$fn = function($args) {
$args['query'] = str_replace('SLCT', 'SELECT', $args['query']);
return array($args['query'], $args['args']);
};
$fn2 = function($args) {
$args['args'][0] = '1ofmany';
return array($args['query'], $args['args']);
};
$fn3 = function() use (&$callback_worked) {
$callback_worked = true;
};
DB::addHook('pre_parse', $fn);
DB::addHook('pre_parse', $fn2);
DB::addHook('pre_parse', $fn3);
$row = DB::queryFirstRow("SLCT * FROM accounts WHERE username=%s", "asdf");
$this->assert($row['password'] == 'something');
$this->assert($callback_worked);
DB::removeHooks('pre_parse');
}
}
?>