7 use InvalidArgumentException;
20 use Wikimedia\TestingAccessWrapper;
41 $WANObjectCache =
null
64 ->disableOriginalConstructor()->getMock();
72 ->disableOriginalConstructor()->getMock();
80 ->disableOriginalConstructor()->getMock();
88 ->disableOriginalConstructor()->getMock();
117 if ( $expectedFail ) {
128 $nameTables->getContentModels(),
129 $nameTables->getSlotRoles(),
135 $this->assertSame( $contentHandlerDb, $store->getContentHandlerUseDB() );
141 $this->
setService(
'DBLoadBalancer', $mockLoadBalancer );
145 $mockLoadBalancer->expects( $this->atLeastOnce() )
146 ->method(
'getConnection' )
150 $db->expects( $this->at( 0 ) )
151 ->method(
'selectRow' )
157 ->willReturn( (
object)[
158 'page_namespace' =>
'1',
159 'page_title' =>
'Food',
163 $title = $store->getTitle( 1, 2, RevisionStore::READ_NORMAL );
165 $this->assertSame( 1,
$title->getNamespace() );
166 $this->assertSame(
'Food',
$title->getDBkey() );
172 $this->
setService(
'DBLoadBalancer', $mockLoadBalancer );
177 $mockLoadBalancer->expects( $this->exactly( 2 ) )
178 ->method(
'getConnection' )
181 $mockLoadBalancer->expects( $this->atLeastOnce() )
182 ->method(
'getConnectionRef' )
186 $db->expects( $this->at( 0 ) )
187 ->method(
'selectRow' )
193 ->willReturn(
false );
196 $db->expects( $this->at( 1 ) )
197 ->method(
'selectRow' )
199 [
'revision',
'page' ],
203 ->willReturn(
false );
206 $db->expects( $this->at( 2 ) )
207 ->method(
'selectRow' )
213 ->willReturn( (
object)[
214 'page_namespace' =>
'2',
215 'page_title' =>
'Foodey',
219 $title = $store->getTitle( 1, 2, RevisionStore::READ_NORMAL );
221 $this->assertSame( 2,
$title->getNamespace() );
222 $this->assertSame(
'Foodey',
$title->getDBkey() );
228 $this->
setService(
'DBLoadBalancer', $mockLoadBalancer );
232 $mockLoadBalancer->expects( $this->atLeastOnce() )
233 ->method(
'getConnection' )
236 $mockLoadBalancer->expects( $this->atLeastOnce() )
237 ->method(
'getConnectionRef' )
241 $db->expects( $this->at( 0 ) )
242 ->method(
'selectRow' )
248 ->willReturn(
false );
251 $db->expects( $this->at( 1 ) )
252 ->method(
'selectRow' )
254 [
'revision',
'page' ],
258 ->willReturn( (
object)[
259 'page_namespace' =>
'1',
260 'page_title' =>
'Food2',
264 $title = $store->getTitle( 1, 2, RevisionStore::READ_NORMAL );
266 $this->assertSame( 1,
$title->getNamespace() );
267 $this->assertSame(
'Food2',
$title->getDBkey() );
273 $this->
setService(
'DBLoadBalancer', $mockLoadBalancer );
278 $mockLoadBalancer->expects( $this->exactly( 2 ) )
279 ->method(
'getConnection' )
282 $mockLoadBalancer->expects( $this->atLeastOnce() )
283 ->method(
'getConnectionRef' )
287 $db->expects( $this->at( 0 ) )
288 ->method(
'selectRow' )
294 ->willReturn(
false );
297 $db->expects( $this->at( 1 ) )
298 ->method(
'selectRow' )
300 [
'revision',
'page' ],
304 ->willReturn(
false );
307 $db->expects( $this->at( 2 ) )
308 ->method(
'selectRow' )
314 ->willReturn(
false );
317 $db->expects( $this->at( 3 ) )
318 ->method(
'selectRow' )
320 [
'revision',
'page' ],
324 ->willReturn( (
object)[
325 'page_namespace' =>
'2',
326 'page_title' =>
'Foodey',
330 $title = $store->getTitle( 1, 2, RevisionStore::READ_NORMAL );
332 $this->assertSame( 2,
$title->getNamespace() );
333 $this->assertSame(
'Foodey',
$title->getDBkey() );
342 $this->
setService(
'DBLoadBalancer', $mockLoadBalancer );
350 foreach ( [
'getConnection',
'getConnectionRef' ]
as $method ) {
351 $mockLoadBalancer->expects( $this->exactly( 2 ) )
353 ->willReturnCallback(
function ( $masterOrReplica )
use (
$db ) {
354 static $callCounter = 0;
357 if ( $callCounter === 1 ) {
358 $this->assertSame(
DB_REPLICA, $masterOrReplica );
359 } elseif ( $callCounter === 2 ) {
360 $this->assertSame(
DB_MASTER, $masterOrReplica );
366 foreach ( [ 0, 2 ]
as $counter ) {
367 $db->expects( $this->at( $counter ) )
368 ->method(
'selectRow' )
374 ->willReturn(
false );
377 foreach ( [ 1, 3 ]
as $counter ) {
378 $db->expects( $this->at( $counter ) )
379 ->method(
'selectRow' )
381 [
'revision',
'page' ],
385 ->willReturn(
false );
391 $store->getTitle( 1, 2, RevisionStore::READ_NORMAL );
395 yield
'windows-1252, old_flags is empty' => [
400 'old_text' =>
"S\xF6me Content",
405 yield
'windows-1252, old_flags is null' => [
410 'old_text' =>
"S\xF6me Content",
423 $this->markTestSkipped(
'No longer applicable with MCR schema' );
434 $record = $store->newRevisionFromRow(
440 $this->assertSame( $text, $record->getContent(
SlotRecord::MAIN )->serialize() );
448 $this->markTestSkipped(
'No longer applicable with MCR schema' );
452 'old_flags' =>
'utf-8',
453 'old_text' =>
'Söme Content',
464 $record = $store->newRevisionFromRow(
469 $this->assertSame(
'Söme Content', $record->getContent(
SlotRecord::MAIN )->serialize() );
476 'rev_timestamp' =>
'20110101000000',
477 'rev_user_text' =>
'Tester',
479 'rev_minor_edit' => 0,
482 'rev_parent_id' => 0,
483 'rev_sha1' =>
'deadbeef',
484 'rev_comment_text' =>
'Testing',
485 'rev_comment_data' =>
'{}',
486 'rev_comment_cid' => 111,
487 'page_namespace' => 0,
488 'page_title' =>
'TEST',
491 'page_is_redirect' => 0,
493 'user_name' =>
'Tester',
502 'old_text' =>
'Hello World',
503 'old_flags' =>
'utf-8',
506 if ( !isset( $row[
'content'] ) && isset( $array[
'old_text'] ) ) {
533 if ( $expectException ) {
541 $nameTables =
$services->getNameTableStoreFactory();
542 $contentModelStore = $nameTables->getContentModels();
543 $slotRoleStore = $nameTables->getSlotRoles();
549 $nameTables->getContentModels(),
550 $nameTables->getSlotRoles(),
554 if ( !$expectException ) {
555 $store = TestingAccessWrapper::newFromObject( $store );
556 $this->assertSame( $loadBalancer, $store->loadBalancer );
557 $this->assertSame( $blobStore, $store->blobStore );
558 $this->assertSame(
$cache, $store->cache );
559 $this->assertSame( $commentStore, $store->commentStore );
560 $this->assertSame( $contentModelStore, $store->contentModelStore );
561 $this->assertSame( $slotRoleStore, $store->slotRoleStore );
562 $this->assertSame( $migration, $store->mcrMigrationStage );