summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/db
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2014-04-25 06:26:49 +0200
committerPierre Schmitz <pierre@archlinux.de>2014-04-25 06:26:49 +0200
commit2e44b49a2db3026050b136de9b00f749dd3ff939 (patch)
treeef048f4db79a93c25cfc86319264aa7ae2a4ae0b /tests/phpunit/includes/db
parent9441dde8bfb95277df073717ed7817dced40f948 (diff)
Update to MediaWiki 1.22.6
Diffstat (limited to 'tests/phpunit/includes/db')
-rw-r--r--tests/phpunit/includes/db/DatabaseMysqlBaseTest.php209
-rw-r--r--tests/phpunit/includes/db/DatabaseSQLTest.php721
-rw-r--r--tests/phpunit/includes/db/DatabaseSqliteTest.php421
-rw-r--r--tests/phpunit/includes/db/DatabaseTest.php234
-rw-r--r--tests/phpunit/includes/db/DatabaseTestHelper.php166
-rw-r--r--tests/phpunit/includes/db/ORMRowTest.php226
-rw-r--r--tests/phpunit/includes/db/ORMTableTest.php146
-rw-r--r--tests/phpunit/includes/db/TestORMRowTest.php215
8 files changed, 0 insertions, 2338 deletions
diff --git a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
deleted file mode 100644
index ba63c091..00000000
--- a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-/**
- * Holds tests for DatabaseMysqlBase MediaWiki class.
- *
- * @section LICENSE
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Antoine Musso
- * @author Bryan Davis
- * @copyright © 2013 Antoine Musso
- * @copyright © 2013 Bryan Davis
- * @copyright © 2013 Wikimedia Foundation Inc.
- */
-
-/**
- * Fake class around abstract class so we can call concrete methods.
- */
-class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
- // From DatabaseBase
- protected function closeConnection() {}
- protected function doQuery( $sql ) {}
-
- // From DatabaseMysql
- protected function mysqlConnect( $realServer ) {}
- protected function mysqlFreeResult( $res ) {}
- protected function mysqlFetchObject( $res ) {}
- protected function mysqlFetchArray( $res ) {}
- protected function mysqlNumRows( $res ) {}
- protected function mysqlNumFields( $res ) {}
- protected function mysqlFieldName( $res, $n ) {}
- protected function mysqlDataSeek( $res, $row ) {}
- protected function mysqlError( $conn = null ) {}
- protected function mysqlFetchField( $res, $n ) {}
- protected function mysqlPing() {}
-
- // From interface DatabaseType
- function insertId() {}
- function lastErrno() {}
- function affectedRows() {}
- function getServerVersion() {}
-}
-
-class DatabaseMysqlBaseTest extends MediaWikiTestCase {
-
- /**
- * @dataProvider provideDiapers
- * @covers DatabaseMysqlBase::addIdentifierQuotes
- */
- public function testAddIdentifierQuotes( $expected, $in ) {
- $db = new FakeDatabaseMysqlBase();
- $quoted = $db->addIdentifierQuotes( $in );
- $this->assertEquals($expected, $quoted);
- }
-
-
- /**
- * Feeds testAddIdentifierQuotes
- *
- * Named per bug 20281 convention.
- */
- function provideDiapers() {
- return array(
- // Format: expected, input
- array( '``', '' ),
-
- // Yeah I really hate loosely typed PHP idiocies nowadays
- array( '``', null ),
-
- // Dear codereviewer, guess what addIdentifierQuotes()
- // will return with thoses:
- array( '``', false ),
- array( '`1`', true ),
-
- // We never know what could happen
- array( '`0`', 0 ),
- array( '`1`', 1 ),
-
- // Whatchout! Should probably use something more meaningful
- array( "`'`", "'" ), # single quote
- array( '`"`', '"' ), # double quote
- array( '````', '`' ), # backtick
- array( '`’`', '’' ), # apostrophe (look at your encyclopedia)
-
- // sneaky NUL bytes are lurking everywhere
- array( '``', "\0" ),
- array( '`xyzzy`', "\0x\0y\0z\0z\0y\0" ),
-
- // unicode chars
- array(
- self::createUnicodeString( '`\u0001a\uFFFFb`' ),
- self::createUnicodeString( '\u0001a\uFFFFb' )
- ),
- array(
- self::createUnicodeString( '`\u0001\uFFFF`' ),
- self::createUnicodeString( '\u0001\u0000\uFFFF\u0000' )
- ),
- array( '`☃`', '☃' ),
- array( '`メインページ`', 'メインページ' ),
- array( '`Басты_бет`', 'Басты_бет' ),
-
- // Real world:
- array( '`Alix`', 'Alix' ), # while( ! $recovered ) { sleep(); }
- array( '`Backtick: ```', 'Backtick: `' ),
- array( '`This is a test`', 'This is a test' ),
- );
- }
-
- private static function createUnicodeString($str) {
- return json_decode( '"' . $str . '"' );
- }
-
- function getMockForViews() {
- $db = $this->getMockBuilder( 'DatabaseMysql' )
- ->disableOriginalConstructor()
- ->setMethods( array( 'fetchRow', 'query' ) )
- ->getMock();
-
- $db->expects( $this->any() )
- ->method( 'query' )
- ->with( $this->anything() )
- ->will(
- $this->returnValue( null )
- );
-
- $db->expects( $this->any() )
- ->method( 'fetchRow' )
- ->with( $this->anything() )
- ->will( $this->onConsecutiveCalls(
- array( 'Tables_in_' => 'view1' ),
- array( 'Tables_in_' => 'view2' ),
- array( 'Tables_in_' => 'myview' ),
- false # no more rows
- ));
- return $db;
- }
- /**
- * @covers DatabaseMysqlBase::listViews
- */
- function testListviews() {
- $db = $this->getMockForViews();
-
- // The first call populate an internal cache of views
- $this->assertEquals( array( 'view1', 'view2', 'myview'),
- $db->listViews() );
- $this->assertEquals( array( 'view1', 'view2', 'myview'),
- $db->listViews() );
-
- // Prefix filtering
- $this->assertEquals( array( 'view1', 'view2' ),
- $db->listViews( 'view' ) );
- $this->assertEquals( array( 'myview' ),
- $db->listViews( 'my' ) );
- $this->assertEquals( array(),
- $db->listViews( 'UNUSED_PREFIX' ) );
- $this->assertEquals( array( 'view1', 'view2', 'myview'),
- $db->listViews( '' ) );
- }
-
- /**
- * @covers DatabaseMysqlBase::isView
- * @dataProvider provideViewExistanceChecks
- */
- function testIsView( $isView, $viewName ) {
- $db = $this->getMockForViews();
-
- switch( $isView ) {
- case true:
- $this->assertTrue( $db->isView( $viewName ),
- "$viewName should be considered a view" );
- break;
-
- case false:
- $this->assertFalse( $db->isView( $viewName ),
- "$viewName has not been defined as a view" );
- break;
- }
-
- }
-
- function provideViewExistanceChecks() {
- return array(
- // format: whether it is a view, view name
- array( true, 'view1' ),
- array( true, 'view2' ),
- array( true, 'myview' ),
-
- array( false, 'user' ),
-
- array( false, 'view10' ),
- array( false, 'my' ),
- array( false, 'OH_MY_GOD' ), # they killed kenny!
- );
- }
-
-}
diff --git a/tests/phpunit/includes/db/DatabaseSQLTest.php b/tests/phpunit/includes/db/DatabaseSQLTest.php
deleted file mode 100644
index bdd567e7..00000000
--- a/tests/phpunit/includes/db/DatabaseSQLTest.php
+++ /dev/null
@@ -1,721 +0,0 @@
-<?php
-
-/**
- * Test the abstract database layer
- * This is a non DBMS depending test.
- */
-class DatabaseSQLTest extends MediaWikiTestCase {
-
- /**
- * @var DatabaseTestHelper
- */
- private $database;
-
- protected function setUp() {
- parent::setUp();
- $this->database = new DatabaseTestHelper( __CLASS__ );
- }
-
- protected function assertLastSql( $sqlText ) {
- $this->assertEquals(
- $this->database->getLastSqls(),
- $sqlText
- );
- }
-
- /**
- * @dataProvider provideSelect
- * @covers DatabaseBase::select
- */
- public function testSelect( $sql, $sqlText ) {
- $this->database->select(
- $sql['tables'],
- $sql['fields'],
- isset( $sql['conds'] ) ? $sql['conds'] : array(),
- __METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : array(),
- isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideSelect() {
- return array(
- array(
- array(
- 'tables' => 'table',
- 'fields' => array( 'field', 'alias' => 'field2' ),
- 'conds' => array( 'alias' => 'text' ),
- ),
- "SELECT field,field2 AS alias " .
- "FROM table " .
- "WHERE alias = 'text'"
- ),
- array(
- array(
- 'tables' => 'table',
- 'fields' => array( 'field', 'alias' => 'field2' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
- ),
- "SELECT field,field2 AS alias " .
- "FROM table " .
- "WHERE alias = 'text' " .
- "ORDER BY field " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table', 't2' => 'table2' ),
- 'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- ) ),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "ORDER BY field " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table', 't2' => 'table2' ),
- 'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'GROUP BY' => 'field', 'HAVING' => 'COUNT(*) > 1' ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- ) ),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "GROUP BY field HAVING COUNT(*) > 1 " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table', 't2' => 'table2' ),
- 'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'GROUP BY' => array( 'field', 'field2' ), 'HAVING' => array( 'COUNT(*) > 1', 'field' => 1 ) ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- ) ),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table' ),
- 'fields' => array( 'alias' => 'field' ),
- 'conds' => array( 'alias' => array( 1, 2, 3, 4 ) ),
- ),
- "SELECT field AS alias " .
- "FROM table " .
- "WHERE alias IN ('1','2','3','4')"
- ),
- );
- }
-
- /**
- * @dataProvider provideUpdate
- * @covers DatabaseBase::update
- */
- public function testUpdate( $sql, $sqlText ) {
- $this->database->update(
- $sql['table'],
- $sql['values'],
- $sql['conds'],
- __METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : array()
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideUpdate() {
- return array(
- array(
- array(
- 'table' => 'table',
- 'values' => array( 'field' => 'text', 'field2' => 'text2' ),
- 'conds' => array( 'alias' => 'text' ),
- ),
- "UPDATE table " .
- "SET field = 'text'" .
- ",field2 = 'text2' " .
- "WHERE alias = 'text'"
- ),
- array(
- array(
- 'table' => 'table',
- 'values' => array( 'field = other', 'field2' => 'text2' ),
- 'conds' => array( 'id' => '1' ),
- ),
- "UPDATE table " .
- "SET field = other" .
- ",field2 = 'text2' " .
- "WHERE id = '1'"
- ),
- array(
- array(
- 'table' => 'table',
- 'values' => array( 'field = other', 'field2' => 'text2' ),
- 'conds' => '*',
- ),
- "UPDATE table " .
- "SET field = other" .
- ",field2 = 'text2'"
- ),
- );
- }
-
- /**
- * @dataProvider provideDelete
- * @covers DatabaseBase::delete
- */
- public function testDelete( $sql, $sqlText ) {
- $this->database->delete(
- $sql['table'],
- $sql['conds'],
- __METHOD__
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideDelete() {
- return array(
- array(
- array(
- 'table' => 'table',
- 'conds' => array( 'alias' => 'text' ),
- ),
- "DELETE FROM table " .
- "WHERE alias = 'text'"
- ),
- array(
- array(
- 'table' => 'table',
- 'conds' => '*',
- ),
- "DELETE FROM table"
- ),
- );
- }
-
- /**
- * @dataProvider provideUpsert
- * @covers DatabaseBase::upsert
- */
- public function testUpsert( $sql, $sqlText ) {
- $this->database->upsert(
- $sql['table'],
- $sql['rows'],
- $sql['uniqueIndexes'],
- $sql['set'],
- __METHOD__
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideUpsert() {
- return array(
- array(
- array(
- 'table' => 'upsert_table',
- 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
- 'uniqueIndexes' => array( 'field' ),
- 'set' => array( 'field' => 'set' ),
- ),
- "BEGIN; " .
- "UPDATE upsert_table " .
- "SET field = 'set' " .
- "WHERE ((field = 'text')); " .
- "INSERT IGNORE INTO upsert_table " .
- "(field,field2) " .
- "VALUES ('text','text2'); " .
- "COMMIT"
- ),
- );
- }
-
- /**
- * @dataProvider provideDeleteJoin
- * @covers DatabaseBase::deleteJoin
- */
- public function testDeleteJoin( $sql, $sqlText ) {
- $this->database->deleteJoin(
- $sql['delTable'],
- $sql['joinTable'],
- $sql['delVar'],
- $sql['joinVar'],
- $sql['conds'],
- __METHOD__
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideDeleteJoin() {
- return array(
- array(
- array(
- 'delTable' => 'table',
- 'joinTable' => 'table_join',
- 'delVar' => 'field',
- 'joinVar' => 'field_join',
- 'conds' => array( 'alias' => 'text' ),
- ),
- "DELETE FROM table " .
- "WHERE field IN (" .
- "SELECT field_join FROM table_join WHERE alias = 'text'" .
- ")"
- ),
- array(
- array(
- 'delTable' => 'table',
- 'joinTable' => 'table_join',
- 'delVar' => 'field',
- 'joinVar' => 'field_join',
- 'conds' => '*',
- ),
- "DELETE FROM table " .
- "WHERE field IN (" .
- "SELECT field_join FROM table_join " .
- ")"
- ),
- );
- }
-
- /**
- * @dataProvider provideInsert
- * @covers DatabaseBase::insert
- */
- public function testInsert( $sql, $sqlText ) {
- $this->database->insert(
- $sql['table'],
- $sql['rows'],
- __METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : array()
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideInsert() {
- return array(
- array(
- array(
- 'table' => 'table',
- 'rows' => array( 'field' => 'text', 'field2' => 2 ),
- ),
- "INSERT INTO table " .
- "(field,field2) " .
- "VALUES ('text','2')"
- ),
- array(
- array(
- 'table' => 'table',
- 'rows' => array( 'field' => 'text', 'field2' => 2 ),
- 'options' => 'IGNORE',
- ),
- "INSERT IGNORE INTO table " .
- "(field,field2) " .
- "VALUES ('text','2')"
- ),
- array(
- array(
- 'table' => 'table',
- 'rows' => array(
- array( 'field' => 'text', 'field2' => 2 ),
- array( 'field' => 'multi', 'field2' => 3 ),
- ),
- 'options' => 'IGNORE',
- ),
- "INSERT IGNORE INTO table " .
- "(field,field2) " .
- "VALUES " .
- "('text','2')," .
- "('multi','3')"
- ),
- );
- }
-
- /**
- * @dataProvider provideInsertSelect
- * @covers DatabaseBase::insertSelect
- */
- public function testInsertSelect( $sql, $sqlText ) {
- $this->database->insertSelect(
- $sql['destTable'],
- $sql['srcTable'],
- $sql['varMap'],
- $sql['conds'],
- __METHOD__,
- isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : array(),
- isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : array()
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideInsertSelect() {
- return array(
- array(
- array(
- 'destTable' => 'insert_table',
- 'srcTable' => 'select_table',
- 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
- 'conds' => '*',
- ),
- "INSERT INTO insert_table " .
- "(field_insert,field) " .
- "SELECT field_select,field2 " .
- "FROM select_table"
- ),
- array(
- array(
- 'destTable' => 'insert_table',
- 'srcTable' => 'select_table',
- 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
- 'conds' => array( 'field' => 2 ),
- ),
- "INSERT INTO insert_table " .
- "(field_insert,field) " .
- "SELECT field_select,field2 " .
- "FROM select_table " .
- "WHERE field = '2'"
- ),
- array(
- array(
- 'destTable' => 'insert_table',
- 'srcTable' => 'select_table',
- 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
- 'conds' => array( 'field' => 2 ),
- 'insertOptions' => 'IGNORE',
- 'selectOptions' => array( 'ORDER BY' => 'field' ),
- ),
- "INSERT IGNORE INTO insert_table " .
- "(field_insert,field) " .
- "SELECT field_select,field2 " .
- "FROM select_table " .
- "WHERE field = '2' " .
- "ORDER BY field"
- ),
- );
- }
-
- /**
- * @dataProvider provideReplace
- * @covers DatabaseBase::replace
- */
- public function testReplace( $sql, $sqlText ) {
- $this->database->replace(
- $sql['table'],
- $sql['uniqueIndexes'],
- $sql['rows'],
- __METHOD__
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideReplace() {
- return array(
- array(
- array(
- 'table' => 'replace_table',
- 'uniqueIndexes' => array( 'field' ),
- 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
- ),
- "DELETE FROM replace_table " .
- "WHERE ( field='text' ); " .
- "INSERT INTO replace_table " .
- "(field,field2) " .
- "VALUES ('text','text2')"
- ),
- array(
- array(
- 'table' => 'module_deps',
- 'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
- 'rows' => array(
- 'md_module' => 'module',
- 'md_skin' => 'skin',
- 'md_deps' => 'deps',
- ),
- ),
- "DELETE FROM module_deps " .
- "WHERE ( md_module='module' AND md_skin='skin' ); " .
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps')"
- ),
- array(
- array(
- 'table' => 'module_deps',
- 'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
- 'rows' => array(
- array(
- 'md_module' => 'module',
- 'md_skin' => 'skin',
- 'md_deps' => 'deps',
- ), array(
- 'md_module' => 'module2',
- 'md_skin' => 'skin2',
- 'md_deps' => 'deps2',
- ),
- ),
- ),
- "DELETE FROM module_deps " .
- "WHERE ( md_module='module' AND md_skin='skin' ); " .
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps'); " .
- "DELETE FROM module_deps " .
- "WHERE ( md_module='module2' AND md_skin='skin2' ); " .
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module2','skin2','deps2')"
- ),
- array(
- array(
- 'table' => 'module_deps',
- 'uniqueIndexes' => array( 'md_module', 'md_skin' ),
- 'rows' => array(
- array(
- 'md_module' => 'module',
- 'md_skin' => 'skin',
- 'md_deps' => 'deps',
- ), array(
- 'md_module' => 'module2',
- 'md_skin' => 'skin2',
- 'md_deps' => 'deps2',
- ),
- ),
- ),
- "DELETE FROM module_deps " .
- "WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps'); " .
- "DELETE FROM module_deps " .
- "WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module2','skin2','deps2')"
- ),
- array(
- array(
- 'table' => 'module_deps',
- 'uniqueIndexes' => array(),
- 'rows' => array(
- 'md_module' => 'module',
- 'md_skin' => 'skin',
- 'md_deps' => 'deps',
- ),
- ),
- "INSERT INTO module_deps " .
- "(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps')"
- ),
- );
- }
-
- /**
- * @dataProvider provideNativeReplace
- * @covers DatabaseBase::nativeReplace
- */
- public function testNativeReplace( $sql, $sqlText ) {
- $this->database->nativeReplace(
- $sql['table'],
- $sql['rows'],
- __METHOD__
- );
- $this->assertLastSql( $sqlText );
- }
-
- public static function provideNativeReplace() {
- return array(
- array(
- array(
- 'table' => 'replace_table',
- 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
- ),
- "REPLACE INTO replace_table " .
- "(field,field2) " .
- "VALUES ('text','text2')"
- ),
- );
- }
-
- /**
- * @dataProvider provideConditional
- * @covers DatabaseBase::conditional
- */
- public function testConditional( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->database->conditional(
- $sql['conds'],
- $sql['true'],
- $sql['false']
- ) ), $sqlText );
- }
-
- public static function provideConditional() {
- return array(
- array(
- array(
- 'conds' => array( 'field' => 'text' ),
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field = 'text' THEN 1 ELSE NULL END)"
- ),
- array(
- array(
- 'conds' => array( 'field' => 'text', 'field2' => 'anothertext' ),
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field = 'text' AND field2 = 'anothertext' THEN 1 ELSE NULL END)"
- ),
- array(
- array(
- 'conds' => 'field=1',
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field=1 THEN 1 ELSE NULL END)"
- ),
- );
- }
-
- /**
- * @dataProvider provideBuildConcat
- * @covers DatabaseBase::buildConcat
- */
- public function testBuildConcat( $stringList, $sqlText ) {
- $this->assertEquals( trim( $this->database->buildConcat(
- $stringList
- ) ), $sqlText );
- }
-
- public static function provideBuildConcat() {
- return array(
- array(
- array( 'field', 'field2' ),
- "CONCAT(field,field2)"
- ),
- array(
- array( "'test'", 'field2' ),
- "CONCAT('test',field2)"
- ),
- );
- }
-
- /**
- * @dataProvider provideBuildLike
- * @covers DatabaseBase::buildLike
- */
- public function testBuildLike( $array, $sqlText ) {
- $this->assertEquals( trim( $this->database->buildLike(
- $array
- ) ), $sqlText );
- }
-
- public static function provideBuildLike() {
- return array(
- array(
- 'text',
- "LIKE 'text'"
- ),
- array(
- array( 'text', new LikeMatch( '%' ) ),
- "LIKE 'text%'"
- ),
- array(
- array( 'text', new LikeMatch( '%' ), 'text2' ),
- "LIKE 'text%text2'"
- ),
- array(
- array( 'text', new LikeMatch( '_' ) ),
- "LIKE 'text_'"
- ),
- );
- }
-
- /**
- * @dataProvider provideUnionQueries
- * @covers DatabaseBase::unionQueries
- */
- public function testUnionQueries( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->database->unionQueries(
- $sql['sqls'],
- $sql['all']
- ) ), $sqlText );
- }
-
- public static function provideUnionQueries() {
- return array(
- array(
- array(
- 'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
- 'all' => true,
- ),
- "(RAW SQL) UNION ALL (RAW2SQL)"
- ),
- array(
- array(
- 'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
- 'all' => false,
- ),
- "(RAW SQL) UNION (RAW2SQL)"
- ),
- array(
- array(
- 'sqls' => array( 'RAW SQL', 'RAW2SQL', 'RAW3SQL' ),
- 'all' => false,
- ),
- "(RAW SQL) UNION (RAW2SQL) UNION (RAW3SQL)"
- ),
- );
- }
-
- /**
- * @covers DatabaseBase::commit
- */
- public function testTransactionCommit() {
- $this->database->begin( __METHOD__ );
- $this->database->commit( __METHOD__ );
- $this->assertLastSql( 'BEGIN; COMMIT' );
- }
-
- /**
- * @covers DatabaseBase::rollback
- */
- public function testTransactionRollback() {
- $this->database->begin( __METHOD__ );
- $this->database->rollback( __METHOD__ );
- $this->assertLastSql( 'BEGIN; ROLLBACK' );
- }
-
- /**
- * @covers DatabaseBase::dropTable
- */
- public function testDropTable() {
- $this->database->setExistingTables( array( 'table' ) );
- $this->database->dropTable( 'table', __METHOD__ );
- $this->assertLastSql( 'DROP TABLE table' );
- }
-
- /**
- * @covers DatabaseBase::dropTable
- */
- public function testDropNonExistingTable() {
- $this->assertFalse(
- $this->database->dropTable( 'non_existing', __METHOD__ )
- );
- }
-}
diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php
deleted file mode 100644
index 70ee9465..00000000
--- a/tests/phpunit/includes/db/DatabaseSqliteTest.php
+++ /dev/null
@@ -1,421 +0,0 @@
-<?php
-
-class MockDatabaseSqlite extends DatabaseSqliteStandalone {
- var $lastQuery;
-
- function __construct() {
- parent::__construct( ':memory:' );
- }
-
- function query( $sql, $fname = '', $tempIgnore = false ) {
- $this->lastQuery = $sql;
-
- return true;
- }
-
- /**
- * Override parent visibility to public
- */
- public function replaceVars( $s ) {
- return parent::replaceVars( $s );
- }
-}
-
-/**
- * @group sqlite
- * @group Database
- * @group medium
- */
-class DatabaseSqliteTest extends MediaWikiTestCase {
-
- /**
- * @var MockDatabaseSqlite
- */
- var $db;
-
- protected function setUp() {
- parent::setUp();
-
- if ( !Sqlite::isPresent() ) {
- $this->markTestSkipped( 'No SQLite support detected' );
- }
- $this->db = new MockDatabaseSqlite();
- if ( version_compare( $this->db->getServerVersion(), '3.6.0', '<' ) ) {
- $this->markTestSkipped( "SQLite at least 3.6 required, {$this->db->getServerVersion()} found" );
- }
- }
-
- private function replaceVars( $sql ) {
- // normalize spacing to hide implementation details
- return preg_replace( '/\s+/', ' ', $this->db->replaceVars( $sql ) );
- }
-
- private function assertResultIs( $expected, $res ) {
- $this->assertNotNull( $res );
- $i = 0;
- foreach ( $res as $row ) {
- foreach ( $expected[$i] as $key => $value ) {
- $this->assertTrue( isset( $row->$key ) );
- $this->assertEquals( $value, $row->$key );
- }
- $i++;
- }
- $this->assertEquals( count( $expected ), $i, 'Unexpected number of rows' );
- }
-
- public static function provideAddQuotes() {
- return array(
- array( // #0: empty
- '', "''"
- ),
- array( // #1: simple
- 'foo bar', "'foo bar'"
- ),
- array( // #2: including quote
- 'foo\'bar', "'foo''bar'"
- ),
- array( // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
- "x\0y",
- "x'780079'",
- ),
- array( // #4: blob object (must be represented as hex)
- new Blob( "hello" ),
- "x'68656c6c6f'",
- ),
- );
- }
-
- /**
- * @dataProvider provideAddQuotes()
- * @covers DatabaseSqlite::addQuotes
- */
- public function testAddQuotes( $value, $expected ) {
- // check quoting
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $this->assertEquals( $expected, $db->addQuotes( $value ), 'string not quoted as expected' );
-
- // ok, quoting works as expected, now try a round trip.
- $re = $db->query( 'select ' . $db->addQuotes( $value ) );
-
- $this->assertTrue( $re !== false, 'query failed' );
-
- if ( $row = $re->fetchRow() ) {
- if ( $value instanceof Blob ) {
- $value = $value->fetch();
- }
-
- $this->assertEquals( $value, $row[0], 'string mangled by the database' );
- } else {
- $this->fail( 'query returned no result' );
- }
- }
-
- /**
- * @covers DatabaseSqlite::replaceVars
- */
- public function testReplaceVars() {
- $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
-
- $this->assertEquals( "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
- . "foo_bar TEXT, foo_name TEXT NOT NULL DEFAULT '', foo_int INTEGER, foo_int2 INTEGER );",
- $this->replaceVars( "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- foo_bar char(13), foo_name varchar(255) binary NOT NULL DEFAULT '', foo_int tinyint ( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;" )
- );
-
- $this->assertEquals( "CREATE TABLE foo ( foo1 REAL, foo2 REAL, foo3 REAL );",
- $this->replaceVars( "CREATE TABLE foo ( foo1 FLOAT, foo2 DOUBLE( 1,10), foo3 DOUBLE PRECISION );" )
- );
-
- $this->assertEquals( "CREATE TABLE foo ( foo_binary1 BLOB, foo_binary2 BLOB );",
- $this->replaceVars( "CREATE TABLE foo ( foo_binary1 binary(16), foo_binary2 varbinary(32) );" )
- );
-
- $this->assertEquals( "CREATE TABLE text ( text_foo TEXT );",
- $this->replaceVars( "CREATE TABLE text ( text_foo tinytext );" ),
- 'Table name changed'
- );
-
- $this->assertEquals( "CREATE TABLE foo ( foobar INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL );",
- $this->replaceVars( "CREATE TABLE foo ( foobar INT PRIMARY KEY NOT NULL AUTO_INCREMENT );" )
- );
- $this->assertEquals( "CREATE TABLE foo ( foobar INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL );",
- $this->replaceVars( "CREATE TABLE foo ( foobar INT PRIMARY KEY AUTO_INCREMENT NOT NULL );" )
- );
-
- $this->assertEquals( "CREATE TABLE enums( enum1 TEXT, myenum TEXT)",
- $this->replaceVars( "CREATE TABLE enums( enum1 ENUM('A', 'B'), myenum ENUM ('X', 'Y'))" )
- );
-
- $this->assertEquals( "ALTER TABLE foo ADD COLUMN foo_bar INTEGER DEFAULT 42",
- $this->replaceVars( "ALTER TABLE foo\nADD COLUMN foo_bar int(10) unsigned DEFAULT 42" )
- );
- }
-
- /**
- * @covers DatabaseSqlite::tableName
- */
- public function testTableName() {
- // @todo Moar!
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $this->assertEquals( 'foo', $db->tableName( 'foo' ) );
- $this->assertEquals( 'sqlite_master', $db->tableName( 'sqlite_master' ) );
- $db->tablePrefix( 'foo' );
- $this->assertEquals( 'sqlite_master', $db->tableName( 'sqlite_master' ) );
- $this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
- }
-
- /**
- * @covers DatabaseSqlite::duplicateTableStructure
- */
- public function testDuplicateTableStructure() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->query( 'CREATE TABLE foo(foo, barfoo)' );
-
- $db->duplicateTableStructure( 'foo', 'bar' );
- $this->assertEquals( 'CREATE TABLE "bar"(foo, barfoo)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'bar' ) ),
- 'Normal table duplication'
- );
-
- $db->duplicateTableStructure( 'foo', 'baz', true );
- $this->assertEquals( 'CREATE TABLE "baz"(foo, barfoo)',
- $db->selectField( 'sqlite_temp_master', 'sql', array( 'name' => 'baz' ) ),
- 'Creation of temporary duplicate'
- );
- $this->assertEquals( 0,
- $db->selectField( 'sqlite_master', 'COUNT(*)', array( 'name' => 'baz' ) ),
- 'Create a temporary duplicate only'
- );
- }
-
- /**
- * @covers DatabaseSqlite::duplicateTableStructure
- */
- public function testDuplicateTableStructureVirtual() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- if ( $db->getFulltextSearchModule() != 'FTS3' ) {
- $this->markTestSkipped( 'FTS3 not supported, cannot create virtual tables' );
- }
- $db->query( 'CREATE VIRTUAL TABLE "foo" USING FTS3(foobar)' );
-
- $db->duplicateTableStructure( 'foo', 'bar' );
- $this->assertEquals( 'CREATE VIRTUAL TABLE "bar" USING FTS3(foobar)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'bar' ) ),
- 'Duplication of virtual tables'
- );
-
- $db->duplicateTableStructure( 'foo', 'baz', true );
- $this->assertEquals( 'CREATE VIRTUAL TABLE "baz" USING FTS3(foobar)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'baz' ) ),
- "Can't create temporary virtual tables, should fall back to non-temporary duplication"
- );
- }
-
- /**
- * @covers DatabaseSqlite::deleteJoin
- */
- public function testDeleteJoin() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
- $db->query( 'CREATE TABLE b (b_1, b_2)', __METHOD__ );
- $db->insert( 'a', array(
- array( 'a_1' => 1 ),
- array( 'a_1' => 2 ),
- array( 'a_1' => 3 ),
- ),
- __METHOD__
- );
- $db->insert( 'b', array(
- array( 'b_1' => 2, 'b_2' => 'a' ),
- array( 'b_1' => 3, 'b_2' => 'b' ),
- ),
- __METHOD__
- );
- $db->deleteJoin( 'a', 'b', 'a_1', 'b_1', array( 'b_2' => 'a' ), __METHOD__ );
- $res = $db->query( "SELECT * FROM a", __METHOD__ );
- $this->assertResultIs( array(
- array( 'a_1' => 1 ),
- array( 'a_1' => 3 ),
- ),
- $res
- );
- }
-
- public function testEntireSchema() {
- global $IP;
-
- $result = Sqlite::checkSqlSyntax( "$IP/maintenance/tables.sql" );
- if ( $result !== true ) {
- $this->fail( $result );
- }
- $this->assertTrue( true ); // avoid test being marked as incomplete due to lack of assertions
- }
-
- /**
- * Runs upgrades of older databases and compares results with current schema
- * @todo Currently only checks list of tables
- */
- public function testUpgrades() {
- global $IP, $wgVersion, $wgProfileToDatabase;
-
- // Versions tested
- $versions = array(
- //'1.13', disabled for now, was totally screwed up
- // SQLite wasn't included in 1.14
- '1.15',
- '1.16',
- '1.17',
- '1.18',
- );
-
- // Mismatches for these columns we can safely ignore
- $ignoredColumns = array(
- 'user_newtalk.user_last_timestamp', // r84185
- );
-
- $currentDB = new DatabaseSqliteStandalone( ':memory:' );
- $currentDB->sourceFile( "$IP/maintenance/tables.sql" );
- if ( $wgProfileToDatabase ) {
- $currentDB->sourceFile( "$IP/maintenance/sqlite/archives/patch-profiling.sql" );
- }
- $currentTables = $this->getTables( $currentDB );
- sort( $currentTables );
-
- foreach ( $versions as $version ) {
- $versions = "upgrading from $version to $wgVersion";
- $db = $this->prepareDB( $version );
- $tables = $this->getTables( $db );
- $this->assertEquals( $currentTables, $tables, "Different tables $versions" );
- foreach ( $tables as $table ) {
- $currentCols = $this->getColumns( $currentDB, $table );
- $cols = $this->getColumns( $db, $table );
- $this->assertEquals(
- array_keys( $currentCols ),
- array_keys( $cols ),
- "Mismatching columns for table \"$table\" $versions"
- );
- foreach ( $currentCols as $name => $column ) {
- $fullName = "$table.$name";
- $this->assertEquals(
- (bool)$column->pk,
- (bool)$cols[$name]->pk,
- "PRIMARY KEY status does not match for column $fullName $versions"
- );
- if ( !in_array( $fullName, $ignoredColumns ) ) {
- $this->assertEquals(
- (bool)$column->notnull,
- (bool)$cols[$name]->notnull,
- "NOT NULL status does not match for column $fullName $versions"
- );
- $this->assertEquals(
- $column->dflt_value,
- $cols[$name]->dflt_value,
- "Default values does not match for column $fullName $versions"
- );
- }
- }
- $currentIndexes = $this->getIndexes( $currentDB, $table );
- $indexes = $this->getIndexes( $db, $table );
- $this->assertEquals(
- array_keys( $currentIndexes ),
- array_keys( $indexes ),
- "mismatching indexes for table \"$table\" $versions"
- );
- }
- $db->close();
- }
- }
-
- /**
- * @covers DatabaseSqlite::insertId
- */
- public function testInsertIdType() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
-
- $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
- $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
-
- $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
- $this->assertTrue( $insertion, "Insertion worked" );
-
- $this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
- $this->assertTrue( $db->close(), "closing database" );
- }
-
- private function prepareDB( $version ) {
- static $maint = null;
- if ( $maint === null ) {
- $maint = new FakeMaintenance();
- $maint->loadParamsAndArgs( null, array( 'quiet' => 1 ) );
- }
-
- global $IP;
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
- $updater = DatabaseUpdater::newForDB( $db, false, $maint );
- $updater->doUpdates( array( 'core' ) );
-
- return $db;
- }
-
- private function getTables( $db ) {
- $list = array_flip( $db->listTables() );
- $excluded = array(
- 'external_user', // removed from core in 1.22
- 'math', // moved out of core in 1.18
- 'trackbacks', // removed from core in 1.19
- 'searchindex',
- 'searchindex_content',
- 'searchindex_segments',
- 'searchindex_segdir',
- // FTS4 ready!!1
- 'searchindex_docsize',
- 'searchindex_stat',
- );
- foreach ( $excluded as $t ) {
- unset( $list[$t] );
- }
- $list = array_flip( $list );
- sort( $list );
-
- return $list;
- }
-
- private function getColumns( $db, $table ) {
- $cols = array();
- $res = $db->query( "PRAGMA table_info($table)" );
- $this->assertNotNull( $res );
- foreach ( $res as $col ) {
- $cols[$col->name] = $col;
- }
- ksort( $cols );
-
- return $cols;
- }
-
- private function getIndexes( $db, $table ) {
- $indexes = array();
- $res = $db->query( "PRAGMA index_list($table)" );
- $this->assertNotNull( $res );
- foreach ( $res as $index ) {
- $res2 = $db->query( "PRAGMA index_info({$index->name})" );
- $this->assertNotNull( $res2 );
- $index->columns = array();
- foreach ( $res2 as $col ) {
- $index->columns[] = $col;
- }
- $indexes[$index->name] = $index;
- }
- ksort( $indexes );
-
- return $indexes;
- }
-
- public function testCaseInsensitiveLike() {
- // TODO: Test this for all databases
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $res = $db->query( 'SELECT "a" LIKE "A" AS a' );
- $row = $res->fetchRow();
- $this->assertFalse( (bool)$row['a'] );
- }
-}
diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
deleted file mode 100644
index 301fc990..00000000
--- a/tests/phpunit/includes/db/DatabaseTest.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group DatabaseBase
- */
-class DatabaseTest extends MediaWikiTestCase {
- /**
- * @var DatabaseBase
- */
- var $db;
- var $functionTest = false;
-
- protected function setUp() {
- parent::setUp();
- $this->db = wfGetDB( DB_MASTER );
- }
-
- protected function tearDown() {
- parent::tearDown();
- if ( $this->functionTest ) {
- $this->dropFunctions();
- $this->functionTest = false;
- }
- }
- /**
- * @covers DatabaseBase::dropTable
- */
- public function testAddQuotesNull() {
- $check = "NULL";
- if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
- $check = "''";
- }
- $this->assertEquals( $check, $this->db->addQuotes( null ) );
- }
-
- public function testAddQuotesInt() {
- # returning just "1234" should be ok too, though...
- # maybe
- $this->assertEquals(
- "'1234'",
- $this->db->addQuotes( 1234 ) );
- }
-
- public function testAddQuotesFloat() {
- # returning just "1234.5678" would be ok too, though
- $this->assertEquals(
- "'1234.5678'",
- $this->db->addQuotes( 1234.5678 ) );
- }
-
- public function testAddQuotesString() {
- $this->assertEquals(
- "'string'",
- $this->db->addQuotes( 'string' ) );
- }
-
- public function testAddQuotesStringQuote() {
- $check = "'string''s cause trouble'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "'string\'s cause trouble'";
- }
- $this->assertEquals(
- $check,
- $this->db->addQuotes( "string's cause trouble" ) );
- }
-
- private function getSharedTableName( $table, $database, $prefix, $format = 'quoted' ) {
- global $wgSharedDB, $wgSharedTables, $wgSharedPrefix;
-
- $oldName = $wgSharedDB;
- $oldTables = $wgSharedTables;
- $oldPrefix = $wgSharedPrefix;
-
- $wgSharedDB = $database;
- $wgSharedTables = array( $table );
- $wgSharedPrefix = $prefix;
-
- $ret = $this->db->tableName( $table, $format );
-
- $wgSharedDB = $oldName;
- $wgSharedTables = $oldTables;
- $wgSharedPrefix = $oldPrefix;
-
- return $ret;
- }
-
- private function prefixAndQuote( $table, $database = null, $prefix = null, $format = 'quoted' ) {
- if ( $this->db->getType() === 'sqlite' || $format !== 'quoted' ) {
- $quote = '';
- } elseif ( $this->db->getType() === 'mysql' ) {
- $quote = '`';
- } elseif ( $this->db->getType() === 'oracle' ) {
- $quote = '/*Q*/';
- } else {
- $quote = '"';
- }
-
- if ( $database !== null ) {
- if ( $this->db->getType() === 'oracle' ) {
- $database = $quote . $database . '.';
- } else {
- $database = $quote . $database . $quote . '.';
- }
- }
-
- if ( $prefix === null ) {
- $prefix = $this->dbPrefix();
- }
-
- if ( $this->db->getType() === 'oracle' ) {
- return strtoupper($database . $quote . $prefix . $table);
- } else {
- return $database . $quote . $prefix . $table . $quote;
- }
- }
-
- public function testTableNameLocal() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename' ),
- $this->db->tableName( 'tablename' )
- );
- }
-
- public function testTableNameRawLocal() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', null, null, 'raw' ),
- $this->db->tableName( 'tablename', 'raw' )
- );
- }
-
- public function testTableNameShared() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
- );
-
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', null ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', null )
- );
- }
-
- public function testTableNameRawShared() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
- );
-
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', null, 'raw' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', null, 'raw' )
- );
- }
-
- public function testTableNameForeign() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'databasename', '' ),
- $this->db->tableName( 'databasename.tablename' )
- );
- }
-
- public function testTableNameRawForeign() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
- $this->db->tableName( 'databasename.tablename', 'raw' )
- );
- }
-
- public function testFillPreparedEmpty() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM interwiki', array() );
- $this->assertEquals(
- "SELECT * FROM interwiki",
- $sql );
- }
-
- public function testFillPreparedQuestion() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
- array( 4, "Snicker's_paradox" ) );
-
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker''s_paradox'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker\'s_paradox'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- public function testFillPreparedBang() {
- $sql = $this->db->fillPrepared(
- 'SELECT user_id FROM ! WHERE user_name=?',
- array( '"user"', "Slash's Dot" ) );
-
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash''s Dot'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash\'s Dot'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- public function testFillPreparedRaw() {
- $sql = $this->db->fillPrepared(
- "SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
- array( '"user"', "Slash's Dot" ) );
- $this->assertEquals(
- "SELECT * FROM cur WHERE cur_title='This_&_that,_WTF?!'",
- $sql );
- }
-
- public function testStoredFunctions() {
- if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
- $this->markTestSkipped( 'MySQL or Postgres required' );
- }
- global $IP;
- $this->dropFunctions();
- $this->functionTest = true;
- $this->assertTrue( $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" ) );
- $res = $this->db->query( 'SELECT mw_test_function() AS test', __METHOD__ );
- $this->assertEquals( 42, $res->fetchObject()->test );
- }
-
- private function dropFunctions() {
- $this->db->query( 'DROP FUNCTION IF EXISTS mw_test_function'
- . ( $this->db->getType() == 'postgres' ? '()' : '' )
- );
- }
-
- public function testUnknownTableCorruptsResults() {
- $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
- $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
- $this->assertInternalType( 'int', $res->numRows() );
- }
-}
diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php
deleted file mode 100644
index 790f273c..00000000
--- a/tests/phpunit/includes/db/DatabaseTestHelper.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-
-/**
- * Helper for testing the methods from the DatabaseBase class
- * @since 1.22
- */
-class DatabaseTestHelper extends DatabaseBase {
-
- /**
- * __CLASS__ of the test suite,
- * used to determine, if the function name is passed every time to query()
- */
- protected $testName = array();
-
- /**
- * Array of lastSqls passed to query(),
- * This is an array since some methods in DatabaseBase can do more than one
- * query. Cleared when calling getLastSqls().
- */
- protected $lastSqls = array();
-
- /**
- * Array of tables to be considered as existing by tableExist()
- * Use setExistingTables() to alter.
- */
- protected $tablesExists;
-
- public function __construct( $testName ) {
- $this->testName = $testName;
- }
-
- /**
- * Returns SQL queries grouped by '; '
- * Clear the list of queries that have been done so far.
- */
- public function getLastSqls() {
- $lastSqls = implode( '; ', $this->lastSqls );
- $this->lastSqls = array();
-
- return $lastSqls;
- }
-
- public function setExistingTables( $tablesExists ) {
- $this->tablesExists = (array)$tablesExists;
- }
-
- protected function addSql( $sql ) {
- // clean up spaces before and after some words and the whole string
- $this->lastSqls[] = trim( preg_replace(
- '/\s{2,}(?=FROM|WHERE|GROUP BY|ORDER BY|LIMIT)|(?<=SELECT|INSERT|UPDATE)\s{2,}/',
- ' ', $sql
- ) );
- }
-
- protected function checkFunctionName( $fname ) {
- if ( substr( $fname, 0, strlen( $this->testName ) ) !== $this->testName ) {
- throw new MWException( 'function name does not start with test class. ' .
- $fname . ' vs. ' . $this->testName . '. ' .
- 'Please provide __METHOD__ to database methods.' );
- }
- }
-
- function strencode( $s ) {
- // Choose apos to avoid handling of escaping double quotes in quoted text
- return str_replace( "'", "\'", $s );
- }
-
- public function addIdentifierQuotes( $s ) {
- // no escaping to avoid handling of double quotes in quoted text
- return $s;
- }
-
- public function query( $sql, $fname = '', $tempIgnore = false ) {
- $this->checkFunctionName( $fname );
- $this->addSql( $sql );
-
- return parent::query( $sql, $fname, $tempIgnore );
- }
-
- public function tableExists( $table, $fname = __METHOD__ ) {
- $this->checkFunctionName( $fname );
-
- return in_array( $table, (array)$this->tablesExists );
- }
-
- // Redeclare parent method to make it public
- public function nativeReplace( $table, $rows, $fname ) {
- return parent::nativeReplace( $table, $rows, $fname );
- }
-
- function getType() {
- return 'test';
- }
-
- function open( $server, $user, $password, $dbName ) {
- return false;
- }
-
- function fetchObject( $res ) {
- return false;
- }
-
- function fetchRow( $res ) {
- return false;
- }
-
- function numRows( $res ) {
- return -1;
- }
-
- function numFields( $res ) {
- return -1;
- }
-
- function fieldName( $res, $n ) {
- return 'test';
- }
-
- function insertId() {
- return -1;
- }
-
- function dataSeek( $res, $row ) {
- /* nop */
- }
-
- function lastErrno() {
- return -1;
- }
-
- function lastError() {
- return 'test';
- }
-
- function fieldInfo( $table, $field ) {
- return false;
- }
-
- function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
- return false;
- }
-
- function affectedRows() {
- return -1;
- }
-
- function getSoftwareLink() {
- return 'test';
- }
-
- function getServerVersion() {
- return 'test';
- }
-
- function getServerInfo() {
- return 'test';
- }
-
- protected function closeConnection() {
- return false;
- }
-
- protected function doQuery( $sql ) {
- return array();
- }
-}
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
deleted file mode 100644
index 27d4d0e8..00000000
--- a/tests/phpunit/includes/db/ORMRowTest.php
+++ /dev/null
@@ -1,226 +0,0 @@
-<?php
-
-/**
- * Abstract class to construct tests for ORMRow deriving classes.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.20
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ORMRowTest extends \MediaWikiTestCase {
-
- /**
- * @since 1.20
- * @return string
- */
- abstract protected function getRowClass();
-
- /**
- * @since 1.20
- * @return IORMTable
- */
- abstract protected function getTableInstance();
-
- /**
- * @since 1.20
- * @return array
- */
- abstract public function constructorTestProvider();
-
- /**
- * @since 1.20
- * @param IORMRow $row
- * @param array $data
- */
- protected function verifyFields( IORMRow $row, array $data ) {
- foreach ( array_keys( $data ) as $fieldName ) {
- $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) );
- }
- }
-
- /**
- * @since 1.20
- * @param array $data
- * @param boolean $loadDefaults
- * @return IORMRow
- */
- protected function getRowInstance( array $data, $loadDefaults ) {
- $class = $this->getRowClass();
-
- return new $class( $this->getTableInstance(), $data, $loadDefaults );
- }
-
- /**
- * @since 1.20
- * @return array
- */
- protected function getMockValues() {
- return array(
- 'id' => 1,
- 'str' => 'foobar4645645',
- 'int' => 42,
- 'float' => 4.2,
- 'bool' => true,
- 'array' => array( 42, 'foobar' ),
- 'blob' => new stdClass()
- );
- }
-
- /**
- * @since 1.20
- * @return array
- */
- protected function getMockFields() {
- $mockValues = $this->getMockValues();
- $mockFields = array();
-
- foreach ( $this->getTableInstance()->getFields() as $name => $type ) {
- if ( $name !== 'id' ) {
- $mockFields[$name] = $mockValues[$type];
- }
- }
-
- return $mockFields;
- }
-
- /**
- * @since 1.20
- * @return array of IORMRow
- */
- public function instanceProvider() {
- $instances = array();
-
- foreach ( $this->constructorTestProvider() as $arguments ) {
- $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) );
- }
-
- return $instances;
- }
-
- /**
- * @dataProvider constructorTestProvider
- */
- public function testConstructor( array $data, $loadDefaults ) {
- $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data );
- }
-
- /**
- * @dataProvider constructorTestProvider
- */
- public function testSaveAndRemove( array $data, $loadDefaults ) {
- $item = $this->getRowInstance( $data, $loadDefaults );
-
- $this->assertTrue( $item->save() );
-
- $this->assertTrue( $item->hasIdField() );
- $this->assertTrue( is_integer( $item->getId() ) );
-
- $id = $item->getId();
-
- $this->assertTrue( $item->save() );
-
- $this->assertEquals( $id, $item->getId() );
-
- $this->verifyFields( $item, $data );
-
- $this->assertTrue( $item->remove() );
-
- $this->assertFalse( $item->hasIdField() );
-
- $this->assertTrue( $item->save() );
-
- $this->verifyFields( $item, $data );
-
- $this->assertTrue( $item->remove() );
-
- $this->assertFalse( $item->hasIdField() );
-
- $this->verifyFields( $item, $data );
- }
-
- /**
- * @dataProvider instanceProvider
- */
- public function testSetField( IORMRow $item ) {
- foreach ( $this->getMockFields() as $name => $value ) {
- $item->setField( $name, $value );
- $this->assertEquals( $value, $item->getField( $name ) );
- }
- }
-
- /**
- * @since 1.20
- * @param array $expected
- * @param IORMRow $item
- */
- protected function assertFieldValues( array $expected, IORMRow $item ) {
- foreach ( $expected as $name => $type ) {
- if ( $name !== 'id' ) {
- $this->assertEquals( $expected[$name], $item->getField( $name ) );
- }
- }
- }
-
- /**
- * @dataProvider instanceProvider
- */
- public function testSetFields( IORMRow $item ) {
- $originalValues = $item->getFields();
-
- $item->setFields( array(), false );
-
- foreach ( $item->getTable()->getFields() as $name => $type ) {
- $originalHas = array_key_exists( $name, $originalValues );
- $newHas = $item->hasField( $name );
-
- $this->assertEquals( $originalHas, $newHas );
-
- if ( $originalHas && $newHas ) {
- $this->assertEquals( $originalValues[$name], $item->getField( $name ) );
- }
- }
-
- $mockFields = $this->getMockFields();
-
- $item->setFields( $mockFields, false );
-
- $this->assertFieldValues( $originalValues, $item );
-
- $item->setFields( $mockFields, true );
-
- $this->assertFieldValues( $mockFields, $item );
- }
-
- // TODO: test all of the methods!
-
-}
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
deleted file mode 100644
index e583d1bc..00000000
--- a/tests/phpunit/includes/db/ORMTableTest.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * Abstract class to construct tests for ORMTable deriving classes.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.21
- *
- * @ingroup Test
- *
- * @group ORM
- * @group Database
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- * @author Daniel Kinzler
- */
-class ORMTableTest extends MediaWikiTestCase {
-
- /**
- * @since 1.21
- * @return string
- */
- protected function getTableClass() {
- return 'PageORMTableForTesting';
- }
-
- /**
- * @since 1.21
- * @return IORMTable
- */
- public function getTable() {
- $class = $this->getTableClass();
-
- return $class::singleton();
- }
-
- /**
- * @since 1.21
- * @return string
- */
- public function getRowClass() {
- return $this->getTable()->getRowClass();
- }
-
- /**
- * @since 1.21
- */
- public function testSingleton() {
- $class = $this->getTableClass();
-
- $this->assertInstanceOf( $class, $class::singleton() );
- $this->assertTrue( $class::singleton() === $class::singleton() );
- }
-
- /**
- * @since 1.21
- */
- public function testIgnoreErrorsOverride() {
- $table = $this->getTable();
-
- $db = $table->getReadDbConnection();
- $db->ignoreErrors( true );
-
- try {
- $table->rawSelect( "this is invalid" );
- $this->fail( "An invalid query should trigger a DBQueryError even if ignoreErrors is enabled." );
- } catch ( DBQueryError $ex ) {
- $this->assertTrue( true, "just making phpunit happy" );
- }
-
- $db->ignoreErrors( false );
- }
-}
-
-/**
- * Dummy ORM table for testing, reading Title objects from the page table.
- *
- * @since 1.21
- */
-
-class PageORMTableForTesting extends ORMTable {
-
- /**
- * @see ORMTable::getName
- *
- * @return string
- */
- public function getName() {
- return 'page';
- }
-
- /**
- * @see ORMTable::getRowClass
- *
- * @return string
- */
- public function getRowClass() {
- return 'Title';
- }
-
- /**
- * @see ORMTable::newRow
- *
- * @return IORMRow
- */
- public function newRow( array $data, $loadDefaults = false ) {
- return Title::makeTitle( $data['namespace'], $data['title'] );
- }
-
- /**
- * @see ORMTable::getFields
- *
- * @return array
- */
- public function getFields() {
- return array(
- 'id' => 'int',
- 'namespace' => 'int',
- 'title' => 'str',
- );
- }
-
- /**
- * @see ORMTable::getFieldPrefix
- *
- * @return string
- */
- protected function getFieldPrefix() {
- return 'page_';
- }
-}
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
deleted file mode 100644
index f65642b8..00000000
--- a/tests/phpunit/includes/db/TestORMRowTest.php
+++ /dev/null
@@ -1,215 +0,0 @@
-<?php
-
-/**
- * Tests for the TestORMRow class.
- * TestORMRow is a dummy class to be able to test the abstract ORMRow class.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.20
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-require_once __DIR__ . "/ORMRowTest.php";
-
-class TestORMRowTest extends ORMRowTest {
-
- /**
- * @since 1.20
- * @return string
- */
- protected function getRowClass() {
- return 'TestORMRow';
- }
-
- /**
- * @since 1.20
- * @return IORMTable
- */
- protected function getTableInstance() {
- return TestORMTable::singleton();
- }
-
- protected function setUp() {
- parent::setUp();
-
- $dbw = wfGetDB( DB_MASTER );
-
- $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
- $isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
-
- $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
- $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
-
- if ( $isPostgres ) {
- $dbw->query(
- 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
- test_id serial PRIMARY KEY,
- test_name TEXT NOT NULL DEFAULT '',
- test_age INTEGER NOT NULL DEFAULT 0,
- test_height REAL NOT NULL DEFAULT 0,
- test_awesome INTEGER NOT NULL DEFAULT 0,
- test_stuff BYTEA,
- test_moarstuff BYTEA,
- test_time TIMESTAMPTZ
- );",
- __METHOD__
- );
- } else {
- $dbw->query(
- 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
- test_id ' . $idField . ' NOT NULL ' . $primaryKey . ',
- test_name VARCHAR(255) NOT NULL,
- test_age TINYINT unsigned NOT NULL,
- test_height FLOAT NOT NULL,
- test_awesome TINYINT unsigned NOT NULL,
- test_stuff BLOB NOT NULL,
- test_moarstuff BLOB NOT NULL,
- test_time varbinary(14) NOT NULL
- );',
- __METHOD__
- );
- }
- }
-
- protected function tearDown() {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->dropTable( 'orm_test', __METHOD__ );
-
- parent::tearDown();
- }
-
- public function constructorTestProvider() {
- $dbw = wfGetDB( DB_MASTER );
- return array(
- array(
- array(
- 'name' => 'Foobar',
- 'time' => $dbw->timestamp( '20120101020202' ),
- 'age' => 42,
- 'height' => 9000.1,
- 'awesome' => true,
- 'stuff' => array( 13, 11, 7, 5, 3, 2 ),
- 'moarstuff' => (object)array( 'foo' => 'bar', 'bar' => array( 4, 2 ), 'baz' => true )
- ),
- true
- ),
- );
- }
-
- /**
- * @since 1.21
- * @return array
- */
- protected function getMockValues() {
- return array(
- 'id' => 1,
- 'str' => 'foobar4645645',
- 'int' => 42,
- 'float' => 4.2,
- 'bool' => '',
- 'array' => array( 42, 'foobar' ),
- 'blob' => new stdClass()
- );
- }
-}
-
-class TestORMRow extends ORMRow {
-}
-
-class TestORMTable extends ORMTable {
-
- /**
- * Returns the name of the database table objects of this type are stored in.
- *
- * @since 1.20
- *
- * @return string
- */
- public function getName() {
- return 'orm_test';
- }
-
- /**
- * Returns the name of a IORMRow implementing class that
- * represents single rows in this table.
- *
- * @since 1.20
- *
- * @return string
- */
- public function getRowClass() {
- return 'TestORMRow';
- }
-
- /**
- * Returns an array with the fields and their types this object contains.
- * This corresponds directly to the fields in the database, without prefix.
- *
- * field name => type
- *
- * Allowed types:
- * * id
- * * str
- * * int
- * * float
- * * bool
- * * array
- * * blob
- *
- * @since 1.20
- *
- * @return array
- */
- public function getFields() {
- return array(
- 'id' => 'id',
- 'name' => 'str',
- 'age' => 'int',
- 'height' => 'float',
- 'awesome' => 'bool',
- 'stuff' => 'array',
- 'moarstuff' => 'blob',
- 'time' => 'str', // TS_MW
- );
- }
-
- /**
- * Gets the db field prefix.
- *
- * @since 1.20
- *
- * @return string
- */
- protected function getFieldPrefix() {
- return 'test_';
- }
-}