4 * @group ContentHandler
6 class RevisionTest
extends MediaWikiTestCase
{
7 protected function setUp() {
12 $this->setMwGlobals( array(
13 'wgContLang' => Language
::factory( 'en' ),
14 'wgLanguageCode' => 'en',
15 'wgLegacyEncoding' => false,
16 'wgCompressRevisions' => false,
18 'wgContentHandlerTextFallback' => 'ignore',
21 $this->mergeMwGlobalArrayValue(
25 12313 => 'Dummy_talk',
29 $this->mergeMwGlobalArrayValue(
30 'wgNamespaceContentModels',
36 $this->mergeMwGlobalArrayValue(
39 'testing' => 'DummyContentHandlerForTesting',
40 'RevisionTestModifyableContent' => 'RevisionTestModifyableContentHandler',
44 MWNamespace
::getCanonicalNamespaces( true ); # reset namespace cache
45 $wgContLang->resetNamespaces(); # reset namespace cache
51 MWNamespace
::getCanonicalNamespaces( true ); # reset namespace cache
52 $wgContLang->resetNamespaces(); # reset namespace cache
58 * @covers Revision::getRevisionText
60 public function testGetRevisionText() {
63 $row->old_text
= 'This is a bunch of revision text.';
65 'This is a bunch of revision text.',
66 Revision
::getRevisionText( $row ) );
70 * @covers Revision::getRevisionText
72 public function testGetRevisionTextGzip() {
73 $this->checkPHPExtension( 'zlib' );
76 $row->old_flags
= 'gzip';
77 $row->old_text
= gzdeflate( 'This is a bunch of revision text.' );
79 'This is a bunch of revision text.',
80 Revision
::getRevisionText( $row ) );
84 * @covers Revision::getRevisionText
86 public function testGetRevisionTextUtf8Native() {
88 $row->old_flags
= 'utf-8';
89 $row->old_text
= "Wiki est l'\xc3\xa9cole superieur !";
90 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
92 "Wiki est l'\xc3\xa9cole superieur !",
93 Revision
::getRevisionText( $row ) );
97 * @covers Revision::getRevisionText
99 public function testGetRevisionTextUtf8Legacy() {
101 $row->old_flags
= '';
102 $row->old_text
= "Wiki est l'\xe9cole superieur !";
103 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
105 "Wiki est l'\xc3\xa9cole superieur !",
106 Revision
::getRevisionText( $row ) );
110 * @covers Revision::getRevisionText
112 public function testGetRevisionTextUtf8NativeGzip() {
113 $this->checkPHPExtension( 'zlib' );
116 $row->old_flags
= 'gzip,utf-8';
117 $row->old_text
= gzdeflate( "Wiki est l'\xc3\xa9cole superieur !" );
118 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
120 "Wiki est l'\xc3\xa9cole superieur !",
121 Revision
::getRevisionText( $row ) );
125 * @covers Revision::getRevisionText
127 public function testGetRevisionTextUtf8LegacyGzip() {
128 $this->checkPHPExtension( 'zlib' );
131 $row->old_flags
= 'gzip';
132 $row->old_text
= gzdeflate( "Wiki est l'\xe9cole superieur !" );
133 $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
135 "Wiki est l'\xc3\xa9cole superieur !",
136 Revision
::getRevisionText( $row ) );
140 * @covers Revision::compressRevisionText
142 public function testCompressRevisionTextUtf8() {
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" );
157 * @covers Revision::compressRevisionText
159 public function testCompressRevisionTextUtf8Gzip() {
160 $this->checkPHPExtension( 'zlib' );
161 $this->setMwGlobals( 'wgCompressRevisions', true );
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" );
176 # =================================================================================================================
179 * @param string $text
180 * @param string $title
181 * @param string $model
182 * @param null $format
186 function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT
, $format = null ) {
187 if ( is_string( $title ) ) {
188 $title = Title
::newFromText( $title );
191 $content = ContentHandler
::makeContent( $text, $title, $model, $format );
199 'content' => $content,
200 'length' => $content->getSize(),
201 'comment' => "testing",
202 'minor_edit' => false,
204 'content_format' => $format,
211 function dataGetContentModel() {
212 //NOTE: we expect the help namespace to always contain wikitext
214 array( 'hello world', 'Help:Hello', null, null, CONTENT_MODEL_WIKITEXT
),
215 array( 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS
),
216 array( serialize( 'hello world' ), 'Dummy:Hello', null, null, "testing" ),
222 * @dataProvider dataGetContentModel
223 * @covers Revision::getContentModel
225 public function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
226 $rev = $this->newTestRevision( $text, $title, $model, $format );
228 $this->assertEquals( $expectedModel, $rev->getContentModel() );
231 function dataGetContentFormat() {
232 //NOTE: we expect the help namespace to always contain wikitext
234 array( 'hello world', 'Help:Hello', null, null, CONTENT_FORMAT_WIKITEXT
),
235 array( 'hello world', 'Help:Hello', CONTENT_MODEL_CSS
, null, CONTENT_FORMAT_CSS
),
236 array( 'hello world', 'User:hello/there.css', null, null, CONTENT_FORMAT_CSS
),
237 array( serialize( 'hello world' ), 'Dummy:Hello', null, null, "testing" ),
243 * @dataProvider dataGetContentFormat
244 * @covers Revision::getContentFormat
246 public function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
247 $rev = $this->newTestRevision( $text, $title, $model, $format );
249 $this->assertEquals( $expectedFormat, $rev->getContentFormat() );
252 function dataGetContentHandler() {
253 //NOTE: we expect the help namespace to always contain wikitext
255 array( 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ),
256 array( 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ),
257 array( serialize( 'hello world' ), 'Dummy:Hello', null, null, 'DummyContentHandlerForTesting' ),
263 * @dataProvider dataGetContentHandler
264 * @covers Revision::getContentHandler
266 public function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
267 $rev = $this->newTestRevision( $text, $title, $model, $format );
269 $this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
272 function dataGetContent() {
273 //NOTE: we expect the help namespace to always contain wikitext
275 array( 'hello world', 'Help:Hello', null, null, Revision
::FOR_PUBLIC
, 'hello world' ),
276 array( serialize( 'hello world' ), 'Hello', "testing", null, Revision
::FOR_PUBLIC
, serialize( 'hello world' ) ),
277 array( serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision
::FOR_PUBLIC
, serialize( 'hello world' ) ),
283 * @dataProvider dataGetContent
284 * @covers Revision::getContent
286 public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
287 $rev = $this->newTestRevision( $text, $title, $model, $format );
288 $content = $rev->getContent( $audience );
290 $this->assertEquals( $expectedSerialization, is_null( $content ) ?
null : $content->serialize( $format ) );
293 function dataGetText() {
294 //NOTE: we expect the help namespace to always contain wikitext
296 array( 'hello world', 'Help:Hello', null, null, Revision
::FOR_PUBLIC
, 'hello world' ),
297 array( serialize( 'hello world' ), 'Hello', "testing", null, Revision
::FOR_PUBLIC
, null ),
298 array( serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision
::FOR_PUBLIC
, null ),
304 * @dataProvider dataGetText
305 * @covers Revision::getText
307 public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
308 $this->hideDeprecated( 'Revision::getText' );
310 $rev = $this->newTestRevision( $text, $title, $model, $format );
312 $this->assertEquals( $expectedText, $rev->getText( $audience ) );
317 * @dataProvider dataGetText
318 * @covers Revision::getRawText
320 public function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
321 $this->hideDeprecated( 'Revision::getRawText' );
323 $rev = $this->newTestRevision( $text, $title, $model, $format );
325 $this->assertEquals( $expectedText, $rev->getRawText( $audience ) );
328 public function dataGetSize() {
330 array( "hello world.", CONTENT_MODEL_WIKITEXT
, 12 ),
331 array( serialize( "hello world." ), "testing", 12 ),
336 * @covers Revision::getSize
338 * @dataProvider dataGetSize
340 public function testGetSize( $text, $model, $expected_size ) {
341 $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSize', $model );
342 $this->assertEquals( $expected_size, $rev->getSize() );
345 public function dataGetSha1() {
347 array( "hello world.", CONTENT_MODEL_WIKITEXT
, Revision
::base36Sha1( "hello world." ) ),
348 array( serialize( "hello world." ), "testing", Revision
::base36Sha1( serialize( "hello world." ) ) ),
353 * @covers Revision::getSha1
355 * @dataProvider dataGetSha1
357 public function testGetSha1( $text, $model, $expected_hash ) {
358 $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSha1', $model );
359 $this->assertEquals( $expected_hash, $rev->getSha1() );
363 * @covers Revision::__construct
365 public function testConstructWithText() {
366 $this->hideDeprecated( "Revision::getText" );
368 $rev = new Revision( array(
369 'text' => 'hello world.',
370 'content_model' => CONTENT_MODEL_JAVASCRIPT
373 $this->assertNotNull( $rev->getText(), 'no content text' );
374 $this->assertNotNull( $rev->getContent(), 'no content object available' );
375 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $rev->getContent()->getModel() );
376 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $rev->getContentModel() );
380 * @covers Revision::__construct
382 public function testConstructWithContent() {
383 $this->hideDeprecated( "Revision::getText" );
385 $title = Title
::newFromText( 'RevisionTest_testConstructWithContent' );
387 $rev = new Revision( array(
388 'content' => ContentHandler
::makeContent( 'hello world.', $title, CONTENT_MODEL_JAVASCRIPT
),
391 $this->assertNotNull( $rev->getText(), 'no content text' );
392 $this->assertNotNull( $rev->getContent(), 'no content object available' );
393 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $rev->getContent()->getModel() );
394 $this->assertEquals( CONTENT_MODEL_JAVASCRIPT
, $rev->getContentModel() );
398 * Tests whether $rev->getContent() returns a clone when needed.
401 * @covers Revision::getContent
403 public function testGetContentClone() {
404 $content = new RevisionTestModifyableContent( "foo" );
410 'title' => Title
::newFromText( "testGetContentClone_dummy" ),
412 'content' => $content,
413 'length' => $content->getSize(),
414 'comment' => "testing",
415 'minor_edit' => false,
419 $content = $rev->getContent( Revision
::RAW
);
420 $content->setText( "bar" );
422 $content2 = $rev->getContent( Revision
::RAW
);
423 $this->assertNotSame( $content, $content2, "expected a clone" ); // content is mutable, expect clone
424 $this->assertEquals( "foo", $content2->getText() ); // clone should contain the original text
426 $content2->setText( "bla bla" );
427 $this->assertEquals( "bar", $content->getText() ); // clones should be independent
431 * Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
434 * @covers Revision::getContent
436 public function testGetContentUncloned() {
437 $rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT
);
438 $content = $rev->getContent( Revision
::RAW
);
439 $content2 = $rev->getContent( Revision
::RAW
);
441 // for immutable content like wikitext, this should be the same object
442 $this->assertSame( $content, $content2 );
446 class RevisionTestModifyableContent
extends TextContent
{
447 public function __construct( $text ) {
448 parent
::__construct( $text, "RevisionTestModifyableContent" );
451 public function copy() {
452 return new RevisionTestModifyableContent( $this->mText
);
455 public function getText() {
459 public function setText( $text ) {
460 $this->mText
= $text;
464 class RevisionTestModifyableContentHandler
extends TextContentHandler
{
466 public function __construct() {
467 parent
::__construct( "RevisionTestModifyableContent", array( CONTENT_FORMAT_TEXT
) );
470 public function unserializeContent( $text, $format = null ) {
471 $this->checkFormat( $format );
473 return new RevisionTestModifyableContent( $text );
476 public function makeEmptyContent() {
477 return new RevisionTestModifyableContent( '' );