From b559ec1bab730622cfef78da3c183d81b718e356 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Fri, 13 Apr 2012 13:21:06 -0400 Subject: [PATCH] Move db tests to Query only --- sys/db | 2 +- tests/core/parent.php | 273 ----------------------- tests/databases/firebird/firebird-qb.php | 224 ------------------- tests/databases/firebird/firebird.php | 191 ---------------- tests/databases/mysql/mysql-qb.php | 52 ----- tests/databases/mysql/mysql.php | 171 -------------- tests/databases/odbc/odbc-qb.php | 21 -- tests/databases/odbc/odbc.php | 26 --- tests/databases/pgsql/pgsql-qb.php | 52 ----- tests/databases/pgsql/pgsql.php | 187 ---------------- tests/databases/sqlite/sqlite-qb.php | 33 --- tests/databases/sqlite/sqlite.php | 173 -------------- tests/db_files/FB_TEST_DB.FDB | Bin 933888 -> 0 bytes tests/index.php | 44 +--- 14 files changed, 7 insertions(+), 1442 deletions(-) delete mode 100644 tests/core/parent.php delete mode 100644 tests/databases/firebird/firebird-qb.php delete mode 100644 tests/databases/firebird/firebird.php delete mode 100644 tests/databases/mysql/mysql-qb.php delete mode 100644 tests/databases/mysql/mysql.php delete mode 100644 tests/databases/odbc/odbc-qb.php delete mode 100644 tests/databases/odbc/odbc.php delete mode 100644 tests/databases/pgsql/pgsql-qb.php delete mode 100644 tests/databases/pgsql/pgsql.php delete mode 100644 tests/databases/sqlite/sqlite-qb.php delete mode 100644 tests/databases/sqlite/sqlite.php delete mode 100755 tests/db_files/FB_TEST_DB.FDB diff --git a/sys/db b/sys/db index 773e7b8..e745750 160000 --- a/sys/db +++ b/sys/db @@ -1 +1 @@ -Subproject commit 773e7b8b805783ccefcfae17583f077ce8672996 +Subproject commit e745750eca9bf718094c27af26873be646bf9ef6 diff --git a/tests/core/parent.php b/tests/core/parent.php deleted file mode 100644 index f664af2..0000000 --- a/tests/core/parent.php +++ /dev/null @@ -1,273 +0,0 @@ -db = NULL; - } - - function TestGetTables() - { - if (empty($this->db)) return; - - $tables = $this->db->get_tables(); - $this->assertTrue(is_array($tables)); - } - - function TestGetSystemTables() - { - if (empty($this->db)) return; - - $tables = $this->db->get_system_tables(); - - $this->assertTrue(is_array($tables)); - } - - function TestCreateTransaction() - { - if (empty($this->db)) return; - - $res = $this->db->beginTransaction(); - $this->assertTrue($res); - } -} - -// -------------------------------------------------------------------------- - -/** - * Query builder parent test class - */ -abstract class QBTest extends UnitTestCase { - - function TestGet() - { - if (empty($this->db)) return; - - $query = $this->db->get('create_test'); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestGetLimit() - { - if (empty($this->db)) return; - - $query = $this->db->get('create_test', 2); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestGetLimitSkip() - { - if (empty($this->db)) return; - - $query = $this->db->get('create_test', 2, 1); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestSelectWhereGet() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->where('id >', 1) - ->where('id <', 900) - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestSelectWhereGet2() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->where('id !=', 1) - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestSelectGet() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestSelectFromGet() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test ct') - ->where('id >', 1) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestSelectFromLimitGet() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test ct') - ->where('id >', 1) - ->limit(3) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestOrderBy() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->order_by('id', 'DESC') - ->order_by('k', 'ASC') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestOrderByRandom() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->order_by('id', 'rand') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestGroupBy() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->group_by('k') - ->group_by('id') - ->group_by('val') - ->order_by('id', 'DESC') - ->order_by('k', 'ASC') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestOrWhere() - { - if (empty($this->db)) return; - - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where(' id ', 1) - ->or_where('key >', 0) - ->limit(2, 1) - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestLike() - { - if (empty($this->db)) return; - - $query = $this->db->from('create_test') - ->like('key', 'og') - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestJoin() - { - if (empty($this->db)) return; - - $query = $this->db->from('create_test') - ->join('create_join cj', 'cj.id = create_test.id') - ->get(); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestInsert() - { - if (empty($this->db)) return; - - $query = $this->db->set('id', 4) - ->set('key', 4) - ->set('val', 5) - ->insert('create_test'); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestUpdate() - { - if (empty($this->db)) return; - - $query = $this->db->set('id', 4) - ->set('key', 'gogle') - ->set('val', 'non-word') - ->where('id', 4) - ->update('create_test'); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestDelete() - { - if (empty($this->db)) return; - - $query = $this->db->where('id', 4)->delete('create_test'); - - $this->assertIsA($query, 'PDOStatement'); - } - - function TestGetViews() - { - if (empty($this->db)) return; - - $this->assertTrue(is_array($this->db->get_views())); - } -} - -// End of parent.php \ No newline at end of file diff --git a/tests/databases/firebird/firebird-qb.php b/tests/databases/firebird/firebird-qb.php deleted file mode 100644 index 880ad75..0000000 --- a/tests/databases/firebird/firebird-qb.php +++ /dev/null @@ -1,224 +0,0 @@ -type = 'firebird'; - $params->file = $dbpath; - $params->host = 'localhost'; - $params->user = 'sysdba'; - $params->pass = 'masterkey'; - $this->db = new Query_Builder($params); - - // echo '
Firebird Queries
'; - } - - function TestGet() - { - $query = $this->db->get('create_test ct'); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestGetLimit() - { - $query = $this->db->get('create_test', 2); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestGetLimitSkip() - { - $query = $this->db->get('create_test', 2, 1); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestSelectWhereGet() - { - $query = $this->db->select('id, key as k, val') - ->where('id >', 1) - ->where('id <', 800) - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestSelectWhereGet2() - { - $query = $this->db->select('id, key as k, val') - ->where(' id ', 1) - - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestSelectGet() - { - $query = $this->db->select('id, key as k, val') - ->get('create_test', 2, 1); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestSelectFromGet() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test ct') - ->where('id >', 1) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestSelectFromLimitGet() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test ct') - ->where('id >', 1) - ->limit(3) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestOrderBy() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->order_by('id', 'DESC') - ->order_by('k', 'ASC') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestOrderByRandom() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->order_by('id', 'rand') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestOrWhere() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where(' id ', 1) - ->or_where('key >', 0) - ->limit(2, 1) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestGroupBy() - { - - } - - /*function TestGroupBy() - { - $query = $this->db->select('id, key as k, val') - ->from('create_test') - ->where('id >', 0) - ->where('id <', 9000) - ->group_by('k') - ->group_by('val') - ->order_by('id', 'DESC') - ->order_by('k', 'ASC') - ->limit(5,2) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - }*/ - - function TestLike() - { - $query = $this->db->from('create_test') - ->like('key', 'og') - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestWhereIn() - { - $query = $this->db->from('create_test') - ->where_in('key', array(12, 96, "works")) - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestJoin() - { - $query = $this->db->from('create_test') - ->join('create_join cj', 'cj.id = create_test.id') - ->get(); - - $this->assertIsA($query, 'Firebird_Result'); - } - - function TestInsert() - { - $query = $this->db->set('id', 4) - ->set('key', 4) - ->set('val', 5) - ->insert('create_test'); - - $this->assertTrue($query); - } - - function TestUpdate() - { - $query = $this->db->set('id', 4) - ->set('key', 'gogle') - ->set('val', 'non-word') - ->where('id', 4) - ->update('create_test'); - - $this->assertTrue($query); - } - - function TestDelete() - { - $query = $this->db->where('id', 4)->delete('create_test'); - - $this->assertTrue($query); - } - - -} \ No newline at end of file diff --git a/tests/databases/firebird/firebird.php b/tests/databases/firebird/firebird.php deleted file mode 100644 index 7e27b15..0000000 --- a/tests/databases/firebird/firebird.php +++ /dev/null @@ -1,191 +0,0 @@ -db = new Firebird('localhost:'.$dbpath); - $this->tables = $this->db->get_tables(); - } - - function tearDown() - { - unset($this->db); - unset($this->tables); - } - - function TestConnection() - { - $this->assertIsA($this->db, 'Firebird'); - } - - function TestGetTables() - { - $tables = $this->tables; - $this->assertTrue(is_array($tables)); - } - - function TestGetSystemTables() - { - $only_system = TRUE; - - $tables = $this->db->get_system_tables(); - - foreach($tables as $t) - { - if(stripos($t, 'rdb$') !== 0 && stripos($t, 'mon$') !== 0) - { - $only_system = FALSE; - break; - } - } - - $this->assertTrue($only_system); - } - - function TestCreateTransaction() - { - $res = $this->db->beginTransaction(); - $this->assertTrue($res); - } - - /*function TestCreateTable() - { - //Attempt to create the table - $sql = $this->db->sql->create_table('create_join', array( - 'id' => 'SMALLINT', - 'key' => 'VARCHAR(64)', - 'val' => 'BLOB SUB_TYPE TEXT' - )); - $this->db->query($sql); - - //This test fails for an unknown reason, when clearly the table exists - //Reset - $this->tearDown(); - $this->setUp(); - - //Check - $table_exists = (bool)in_array('create_test', $this->tables); - - echo "create_test exists :".(int)$table_exists.'
'; - - $this->assertTrue($table_exists); - }*/ - - - - function TestTruncate() - { - $this->db->truncate('create_test'); - - $this->assertTrue($this->db->affected_rows() > 0); - } - - function TestCommitTransaction() - { - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (10, 12, 14)'; - $this->db->query($sql); - - $res = $this->db->commit(); - $this->assertTrue($res); - } - - function TestRollbackTransaction() - { - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (182, 96, 43)'; - $this->db->query($sql); - - $res = $this->db->rollback(); - $this->assertTrue($res); - } - - - - function TestPreparedStatements() - { - $sql = <<db->prepare($sql); - $query->execute(array(1,"booger's", "Gross")); - - } - - function TestPrepareExecute() - { - $sql = <<db->prepare_execute($sql, array( - 2, "works", 'also?' - )); - - } - - function TestPrepareQuery() - { - $this->assertFalse($this->db->prepare_query('', array())); - } - - /*function TestDeleteTable() - { - //Attempt to delete the table - $sql = $this->db->sql->delete_table('create_test'); - $this->db->query($sql); - - //Reset - $this->tearDown(); - $this->setUp(); - - //Check - $table_exists = in_array('create_test', $this->tables); - $this->assertFalse($table_exists); - }*/ - - function TestGetSequences() - { - $this->assertTrue(is_array($this->db->get_sequences())); - } - - function TestGetProcedures() - { - $this->assertTrue(is_array($this->db->get_procedures())); - } - - function TestGetFunctions() - { - $this->assertTrue(is_array($this->db->get_functions())); - } - - function TestGetTriggers() - { - $this->assertTrue(is_array($this->db->get_triggers())); - } - -} \ No newline at end of file diff --git a/tests/databases/mysql/mysql-qb.php b/tests/databases/mysql/mysql-qb.php deleted file mode 100644 index 06915db..0000000 --- a/tests/databases/mysql/mysql-qb.php +++ /dev/null @@ -1,52 +0,0 @@ -mysql; - $params->type = "mysql"; - - $this->db = new Query_Builder($params); - - // echo '
MySQL Queries
'; - } - elseif (($var = getenv('CI'))) - { - $params = array( - 'host' => '127.0.0.1', - 'port' => '3306', - 'conn_db' => 'test', - 'user' => 'root', - 'pass' => NULL, - 'type' => 'mysql' - ); - - $this->db = new Query_Builder($params); - } - } - - - function TestExists() - { - $this->assertTrue(in_array('mysql', pdo_drivers())); - } -} \ No newline at end of file diff --git a/tests/databases/mysql/mysql.php b/tests/databases/mysql/mysql.php deleted file mode 100644 index 1eb5a5a..0000000 --- a/tests/databases/mysql/mysql.php +++ /dev/null @@ -1,171 +0,0 @@ -mysql; - - $this->db = new MySQL("host={$params->host};port={$params->port};dbname={$params->conn_db}", $params->user, $params->pass); - } - elseif (($var = getenv('CI'))) - { - $this->db = new MySQL('host=127.0.0.1;port=3306;dbname=test', 'root'); - } - } - - function TestExists() - { - $this->assertTrue(in_array('mysql', pdo_drivers())); - } - - function TestConnection() - { - if (empty($this->db)) return; - - $this->assertIsA($this->db, 'MySQL'); - } - - function TestCreateTable() - { - if (empty($this->db)) return; - - //Attempt to create the table - $sql = $this->db->sql->create_table('create_test', - array( - 'id' => 'int(10)', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - - $this->db->query($sql); - - //Attempt to create the table - $sql = $this->db->sql->create_table('create_join', - array( - 'id' => 'int(10)', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - $this->db->query($sql); - - //Check - $dbs = $this->db->get_tables(); - - $this->assertTrue(in_array('create_test', $dbs)); - - } - - function TestTruncate() - { - $this->db->truncate('create_test'); - $this->db->truncate('create_join'); - - $ct_query = $this->db->query('SELECT * FROM create_test'); - $cj_query = $this->db->query('SELECT * FROM create_join'); - } - - function TestPreparedStatements() - { - if (empty($this->db)) return; - - $sql = <<db->prepare_query($sql, array(1,"boogers", "Gross")); - - $statement->execute(); - - } - - function TestPrepareExecute() - { - if (empty($this->db)) return; - - $sql = <<db->prepare_execute($sql, array( - 2, "works", 'also?' - )); - - } - - function TestCommitTransaction() - { - if (empty($this->db)) return; - - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO `create_test` (`id`, `key`, `val`) VALUES (10, 12, 14)'; - $this->db->query($sql); - - $res = $this->db->commit(); - $this->assertTrue($res); - } - - function TestRollbackTransaction() - { - if (empty($this->db)) return; - - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO `create_test` (`id`, `key`, `val`) VALUES (182, 96, 43)'; - $this->db->query($sql); - - $res = $this->db->rollback(); - $this->assertTrue($res); - } - - function TestGetSchemas() - { - $this->assertFalse($this->db->get_schemas()); - } - - function TestGetsProcedures() - { - $this->assertTrue(is_array($this->db->get_procedures())); - } - - function TestGetTriggers() - { - $this->assertTrue(is_array($this->db->get_triggers())); - } - - function TestGetSequences() - { - $this->assertFalse($this->db->get_sequences()); - } -} - diff --git a/tests/databases/odbc/odbc-qb.php b/tests/databases/odbc/odbc-qb.php deleted file mode 100644 index ea35a20..0000000 --- a/tests/databases/odbc/odbc-qb.php +++ /dev/null @@ -1,21 +0,0 @@ -assertTrue(in_array('odbc', pdo_drivers())); - } -} \ No newline at end of file diff --git a/tests/databases/odbc/odbc.php b/tests/databases/odbc/odbc.php deleted file mode 100644 index 1ad4072..0000000 --- a/tests/databases/odbc/odbc.php +++ /dev/null @@ -1,26 +0,0 @@ -assertTrue(in_array('odbc', pdo_drivers())); - } -} \ No newline at end of file diff --git a/tests/databases/pgsql/pgsql-qb.php b/tests/databases/pgsql/pgsql-qb.php deleted file mode 100644 index d1bfb34..0000000 --- a/tests/databases/pgsql/pgsql-qb.php +++ /dev/null @@ -1,52 +0,0 @@ -pgsql; - $params->type = "pgsql"; - - $this->db = new Query_Builder($params); - - // echo '
Postgres Queries
'; - - } - elseif (($var = getenv('CI'))) - { - $params = array( - 'host' => '127.0.0.1', - 'port' => '5432', - 'conn_db' => 'test', - 'user' => 'postgres', - 'pass' => '', - 'type' => 'pgsql' - ); - - $this->db = new Query_Builder($params); - } - } - - function TestExists() - { - $this->assertTrue(in_array('pgsql', pdo_drivers())); - } -} \ No newline at end of file diff --git a/tests/databases/pgsql/pgsql.php b/tests/databases/pgsql/pgsql.php deleted file mode 100644 index 470c34a..0000000 --- a/tests/databases/pgsql/pgsql.php +++ /dev/null @@ -1,187 +0,0 @@ -pgsql; - - $this->db = new PgSQL("host={$params->host};port={$params->port};dbname={$params->conn_db}", $params->user, $params->pass); - } - elseif (($var = getenv('CI'))) - { - $this->db = new PgSQL('host=127.0.0.1;port=5432;dbname=test', 'postgres'); - } - } - - function TestExists() - { - $this->assertTrue(in_array('pgsql', pdo_drivers())); - } - - function TestConnection() - { - if (empty($this->db)) return; - - $this->assertIsA($this->db, 'PgSQL'); - } - - function TestCreateTable() - { - if (empty($this->db)) return; - - // Drop the table(s) if they exist - $sql = 'DROP TABLE IF EXISTS "create_test"'; - $this->db->query($sql); - $sql = 'DROP TABLE IF EXISTS "create_join"'; - $this->db->query($sql); - - - //Attempt to create the table - $sql = $this->db->sql->create_table('create_test', - array( - 'id' => 'integer', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - - $this->db->query($sql); - - //Attempt to create the table - $sql = $this->db->sql->create_table('create_join', - array( - 'id' => 'integer', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - $this->db->query($sql); - - //echo $sql.'
'; - - //Reset - unset($this->db); - $this->setUp(); - - //Check - $dbs = $this->db->get_tables(); - $this->assertTrue(in_array('create_test', $dbs)); - - } - - function TestTruncate() - { - $this->db->truncate('create_test'); - $this->db->truncate('create_join'); - - $ct_query = $this->db->query('SELECT * FROM create_test'); - $cj_query = $this->db->query('SELECT * FROM create_join'); - } - - function TestPreparedStatements() - { - if (empty($this->db)) return; - - $sql = <<db->prepare_query($sql, array(1,"boogers", "Gross")); - - $statement->execute(); - - } - - function TestPrepareExecute() - { - if (empty($this->db)) return; - - $sql = <<db->prepare_execute($sql, array( - 2, "works", 'also?' - )); - - } - - function TestCommitTransaction() - { - if (empty($this->db)) return; - - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (10, 12, 14)'; - $this->db->query($sql); - - $res = $this->db->commit(); - $this->assertTrue($res); - } - - function TestRollbackTransaction() - { - if (empty($this->db)) return; - - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (182, 96, 43)'; - $this->db->query($sql); - - $res = $this->db->rollback(); - $this->assertTrue($res); - } - - function TestGetSchemas() - { - $this->assertTrue(is_array($this->db->get_schemas())); - } - - function TestGetSequences() - { - $this->assertTrue(is_array($this->db->get_sequences())); - } - - function TestGetsProcedures() - { - $this->assertTrue(is_array($this->db->get_procedures())); - } - - function TestGetTriggers() - { - $this->assertTrue(is_array($this->db->get_triggers())); - } -} \ No newline at end of file diff --git a/tests/databases/sqlite/sqlite-qb.php b/tests/databases/sqlite/sqlite-qb.php deleted file mode 100644 index ad62c12..0000000 --- a/tests/databases/sqlite/sqlite-qb.php +++ /dev/null @@ -1,33 +0,0 @@ -type = 'sqlite'; - $params->file = $path; - $params->host = 'localhost'; - $this->db = new Query_Builder($params); - - // echo '
SQLite Queries
'; - } -} \ No newline at end of file diff --git a/tests/databases/sqlite/sqlite.php b/tests/databases/sqlite/sqlite.php deleted file mode 100644 index e2ffdfa..0000000 --- a/tests/databases/sqlite/sqlite.php +++ /dev/null @@ -1,173 +0,0 @@ -db = new SQLite($path); - } - - function tearDown() - { - unset($this->db); - } - - function TestConnection() - { - $this->assertIsA($this->db, 'SQLite'); - } - - function TestGetTables() - { - $tables = $this->db->get_tables(); - $this->assertTrue(is_array($tables)); - } - - function TestGetSystemTables() - { - $tables = $this->db->get_system_tables(); - - $this->assertTrue(is_array($tables)); - } - - function TestCreateTransaction() - { - $res = $this->db->beginTransaction(); - $this->assertTrue($res); - } - - function TestCreateTable() - { - //Attempt to create the table - $sql = $this->db->sql->create_table('create_test', - array( - 'id' => 'INTEGER', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - $this->db->query($sql); - - //Attempt to create the table - $sql = $this->db->sql->create_table('create_join', - array( - 'id' => 'INTEGER', - 'key' => 'TEXT', - 'val' => 'TEXT', - ), - array( - 'id' => 'PRIMARY KEY' - ) - ); - $this->db->query($sql); - - //Check - $dbs = $this->db->get_tables(); - - $this->assertTrue(in_array('create_test', $dbs)); - } - - function TestTruncate() - { - $this->db->truncate('create_test'); - $this->assertIsA($this->db->affected_rows(), 'int'); - } - - function TestPreparedStatements() - { - $sql = <<db->prepare_query($sql, array(1,"boogers", "Gross")); - - $statement->execute(); - - } - - function TestPrepareExecute() - { - $sql = <<db->prepare_execute($sql, array( - 2, "works", 'also?' - )); - - } - - function TestCommitTransaction() - { - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (10, 12, 14)'; - $this->db->query($sql); - - $res = $this->db->commit(); - $this->assertTrue($res); - } - - function TestRollbackTransaction() - { - $res = $this->db->beginTransaction(); - - $sql = 'INSERT INTO "create_test" ("id", "key", "val") VALUES (182, 96, 43)'; - $this->db->query($sql); - - $res = $this->db->rollback(); - $this->assertTrue($res); - } - - // This is really time intensive ! Run only when needed - /*function TestDeleteTable() - { - //Make sure the table exists to delete - $dbs = $this->db->get_tables(); - $this->assertTrue(isset($dbs['create_test'])); - - //Attempt to delete the table - $sql = $this->db->sql->delete_table('create_test'); - $this->db->query($sql); - - //Check - $dbs = $this->db->get_tables(); - $this->assertFalse(in_array('create_test', $dbs)); - }*/ - - function TestGetDBs() - { - $this->assertFalse($this->db->get_dbs()); - } - - function TestGetSchemas() - { - $this->assertFalse($this->db->get_schemas()); - } -} \ No newline at end of file diff --git a/tests/db_files/FB_TEST_DB.FDB b/tests/db_files/FB_TEST_DB.FDB deleted file mode 100755 index 4f729036353bdac20bbb8f0b9434dd5e62cabac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933888 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 diff --git a/tests/index.php b/tests/index.php index a5cbe85..a37460f 100644 --- a/tests/index.php +++ b/tests/index.php @@ -15,53 +15,21 @@ /** * Unit test bootstrap - Using php simpletest */ -define('TEST_DIR', dirname(__FILE__).'/'); -define('BASE_DIR', str_replace(basename(TEST_DIR).'/', '', TEST_DIR).'sys/'); -define('DS', DIRECTORY_SEPARATOR); +define('OSL_TEST_DIR', dirname(__FILE__).'/'); +define('OSL_BASE_DIR', str_replace(basename(OSL_TEST_DIR).'/', '', OSL_TEST_DIR).'sys/'); // -------------------------------------------------------------------------- // Include simpletest // it has to be set in your php path, or put in the tests folder require_once('simpletest/autorun.php'); - -// Include db_drivers -require_once(BASE_DIR . 'db/autoload.php'); +require_once(OSL_BASE_DIR . 'db/autoload.php'); // Include core tests -array_map('do_include', glob(TEST_DIR . 'core/*.php')); +array_map('do_include', glob(OSL_TEST_DIR . 'core/*.php')); // Include required methods -array_map('do_include', glob(BASE_DIR . 'common/*.php')); +array_map('do_include', glob(OSL_BASE_DIR . 'common/*.php')); // Include db tests -// Load db classes based on capability -$src_path = BASE_DIR.'db/drivers/'; -$test_path = TEST_DIR.'databases/'; - -foreach(pdo_drivers() as $d) -{ - // PDO firebird isn't stable enough to - // bother, so skip it. - if ($d === 'firebird') - { - continue; - } - - // Load by driver folder - $src_dir = "{$src_path}{$d}"; - - if(is_dir($src_dir)) - { - require_once("{$test_path}{$d}/{$d}.php"); - require_once("{$test_path}{$d}/{$d}-qb.php"); - } -} - -// Load Firebird if there is support -if(function_exists('fbird_connect')) -{ - array_map('do_include', glob($src_path.'firebird/*.php')); - require_once("{$test_path}firebird/firebird.php"); - require_once("{$test_path}firebird/firebird-qb.php"); -} \ No newline at end of file +require_once(OSL_BASE_DIR . 'db/tests/index.php');