Add a RefreshLinks job when a template is deleted
authorBrad Jorsch <bjorsch@wikimedia.org>
Wed, 6 Nov 2013 17:51:23 +0000 (12:51 -0500)
committerBrad Jorsch <bjorsch@wikimedia.org>
Wed, 6 Nov 2013 17:56:53 +0000 (12:56 -0500)
When a template is deleted, all pages transcluding it need to be
reparsed so that entries for transcluding pages in the various links
tables due to the transcluded content are properly removed.

Bug: 5382
Change-Id: I838b546caa3f5887e6bd312017c1fa71d3c3463a

includes/WikiPage.php
tests/phpunit/includes/TemplateCategoriesTest.php

index 6d2d80c..576979c 100644 (file)
@@ -2747,6 +2747,9 @@ class WikiPage implements Page, IDBAccessObject {
                $updates = $this->getDeletionUpdates( $content );
                DataUpdate::runUpdates( $updates );
 
+               // Reparse any pages transcluding this page
+               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+
                // Clear caches
                WikiPage::onArticleDelete( $this->mTitle );
 
index fb63a56..b0d1726 100644 (file)
@@ -11,11 +11,11 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
         * @covers Title::getParentCategories
         */
        public function testTemplateCategories() {
-               $title = Title::newFromText( "Categorized from template" );
-               $page = WikiPage::factory( $title );
                $user = new User();
-               $user->mRights = array( 'createpage', 'edit', 'purge' );
+               $user->mRights = array( 'createpage', 'edit', 'purge', 'delete' );
 
+               $title = Title::newFromText( "Categorized from template" );
+               $page = WikiPage::factory( $title );
                $page->doEditContent(
                        new WikitextContent( '{{Categorising template}}' ),
                        'Create a page with a template',
@@ -25,12 +25,13 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                );
 
                $this->assertEquals(
-                       array()
-                       , $title->getParentCategories()
+                       array(),
+                       $title->getParentCategories(),
+                       'Verify that the category doesn\'t contain the page before the template is created'
                );
 
+               // Create template
                $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-
                $template->doEditContent(
                        new WikitextContent( '[[Category:Solved bugs]]' ),
                        'Add a category through a template',
@@ -45,9 +46,51 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
                $jobs->execute();
 
+               // Make sure page is in the category
                $this->assertEquals(
-                       array( 'Category:Solved_bugs' => $title->getPrefixedText() )
-                       , $title->getParentCategories()
+                       array( 'Category:Solved_bugs' => $title->getPrefixedText() ),
+                       $title->getParentCategories(),
+                       'Verify that the page is in the category after the template is created'
+               );
+
+               // Edit the template
+               $template->doEditContent(
+                       new WikitextContent( '[[Category:Solved bugs 2]]' ),
+                       'Change the category added by the template',
+                       0,
+                       false,
+                       $user
                );
+
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
+               // Make sure page is in the right category
+               $this->assertEquals(
+                       array( 'Category:Solved_bugs_2' => $title->getPrefixedText() ),
+                       $title->getParentCategories(),
+                       'Verify that the page is in the right category after the template is edited'
+               );
+
+               // Now delete the template
+               $error = '';
+               $template->doDeleteArticleReal( 'Delete the template', false, 0, true, $error, $user );
+
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
+               // Make sure the page is no longer in the category
+               $this->assertEquals(
+                       array(),
+                       $title->getParentCategories(),
+                       'Verify that the page is no longer in the category after template deletion'
+               );
+
        }
 }