2018-03-03 03:56:39 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
|
|
|
use Wikimedia\Rdbms\IDatabase;
|
|
|
|
|
|
|
|
|
|
class DatabaseLogEntryTest extends MediaWikiTestCase {
|
|
|
|
|
public function setUp() {
|
|
|
|
|
parent::setUp();
|
|
|
|
|
|
|
|
|
|
// These services cache their joins
|
|
|
|
|
MediaWikiServices::getInstance()->resetServiceForTesting( 'CommentStore' );
|
|
|
|
|
MediaWikiServices::getInstance()->resetServiceForTesting( 'ActorMigration' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function tearDown() {
|
|
|
|
|
parent::tearDown();
|
|
|
|
|
|
|
|
|
|
MediaWikiServices::getInstance()->resetServiceForTesting( 'CommentStore' );
|
|
|
|
|
MediaWikiServices::getInstance()->resetServiceForTesting( 'ActorMigration' );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @covers DatabaseLogEntry::newFromId
|
|
|
|
|
* @covers DatabaseLogEntry::getSelectQueryData
|
|
|
|
|
*
|
|
|
|
|
* @dataProvider provideNewFromId
|
|
|
|
|
*
|
|
|
|
|
* @param int $id
|
|
|
|
|
* @param array $selectFields
|
|
|
|
|
* @param string[]|null $row
|
|
|
|
|
* @param string[]|null $expectedFields
|
2018-09-18 18:21:20 +00:00
|
|
|
* @param int $actorMigration
|
2018-03-03 03:56:39 +00:00
|
|
|
*/
|
|
|
|
|
public function testNewFromId( $id,
|
|
|
|
|
array $selectFields,
|
|
|
|
|
array $row = null,
|
|
|
|
|
array $expectedFields = null,
|
2018-09-18 18:21:20 +00:00
|
|
|
$actorMigration
|
2018-03-03 03:56:39 +00:00
|
|
|
) {
|
|
|
|
|
$this->setMwGlobals( [
|
2018-09-18 18:21:20 +00:00
|
|
|
'wgActorTableSchemaMigrationStage' => $actorMigration,
|
2018-03-03 03:56:39 +00:00
|
|
|
] );
|
|
|
|
|
|
|
|
|
|
$row = $row ? (object)$row : null;
|
|
|
|
|
$db = $this->getMock( IDatabase::class );
|
|
|
|
|
$db->expects( self::once() )
|
|
|
|
|
->method( 'selectRow' )
|
|
|
|
|
->with( $selectFields['tables'],
|
|
|
|
|
$selectFields['fields'],
|
|
|
|
|
$selectFields['conds'],
|
|
|
|
|
'DatabaseLogEntry::newFromId',
|
|
|
|
|
$selectFields['options'],
|
|
|
|
|
$selectFields['join_conds']
|
|
|
|
|
)
|
|
|
|
|
->will( self::returnValue( $row ) );
|
|
|
|
|
|
|
|
|
|
/** @var IDatabase $db */
|
|
|
|
|
$logEntry = DatabaseLogEntry::newFromId( $id, $db );
|
|
|
|
|
|
|
|
|
|
if ( !$expectedFields ) {
|
|
|
|
|
self::assertNull( $logEntry, "Expected no log entry returned for id=$id" );
|
|
|
|
|
} else {
|
|
|
|
|
self::assertEquals( $id, $logEntry->getId() );
|
|
|
|
|
self::assertEquals( $expectedFields['type'], $logEntry->getType() );
|
|
|
|
|
self::assertEquals( $expectedFields['comment'], $logEntry->getComment() );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function provideNewFromId() {
|
|
|
|
|
$oldTables = [
|
2019-01-04 18:55:11 +00:00
|
|
|
'tables' => [
|
|
|
|
|
'logging', 'user',
|
|
|
|
|
'comment_log_comment' => 'comment',
|
|
|
|
|
],
|
2018-03-03 03:56:39 +00:00
|
|
|
'fields' => [
|
|
|
|
|
'log_id',
|
|
|
|
|
'log_type',
|
|
|
|
|
'log_action',
|
|
|
|
|
'log_timestamp',
|
|
|
|
|
'log_namespace',
|
|
|
|
|
'log_title',
|
|
|
|
|
'log_params',
|
|
|
|
|
'log_deleted',
|
|
|
|
|
'user_id',
|
|
|
|
|
'user_name',
|
|
|
|
|
'user_editcount',
|
2019-01-04 18:55:11 +00:00
|
|
|
'log_comment_text' => 'comment_log_comment.comment_text',
|
|
|
|
|
'log_comment_data' => 'comment_log_comment.comment_data',
|
|
|
|
|
'log_comment_cid' => 'comment_log_comment.comment_id',
|
2018-03-03 03:56:39 +00:00
|
|
|
'log_user' => 'log_user',
|
|
|
|
|
'log_user_text' => 'log_user_text',
|
|
|
|
|
'log_actor' => 'NULL',
|
|
|
|
|
],
|
|
|
|
|
'options' => [],
|
2019-01-04 18:55:11 +00:00
|
|
|
'join_conds' => [
|
|
|
|
|
'user' => [ 'LEFT JOIN', 'user_id=log_user' ],
|
|
|
|
|
'comment_log_comment' => [ 'JOIN', 'comment_log_comment.comment_id = log_comment_id' ],
|
|
|
|
|
],
|
2018-03-03 03:56:39 +00:00
|
|
|
];
|
|
|
|
|
$newTables = [
|
|
|
|
|
'tables' => [
|
|
|
|
|
'logging',
|
|
|
|
|
'user',
|
|
|
|
|
'comment_log_comment' => 'comment',
|
|
|
|
|
'actor_log_user' => 'actor'
|
|
|
|
|
],
|
|
|
|
|
'fields' => [
|
|
|
|
|
'log_id',
|
|
|
|
|
'log_type',
|
|
|
|
|
'log_action',
|
|
|
|
|
'log_timestamp',
|
|
|
|
|
'log_namespace',
|
|
|
|
|
'log_title',
|
|
|
|
|
'log_params',
|
|
|
|
|
'log_deleted',
|
|
|
|
|
'user_id',
|
|
|
|
|
'user_name',
|
|
|
|
|
'user_editcount',
|
|
|
|
|
'log_comment_text' => 'comment_log_comment.comment_text',
|
|
|
|
|
'log_comment_data' => 'comment_log_comment.comment_data',
|
|
|
|
|
'log_comment_cid' => 'comment_log_comment.comment_id',
|
|
|
|
|
'log_user' => 'actor_log_user.actor_user',
|
|
|
|
|
'log_user_text' => 'actor_log_user.actor_name',
|
|
|
|
|
'log_actor' => 'log_actor',
|
|
|
|
|
],
|
|
|
|
|
'options' => [],
|
|
|
|
|
'join_conds' => [
|
|
|
|
|
'user' => [ 'LEFT JOIN', 'user_id=actor_log_user.actor_user' ],
|
|
|
|
|
'comment_log_comment' => [ 'JOIN', 'comment_log_comment.comment_id = log_comment_id' ],
|
|
|
|
|
'actor_log_user' => [ 'JOIN', 'actor_log_user.actor_id = log_actor' ],
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
return [
|
|
|
|
|
[
|
|
|
|
|
0,
|
|
|
|
|
$oldTables + [ 'conds' => [ 'log_id' => 0 ] ],
|
|
|
|
|
null,
|
|
|
|
|
null,
|
2018-09-18 18:21:20 +00:00
|
|
|
SCHEMA_COMPAT_OLD,
|
2018-03-03 03:56:39 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
123,
|
|
|
|
|
$oldTables + [ 'conds' => [ 'log_id' => 123 ] ],
|
|
|
|
|
[
|
|
|
|
|
'log_id' => 123,
|
|
|
|
|
'log_type' => 'foobarize',
|
|
|
|
|
'log_comment_text' => 'test!',
|
|
|
|
|
'log_comment_data' => null,
|
|
|
|
|
],
|
|
|
|
|
[ 'type' => 'foobarize', 'comment' => 'test!' ],
|
2018-09-18 18:21:20 +00:00
|
|
|
SCHEMA_COMPAT_OLD,
|
2018-03-03 03:56:39 +00:00
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
567,
|
|
|
|
|
$newTables + [ 'conds' => [ 'log_id' => 567 ] ],
|
|
|
|
|
[
|
|
|
|
|
'log_id' => 567,
|
|
|
|
|
'log_type' => 'foobarize',
|
|
|
|
|
'log_comment_text' => 'test!',
|
|
|
|
|
'log_comment_data' => null,
|
|
|
|
|
],
|
|
|
|
|
[ 'type' => 'foobarize', 'comment' => 'test!' ],
|
2018-09-18 18:21:20 +00:00
|
|
|
SCHEMA_COMPAT_NEW,
|
2018-03-03 03:56:39 +00:00
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|