2016-09-17 04:39:57 +00:00
|
|
|
<?php
|
|
|
|
|
|
2017-02-06 22:32:49 +00:00
|
|
|
use Wikimedia\Rdbms\DatabaseDomain;
|
|
|
|
|
|
2016-09-17 04:39:57 +00:00
|
|
|
/**
|
2017-02-06 22:32:49 +00:00
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain
|
2016-09-17 04:39:57 +00:00
|
|
|
*/
|
2018-02-17 12:29:13 +00:00
|
|
|
class DatabaseDomainTest extends PHPUnit\Framework\TestCase {
|
2017-12-29 23:22:37 +00:00
|
|
|
|
|
|
|
|
use MediaWikiCoversValidator;
|
|
|
|
|
|
2016-09-17 04:39:57 +00:00
|
|
|
public static function provideConstruct() {
|
|
|
|
|
return [
|
2017-07-22 03:05:48 +00:00
|
|
|
'All strings' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo', 'bar', 'baz_', 'foo-bar-baz_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'Nothing' =>
|
|
|
|
|
[ null, null, '', '' ],
|
|
|
|
|
'Invalid $database' =>
|
|
|
|
|
[ 0, 'bar', '', '', true ],
|
|
|
|
|
'Invalid $schema' =>
|
|
|
|
|
[ 'foo', 0, '', '', true ],
|
|
|
|
|
'Invalid $prefix' =>
|
|
|
|
|
[ 'foo', 'bar', 0, '', true ],
|
|
|
|
|
'Dash' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar', 'baz', 'baa_', 'foo?hbar-baz-baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'Question mark' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo?bar', 'baz', 'baa_', 'foo??bar-baz-baa_' ],
|
2016-09-17 04:39:57 +00:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideConstruct
|
|
|
|
|
*/
|
|
|
|
|
public function testConstruct( $db, $schema, $prefix, $id, $exception = false ) {
|
|
|
|
|
if ( $exception ) {
|
2019-10-03 22:20:49 +00:00
|
|
|
$this->expectException( InvalidArgumentException::class );
|
2017-07-22 03:05:48 +00:00
|
|
|
new DatabaseDomain( $db, $schema, $prefix );
|
|
|
|
|
return;
|
2016-09-17 04:39:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$domain = new DatabaseDomain( $db, $schema, $prefix );
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $domain );
|
|
|
|
|
$this->assertEquals( $db, $domain->getDatabase() );
|
|
|
|
|
$this->assertEquals( $schema, $domain->getSchema() );
|
|
|
|
|
$this->assertEquals( $prefix, $domain->getTablePrefix() );
|
|
|
|
|
$this->assertEquals( $id, $domain->getId() );
|
2017-07-22 03:05:48 +00:00
|
|
|
$this->assertEquals( $id, strval( $domain ), 'toString' );
|
2016-09-17 04:39:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideNewFromId() {
|
|
|
|
|
return [
|
2017-07-22 03:05:48 +00:00
|
|
|
'Basic' =>
|
|
|
|
|
[ 'foo', 'foo', null, '' ],
|
|
|
|
|
'db+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar_', 'foo', null, 'bar_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'db+schema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar-baz_', 'foo', 'bar', 'baz_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'?h -> -' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo?hbar-baz-baa_', 'foo-bar', 'baz', 'baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'?? -> ?' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo??bar-baz-baa_', 'foo?bar', 'baz', 'baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'? is left alone' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo?bar-baz-baa_', 'foo?bar', 'baz', 'baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'too many parts' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar-baz-baa_', '', '', '', true ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'from instance' =>
|
|
|
|
|
[ DatabaseDomain::newUnspecified(), null, null, '' ],
|
2016-09-17 04:39:57 +00:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideNewFromId
|
|
|
|
|
*/
|
|
|
|
|
public function testNewFromId( $id, $db, $schema, $prefix, $exception = false ) {
|
|
|
|
|
if ( $exception ) {
|
2019-10-03 22:20:49 +00:00
|
|
|
$this->expectException( InvalidArgumentException::class );
|
2017-07-22 03:05:48 +00:00
|
|
|
DatabaseDomain::newFromId( $id );
|
|
|
|
|
return;
|
2016-09-17 04:39:57 +00:00
|
|
|
}
|
|
|
|
|
$domain = DatabaseDomain::newFromId( $id );
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $domain );
|
|
|
|
|
$this->assertEquals( $db, $domain->getDatabase() );
|
|
|
|
|
$this->assertEquals( $schema, $domain->getSchema() );
|
|
|
|
|
$this->assertEquals( $prefix, $domain->getTablePrefix() );
|
|
|
|
|
}
|
2017-07-22 03:05:48 +00:00
|
|
|
|
|
|
|
|
public static function provideEquals() {
|
|
|
|
|
return [
|
|
|
|
|
'Basic' =>
|
|
|
|
|
[ 'foo', 'foo', null, '' ],
|
|
|
|
|
'db+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar_', 'foo', null, 'bar_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'db+schema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar-baz_', 'foo', 'bar', 'baz_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'?h -> -' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo?hbar-baz-baa_', 'foo-bar', 'baz', 'baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'?? -> ?' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo??bar-baz-baa_', 'foo?bar', 'baz', 'baa_' ],
|
2017-07-22 03:05:48 +00:00
|
|
|
'Nothing' =>
|
|
|
|
|
[ '', null, null, '' ],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideEquals
|
|
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain::equals
|
|
|
|
|
*/
|
|
|
|
|
public function testEquals( $id, $db, $schema, $prefix ) {
|
|
|
|
|
$fromId = DatabaseDomain::newFromId( $id );
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $fromId );
|
|
|
|
|
|
|
|
|
|
$constructed = new DatabaseDomain( $db, $schema, $prefix );
|
|
|
|
|
|
|
|
|
|
$this->assertTrue( $constructed->equals( $id ), 'constructed equals string' );
|
|
|
|
|
$this->assertTrue( $fromId->equals( $id ), 'fromId equals string' );
|
|
|
|
|
|
|
|
|
|
$this->assertTrue( $constructed->equals( $fromId ), 'compare constructed to newId' );
|
|
|
|
|
$this->assertTrue( $fromId->equals( $constructed ), 'compare newId to constructed' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain::newUnspecified
|
|
|
|
|
*/
|
|
|
|
|
public function testNewUnspecified() {
|
|
|
|
|
$domain = DatabaseDomain::newUnspecified();
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $domain );
|
|
|
|
|
$this->assertTrue( $domain->equals( '' ) );
|
|
|
|
|
$this->assertSame( null, $domain->getDatabase() );
|
|
|
|
|
$this->assertSame( null, $domain->getSchema() );
|
|
|
|
|
$this->assertSame( '', $domain->getTablePrefix() );
|
|
|
|
|
}
|
2018-10-13 16:14:20 +00:00
|
|
|
|
|
|
|
|
public static function provideIsCompatible() {
|
|
|
|
|
return [
|
|
|
|
|
'Basic' =>
|
|
|
|
|
[ 'foo', 'foo', null, '', true ],
|
|
|
|
|
'db+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar_', 'foo', null, 'bar_', true ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'db+schema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar-baz_', 'foo', 'bar', 'baz_', true ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'db+dontcare_schema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo-bar-baz_', 'foo', null, 'baz_', false ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'?h -> -' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo?hbar-baz-baa_', 'foo-bar', 'baz', 'baa_', true ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'?? -> ?' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'foo??bar-baz-baa_', 'foo?bar', 'baz', 'baa_', true ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'Nothing' =>
|
|
|
|
|
[ '', null, null, '', true ],
|
|
|
|
|
'dontcaredb+dontcaredbschema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'mywiki-mediawiki-prefix_', null, null, 'prefix_', false ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'db+dontcareschema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'mywiki-schema-prefix_', 'mywiki', null, 'prefix_', false ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'postgres-db-jobqueue' =>
|
|
|
|
|
[ 'postgres-mediawiki-', 'postgres', null, '', false ]
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideIsCompatible
|
|
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain::isCompatible
|
|
|
|
|
*/
|
|
|
|
|
public function testIsCompatible( $id, $db, $schema, $prefix, $transitive ) {
|
|
|
|
|
$compareIdObj = DatabaseDomain::newFromId( $id );
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $compareIdObj );
|
|
|
|
|
|
|
|
|
|
$fromId = new DatabaseDomain( $db, $schema, $prefix );
|
|
|
|
|
|
|
|
|
|
$this->assertTrue( $fromId->isCompatible( $id ), 'constructed equals string' );
|
|
|
|
|
$this->assertTrue( $fromId->isCompatible( $compareIdObj ), 'fromId equals string' );
|
|
|
|
|
|
|
|
|
|
$this->assertEquals( $transitive, $compareIdObj->isCompatible( $fromId ),
|
|
|
|
|
'test transitivity of nulls components' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function provideIsCompatible2() {
|
|
|
|
|
return [
|
|
|
|
|
'db+schema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'mywiki-schema-prefix_', 'thatwiki', 'schema', 'prefix_' ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'dontcaredb+dontcaredbschema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'thatwiki-mediawiki-otherprefix_', null, null, 'prefix_' ],
|
2018-10-13 16:14:20 +00:00
|
|
|
'db+dontcareschema+prefix' =>
|
2019-03-25 14:51:45 +00:00
|
|
|
[ 'notmywiki-schema-prefix_', 'mywiki', null, 'prefix_' ],
|
2018-10-13 16:14:20 +00:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @dataProvider provideIsCompatible2
|
|
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain::isCompatible
|
|
|
|
|
*/
|
|
|
|
|
public function testIsCompatible2( $id, $db, $schema, $prefix ) {
|
|
|
|
|
$compareIdObj = DatabaseDomain::newFromId( $id );
|
|
|
|
|
$this->assertInstanceOf( DatabaseDomain::class, $compareIdObj );
|
|
|
|
|
|
|
|
|
|
$fromId = new DatabaseDomain( $db, $schema, $prefix );
|
|
|
|
|
|
|
|
|
|
$this->assertFalse( $fromId->isCompatible( $id ), 'constructed equals string' );
|
|
|
|
|
$this->assertFalse( $fromId->isCompatible( $compareIdObj ), 'fromId equals string' );
|
|
|
|
|
}
|
|
|
|
|
|
2019-03-28 23:04:59 +00:00
|
|
|
public function testSchemaWithNoDB1() {
|
2019-10-11 22:22:26 +00:00
|
|
|
$this->expectException( InvalidArgumentException::class );
|
2019-03-28 23:04:59 +00:00
|
|
|
new DatabaseDomain( null, 'schema', '' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testSchemaWithNoDB2() {
|
2019-10-11 22:22:26 +00:00
|
|
|
$this->expectException( InvalidArgumentException::class );
|
2019-03-28 23:04:59 +00:00
|
|
|
DatabaseDomain::newFromId( '-schema-prefix' );
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-13 16:14:20 +00:00
|
|
|
/**
|
|
|
|
|
* @covers Wikimedia\Rdbms\DatabaseDomain::isUnspecified
|
|
|
|
|
*/
|
|
|
|
|
public function testIsUnspecified() {
|
|
|
|
|
$domain = new DatabaseDomain( null, null, '' );
|
|
|
|
|
$this->assertTrue( $domain->isUnspecified() );
|
|
|
|
|
$domain = new DatabaseDomain( 'mywiki', null, '' );
|
|
|
|
|
$this->assertFalse( $domain->isUnspecified() );
|
|
|
|
|
$domain = new DatabaseDomain( 'mywiki', null, '' );
|
|
|
|
|
$this->assertFalse( $domain->isUnspecified() );
|
|
|
|
|
}
|
2016-09-17 04:39:57 +00:00
|
|
|
}
|