gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/MediaWiki/Jobs/UpdateJobRoundtripTest.php

192 lines
5.3 KiB
PHP

<?php
namespace SMW\Tests\Integration\MediaWiki\Jobs;
use Job;
use MediaWiki\MediaWikiServices;
use SMW\Services\ServicesFactory as ApplicationFactory;
use SMW\Tests\SMWIntegrationTestCase;
use SMW\Tests\Utils\UtilityFactory;
/**
* @group semantic-mediawiki
* @group Database
* @group medium
*
* @license GPL-2.0-or-later
* @since 1.9.1
*
* @author mwjames
*/
class UpdateJobRoundtripTest extends SMWIntegrationTestCase {
private $job = null;
private $applicationFactory;
private $deletePoolOfPages = [];
private $runnerFactory;
private $mwHooksHandler;
private $semanticDataValidator;
private $pageDeleter;
private $pageCreator;
private $jobQueueRunner;
private $jobQueue;
protected function setUp(): void {
$utilityFactory = UtilityFactory::getInstance();
$this->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()
);
}
}