From 35442e54744d74b18933d4e0b026ad189d90a650 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Fri, 12 Oct 2012 15:47:35 +0200 Subject: [PATCH] Add unit tests for OC_DB --- tests/lib/db.php | 90 +++++++++++++++++++++++++++++++ tests/lib/dbschema.php | 118 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 tests/lib/db.php create mode 100644 tests/lib/dbschema.php diff --git a/tests/lib/db.php b/tests/lib/db.php new file mode 100644 index 00000000000..4f1f03ae6f2 --- /dev/null +++ b/tests/lib/db.php @@ -0,0 +1,90 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class Test_DB extends UnitTestCase { + protected static $schema_file = 'static://test_db_scheme'; + protected $test_prefix; + + public function setUp() { + $dbfile = OC::$SERVERROOT.'/tests/data/db_structure.xml'; + + $r = '_'.OC_Util::generate_random_bytes('4').'_'; + $content = file_get_contents( $dbfile ); + $content = str_replace( '*dbprefix*', '*dbprefix*'.$r, $content ); + file_put_contents( self::$schema_file, $content ); + + $this->test_prefix = $r; + $this->table1 = $this->test_prefix.'contacts_addressbooks'; + $this->table2 = $this->test_prefix.'contacts_cards'; + } + + public function tearDown() { + unlink(self::$schema_file); + } + + protected function setUpDB() { + OC_DB::disconnect(); + OC_DB::createDbFromStructure(self::$schema_file); + } + protected function tearDownDB() { + OC_DB::removeDBStructure(self::$schema_file); + } + + // every thing in one test, phpunit messes with MDB2 + // also setUpDB and tearDownDB only once, otherwise sqlite doesn't finish + public function testDBCompatibility() { + $this->setUpDB(); + $this->doTestQuotes(); + $this->doTestNOW(); + $this->doTestUNIX_TIMESTAMP(); + $this->tearDownDB(); + } + + public function doTestQuotes() { + //$this->setUpDB(); + $query = OC_DB::prepare('SELECT `fullname` FROM *PREFIX*'.$this->table2.' WHERE `uri` = ?'); + $result = $query->execute(array('uri_1')); + $this->assertTrue($result); + $row = $result->fetchRow(); + $this->assertFalse($row); + $query = OC_DB::prepare('INSERT INTO *PREFIX*'.$this->table2.' (`fullname`,`uri`) VALUES (?,?)'); + $result = $query->execute(array('fullname test', 'uri_1')); + $this->assertTrue($result); + $query = OC_DB::prepare('SELECT `fullname`,`uri` FROM *PREFIX*'.$this->table2.' WHERE `uri` = ?'); + $result = $query->execute(array('uri_1')); + $this->assertTrue($result); + $row = $result->fetchRow(); + $this->assertArrayHasKey('fullname', $row); + $this->assertEqual($row['fullname'], 'fullname test'); + $row = $result->fetchRow(); + $this->assertFalse($row); + //$this->tearDownDB(); + } + + public function doTestNOW() { + //$this->setUpDB(); + $query = OC_DB::prepare('INSERT INTO *PREFIX*'.$this->table2.' (`fullname`,`uri`) VALUES (NOW(),?)'); + $result = $query->execute(array('uri_2')); + $this->assertTrue($result); + $query = OC_DB::prepare('SELECT `fullname`,`uri` FROM *PREFIX*'.$this->table2.' WHERE `uri` = ?'); + $result = $query->execute(array('uri_2')); + $this->assertTrue($result); + //$this->tearDownDB(); + } + + public function doTestUNIX_TIMESTAMP() { + //$this->setUpDB(); + $query = OC_DB::prepare('INSERT INTO *PREFIX*'.$this->table2.' (`fullname`,`uri`) VALUES (UNIX_TIMESTAMP(),?)'); + $result = $query->execute(array('uri_3')); + $this->assertTrue($result); + $query = OC_DB::prepare('SELECT `fullname`,`uri` FROM *PREFIX*'.$this->table2.' WHERE `uri` = ?'); + $result = $query->execute(array('uri_3')); + $this->assertTrue($result); + //$this->tearDownDB(); + } +} diff --git a/tests/lib/dbschema.php b/tests/lib/dbschema.php new file mode 100644 index 00000000000..25abad7fc95 --- /dev/null +++ b/tests/lib/dbschema.php @@ -0,0 +1,118 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class Test_DBSchema extends UnitTestCase { + protected static $schema_file = 'static://test_db_scheme'; + protected static $schema_file2 = 'static://test_db_scheme2'; + protected $test_prefix; + protected $table1; + protected $table2; + + public function setUp() { + $dbfile = OC::$SERVERROOT.'/tests/data/db_structure.xml'; + $dbfile2 = OC::$SERVERROOT.'/tests/data/db_structure2.xml'; + + $r = '_'.OC_Util::generate_random_bytes('4').'_'; + $content = file_get_contents( $dbfile ); + $content = str_replace( '*dbprefix*', '*dbprefix*'.$r, $content ); + file_put_contents( self::$schema_file, $content ); + $content = file_get_contents( $dbfile2 ); + $content = str_replace( '*dbprefix*', '*dbprefix*'.$r, $content ); + file_put_contents( self::$schema_file2, $content ); + + $this->test_prefix = $r; + $this->table1 = $this->test_prefix.'contacts_addressbooks'; + $this->table2 = $this->test_prefix.'contacts_cards'; + } + + public function tearDown() { + unlink(self::$schema_file); + unlink(self::$schema_file2); + } + + // every thing in one test, phpunit messes with MDB2 + public function testSchema() { + $this->doTestSchemaCreating(); + $this->doTestSchemaChanging(); + $this->doTestSchemaDumping(); + $this->doTestSchemaRemoving(); + } + + public function doTestSchemaCreating() { + OC_DB::createDbFromStructure(self::$schema_file); + $this->assertTableExist($this->table1); + $this->assertTableExist($this->table2); + } + + public function doTestSchemaChanging() { + OC_DB::updateDbFromStructure(self::$schema_file2); + $this->assertTableExist($this->table2); + } + + public function doTestSchemaDumping() { + $outfile = 'static://db_out.xml'; + OC_DB::getDbStructure($outfile); + $content = file_get_contents($outfile); + $this->assertContains($this->table1, $content); + $this->assertContains($this->table2, $content); + } + + public function doTestSchemaRemoving() { + OC_DB::removeDBStructure(self::$schema_file); + $this->assertTableNotExist($this->table1); + $this->assertTableNotExist($this->table2); + } + + public function tableExist($table) { + $table = '*PREFIX*' . $table; + + switch (OC_Config::getValue( 'dbtype', 'sqlite' )) { + case 'sqlite': + case 'sqlite3': + $sql = "SELECT name FROM sqlite_master " + . "WHERE type = 'table' AND name != 'sqlite_sequence' " + . "AND name != 'geometry_columns' AND name != 'spatial_ref_sys' " + . "UNION ALL SELECT name FROM sqlite_temp_master " + . "WHERE type = 'table' AND name = '".$table."'"; + $query = OC_DB::prepare($sql); + $result = $query->execute(array()); + $exists = $result && $result->fetchOne(); + break; + case 'mysql': + $sql = 'SHOW TABLES LIKE "'.$table.'"'; + $query = OC_DB::prepare($sql); + $result = $query->execute(array()); + $exists = $result && $result->fetchOne(); + break; + case 'pgsql': + $sql = "SELECT tablename AS table_name, schemaname AS schema_name " + . "FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' " + . "AND schemaname != 'information_schema' " + . "AND tablename == '".$table."'"; + $query = OC_DB::prepare($sql); + $result = $query->execute(array()); + $exists = $result && $result->fetchOne(); + break; + } + return $exists; + } + + public function assertTableExist($table) { + $this->assertTrue($this->tableExist($table)); + } + + public function assertTableNotExist($table) { + $type=OC_Config::getValue( "dbtype", "sqlite" ); + if( $type == 'sqlite' || $type == 'sqlite3' ) { + // sqlite removes the tables after closing the DB + } + else { + $this->assertFalse($this->tableExist($table)); + } + } +} -- 2.39.5