Merge "Improve documentation of $wgReferrerPolicy"
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / RevisionStoreTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Storage;
4
5 use MediaWiki\Storage\RevisionStore;
6 use MediaWiki\Storage\SqlBlobStore;
7 use MediaWikiTestCase;
8 use WANObjectCache;
9 use Wikimedia\Rdbms\LoadBalancer;
10
11 class RevisionStoreTest extends MediaWikiTestCase {
12
13 /**
14 * @param LoadBalancer $loadBalancer
15 * @param SqlBlobStore $blobStore
16 * @param WANObjectCache $WANObjectCache
17 *
18 * @return RevisionStore
19 */
20 private function getRevisionStore(
21 $loadBalancer = null,
22 $blobStore = null,
23 $WANObjectCache = null
24 ) {
25 return new RevisionStore(
26 $loadBalancer ? $loadBalancer : $this->getMockLoadBalancer(),
27 $blobStore ? $blobStore : $this->getMockSqlBlobStore(),
28 $WANObjectCache ? $WANObjectCache : $this->getHashWANObjectCache()
29 );
30 }
31
32 /**
33 * @return \PHPUnit_Framework_MockObject_MockObject|LoadBalancer
34 */
35 private function getMockLoadBalancer() {
36 return $this->getMockBuilder( LoadBalancer::class )
37 ->disableOriginalConstructor()->getMock();
38 }
39
40 /**
41 * @return \PHPUnit_Framework_MockObject_MockObject|SqlBlobStore
42 */
43 private function getMockSqlBlobStore() {
44 return $this->getMockBuilder( SqlBlobStore::class )
45 ->disableOriginalConstructor()->getMock();
46 }
47
48 private function getHashWANObjectCache() {
49 return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] );
50 }
51
52 /**
53 * @covers \MediaWiki\Storage\RevisionStore::getContentHandlerUseDB
54 * @covers \MediaWiki\Storage\RevisionStore::setContentHandlerUseDB
55 */
56 public function testGetSetContentHandlerDb() {
57 $store = $this->getRevisionStore();
58 $this->assertTrue( $store->getContentHandlerUseDB() );
59 $store->setContentHandlerUseDB( false );
60 $this->assertFalse( $store->getContentHandlerUseDB() );
61 $store->setContentHandlerUseDB( true );
62 $this->assertTrue( $store->getContentHandlerUseDB() );
63 }
64
65 private function getDefaultQueryFields() {
66 return [
67 'rev_id',
68 'rev_page',
69 'rev_text_id',
70 'rev_timestamp',
71 'rev_user_text',
72 'rev_user',
73 'rev_minor_edit',
74 'rev_deleted',
75 'rev_len',
76 'rev_parent_id',
77 'rev_sha1',
78 ];
79 }
80
81 private function getCommentQueryFields() {
82 return [
83 'rev_comment_text' => 'rev_comment',
84 'rev_comment_data' => 'NULL',
85 'rev_comment_cid' => 'NULL',
86 ];
87 }
88
89 private function getContentHandlerQueryFields() {
90 return [
91 'rev_content_format',
92 'rev_content_model',
93 ];
94 }
95
96 public function provideGetQueryInfo() {
97 yield [
98 true,
99 [],
100 [
101 'tables' => [ 'revision' ],
102 'fields' => array_merge(
103 $this->getDefaultQueryFields(),
104 $this->getCommentQueryFields(),
105 $this->getContentHandlerQueryFields()
106 ),
107 'joins' => [],
108 ]
109 ];
110 yield [
111 false,
112 [],
113 [
114 'tables' => [ 'revision' ],
115 'fields' => array_merge(
116 $this->getDefaultQueryFields(),
117 $this->getCommentQueryFields()
118 ),
119 'joins' => [],
120 ]
121 ];
122 yield [
123 false,
124 [ 'page' ],
125 [
126 'tables' => [ 'revision', 'page' ],
127 'fields' => array_merge(
128 $this->getDefaultQueryFields(),
129 $this->getCommentQueryFields(),
130 [
131 'page_namespace',
132 'page_title',
133 'page_id',
134 'page_latest',
135 'page_is_redirect',
136 'page_len',
137 ]
138 ),
139 'joins' => [
140 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
141 ],
142 ]
143 ];
144 yield [
145 false,
146 [ 'user' ],
147 [
148 'tables' => [ 'revision', 'user' ],
149 'fields' => array_merge(
150 $this->getDefaultQueryFields(),
151 $this->getCommentQueryFields(),
152 [
153 'user_name',
154 ]
155 ),
156 'joins' => [
157 'user' => [ 'LEFT JOIN', [ 'rev_user != 0', 'user_id = rev_user' ] ],
158 ],
159 ]
160 ];
161 yield [
162 false,
163 [ 'text' ],
164 [
165 'tables' => [ 'revision', 'text' ],
166 'fields' => array_merge(
167 $this->getDefaultQueryFields(),
168 $this->getCommentQueryFields(),
169 [
170 'old_text',
171 'old_flags',
172 ]
173 ),
174 'joins' => [
175 'text' => [ 'INNER JOIN', [ 'rev_text_id=old_id' ] ],
176 ],
177 ]
178 ];
179 yield [
180 true,
181 [ 'page', 'user', 'text' ],
182 [
183 'tables' => [ 'revision', 'page', 'user', 'text' ],
184 'fields' => array_merge(
185 $this->getDefaultQueryFields(),
186 $this->getCommentQueryFields(),
187 $this->getContentHandlerQueryFields(),
188 [
189 'page_namespace',
190 'page_title',
191 'page_id',
192 'page_latest',
193 'page_is_redirect',
194 'page_len',
195 'user_name',
196 'old_text',
197 'old_flags',
198 ]
199 ),
200 'joins' => [
201 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ],
202 'user' => [ 'LEFT JOIN', [ 'rev_user != 0', 'user_id = rev_user' ] ],
203 'text' => [ 'INNER JOIN', [ 'rev_text_id=old_id' ] ],
204 ],
205 ]
206 ];
207 }
208
209 /**
210 * @dataProvider provideGetQueryInfo
211 * @covers \MediaWiki\Storage\RevisionStore::getQueryInfo
212 */
213 public function testGetQueryInfo( $contentHandlerUseDb, $options, $expected ) {
214 $store = $this->getRevisionStore();
215 $store->setContentHandlerUseDB( $contentHandlerUseDb );
216 $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
217 $this->assertEquals( $expected, $store->getQueryInfo( $options ) );
218 }
219
220 private function getDefaultArchiveFields() {
221 return [
222 'ar_id',
223 'ar_page_id',
224 'ar_namespace',
225 'ar_title',
226 'ar_rev_id',
227 'ar_text',
228 'ar_text_id',
229 'ar_timestamp',
230 'ar_user_text',
231 'ar_user',
232 'ar_minor_edit',
233 'ar_deleted',
234 'ar_len',
235 'ar_parent_id',
236 'ar_sha1',
237 ];
238 }
239
240 /**
241 * @covers \MediaWiki\Storage\RevisionStore::getArchiveQueryInfo
242 */
243 public function testGetArchiveQueryInfo_contentHandlerDb() {
244 $store = $this->getRevisionStore();
245 $store->setContentHandlerUseDB( true );
246 $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
247 $this->assertEquals(
248 [
249 'tables' => [
250 'archive'
251 ],
252 'fields' => array_merge(
253 $this->getDefaultArchiveFields(),
254 [
255 'ar_comment_text' => 'ar_comment',
256 'ar_comment_data' => 'NULL',
257 'ar_comment_cid' => 'NULL',
258 'ar_content_format',
259 'ar_content_model',
260 ]
261 ),
262 'joins' => [],
263 ],
264 $store->getArchiveQueryInfo()
265 );
266 }
267
268 /**
269 * @covers \MediaWiki\Storage\RevisionStore::getArchiveQueryInfo
270 */
271 public function testGetArchiveQueryInfo_noContentHandlerDb() {
272 $store = $this->getRevisionStore();
273 $store->setContentHandlerUseDB( false );
274 $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
275 $this->assertEquals(
276 [
277 'tables' => [
278 'archive'
279 ],
280 'fields' => array_merge(
281 $this->getDefaultArchiveFields(),
282 [
283 'ar_comment_text' => 'ar_comment',
284 'ar_comment_data' => 'NULL',
285 'ar_comment_cid' => 'NULL',
286 ]
287 ),
288 'joins' => [],
289 ],
290 $store->getArchiveQueryInfo()
291 );
292 }
293
294 }