Add `actor` table and code to start using it
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / RevisionStoreRecordTest.php
index 17260f9..43784b6 100644 (file)
@@ -17,19 +17,20 @@ use TextContent;
 use Title;
 
 /**
- * @covers MediaWiki\Storage\RevisionStoreRecord
+ * @covers \MediaWiki\Storage\RevisionStoreRecord
  */
 class RevisionStoreRecordTest extends MediaWikiTestCase {
 
        /**
-        * @param array $overrides
+        * @param array $rowOverrides
+        *
         * @return RevisionStoreRecord
         */
-       public function newRevision( array $overrides = [] ) {
+       public function newRevision( array $rowOverrides = [] ) {
                $title = Title::newFromText( 'Dummy' );
                $title->resetArticleID( 17 );
 
-               $user = new UserIdentityValue( 11, 'Tester' );
+               $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
                $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
@@ -48,7 +49,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                        'page_latest' => '18',
                ];
 
-               $row = array_merge( $row, $overrides );
+               $row = array_merge( $row, $rowOverrides );
 
                return new RevisionStoreRecord( $title, $user, $comment, (object)$row, $slots );
        }
@@ -57,7 +58,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $title = Title::newFromText( 'Dummy' );
                $title->resetArticleID( 17 );
 
-               $user = new UserIdentityValue( 11, 'Tester' );
+               $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
                $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
@@ -212,7 +213,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $title = Title::newFromText( 'Dummy' );
                $title->resetArticleID( 17 );
 
-               $user = new UserIdentityValue( 11, 'Tester' );
+               $user = new UserIdentityValue( 11, 'Tester', 0 );
 
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
@@ -299,28 +300,28 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
 
        private function provideAudienceCheckData( $field ) {
                yield 'field accessible for oversighter (ALL)' => [
-                       Revisionrecord::SUPPRESSED_ALL,
+                       RevisionRecord::SUPPRESSED_ALL,
                        [ 'oversight' ],
                        true,
                        false
                ];
 
                yield 'field accessible for oversighter' => [
-                       Revisionrecord::DELETED_RESTRICTED | $field,
+                       RevisionRecord::DELETED_RESTRICTED | $field,
                        [ 'oversight' ],
                        true,
                        false
                ];
 
                yield 'field not accessible for sysops (ALL)' => [
-                       Revisionrecord::SUPPRESSED_ALL,
+                       RevisionRecord::SUPPRESSED_ALL,
                        [ 'sysop' ],
                        false,
                        false
                ];
 
                yield 'field not accessible for sysops' => [
-                       Revisionrecord::DELETED_RESTRICTED | $field,
+                       RevisionRecord::DELETED_RESTRICTED | $field,
                        [ 'sysop' ],
                        false,
                        false
@@ -341,9 +342,9 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                ];
 
                yield 'unrelated field suppressed' => [
-                       $field === Revisionrecord::DELETED_COMMENT
-                               ? Revisionrecord::DELETED_USER
-                               : Revisionrecord::DELETED_COMMENT,
+                       $field === RevisionRecord::DELETED_COMMENT
+                               ? RevisionRecord::DELETED_USER
+                               : RevisionRecord::DELETED_COMMENT,
                        [ 'user' ],
                        true,
                        true
@@ -657,7 +658,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideUserCanBitfield
-        * @covers RevisionRecord::userCanBitfield
+        * @covers \MediaWiki\Storage\RevisionRecord::userCanBitfield
         */
        public function testUserCanBitfield( $bitField, $field, $userGroups, $title, $expected ) {
                $this->forceStandardPermissions();
@@ -670,16 +671,144 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                );
        }
 
-       public function testHasSameContent() {
-               // TBD
+       private function getSlotRecord( $role, $contentString ) {
+               return SlotRecord::newUnsaved( $role, new TextContent( $contentString ) );
        }
 
-       public function testIsDeleted() {
-               // TBD
+       public function provideHasSameContent() {
+               /**
+                * @param SlotRecord[] $slots
+                * @param int $revId
+                * @return RevisionStoreRecord
+                */
+               $recordCreator = function ( array $slots, $revId ) {
+                       $title = Title::newFromText( 'provideHasSameContent' );
+                       $title->resetArticleID( 19 );
+                       $slots = new RevisionSlots( $slots );
+
+                       return new RevisionStoreRecord(
+                               $title,
+                               new UserIdentityValue( 11, __METHOD__, 0 ),
+                               CommentStoreComment::newUnsavedComment( __METHOD__ ),
+                               (object)[
+                                       'rev_id' => strval( $revId ),
+                                       'rev_page' => strval( $title->getArticleID() ),
+                                       'rev_timestamp' => '20200101000000',
+                                       'rev_deleted' => 0,
+                                       'rev_minor_edit' => 0,
+                                       'rev_parent_id' => '5',
+                                       'rev_len' => $slots->computeSize(),
+                                       'rev_sha1' => $slots->computeSha1(),
+                                       'page_latest' => '18',
+                               ],
+                               $slots
+                       );
+               };
+
+               // Create some slots with content
+               $mainA = SlotRecord::newUnsaved( 'main', new TextContent( 'A' ) );
+               $mainB = SlotRecord::newUnsaved( 'main', new TextContent( 'B' ) );
+               $auxA = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
+               $auxB = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
+
+               $initialRecord = $recordCreator( [ $mainA ], 12 );
+
+               return [
+                       'same record object' => [
+                               true,
+                               $initialRecord,
+                               $initialRecord,
+                       ],
+                       'same record content, different object' => [
+                               true,
+                               $recordCreator( [ $mainA ], 12 ),
+                               $recordCreator( [ $mainA ], 13 ),
+                       ],
+                       'same record content, aux slot, different object' => [
+                               true,
+                               $recordCreator( [ $auxA ], 12 ),
+                               $recordCreator( [ $auxB ], 13 ),
+                       ],
+                       'different content' => [
+                               false,
+                               $recordCreator( [ $mainA ], 12 ),
+                               $recordCreator( [ $mainB ], 13 ),
+                       ],
+                       'different content and number of slots' => [
+                               false,
+                               $recordCreator( [ $mainA ], 12 ),
+                               $recordCreator( [ $mainA, $mainB ], 13 ),
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideHasSameContent
+        * @covers \MediaWiki\Storage\RevisionRecord::hasSameContent
+        * @group Database
+        */
+       public function testHasSameContent(
+               $expected,
+               RevisionRecord $record1,
+               RevisionRecord $record2
+       ) {
+               $this->assertSame(
+                       $expected,
+                       $record1->hasSameContent( $record2 )
+               );
+       }
+
+       public function provideIsDeleted() {
+               yield 'no deletion' => [
+                       0,
+                       [
+                               RevisionRecord::DELETED_TEXT => false,
+                               RevisionRecord::DELETED_COMMENT => false,
+                               RevisionRecord::DELETED_USER => false,
+                               RevisionRecord::DELETED_RESTRICTED => false,
+                       ]
+               ];
+               yield 'text deleted' => [
+                       RevisionRecord::DELETED_TEXT,
+                       [
+                               RevisionRecord::DELETED_TEXT => true,
+                               RevisionRecord::DELETED_COMMENT => false,
+                               RevisionRecord::DELETED_USER => false,
+                               RevisionRecord::DELETED_RESTRICTED => false,
+                       ]
+               ];
+               yield 'text and comment deleted' => [
+                       RevisionRecord::DELETED_TEXT + RevisionRecord::DELETED_COMMENT,
+                       [
+                               RevisionRecord::DELETED_TEXT => true,
+                               RevisionRecord::DELETED_COMMENT => true,
+                               RevisionRecord::DELETED_USER => false,
+                               RevisionRecord::DELETED_RESTRICTED => false,
+                       ]
+               ];
+               yield 'all 4 deleted' => [
+                       RevisionRecord::DELETED_TEXT +
+                       RevisionRecord::DELETED_COMMENT +
+                       RevisionRecord::DELETED_RESTRICTED +
+                       RevisionRecord::DELETED_USER,
+                       [
+                               RevisionRecord::DELETED_TEXT => true,
+                               RevisionRecord::DELETED_COMMENT => true,
+                               RevisionRecord::DELETED_USER => true,
+                               RevisionRecord::DELETED_RESTRICTED => true,
+                       ]
+               ];
        }
 
-       public function testUserCan() {
-               // TBD
+       /**
+        * @dataProvider provideIsDeleted
+        * @covers \MediaWiki\Storage\RevisionRecord::isDeleted
+        */
+       public function testIsDeleted( $revDeleted, $assertionMap ) {
+               $rev = $this->newRevision( [ 'rev_deleted' => $revDeleted ] );
+               foreach ( $assertionMap as $deletionLevel => $expected ) {
+                       $this->assertSame( $expected, $rev->isDeleted( $deletionLevel ) );
+               }
        }
 
 }