Avoid using stale data for revision visibility and actor data
[lhc/web/wiklou.git] / tests / phpunit / includes / Revision / RevisionStoreCacheRecordTest.php
1 <?php
2 namespace MediaWiki\Tests\Revision;
3
4 use Title;
5 use MediaWiki\User\UserIdentityValue;
6 use TextContent;
7 use CommentStoreComment;
8 use MediaWiki\Revision\RevisionStoreCacheRecord;
9 use MediaWiki\Revision\RevisionSlots;
10 use MediaWiki\Revision\SlotRecord;
11 use MediaWiki\Revision\RevisionRecord;
12 use MediaWiki\Revision\RevisionStoreRecord;
13
14 /**
15 * @covers \MediaWiki\Revision\RevisionStoreCacheRecord
16 * @covers \MediaWiki\Revision\RevisionStoreRecord
17 * @covers \MediaWiki\Revision\RevisionRecord
18 */
19 class RevisionStoreCacheRecordTest extends RevisionStoreRecordTest {
20
21 /**
22 * @param array $rowOverrides
23 * @param bool|callable callback function to use, or false for a default no-op callback
24 *
25 * @return RevisionStoreRecord
26 */
27 protected function newRevision( array $rowOverrides = [], $callback = false ) {
28 $title = Title::newFromText( 'Dummy' );
29 $title->resetArticleID( 17 );
30
31 $user = new UserIdentityValue( 11, 'Tester', 0 );
32 $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
33
34 $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
35 $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
36 $slots = new RevisionSlots( [ $main, $aux ] );
37
38 $row = [
39 'rev_id' => '7',
40 'rev_page' => strval( $title->getArticleID() ),
41 'rev_timestamp' => '20200101000000',
42 'rev_deleted' => 0,
43 'rev_minor_edit' => 0,
44 'rev_parent_id' => '5',
45 'rev_len' => $slots->computeSize(),
46 'rev_sha1' => $slots->computeSha1(),
47 'rev_user' => '11',
48 'page_latest' => '18',
49 ];
50
51 $row = array_merge( $row, $rowOverrides );
52
53 if ( !$callback ) {
54 $callback = function ( $revId ) use ( $row ) {
55 return (object)$row;
56 };
57 }
58
59 return new RevisionStoreCacheRecord(
60 $callback,
61 $title,
62 $user,
63 $comment,
64 (object)$row,
65 $slots
66 );
67 }
68
69 public function testCallback() {
70 // Provide a callback that returns non-default values. Asserting the revision returns
71 // these values confirms callback execution and behavior. Also confirm the callback
72 // is only invoked once, even for multiple getter calls.
73 $rowOverrides = [
74 'rev_deleted' => RevisionRecord::DELETED_TEXT,
75 'rev_user' => 12,
76 ];
77 $callbackInvoked = 0;
78 $callback = function ( $revId ) use ( &$callbackInvoked, $rowOverrides ) {
79 $callbackInvoked++;
80 return (object)$rowOverrides;
81 };
82 $rev = $this->newRevision( [], $callback );
83
84 $this->assertSame( RevisionRecord::DELETED_TEXT, $rev->getVisibility() );
85 $this->assertSame( 12, $rev->getUser()->getId() );
86 $this->assertSame( 1, $callbackInvoked );
87 }
88
89 }