Merge "RevisionTest: Use utf-8 as name in iconv"
[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->assertEquals( $expected, $store->getQueryInfo( $options ) );
217 }
218
219 private function getDefaultArchiveFields() {
220 return [
221 'ar_id',
222 'ar_page_id',
223 'ar_namespace',
224 'ar_title',
225 'ar_rev_id',
226 'ar_text',
227 'ar_text_id',
228 'ar_timestamp',
229 'ar_user_text',
230 'ar_user',
231 'ar_minor_edit',
232 'ar_deleted',
233 'ar_len',
234 'ar_parent_id',
235 'ar_sha1',
236 ];
237 }
238
239 /**
240 * @covers \MediaWiki\Storage\RevisionStore::getArchiveQueryInfo
241 */
242 public function testGetArchiveQueryInfo_contentHandlerDb() {
243 $store = $this->getRevisionStore();
244 $store->setContentHandlerUseDB( true );
245 $this->assertEquals(
246 [
247 'tables' => [
248 'archive'
249 ],
250 'fields' => array_merge(
251 $this->getDefaultArchiveFields(),
252 [
253 'ar_comment_text' => 'ar_comment',
254 'ar_comment_data' => 'NULL',
255 'ar_comment_cid' => 'NULL',
256 'ar_content_format',
257 'ar_content_model',
258 ]
259 ),
260 'joins' => [],
261 ],
262 $store->getArchiveQueryInfo()
263 );
264 }
265
266 /**
267 * @covers \MediaWiki\Storage\RevisionStore::getArchiveQueryInfo
268 */
269 public function testGetArchiveQueryInfo_noContentHandlerDb() {
270 $store = $this->getRevisionStore();
271 $store->setContentHandlerUseDB( false );
272 $this->assertEquals(
273 [
274 'tables' => [
275 'archive'
276 ],
277 'fields' => array_merge(
278 $this->getDefaultArchiveFields(),
279 [
280 'ar_comment_text' => 'ar_comment',
281 'ar_comment_data' => 'NULL',
282 'ar_comment_cid' => 'NULL',
283 ]
284 ),
285 'joins' => [],
286 ],
287 $store->getArchiveQueryInfo()
288 );
289 }
290
291 }