MediaWiki  REL1_24
RCCacheEntryFactoryTest.php
Go to the documentation of this file.
00001 <?php
00002 
00011 class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
00012 
00016     private $testRecentChangesHelper;
00017 
00018     public function __construct( $name = null, array $data = array(), $dataName = '' ) {
00019         parent::__construct( $name, $data, $dataName );
00020 
00021         $this->testRecentChangesHelper = new TestRecentChangesHelper();
00022     }
00023 
00024     protected function setUp() {
00025         parent::setUp();
00026 
00027         $this->setMwGlobals( array(
00028             'wgArticlePath' => '/wiki/$1'
00029         ) );
00030     }
00031 
00035     public function testNewFromRecentChange( $expected, $context, $messages,
00036         $recentChange, $watched
00037     ) {
00038         $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
00039         $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
00040 
00041         $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
00042 
00043         $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
00044         $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
00045         $this->assertEquals(
00046             $expected['numberofWatchingusers'], $cacheEntry->numberofWatchingusers,
00047             'watching users'
00048         );
00049         $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
00050 
00051         $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
00052         $this->assertTitleLink( 'Xyz', $cacheEntry );
00053 
00054         $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
00055         $this->assertQueryLink( 'prev', $expected['diff'], $cacheEntry->lastlink, 'prev link' );
00056         $this->assertQueryLink( 'diff', $expected['diff'], $cacheEntry->difflink, 'diff link' );
00057     }
00058 
00059     public function editChangeProvider() {
00060         return array(
00061             array(
00062                 array(
00063                     'title' => 'Xyz',
00064                     'user' => 'TestRecentChangesUser',
00065                     'diff' => array( 'curid' => 5, 'diff' => 191, 'oldid' => 190 ),
00066                     'cur' => array( 'curid' => 5, 'diff' => 0, 'oldid' => 191 ),
00067                     'timestamp' => '21:21',
00068                     'numberofWatchingusers' => 0,
00069                     'unpatrolled' => false
00070                 ),
00071                 $this->getContext(),
00072                 $this->getMessages(),
00073                 $this->testRecentChangesHelper->makeEditRecentChange(
00074                     $this->getTestUser(),
00075                     'Xyz',
00076                     5, // curid
00077                     191, // thisid
00078                     190, // lastid
00079                     '20131103212153',
00080                     0, // counter
00081                     0 // number of watching users
00082                 ),
00083                 false
00084             )
00085         );
00086     }
00087 
00091     public function testNewForDeleteChange( $expected, $context, $messages, $recentChange, $watched ) {
00092         $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
00093         $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
00094 
00095         $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
00096 
00097         $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
00098         $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
00099         $this->assertEquals(
00100             $expected['numberofWatchingusers'],
00101             $cacheEntry->numberofWatchingusers, 'watching users'
00102         );
00103         $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
00104 
00105         $this->assertDeleteLogLink( $cacheEntry );
00106         $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
00107 
00108         $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
00109         $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
00110         $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
00111     }
00112 
00113     public function deleteChangeProvider() {
00114         return array(
00115             array(
00116                 array(
00117                     'title' => 'Abc',
00118                     'user' => 'TestRecentChangesUser',
00119                     'timestamp' => '21:21',
00120                     'numberofWatchingusers' => 0,
00121                     'unpatrolled' => false
00122                 ),
00123                 $this->getContext(),
00124                 $this->getMessages(),
00125                 $this->testRecentChangesHelper->makeLogRecentChange(
00126                     'delete',
00127                     'delete',
00128                     $this->getTestUser(),
00129                     'Abc',
00130                     '20131103212153',
00131                     0, // counter
00132                     0 // number of watching users
00133                 ),
00134                 false
00135             )
00136         );
00137     }
00138 
00142     public function testNewForRevUserDeleteChange( $expected, $context, $messages,
00143         $recentChange, $watched
00144     ) {
00145         $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
00146         $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
00147 
00148         $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
00149 
00150         $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
00151         $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
00152         $this->assertEquals(
00153             $expected['numberofWatchingusers'],
00154             $cacheEntry->numberofWatchingusers, 'watching users'
00155         );
00156         $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
00157 
00158         $this->assertRevDel( $cacheEntry );
00159         $this->assertTitleLink( 'Zzz', $cacheEntry );
00160 
00161         $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
00162         $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
00163         $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
00164     }
00165 
00166     public function revUserDeleteProvider() {
00167         return array(
00168             array(
00169                 array(
00170                     'title' => 'Zzz',
00171                     'user' => 'TestRecentChangesUser',
00172                     'diff' => '',
00173                     'cur' => '',
00174                     'timestamp' => '21:21',
00175                     'numberofWatchingusers' => 0,
00176                     'unpatrolled' => false
00177                 ),
00178                 $this->getContext(),
00179                 $this->getMessages(),
00180                 $this->testRecentChangesHelper->makeDeletedEditRecentChange(
00181                     $this->getTestUser(),
00182                     'Zzz',
00183                     '20131103212153',
00184                     191, // thisid
00185                     190, // lastid
00186                     '20131103212153',
00187                     0, // counter
00188                     0 // number of watching users
00189                 ),
00190                 false
00191             )
00192         );
00193     }
00194 
00195     private function assertUserLinks( $user, $cacheEntry ) {
00196         $this->assertTag(
00197             array(
00198                 'tag' => 'a',
00199                 'attributes' => array(
00200                     'class' => 'new mw-userlink'
00201                 ),
00202                 'content' => $user
00203             ),
00204             $cacheEntry->userlink,
00205             'verify user link'
00206         );
00207 
00208         $this->assertTag(
00209             array(
00210                 'tag' => 'span',
00211                 'attributes' => array(
00212                     'class' => 'mw-usertoollinks'
00213                 ),
00214                 'child' => array(
00215                     'tag' => 'a',
00216                     'content' => 'Talk',
00217                 )
00218             ),
00219             $cacheEntry->usertalklink,
00220             'verify user talk link'
00221         );
00222 
00223         $this->assertTag(
00224             array(
00225                 'tag' => 'span',
00226                 'attributes' => array(
00227                     'class' => 'mw-usertoollinks'
00228                 ),
00229                 'child' => array(
00230                     'tag' => 'a',
00231                     'content' => 'contribs',
00232                 )
00233             ),
00234             $cacheEntry->usertalklink,
00235             'verify user tool links'
00236         );
00237     }
00238 
00239     private function assertDeleteLogLink( $cacheEntry ) {
00240         $this->assertTag(
00241             array(
00242                 'tag' => 'a',
00243                 'attributes' => array(
00244                     'href' => '/wiki/Special:Log/delete',
00245                     'title' => 'Special:Log/delete'
00246                 ),
00247                 'content' => 'Deletion log'
00248             ),
00249             $cacheEntry->link,
00250             'verify deletion log link'
00251         );
00252     }
00253 
00254     private function assertRevDel( $cacheEntry ) {
00255         $this->assertTag(
00256             array(
00257                 'tag' => 'span',
00258                 'attributes' => array(
00259                     'class' => 'history-deleted'
00260                 ),
00261                 'content' => '(username removed)'
00262             ),
00263             $cacheEntry->userlink,
00264             'verify user link for change with deleted revision and user'
00265         );
00266     }
00267 
00268     private function assertTitleLink( $title, $cacheEntry ) {
00269         $this->assertTag(
00270             array(
00271                 'tag' => 'a',
00272                 'attributes' => array(
00273                     'href' => '/wiki/' . $title,
00274                     'title' => $title
00275                 ),
00276                 'content' => $title
00277             ),
00278             $cacheEntry->link,
00279             'verify title link'
00280         );
00281     }
00282 
00283     private function assertQueryLink( $content, $params, $link ) {
00284         $this->assertTag(
00285             array(
00286                 'tag' => 'a',
00287                 'content' => $content
00288             ),
00289             $link,
00290             'assert query link element'
00291         );
00292 
00293         foreach ( $params as $key => $value ) {
00294             $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
00295         }
00296     }
00297 
00298     private function getMessages() {
00299         return array(
00300             'cur' => 'cur',
00301             'diff' => 'diff',
00302             'hist' => 'hist',
00303             'enhancedrc-history' => 'history',
00304             'last' => 'prev',
00305             'blocklink' => 'block',
00306             'history' => 'Page history',
00307             'semicolon-separator' => '; ',
00308             'pipe-separator' => ' | '
00309         );
00310     }
00311 
00312     private function getTestUser() {
00313         $user = User::newFromName( 'TestRecentChangesUser' );
00314 
00315         if ( !$user->getId() ) {
00316             $user->addToDatabase();
00317         }
00318 
00319         return $user;
00320     }
00321 
00322     private function getContext() {
00323         $user = $this->getTestUser();
00324         $context = $this->testRecentChangesHelper->getTestContext( $user );
00325 
00326         $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
00327         $context->setTitle( $title );
00328 
00329         return $context;
00330     }
00331 }