Merge "RevisionStoreDbTestBase, remove redundant needsDB override"
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / RevisionArchiveRecordTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Storage;
4
5 use CommentStoreComment;
6 use InvalidArgumentException;
7 use MediaWiki\Storage\RevisionRecord;
8 use MediaWiki\Storage\RevisionSlots;
9 use MediaWiki\Storage\RevisionArchiveRecord;
10 use MediaWiki\Storage\SlotRecord;
11 use MediaWiki\User\UserIdentity;
12 use MediaWiki\User\UserIdentityValue;
13 use MediaWikiTestCase;
14 use TextContent;
15 use Title;
16
17 /**
18 * @covers \MediaWiki\Storage\RevisionArchiveRecord
19 * @covers \MediaWiki\Storage\RevisionRecord
20 */
21 class RevisionArchiveRecordTest extends MediaWikiTestCase {
22
23 use RevisionRecordTests;
24
25 /**
26 * @param array $rowOverrides
27 *
28 * @return RevisionArchiveRecord
29 */
30 protected function newRevision( array $rowOverrides = [] ) {
31 $title = Title::newFromText( 'Dummy' );
32 $title->resetArticleID( 17 );
33
34 $user = new UserIdentityValue( 11, 'Tester', 0 );
35 $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
36
37 $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
38 $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
39 $slots = new RevisionSlots( [ $main, $aux ] );
40
41 $row = [
42 'ar_id' => '5',
43 'ar_rev_id' => '7',
44 'ar_page_id' => strval( $title->getArticleID() ),
45 'ar_timestamp' => '20200101000000',
46 'ar_deleted' => 0,
47 'ar_minor_edit' => 0,
48 'ar_parent_id' => '5',
49 'ar_len' => $slots->computeSize(),
50 'ar_sha1' => $slots->computeSha1(),
51 ];
52
53 foreach ( $rowOverrides as $field => $value ) {
54 $field = preg_replace( '/^rev_/', 'ar_', $field );
55 $row[$field] = $value;
56 }
57
58 return new RevisionArchiveRecord( $title, $user, $comment, (object)$row, $slots );
59 }
60
61 public function provideConstructor() {
62 $title = Title::newFromText( 'Dummy' );
63 $title->resetArticleID( 17 );
64
65 $user = new UserIdentityValue( 11, 'Tester', 0 );
66 $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
67
68 $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
69 $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
70 $slots = new RevisionSlots( [ $main, $aux ] );
71
72 $protoRow = [
73 'ar_id' => '5',
74 'ar_rev_id' => '7',
75 'ar_page_id' => strval( $title->getArticleID() ),
76 'ar_timestamp' => '20200101000000',
77 'ar_deleted' => 0,
78 'ar_minor_edit' => 0,
79 'ar_parent_id' => '5',
80 'ar_len' => $slots->computeSize(),
81 'ar_sha1' => $slots->computeSha1(),
82 ];
83
84 $row = $protoRow;
85 yield 'all info' => [
86 $title,
87 $user,
88 $comment,
89 (object)$row,
90 $slots,
91 'acmewiki'
92 ];
93
94 $row = $protoRow;
95 $row['ar_minor_edit'] = '1';
96 $row['ar_deleted'] = strval( RevisionRecord::DELETED_USER );
97
98 yield 'minor deleted' => [
99 $title,
100 $user,
101 $comment,
102 (object)$row,
103 $slots
104 ];
105
106 $row = $protoRow;
107 unset( $row['ar_parent'] );
108
109 yield 'no parent' => [
110 $title,
111 $user,
112 $comment,
113 (object)$row,
114 $slots
115 ];
116
117 $row = $protoRow;
118 $row['ar_len'] = null;
119 $row['ar_sha1'] = '';
120
121 yield 'ar_len is null, ar_sha1 is ""' => [
122 $title,
123 $user,
124 $comment,
125 (object)$row,
126 $slots
127 ];
128
129 $row = $protoRow;
130 yield 'no length, no hash' => [
131 Title::newFromText( 'DummyDoesNotExist' ),
132 $user,
133 $comment,
134 (object)$row,
135 $slots
136 ];
137 }
138
139 /**
140 * @dataProvider provideConstructor
141 *
142 * @param Title $title
143 * @param UserIdentity $user
144 * @param CommentStoreComment $comment
145 * @param object $row
146 * @param RevisionSlots $slots
147 * @param bool $wikiId
148 */
149 public function testConstructorAndGetters(
150 Title $title,
151 UserIdentity $user,
152 CommentStoreComment $comment,
153 $row,
154 RevisionSlots $slots,
155 $wikiId = false
156 ) {
157 $rec = new RevisionArchiveRecord( $title, $user, $comment, $row, $slots, $wikiId );
158
159 $this->assertSame( $title, $rec->getPageAsLinkTarget(), 'getPageAsLinkTarget' );
160 $this->assertSame( $user, $rec->getUser( RevisionRecord::RAW ), 'getUser' );
161 $this->assertSame( $comment, $rec->getComment(), 'getComment' );
162
163 $this->assertSame( $slots->getSlotRoles(), $rec->getSlotRoles(), 'getSlotRoles' );
164 $this->assertSame( $wikiId, $rec->getWikiId(), 'getWikiId' );
165
166 $this->assertSame( (int)$row->ar_id, $rec->getArchiveId(), 'getArchiveId' );
167 $this->assertSame( (int)$row->ar_rev_id, $rec->getId(), 'getId' );
168 $this->assertSame( (int)$row->ar_page_id, $rec->getPageId(), 'getId' );
169 $this->assertSame( $row->ar_timestamp, $rec->getTimestamp(), 'getTimestamp' );
170 $this->assertSame( (int)$row->ar_deleted, $rec->getVisibility(), 'getVisibility' );
171 $this->assertSame( (bool)$row->ar_minor_edit, $rec->isMinor(), 'getIsMinor' );
172
173 if ( isset( $row->ar_parent_id ) ) {
174 $this->assertSame( (int)$row->ar_parent_id, $rec->getParentId(), 'getParentId' );
175 } else {
176 $this->assertSame( 0, $rec->getParentId(), 'getParentId' );
177 }
178
179 if ( isset( $row->ar_len ) ) {
180 $this->assertSame( (int)$row->ar_len, $rec->getSize(), 'getSize' );
181 } else {
182 $this->assertSame( $slots->computeSize(), $rec->getSize(), 'getSize' );
183 }
184
185 if ( !empty( $row->ar_sha1 ) ) {
186 $this->assertSame( $row->ar_sha1, $rec->getSha1(), 'getSha1' );
187 } else {
188 $this->assertSame( $slots->computeSha1(), $rec->getSha1(), 'getSha1' );
189 }
190 }
191
192 public function provideConstructorFailure() {
193 $title = Title::newFromText( 'Dummy' );
194 $title->resetArticleID( 17 );
195
196 $user = new UserIdentityValue( 11, 'Tester', 0 );
197
198 $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
199
200 $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
201 $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
202 $slots = new RevisionSlots( [ $main, $aux ] );
203
204 $protoRow = [
205 'ar_id' => '5',
206 'ar_rev_id' => '7',
207 'ar_page_id' => strval( $title->getArticleID() ),
208 'ar_timestamp' => '20200101000000',
209 'ar_deleted' => 0,
210 'ar_minor_edit' => 0,
211 'ar_parent_id' => '5',
212 'ar_len' => $slots->computeSize(),
213 'ar_sha1' => $slots->computeSha1(),
214 ];
215
216 yield 'not a row' => [
217 $title,
218 $user,
219 $comment,
220 'not a row',
221 $slots,
222 'acmewiki'
223 ];
224
225 $row = $protoRow;
226 $row['ar_timestamp'] = 'kittens';
227
228 yield 'bad timestamp' => [
229 $title,
230 $user,
231 $comment,
232 (object)$row,
233 $slots
234 ];
235
236 $row = $protoRow;
237
238 yield 'bad wiki' => [
239 $title,
240 $user,
241 $comment,
242 (object)$row,
243 $slots,
244 12345
245 ];
246
247 // NOTE: $title->getArticleID does *not* have to match ar_page_id in all cases!
248 }
249
250 /**
251 * @dataProvider provideConstructorFailure
252 *
253 * @param Title $title
254 * @param UserIdentity $user
255 * @param CommentStoreComment $comment
256 * @param object $row
257 * @param RevisionSlots $slots
258 * @param bool $wikiId
259 */
260 public function testConstructorFailure(
261 Title $title,
262 UserIdentity $user,
263 CommentStoreComment $comment,
264 $row,
265 RevisionSlots $slots,
266 $wikiId = false
267 ) {
268 $this->setExpectedException( InvalidArgumentException::class );
269 new RevisionArchiveRecord( $title, $user, $comment, $row, $slots, $wikiId );
270 }
271
272 }