8 use InvalidArgumentException;
39 $this->tablesUsed[] =
'archive';
40 $this->tablesUsed[] =
'page';
41 $this->tablesUsed[] =
'revision';
42 $this->tablesUsed[] =
'comment';
50 ->setMethods( [
'reallyOpenConnection' ] )
51 ->setConstructorArgs( [ [
'servers' => [ $server ] ] ] )
54 $lb->method(
'reallyOpenConnection' )->willReturnCallback(
55 function (
array $server, $dbNameOverride ) {
68 ->setMethods( [
'select',
'doQuery',
'open',
'closeConnection',
'isOpen' ] )
69 ->setConstructorArgs( [
$params ] )
73 $db->method(
'isOpen' )->willReturn(
true );
79 yield [
false,
'test',
'' ];
80 yield [
'test',
'test',
'' ];
82 yield [
false,
'test',
'foo_' ];
83 yield [
'test-foo_',
'test',
'foo_' ];
85 yield [
false,
'dash-test',
'' ];
86 yield [
'dash-test',
'dash-test',
'' ];
88 yield [
false,
'underscore_test',
'foo_' ];
89 yield [
'underscore_test-foo_',
'underscore_test',
'foo_' ];
99 'wgDBname' => $dbName,
100 'wgDBprefix' => $dbPrefix,
107 'dbDirectory' =>
'*dummy*',
109 'password' =>
'test',
118 'connLogger' =>
new \Psr\Log\NullLogger(),
119 'queryLogger' =>
new \Psr\Log\NullLogger(),
120 'errorLogger' =>
function () {
122 'deprecationLogger' =>
function () {
126 'tablePrefix' => $dbPrefix,
132 ->disableOriginalConstructor()
144 $count = $store->countRevisionsByPageId(
$db, 0 );
148 $this->assertSame( 0, $count );
159 $this->assertEquals( $r1->
getUser()->getName(), $r2->
getUser()->getName() );
160 $this->assertEquals( $r1->
getUser()->getId(), $r2->
getUser()->getId() );
217 if ( isset( $details[
'user'] ) && $details[
'user'] ===
true ) {
218 $details[
'user'] = $this->
getTestUser()->getUser();
220 if ( isset( $details[
'page'] ) && $details[
'page'] ===
true ) {
221 $details[
'page'] = $page->getId();
223 if ( isset( $details[
'parent'] ) && $details[
'parent'] ===
true ) {
224 $details[
'parent'] = $page->getLatest();
229 isset( $details[
'slot'] ) ?
$rev->setSlot( $details[
'slot'] ) :
null;
230 isset( $details[
'parent'] ) ?
$rev->setParentId( $details[
'parent'] ) :
null;
231 isset( $details[
'page'] ) ?
$rev->setPageId( $details[
'page'] ) :
null;
232 isset( $details[
'size'] ) ?
$rev->setSize( $details[
'size'] ) :
null;
233 isset( $details[
'sha1'] ) ?
$rev->setSha1( $details[
'sha1'] ) :
null;
234 isset( $details[
'comment'] ) ?
$rev->setComment( $details[
'comment'] ) :
null;
235 isset( $details[
'timestamp'] ) ?
$rev->setTimestamp( $details[
'timestamp'] ) :
null;
236 isset( $details[
'minor'] ) ?
$rev->setMinorEdit( $details[
'minor'] ) :
null;
237 isset( $details[
'user'] ) ?
$rev->setUser( $details[
'user'] ) :
null;
238 isset( $details[
'visibility'] ) ?
$rev->setVisibility( $details[
'visibility'] ) :
null;
239 isset( $details[
'id'] ) ?
$rev->setId( $details[
'id'] ) :
null;
249 yield
'Bare minimum revision insertion' => [
255 'timestamp' =>
'20171117010101',
259 yield
'Detailed revision insertion' => [
266 'timestamp' =>
'20171117010101',
298 'timestamp' =>
'20171117010101',
319 $firstReturn->getSlot(
'main' )->getAddress(),
320 $secondReturn->getSlot(
'main' )->getAddress()
323 $this->assertNotSame(
324 $firstReturn->getId(),
325 $secondReturn->getId()
334 'timestamp' =>
'20171117010101',
337 new InvalidArgumentException(
'At least one slot needs to be defined!' )
339 yield
'slot that is not main slot' => [
344 'timestamp' =>
'20171117010101',
347 new InvalidArgumentException(
'Only the main slot is supported for now!' )
349 yield
'no timestamp' => [
358 yield
'no comment' => [
362 'timestamp' =>
'20171117010101',
372 'timestamp' =>
'20171117010101',
384 array $revDetails = [],
385 Exception $exception ) {
390 $this->setExpectedException(
391 get_class( $exception ),
392 $exception->getMessage(),
393 $exception->getCode()
419 $parent = $store->getRevisionByTitle(
$title );
420 $record = $store->newNullRevision(
428 $this->assertEquals(
$title->getNamespace(), $record->getPageAsLinkTarget()->getNamespace() );
429 $this->assertEquals(
$title->getDBkey(), $record->getPageAsLinkTarget()->getDBkey() );
430 $this->assertEquals( $comment, $record->getComment() );
431 $this->assertEquals( $minor, $record->isMinor() );
432 $this->assertEquals(
$user->getName(), $record->getUser()->getName() );
433 $this->assertEquals( $parent->getId(), $record->getParentId() );
435 $parentSlot = $parent->getSlot(
'main' );
436 $slot = $record->getSlot(
'main' );
438 $this->assertTrue( $slot->isInherited(),
'isInherited' );
439 $this->assertSame( $parentSlot->getOrigin(), $slot->getOrigin(),
'getOrigin' );
440 $this->assertSame( $parentSlot->getAddress(), $slot->getAddress(),
'getAddress' );
448 $record = $store->newNullRevision(
455 $this->assertNull( $record );
468 $revisionRecord = $store->getRevisionById(
$rev->getId() );
469 $result = $store->getRcIdIfUnpatrolled( $revisionRecord );
471 $this->assertGreaterThan( 0,
$result );
473 $page->getRevision()->getRecentChange()->getAttribute(
'rc_id' ),
485 $status = $page->doEditContent(
496 $revisionRecord = $store->getRevisionById(
$rev->getId() );
497 $result = $store->getRcIdIfUnpatrolled( $revisionRecord );
499 $this->assertSame( 0,
$result );
508 $status = $page->doEditContent( $content, __METHOD__ );
513 $revRecord = $store->getRevisionById(
$rev->getId() );
514 $recentChange = $store->getRecentChange( $revRecord );
516 $this->assertEquals(
$rev->getId(), $recentChange->getAttribute(
'rc_this_oldid' ) );
517 $this->assertEquals(
$rev->getRecentChange(), $recentChange );
526 $status = $page->doEditContent( $content, __METHOD__ );
531 $revRecord = $store->getRevisionById(
$rev->getId() );
533 $this->assertSame(
$rev->getId(), $revRecord->getId() );
534 $this->assertTrue( $revRecord->getSlot(
'main' )->getContent()->equals( $content ) );
535 $this->assertSame( __METHOD__, $revRecord->getComment()->text );
544 $status = $page->doEditContent( $content, __METHOD__ );
549 $revRecord = $store->getRevisionByTitle( $page->getTitle() );
551 $this->assertSame(
$rev->getId(), $revRecord->getId() );
552 $this->assertTrue( $revRecord->getSlot(
'main' )->getContent()->equals( $content ) );
553 $this->assertSame( __METHOD__, $revRecord->getComment()->text );
562 $status = $page->doEditContent( $content, __METHOD__ );
567 $revRecord = $store->getRevisionByPageId( $page->getId() );
569 $this->assertSame(
$rev->getId(), $revRecord->getId() );
570 $this->assertTrue( $revRecord->getSlot(
'main' )->getContent()->equals( $content ) );
571 $this->assertSame( __METHOD__, $revRecord->getComment()->text );
584 $status = $page->doEditContent( $content, __METHOD__ );
589 $revRecord = $store->getRevisionByTimestamp(
594 $this->assertSame(
$rev->getId(), $revRecord->getId() );
595 $this->assertTrue( $revRecord->getSlot(
'main' )->getContent()->equals( $content ) );
596 $this->assertSame( __METHOD__, $revRecord->getComment()->text );
606 'rev_timestamp' => (
string)
$rev->getTimestamp(),
607 'rev_user_text' => (
string)
$rev->getUserText(),
609 'rev_minor_edit' =>
$rev->isMinor() ?
'1' :
'0',
610 'rev_deleted' => (
string)
$rev->getVisibility(),
612 'rev_parent_id' => (
string)
$rev->getParentId(),
614 'rev_comment_text' =>
$rev->getComment(),
615 'rev_comment_data' =>
null,
616 'rev_comment_cid' =>
null,
617 'rev_content_format' =>
$rev->getContentFormat(),
618 'rev_content_model' =>
$rev->getContentModel(),
619 'page_namespace' => (
string)$page->getTitle()->getNamespace(),
620 'page_title' => $page->getTitle()->getDBkey(),
621 'page_id' => (
string)$page->getId(),
622 'page_latest' => (
string)$page->getLatest(),
623 'page_is_redirect' => $page->isRedirect() ?
'1' :
'0',
624 'page_len' => (
string)$page->getContent()->getSize(),
633 $this->assertSame(
$rev->getId(), $record->
getId() );
636 $this->assertSame(
$rev->getUserText(), $record->
getUser()->getName() );
637 $this->assertSame(
$rev->getUser(), $record->
getUser()->getId() );
638 $this->assertSame(
$rev->isMinor(), $record->
isMinor() );
640 $this->assertSame(
$rev->getSize(), $record->
getSize() );
645 $expectedParent =
$rev->getParentId();
646 if ( $expectedParent ===
null ) {
649 $this->assertSame( $expectedParent, $record->
getParentId() );
650 $this->assertSame(
$rev->getSha1(), $record->
getSha1() );
651 $this->assertSame(
$rev->getComment(), $record->
getComment()->text );
652 $this->assertSame(
$rev->getContentFormat(), $record->
getContent(
'main' )->getDefaultFormat() );
653 $this->assertSame(
$rev->getContentModel(), $record->
getContent(
'main' )->getModel() );
666 $text = __METHOD__ .
'a-ä';
668 $rev = $page->doEditContent(
671 )->value[
'revision'];
674 $record = $store->newRevisionFromRow(
680 $this->assertSame( $text,
$rev->getContent()->serialize() );
688 $this->
setMwGlobals(
'wgLegacyEncoding',
'windows-1252' );
691 $text = __METHOD__ .
'a-ä';
693 $rev = $page->doEditContent(
696 )->value[
'revision'];
699 $record = $store->newRevisionFromRow(
705 $this->assertSame( $text,
$rev->getContent()->serialize() );
717 $text = __METHOD__ .
'b-ä';
719 $rev = $page->doEditContent(
725 )->value[
'revision'];
728 $record = $store->newRevisionFromRow(
734 $this->assertSame( $text,
$rev->getContent()->serialize() );
743 $text = __METHOD__ .
'-bä';
746 $orig = $page->doEditContent(
new WikitextContent( $text ), __METHOD__ )
748 $page->doDeleteArticle( __METHOD__ );
751 $arQuery = $store->getArchiveQueryInfo();
753 $arQuery[
'tables'], $arQuery[
'fields'], [
'ar_rev_id' => $orig->getId() ],
754 __METHOD__, [], $arQuery[
'joins']
756 $this->assertTrue( is_object(
$res ),
'query failed' );
758 $row =
$res->fetchObject();
760 $record = $store->newRevisionFromArchiveRow( $row );
763 $this->assertSame( $text, $record->getContent(
'main' )->serialize() );
770 $this->
setMwGlobals(
'wgLegacyEncoding',
'windows-1252' );
774 $text = __METHOD__ .
'-bä';
777 $orig = $page->doEditContent(
new WikitextContent( $text ), __METHOD__ )
779 $page->doDeleteArticle( __METHOD__ );
782 $arQuery = $store->getArchiveQueryInfo();
784 $arQuery[
'tables'], $arQuery[
'fields'], [
'ar_rev_id' => $orig->getId() ],
785 __METHOD__, [], $arQuery[
'joins']
787 $this->assertTrue( is_object(
$res ),
'query failed' );
789 $row =
$res->fetchObject();
791 $record = $store->newRevisionFromArchiveRow( $row );
794 $this->assertSame( $text, $record->getContent(
'main' )->serialize() );
849 $revOne = $page->doEditContent(
new WikitextContent( __METHOD__ ), __METHOD__ )
854 $revTwo = $page->doEditContent(
new WikitextContent( __METHOD__ .
'a' ),
'' )
863 $store->loadRevisionFromTimestamp(
866 $revOne->getTimestamp()
871 $store->loadRevisionFromTimestamp(
874 $revTwo->getTimestamp()
885 $revOne = $page->doEditContent(
887 )->value[
'revision'];
889 $revTwo = $page->doEditContent(
891 )->value[
'revision'];
896 $revOne->getId() => strlen( __METHOD__ ),
898 $store->listRevisionSizes(
905 $revOne->getId() => strlen( __METHOD__ ),
906 $revTwo->getId() => strlen( __METHOD__ ) + 1,
908 $store->listRevisionSizes(
910 [ $revOne->getId(), $revTwo->getId() ]
921 $revOne = $page->doEditContent(
923 )->value[
'revision'];
925 $revTwo = $page->doEditContent(
927 )->value[
'revision'];
931 $store->getPreviousRevision( $store->getRevisionById( $revOne->getId() ) )
935 $store->getPreviousRevision( $store->getRevisionById( $revTwo->getId() ) )->getId()
945 $revOne = $page->doEditContent(
947 )->value[
'revision'];
949 $revTwo = $page->doEditContent(
951 )->value[
'revision'];
956 $store->getNextRevision( $store->getRevisionById( $revOne->getId() ) )->getId()
959 $store->getNextRevision( $store->getRevisionById( $revTwo->getId() ) )
973 $result = $store->getTimestampFromId(
978 $this->assertSame(
$rev->getTimestamp(),
$result );
991 $result = $store->getTimestampFromId(
1051 $page->doEditContent(
new WikitextContent( __METHOD__ ), __METHOD__ );
1054 $result = $store->userWasLastToEdit(
1060 $this->assertFalse(
$result );
1070 $page->doEditContent(
1079 $result = $store->userWasLastToEdit(
1094 $rev = $page->doEditContent(
1100 )->value[
'revision'];
1103 $record = $store->getKnownCurrentRevision(
1112 yield
'Basic array, with page & id' => [
1117 'timestamp' =>
'20171017114835',
1118 'user_text' =>
'111.0.1.2',
1120 'minor_edit' =>
false,
1124 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1125 'comment' =>
'Goat Comment!',
1126 'content_format' =>
'text/x-wiki',
1127 'content_model' =>
'wikitext',
1130 yield
'Basic array, content object' => [
1134 'timestamp' =>
'20171017114835',
1135 'user_text' =>
'111.0.1.2',
1137 'minor_edit' =>
false,
1141 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1142 'comment' =>
'Goat Comment!',
1146 yield
'Basic array, serialized text' => [
1150 'timestamp' =>
'20171017114835',
1151 'user_text' =>
'111.0.1.2',
1153 'minor_edit' =>
false,
1157 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1158 'comment' =>
'Goat Comment!',
1162 yield
'Basic array, serialized text, utf-8 flags' => [
1166 'timestamp' =>
'20171017114835',
1167 'user_text' =>
'111.0.1.2',
1169 'minor_edit' =>
false,
1173 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1174 'comment' =>
'Goat Comment!',
1179 yield
'Basic array, with title' => [
1183 'timestamp' =>
'20171017114835',
1184 'user_text' =>
'111.0.1.2',
1186 'minor_edit' =>
false,
1190 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1191 'comment' =>
'Goat Comment!',
1192 'content_format' =>
'text/x-wiki',
1193 'content_model' =>
'wikitext',
1196 yield
'Basic array, no user field' => [
1201 'timestamp' =>
'20171017114835',
1202 'user_text' =>
'111.0.1.3',
1203 'minor_edit' =>
false,
1207 'sha1' =>
'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
1208 'comment' =>
'Goat Comment!',
1209 'content_format' =>
'text/x-wiki',
1210 'content_model' =>
'wikitext',
1222 $result = $store->newMutableRevisionFromArray( $array );
1224 if ( isset( $array[
'id'] ) ) {
1225 $this->assertSame( $array[
'id'],
$result->getId() );
1227 if ( isset( $array[
'page'] ) ) {
1228 $this->assertSame( $array[
'page'],
$result->getPageId() );
1230 $this->assertSame( $array[
'timestamp'],
$result->getTimestamp() );
1231 $this->assertSame( $array[
'user_text'],
$result->getUser()->getName() );
1232 if ( isset( $array[
'user'] ) ) {
1233 $this->assertSame( $array[
'user'],
$result->getUser()->getId() );
1235 $this->assertSame( (
bool)$array[
'minor_edit'],
$result->isMinor() );
1236 $this->assertSame( $array[
'deleted'],
$result->getVisibility() );
1237 $this->assertSame( $array[
'len'],
$result->getSize() );
1238 $this->assertSame( $array[
'parent_id'],
$result->getParentId() );
1239 $this->assertSame( $array[
'sha1'],
$result->getSha1() );
1240 $this->assertSame( $array[
'comment'],
$result->getComment()->text );
1241 if ( isset( $array[
'content'] ) ) {
1243 $result->getSlot(
'main' )->getContent()->equals( $array[
'content'] )
1245 } elseif ( isset( $array[
'text'] ) ) {
1246 $this->assertSame( $array[
'text'],
$result->getSlot(
'main' )->getContent()->serialize() );
1249 $array[
'content_format'],
1250 $result->getSlot(
'main' )->getContent()->getDefaultFormat()
1252 $this->assertSame( $array[
'content_model'],
$result->getSlot(
'main' )->getModel() );
1266 ->setMethods( [
'newBlobStore',
'newSqlBlobStore' ] )
1267 ->disableOriginalConstructor()
1269 $factory->expects( $this->any() )
1270 ->method(
'newBlobStore' )
1271 ->willReturn( $blobStore );
1272 $factory->expects( $this->any() )
1273 ->method(
'newSqlBlobStore' )
1274 ->willReturn( $blobStore );
1276 $this->
setService(
'BlobStoreFactory', $factory );