applicationFactory = ApplicationFactory::getInstance(); $GLOBALS['smwgEnableUpdateJobs'] = true; $settings = [ 'smwgEnableUpdateJobs' => true ]; foreach ( $settings as $key => $value ) { $this->applicationFactory->getSettings()->set( $key, $value ); } parent::runJobs( [ 'minJobs' => 0 ], [ 'complete' => true ] ); $this->jobQueue = $this->applicationFactory->getJobQueue(); $this->jobQueueRunner = $utilityFactory->newRunnerFactory()->newJobQueueRunner(); } protected function tearDown(): void { $this->applicationFactory->clear(); parent::tearDown(); } public function testPageMoveTriggersUpdateJobWithImmediateExecution() { // configured to run immediately, so after it was run, the number of exprected jobs in queue will be 0 parent::runJobs( [ 'minJobs' => 0, 'complete' => false ] ); $newTitle = MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ . '-new' ); $wikiPage = parent::getNonexistingTestPage( __METHOD__ . '-old' ); parent::editPage( $wikiPage, '[[Has jobqueue test::UpdateJob]]' ); $title = $wikiPage->getTitle(); // ---- taken from mediawiki/tests/phpunit/includes/page/MovePageTest.php $createRedirect = true; $pageId = $title->getArticleID(); $status = MediaWikiServices::getInstance() ->getMovePageFactory() ->newMovePage( $title, $newTitle ) ->move( $this->getTestUser()->getUser(), 'move reason', $createRedirect ); $this->assertStatusOK( $status ); // ==== // expected 0 jobs in jobQueue because the job is run instantly with immediate execution parent::runJobs( [ 'numJobs' => 0 ], [ 'type' => 'smw.update' ] ); } public function testSQLStoreRefreshDataTriggersUpdateJob() { $index = 1; // pass-by-reference $this->getStore()->refreshData( $index, 1, false, true )->rebuild( $index ); $this->assertJob( 'smw.update' ); } /** * @dataProvider jobFactoryProvider */ public function testJobFactory( $jobName, $type ) { $job = Job::factory( $jobName, MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ . $jobName ), [] ); $this->assertJob( $type, $job ); } public function jobFactoryProvider() { $provider = []; $provider[] = [ 'SMW\UpdateJob', 'smw.update' ]; $provider[] = [ 'SMW\UpdateJob', 'SMW\UpdateJob' ]; $provider[] = [ 'SMWUpdateJob', 'SMW\UpdateJob' ]; $provider[] = [ 'SMW\RefreshJob', 'smw.refresh' ]; $provider[] = [ 'SMW\RefreshJob', 'SMW\RefreshJob' ]; $provider[] = [ 'SMWRefreshJob', 'SMW\RefreshJob' ]; return $provider; } public function titleProvider() { $provider = []; $titleFactory = MediaWikiServices::getInstance()->getTitleFactory(); // #0 Simple property reference $provider[] = [ [ 'title' => $titleFactory->newFromText( __METHOD__ . '-foo' ), 'edit' => '{{#set:|DeferredJobFoo=DeferredJobBar}}' ], [ 'title' => $titleFactory->newFromText( __METHOD__ . '-bar' ), 'edit' => '{{#set:|DeferredJobFoo=DeferredJobBar}}' ] ]; // #1 Source page in-property reference $title = $titleFactory->newFromText( __METHOD__ . '-foo' ); $provider[] = [ [ 'title' => $title, 'edit' => '' ], [ 'title' => $titleFactory->newFromText( __METHOD__ . '-bar' ), 'edit' => '{{#set:|DeferredJobFoo=' . $title->getPrefixedText() . '}}' ] ]; return $provider; } protected function assertJob( $type, ?Job &$job = null ) { if ( $job === null ) { $job = $this->jobQueueRunner->pop_type( $type ); } if ( !$job ) { $this->markTestSkipped( "Required a {$type} JobQueue entry" ); } $this->job = $job; $this->assertInstanceOf( 'Job', $job ); $this->assertTrue( $job->run() ); } public function testNoInfiniteUpdateJobsForCircularRedirect() { $pageA = parent::getNonexistingTestPage( 'Foo-A' ); $pageB = parent::getNonexistingTestPage( 'Foo-B' ); $pageC = parent::getNonexistingTestPage( 'Foo-C' ); parent::editPage( $pageA, '[[Foo-A::{{PAGENAME}}]] {{#ask: [[Foo-A::{{PAGENAME}}]] }}' ); parent::editPage( $pageA, '#REDIRECT [[Foo-B]]' ); $titleA = $pageA->getTitle(); parent::editPage( $pageB, '#REDIRECT [[Foo-C]]' ); $titleB = $pageB->getTitle(); parent::editPage( $pageC, '#REDIRECT [[Foo-A]]' ); $titleC = $pageC->getTitle(); // expected 0 jobs in jobQueue because the job is run instantly with immediate execution parent::runJobs( [ 'minJobs' => 0 ], [ 'type' => 'smw.update' ] ); foreach ( $this->jobQueueRunner->getStatus() as $status ) { $this->assertTrue( $status['status'] ); } $this->assertTrue( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( 'Foo-A' )->isRedirect() ); } }