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'); } } ?>