MediaWiki REL1_27
RevisionTest.php
Go to the documentation of this file.
1<?php
2
7 protected function setUp() {
9
10 parent::setUp();
11
12 $this->setMwGlobals( [
13 'wgContLang' => Language::factory( 'en' ),
14 'wgLanguageCode' => 'en',
15 'wgLegacyEncoding' => false,
16 'wgCompressRevisions' => false,
17
18 'wgContentHandlerTextFallback' => 'ignore',
19 ] );
20
22 'wgExtraNamespaces',
23 [
24 12312 => 'Dummy',
25 12313 => 'Dummy_talk',
26 ]
27 );
28
30 'wgNamespaceContentModels',
31 [
32 12312 => 'testing',
33 ]
34 );
35
37 'wgContentHandlers',
38 [
39 'testing' => 'DummyContentHandlerForTesting',
40 'RevisionTestModifyableContent' => 'RevisionTestModifyableContentHandler',
41 ]
42 );
43
44 MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
45 $wgContLang->resetNamespaces(); # reset namespace cache
46 }
47
50
51 MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
52 $wgContLang->resetNamespaces(); # reset namespace cache
53
54 parent::tearDown();
55 }
56
60 public function testGetRevisionText() {
61 $row = new stdClass;
62 $row->old_flags = '';
63 $row->old_text = 'This is a bunch of revision text.';
64 $this->assertEquals(
65 'This is a bunch of revision text.',
67 }
68
72 public function testGetRevisionTextGzip() {
73 $this->checkPHPExtension( 'zlib' );
74
75 $row = new stdClass;
76 $row->old_flags = 'gzip';
77 $row->old_text = gzdeflate( 'This is a bunch of revision text.' );
78 $this->assertEquals(
79 'This is a bunch of revision text.',
81 }
82
87 $row = new stdClass;
88 $row->old_flags = 'utf-8';
89 $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
90 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
91 $this->assertEquals(
92 "Wiki est l'\xc3\xa9cole superieur !",
94 }
95
100 $row = new stdClass;
101 $row->old_flags = '';
102 $row->old_text = "Wiki est l'\xe9cole superieur !";
103 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
104 $this->assertEquals(
105 "Wiki est l'\xc3\xa9cole superieur !",
107 }
108
113 $this->checkPHPExtension( 'zlib' );
114
115 $row = new stdClass;
116 $row->old_flags = 'gzip,utf-8';
117 $row->old_text = gzdeflate( "Wiki est l'\xc3\xa9cole superieur !" );
118 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
119 $this->assertEquals(
120 "Wiki est l'\xc3\xa9cole superieur !",
122 }
123
128 $this->checkPHPExtension( 'zlib' );
129
130 $row = new stdClass;
131 $row->old_flags = 'gzip';
132 $row->old_text = gzdeflate( "Wiki est l'\xe9cole superieur !" );
133 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
134 $this->assertEquals(
135 "Wiki est l'\xc3\xa9cole superieur !",
137 }
138
143 $row = new stdClass;
144 $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
145 $row->old_flags = Revision::compressRevisionText( $row->old_text );
146 $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
147 "Flags should contain 'utf-8'" );
148 $this->assertFalse( false !== strpos( $row->old_flags, 'gzip' ),
149 "Flags should not contain 'gzip'" );
150 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
151 $row->old_text, "Direct check" );
152 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
153 Revision::getRevisionText( $row ), "getRevisionText" );
154 }
155
160 $this->checkPHPExtension( 'zlib' );
161 $this->setMwGlobals( 'wgCompressRevisions', true );
162
163 $row = new stdClass;
164 $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
165 $row->old_flags = Revision::compressRevisionText( $row->old_text );
166 $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
167 "Flags should contain 'utf-8'" );
168 $this->assertTrue( false !== strpos( $row->old_flags, 'gzip' ),
169 "Flags should contain 'gzip'" );
170 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
171 gzinflate( $row->old_text ), "Direct check" );
172 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
173 Revision::getRevisionText( $row ), "getRevisionText" );
174 }
175
176 # =========================================================================
177
186 function newTestRevision( $text, $title = "Test",
187 $model = CONTENT_MODEL_WIKITEXT, $format = null
188 ) {
189 if ( is_string( $title ) ) {
191 }
192
193 $content = ContentHandler::makeContent( $text, $title, $model, $format );
194
195 $rev = new Revision(
196 [
197 'id' => 42,
198 'page' => 23,
199 'title' => $title,
200
201 'content' => $content,
202 'length' => $content->getSize(),
203 'comment' => "testing",
204 'minor_edit' => false,
205
206 'content_format' => $format,
207 ]
208 );
209
210 return $rev;
211 }
212
214 // NOTE: we expect the help namespace to always contain wikitext
215 return [
216 [ 'hello world', 'Help:Hello', null, null, CONTENT_MODEL_WIKITEXT ],
217 [ 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS ],
218 [ serialize( 'hello world' ), 'Dummy:Hello', null, null, "testing" ],
219 ];
220 }
221
227 public function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
228 $rev = $this->newTestRevision( $text, $title, $model, $format );
229
230 $this->assertEquals( $expectedModel, $rev->getContentModel() );
231 }
232
234 // NOTE: we expect the help namespace to always contain wikitext
235 return [
236 [ 'hello world', 'Help:Hello', null, null, CONTENT_FORMAT_WIKITEXT ],
237 [ 'hello world', 'Help:Hello', CONTENT_MODEL_CSS, null, CONTENT_FORMAT_CSS ],
238 [ 'hello world', 'User:hello/there.css', null, null, CONTENT_FORMAT_CSS ],
239 [ serialize( 'hello world' ), 'Dummy:Hello', null, null, "testing" ],
240 ];
241 }
242
248 public function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
249 $rev = $this->newTestRevision( $text, $title, $model, $format );
250
251 $this->assertEquals( $expectedFormat, $rev->getContentFormat() );
252 }
253
255 // NOTE: we expect the help namespace to always contain wikitext
256 return [
257 [ 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ],
258 [ 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ],
259 [ serialize( 'hello world' ), 'Dummy:Hello', null, null, 'DummyContentHandlerForTesting' ],
260 ];
261 }
262
268 public function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
269 $rev = $this->newTestRevision( $text, $title, $model, $format );
270
271 $this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
272 }
273
274 function dataGetContent() {
275 // NOTE: we expect the help namespace to always contain wikitext
276 return [
277 [ 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ],
278 [
279 serialize( 'hello world' ),
280 'Hello',
281 "testing",
282 null,
284 serialize( 'hello world' )
285 ],
286 [
287 serialize( 'hello world' ),
288 'Dummy:Hello',
289 null,
290 null,
292 serialize( 'hello world' )
293 ],
294 ];
295 }
296
302 public function testGetContent( $text, $title, $model, $format,
303 $audience, $expectedSerialization
304 ) {
305 $rev = $this->newTestRevision( $text, $title, $model, $format );
306 $content = $rev->getContent( $audience );
307
308 $this->assertEquals(
309 $expectedSerialization,
310 is_null( $content ) ? null : $content->serialize( $format )
311 );
312 }
313
314 function dataGetText() {
315 // NOTE: we expect the help namespace to always contain wikitext
316 return [
317 [ 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ],
318 [ serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ],
319 [ serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, null ],
320 ];
321 }
322
328 public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
329 $this->hideDeprecated( 'Revision::getText' );
330
331 $rev = $this->newTestRevision( $text, $title, $model, $format );
332
333 $this->assertEquals( $expectedText, $rev->getText( $audience ) );
334 }
335
336 public function dataGetSize() {
337 return [
338 [ "hello world.", CONTENT_MODEL_WIKITEXT, 12 ],
339 [ serialize( "hello world." ), "testing", 12 ],
340 ];
341 }
342
348 public function testGetSize( $text, $model, $expected_size ) {
349 $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSize', $model );
350 $this->assertEquals( $expected_size, $rev->getSize() );
351 }
352
353 public function dataGetSha1() {
354 return [
355 [ "hello world.", CONTENT_MODEL_WIKITEXT, Revision::base36Sha1( "hello world." ) ],
356 [
357 serialize( "hello world." ),
358 "testing",
359 Revision::base36Sha1( serialize( "hello world." ) )
360 ],
361 ];
362 }
363
369 public function testGetSha1( $text, $model, $expected_hash ) {
370 $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSha1', $model );
371 $this->assertEquals( $expected_hash, $rev->getSha1() );
372 }
373
377 public function testConstructWithText() {
378 $this->hideDeprecated( "Revision::getText" );
379
380 $rev = new Revision( [
381 'text' => 'hello world.',
382 'content_model' => CONTENT_MODEL_JAVASCRIPT
383 ] );
384
385 $this->assertNotNull( $rev->getText(), 'no content text' );
386 $this->assertNotNull( $rev->getContent(), 'no content object available' );
387 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
388 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
389 }
390
394 public function testConstructWithContent() {
395 $this->hideDeprecated( "Revision::getText" );
396
397 $title = Title::newFromText( 'RevisionTest_testConstructWithContent' );
398
399 $rev = new Revision( [
400 'content' => ContentHandler::makeContent( 'hello world.', $title, CONTENT_MODEL_JAVASCRIPT ),
401 ] );
402
403 $this->assertNotNull( $rev->getText(), 'no content text' );
404 $this->assertNotNull( $rev->getContent(), 'no content object available' );
405 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
406 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
407 }
408
415 public function testGetContentClone() {
417
418 $rev = new Revision(
419 [
420 'id' => 42,
421 'page' => 23,
422 'title' => Title::newFromText( "testGetContentClone_dummy" ),
423
424 'content' => $content,
425 'length' => $content->getSize(),
426 'comment' => "testing",
427 'minor_edit' => false,
428 ]
429 );
430
431 $content = $rev->getContent( Revision::RAW );
432 $content->setText( "bar" );
433
434 $content2 = $rev->getContent( Revision::RAW );
435 // content is mutable, expect clone
436 $this->assertNotSame( $content, $content2, "expected a clone" );
437 // clone should contain the original text
438 $this->assertEquals( "foo", $content2->getText() );
439
440 $content2->setText( "bla bla" );
441 $this->assertEquals( "bar", $content->getText() ); // clones should be independent
442 }
443
450 public function testGetContentUncloned() {
451 $rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT );
452 $content = $rev->getContent( Revision::RAW );
453 $content2 = $rev->getContent( Revision::RAW );
454
455 // for immutable content like wikitext, this should be the same object
456 $this->assertSame( $content, $content2 );
457 }
458}
459
461 public function __construct( $text ) {
462 parent::__construct( $text, "RevisionTestModifyableContent" );
463 }
464
465 public function copy() {
466 return new RevisionTestModifyableContent( $this->mText );
467 }
468
469 public function getText() {
470 return $this->mText;
471 }
472
473 public function setText( $text ) {
474 $this->mText = $text;
475 }
476}
477
479
480 public function __construct() {
481 parent::__construct( "RevisionTestModifyableContent", [ CONTENT_FORMAT_TEXT ] );
482 }
483
484 public function unserializeContent( $text, $format = null ) {
485 $this->checkFormat( $format );
486
487 return new RevisionTestModifyableContent( $text );
488 }
489
490 public function makeEmptyContent() {
491 return new RevisionTestModifyableContent( '' );
492 }
493}
serialize()
$GLOBALS['IP']
static makeContent( $text, Title $title=null, $modelId=null, $format=null)
Convenience function for creating a Content object from a given textual representation.
static getCanonicalNamespaces( $rebuild=false)
Returns array of all defined namespaces with their canonical (English) names.
mergeMwGlobalArrayValue( $name, $values)
Merges the given values into a MW global array variable.
setMwGlobals( $pairs, $value=null)
makeEmptyContent()
Creates an empty TextContent object.
unserializeContent( $text, $format=null)
Unserializes a Content object of the type supported by this ContentHandler.
ContentHandler.
testGetContentHandler( $text, $title, $model, $format, $expectedClass)
Database dataGetContentHandler Revision::getContentHandler.
testGetRevisionTextUtf8LegacyGzip()
Revision::getRevisionText.
testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization)
Database dataGetContent Revision::getContent.
testGetSize( $text, $model, $expected_size)
Revision::getSize Database dataGetSize.
testGetSha1( $text, $model, $expected_hash)
Revision::getSha1 Database dataGetSha1.
testGetContentFormat( $text, $title, $model, $format, $expectedFormat)
Database dataGetContentFormat Revision::getContentFormat.
testGetRevisionTextUtf8Legacy()
Revision::getRevisionText.
testGetRevisionTextGzip()
Revision::getRevisionText.
testConstructWithContent()
Revision::__construct.
testGetRevisionTextUtf8Native()
Revision::getRevisionText.
newTestRevision( $text, $title="Test", $model=CONTENT_MODEL_WIKITEXT, $format=null)
testGetContentUncloned()
Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
testCompressRevisionTextUtf8()
Revision::compressRevisionText.
testGetRevisionTextUtf8NativeGzip()
Revision::getRevisionText.
testGetContentClone()
Tests whether $rev->getContent() returns a clone when needed.
testGetText( $text, $title, $model, $format, $audience, $expectedText)
Database dataGetText Revision::getText.
testGetContentModel( $text, $title, $model, $format, $expectedModel)
Database dataGetContentModel Revision::getContentModel.
testCompressRevisionTextUtf8Gzip()
Revision::compressRevisionText.
testConstructWithText()
Revision::__construct.
static compressRevisionText(&$text)
If $wgCompressRevisions is enabled, we will compress data.
static getRevisionText( $row, $prefix='old_', $wiki=false)
Get revision text associated with an old or archive row $row is usually an object from wfFetchRow(),...
static base36Sha1( $text)
Get the base 36 SHA-1 value for a string of text.
const FOR_PUBLIC
Definition Revision.php:83
const RAW
Definition Revision.php:85
Base content handler implementation for flat text contents.
Content object implementation for representing flat text.
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition Title.php:277
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
Definition design.txt:57
when a variable name is used in a function
Definition design.txt:94
when a variable name is used in a it is silently declared as a new local masking the global
Definition design.txt:95
const CONTENT_MODEL_CSS
Definition Defines.php:280
const CONTENT_FORMAT_TEXT
Definition Defines.php:299
const CONTENT_FORMAT_CSS
Definition Defines.php:297
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:278
const CONTENT_FORMAT_WIKITEXT
Definition Defines.php:293
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:279
this hook is for auditing only RecentChangesLinked and Watchlist RecentChangesLinked and Watchlist e g Watchlist removed from all revisions and log entries to which it was applied This gives extensions a chance to take it off their books as the deletion has already been partly carried out by this point or something similar the user will be unable to create the tag set and then return false from the hook function Ensure you consume the ChangeTagAfterDelete hook to carry out custom deletion actions as context called by AbstractContent::getParserOutput May be used to override the normal model specific rendering of page content $content
Definition hooks.txt:1040
namespace and then decline to actually register it file or subcat img or subcat $title
Definition hooks.txt:944
presenting them properly to the user as errors is done by the caller return true use this to change the list i e etc $rev
Definition hooks.txt:1597
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition injection.txt:37
you have access to all of the normal MediaWiki so you can get a DB use the cache