Use integers for content_model and content_format.
[lhc/web/wiklou.git] / tests / phpunit / includes / RevisionStorageTest.php
1 <?php
2
3 /**
4 * Test class for Revision storage.
5 *
6 * @group ContentHandler
7 * @group Database
8 * ^--- important, causes temporary tables to be used instead of the real database
9 */
10 class RevisionStorageTest extends PHPUnit_Framework_TestCase {
11
12 var $the_page;
13
14 public function setUp() {
15 global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
16
17 $wgExtraNamespaces[ 12312 ] = 'Dummy';
18 $wgExtraNamespaces[ 12313 ] = 'Dummy_talk';
19
20 $wgNamespaceContentModels[ 12312 ] = 'DUMMY';
21 $wgContentHandlers[ 'DUMMY' ] = 'DummyContentHandlerForTesting';
22
23 MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
24 $wgContLang->resetNamespaces(); # reset namespace cache
25
26 if ( !$this->the_page ) {
27 $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
28 }
29 }
30
31 public function tearDown() {
32 global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
33
34 unset( $wgExtraNamespaces[ 12312 ] );
35 unset( $wgExtraNamespaces[ 12313 ] );
36
37 unset( $wgNamespaceContentModels[ 12312 ] );
38 unset( $wgContentHandlers[ 'DUMMY' ] );
39
40 MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
41 $wgContLang->resetNamespaces(); # reset namespace cache
42 }
43
44 protected function makeRevision( $props = null ) {
45 if ( $props === null ) $props = array();
46
47 if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
48 if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
49 if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
50
51 $rev = new Revision( $props );
52
53 $dbw = wfgetDB( DB_MASTER );
54 $rev->insertOn( $dbw );
55
56 return $rev;
57 }
58
59 protected function createPage( $page, $text, $model = null ) {
60 if ( is_string( $page ) ) $page = Title::newFromText( $page );
61 if ( $page instanceof Title ) $page = new WikiPage( $page );
62
63 if ( $page->exists() ) {
64 $page->doDeleteArticle( "done" );
65 }
66
67 $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
68 $page->doEditContent( $content, "testing", EDIT_NEW );
69
70 return $page;
71 }
72
73 protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
74 $this->assertNotNull( $rev, 'missing revision' );
75
76 $this->assertEquals( $orig->getId(), $rev->getId() );
77 $this->assertEquals( $orig->getPage(), $rev->getPage() );
78 $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
79 $this->assertEquals( $orig->getUser(), $rev->getUser() );
80 $this->assertEquals( $orig->getContentModel(), $rev->getContentModel() );
81 $this->assertEquals( $orig->getContentFormat(), $rev->getContentFormat() );
82 $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
83 }
84
85 /**
86 * @covers Revision::__construct
87 */
88 public function testConstructFromRow()
89 {
90 $orig = $this->makeRevision();
91
92 $dbr = wfgetDB( DB_SLAVE );
93 $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
94 $this->assertTrue( is_object( $res ), 'query failed' );
95
96 $row = $res->fetchObject();
97 $res->free();
98
99 $rev = new Revision( $row );
100
101 $this->assertRevEquals( $orig, $rev );
102 }
103
104 /**
105 * @covers Revision::newFromRow
106 */
107 public function testNewFromRow()
108 {
109 $orig = $this->makeRevision();
110
111 $dbr = wfgetDB( DB_SLAVE );
112 $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
113 $this->assertTrue( is_object( $res ), 'query failed' );
114
115 $row = $res->fetchObject();
116 $res->free();
117
118 $rev = Revision::newFromRow( $row );
119
120 $this->assertRevEquals( $orig, $rev );
121 }
122
123
124 /**
125 * @covers Revision::newFromArchiveRow
126 */
127 public function testNewFromArchiveRow()
128 {
129 $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
130 $orig = $page->getRevision();
131 $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
132
133 $dbr = wfgetDB( DB_SLAVE );
134 $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
135 $this->assertTrue( is_object( $res ), 'query failed' );
136
137 $row = $res->fetchObject();
138 $res->free();
139
140 $rev = Revision::newFromArchiveRow( $row );
141
142 $this->assertRevEquals( $orig, $rev );
143 }
144
145 /**
146 * @covers Revision::newFromId
147 */
148 public function testNewFromId()
149 {
150 $orig = $this->makeRevision();
151
152 $rev = Revision::newFromId( $orig->getId() );
153
154 $this->assertRevEquals( $orig, $rev );
155 }
156
157 /**
158 * @covers Revision::fetchRevision
159 */
160 public function testFetchRevision()
161 {
162 $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
163 $id1 = $page->getRevision()->getId();
164
165 $page->doEdit( 'two', 'second rev' );
166 $id2 = $page->getRevision()->getId();
167
168 $res = Revision::fetchRevision( $page->getTitle() );
169
170 #note: order is unspecified
171 $rows = array();
172 while ( ( $row = $res->fetchObject() ) ) {
173 $rows[ $row->rev_id ]= $row;
174 }
175
176 $row = $res->fetchObject();
177 $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
178 $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
179 }
180
181 /**
182 * @covers Revision::selectFields
183 */
184 public function testSelectFields()
185 {
186 $fields = Revision::selectFields();
187
188 $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
189 $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
190 $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
191 $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
192
193 $this->assertTrue( in_array( 'rev_content_model', $fields ), 'missing rev_content_model in list of fields');
194 $this->assertTrue( in_array( 'rev_content_format', $fields ), 'missing rev_content_format in list of fields');
195 }
196
197 /**
198 * @covers Revision::getPage
199 */
200 public function testGetPage()
201 {
202 $page = $this->the_page;
203
204 $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
205 $rev = Revision::newFromId( $orig->getId() );
206
207 $this->assertEquals( $page->getId(), $rev->getPage() );
208 }
209
210 /**
211 * @covers Revision::getText
212 */
213 public function testGetText()
214 {
215 $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
216 $rev = Revision::newFromId( $orig->getId() );
217
218 $this->assertEquals( 'hello hello.', $rev->getText() );
219 }
220
221 /**
222 * @covers Revision::getContent
223 */
224 public function testGetContent()
225 {
226 $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
227 $rev = Revision::newFromId( $orig->getId() );
228
229 $this->assertEquals( 'hello hello.', $rev->getContent()->getNativeData() );
230 }
231
232 /**
233 * @covers Revision::revText
234 */
235 public function testRevText()
236 {
237 $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
238 $rev = Revision::newFromId( $orig->getId() );
239
240 $this->assertEquals( 'hello hello rev.', $rev->revText() );
241 }
242
243 /**
244 * @covers Revision::getRawText
245 */
246 public function testGetRawText()
247 {
248 $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
249 $rev = Revision::newFromId( $orig->getId() );
250
251 $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
252 }
253
254 /**
255 * @covers Revision::getContentModel
256 */
257 public function testGetContentModel()
258 {
259 $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
260 $rev = Revision::newFromId( $orig->getId() );
261
262 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
263 }
264
265 /**
266 * @covers Revision::getContentFormat
267 */
268 public function testGetContentFormat()
269 {
270 $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT, 'content_format' => CONTENT_FORMAT_JAVASCRIPT ) );
271 $rev = Revision::newFromId( $orig->getId() );
272
273 $this->assertEquals( CONTENT_FORMAT_JAVASCRIPT, $rev->getContentFormat() );
274 }
275
276 /**
277 * @covers Revision::isCurrent
278 */
279 public function testIsCurrent()
280 {
281 $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
282 $rev1 = $page->getRevision();
283
284 # @todo: find out if this should be true
285 # $this->assertTrue( $rev1->isCurrent() );
286
287 $rev1x = Revision::newFromId( $rev1->getId() );
288 $this->assertTrue( $rev1x->isCurrent() );
289
290 $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle() ), 'second rev' );
291 $rev2 = $page->getRevision();
292
293 # @todo: find out if this should be true
294 # $this->assertTrue( $rev2->isCurrent() );
295
296 $rev1x = Revision::newFromId( $rev1->getId() );
297 $this->assertFalse( $rev1x->isCurrent() );
298
299 $rev2x = Revision::newFromId( $rev2->getId() );
300 $this->assertTrue( $rev2x->isCurrent() );
301 }
302
303 /**
304 * @covers Revision::getPrevious
305 */
306 public function testGetPrevious()
307 {
308 $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
309 $rev1 = $page->getRevision();
310
311 $this->assertNull( $rev1->getPrevious() );
312
313 $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle() ), 'second rev testGetPrevious' );
314 $rev2 = $page->getRevision();
315
316 $this->assertNotNull( $rev2->getPrevious() );
317 $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
318 }
319
320 /**
321 * @covers Revision::getNext
322 */
323 public function testGetNext()
324 {
325 $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
326 $rev1 = $page->getRevision();
327
328 $this->assertNull( $rev1->getNext() );
329
330 $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle() ), 'second rev testGetNext' );
331 $rev2 = $page->getRevision();
332
333 $this->assertNotNull( $rev1->getNext() );
334 $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
335 }
336
337 /**
338 * @covers Revision::newNullRevision
339 */
340 public function testNewNullRevision()
341 {
342 $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
343 $orig = $page->getRevision();
344
345 $dbw = wfGetDB( DB_MASTER );
346 $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
347
348 $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
349 $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
350 $this->assertEquals( 'some testing text', $rev->getContent()->getNativeData() );
351 }
352 }
353 ?>