The first of many changes decoupling SQL building blocks from Database class. Bug: T299691 Depends-On: I5d1d5b9b875bced7bda234f45d6d22ed59db4871 Change-Id: I784e78361f5ee629d31c68629d669ee0ddddf929
146 lines
3.5 KiB
PHP
146 lines
3.5 KiB
PHP
<?php
|
|
|
|
use MediaWiki\Tests\Unit\Libs\Rdbms\AddQuoterMock;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use Wikimedia\Rdbms\DatabaseSqlite;
|
|
use Wikimedia\Rdbms\Platform\SqlitePlatform;
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
/**
|
|
* DatabaseSqliteTest is already defined in mediawiki core hence the 'Rdbms' included in this
|
|
* class name.
|
|
* The test in core should have mediawiki specific stuff removed and the tests moved to this
|
|
* rdbms libs test.
|
|
*/
|
|
class DatabaseSqliteRdbmsTest extends PHPUnit\Framework\TestCase {
|
|
|
|
use MediaWikiCoversValidator;
|
|
|
|
/**
|
|
* @return MockObject|DatabaseSqlite
|
|
*/
|
|
private function getMockDb() {
|
|
$db = $this->getMockBuilder( DatabaseSqlite::class )
|
|
->disableOriginalConstructor()
|
|
->onlyMethods( [ 'open', 'query', 'addQuotes' ] )
|
|
->getMock();
|
|
|
|
$db->method( 'addQuotes' )->willReturnCallback(
|
|
static function ( $s ) {
|
|
return "'$s'";
|
|
}
|
|
);
|
|
$wdb = TestingAccessWrapper::newFromObject( $db );
|
|
$wdb->platform = new SqlitePlatform( new AddQuoterMock() );
|
|
|
|
return $wdb;
|
|
}
|
|
|
|
public function provideBuildSubstring() {
|
|
yield [ 'someField', 1, 2, 'SUBSTR(someField,1,2)' ];
|
|
yield [ 'someField', 1, null, 'SUBSTR(someField,1)' ];
|
|
}
|
|
|
|
/**
|
|
* @covers Wikimedia\Rdbms\DatabaseSqlite::buildSubstring
|
|
* @dataProvider provideBuildSubstring
|
|
*/
|
|
public function testBuildSubstring( $input, $start, $length, $expected ) {
|
|
$dbMock = $this->getMockDb();
|
|
$output = $dbMock->buildSubstring( $input, $start, $length );
|
|
$this->assertSame( $expected, $output );
|
|
}
|
|
|
|
public function provideBuildSubstring_invalidParams() {
|
|
yield [ -1, 1 ];
|
|
yield [ 1, -1 ];
|
|
yield [ 1, 'foo' ];
|
|
yield [ 'foo', 1 ];
|
|
yield [ null, 1 ];
|
|
yield [ 0, 1 ];
|
|
}
|
|
|
|
/**
|
|
* @covers Wikimedia\Rdbms\DatabaseSqlite::buildSubstring
|
|
* @dataProvider provideBuildSubstring_invalidParams
|
|
*/
|
|
public function testBuildSubstring_invalidParams( $start, $length ) {
|
|
$dbMock = $this->getMockDb();
|
|
$this->expectException( InvalidArgumentException::class );
|
|
$dbMock->buildSubstring( 'foo', $start, $length );
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideGreatest
|
|
* @covers Wikimedia\Rdbms\DatabaseSqlite::buildGreatest
|
|
*/
|
|
public function testBuildGreatest( $fields, $values, $sqlText ) {
|
|
$dbMock = $this->getMockDb();
|
|
$this->assertEquals(
|
|
$sqlText,
|
|
trim( $dbMock->buildGreatest( $fields, $values ) )
|
|
);
|
|
}
|
|
|
|
public static function provideGreatest() {
|
|
return [
|
|
[
|
|
'field',
|
|
'value',
|
|
"MAX(\"field\",'value')"
|
|
],
|
|
[
|
|
[ 'field' ],
|
|
[ 'value' ],
|
|
"MAX(\"field\",'value')"
|
|
],
|
|
[
|
|
[ 'field', 'field2' ],
|
|
[ 'value', 'value2', 3, 7.6 ],
|
|
"MAX(\"field\",\"field2\",'value','value2',3,7.6)"
|
|
],
|
|
[
|
|
[ 'field', 'a' => "\"field2\"+1" ],
|
|
[ 'value', 'value2', 3, 7.6 ],
|
|
"MAX(\"field\",\"field2\"+1,'value','value2',3,7.6)"
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideLeast
|
|
* @covers Wikimedia\Rdbms\DatabaseSqlite::buildLeast
|
|
*/
|
|
public function testBuildLeast( $fields, $values, $sqlText ) {
|
|
$dbMock = $this->getMockDb();
|
|
$this->assertEquals(
|
|
$sqlText,
|
|
trim( $dbMock->buildLeast( $fields, $values ) )
|
|
);
|
|
}
|
|
|
|
public static function provideLeast() {
|
|
return [
|
|
[
|
|
'field',
|
|
'value',
|
|
"MIN(\"field\",'value')"
|
|
],
|
|
[
|
|
[ 'field' ],
|
|
[ 'value' ],
|
|
"MIN(\"field\",'value')"
|
|
],
|
|
[
|
|
[ 'field', 'field2' ],
|
|
[ 'value', 'value2', 3, 7.6 ],
|
|
"MIN(\"field\",\"field2\",'value','value2',3,7.6)"
|
|
],
|
|
[
|
|
[ 'field', 'a' => "\"field2\"+1" ],
|
|
[ 'value', 'value2', 3, 7.6 ],
|
|
"MIN(\"field\",\"field2\"+1,'value','value2',3,7.6)"
|
|
],
|
|
];
|
|
}
|
|
}
|