1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- const MWBot = require( 'mwbot' ),
- Page = require( 'wdio-mediawiki/Page' ),
- FRONTPAGE_REQUESTS_MAX_RUNS = 10; // (arbitrary) safe-guard against endless execution
- /**
- * Trigger the execution of jobs
- *
- * @see https://www.mediawiki.org/wiki/Manual:Job_queue/For_developers#Execution_of_jobs
- *
- * Use RunJobs.run() to ensure that jobs are executed before making assertions that depend on it.
- *
- * Systems that are selenium-tested are usually provisioned for that purpose, see no organic
- * traffic, consequently typical post-send job queue processing rarely happens. Additionally,
- * test set-up is often done through the API, requests to which do not trigger job queue
- * processing at all.
- *
- * This can lead to an accumulation of unprocessed jobs, which in turn would render certain
- * assertions impossible - e.g. checking a page is listed on Special:RecentChanges right
- * after creating it.
- *
- * This class will try to trigger job execution through
- * repeated blunt requests against the wiki's home page to trigger them at a rate
- * of $wgJobRunRate per request.
- */
- class RunJobs {
- static run() {
- browser.call( () => {
- return this.runThroughFrontPageRequests();
- } );
- }
- static getJobCount() {
- let bot = new MWBot( {
- apiUrl: `${browser.options.baseUrl}/api.php`
- } );
- return new Promise( ( resolve ) => {
- return bot.request( {
- action: 'query',
- meta: 'siteinfo',
- siprop: 'statistics'
- } ).then( ( response ) => {
- resolve( response.query.statistics.jobs );
- } );
- } );
- }
- static runThroughFrontPageRequests( runCount = 1 ) {
- let page = new Page();
- this.log( `through requests to the front page (run ${runCount}).` );
- page.openTitle( '' );
- return this.getJobCount().then( ( jobCount ) => {
- if ( jobCount === 0 ) {
- this.log( 'found no more queued jobs.' );
- return;
- }
- this.log( `detected ${jobCount} more queued job(s).` );
- if ( runCount >= FRONTPAGE_REQUESTS_MAX_RUNS ) {
- this.log( 'stopping requests to the front page due to reached limit.' );
- return;
- }
- return this.runThroughFrontPageRequests( ++runCount );
- } );
- }
- static log( message ) {
- process.stdout.write( `RunJobs ${message}\n` );
- }
- }
- module.exports = RunJobs;
|