%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/dm/ |
| Current File : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/dm/ve.dm.APIResultsQueue.test.js |
/*!
* VisualEditor DataModel ResourceQueue tests.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
var itemCounter, responseDelay, FullResourceProvider, EmptyResourceProvider, SingleResultResourceProvider;
QUnit.module( 've.dm.APIResultsQueue' );
itemCounter = 0;
responseDelay = 1;
FullResourceProvider = function VeDmFullResourceProvider( config ) {
this.timer = null;
// Inheritance
FullResourceProvider.super.call( this, '', config );
};
EmptyResourceProvider = function VeDmEmptyResourceProvider( config ) {
this.timer = null;
// Inheritance
EmptyResourceProvider.super.call( this, '', config );
};
SingleResultResourceProvider = function VeDmSingleResultResourceProvider( config ) {
this.timer = null;
// Inheritance
SingleResultResourceProvider.super.call( this, '', config );
};
OO.inheritClass( FullResourceProvider, ve.dm.APIResultsProvider );
OO.inheritClass( EmptyResourceProvider, ve.dm.APIResultsProvider );
OO.inheritClass( SingleResultResourceProvider, ve.dm.APIResultsProvider );
FullResourceProvider.prototype.getResults = function ( howMany ) {
var i, timer,
result = [],
deferred = $.Deferred();
for ( i = itemCounter; i < itemCounter + howMany; i++ ) {
result.push( 'result ' + ( i + 1 ) );
}
itemCounter = i;
timer = setTimeout(
function () {
// Always resolve with some values
deferred.resolve( result );
},
responseDelay );
return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
};
EmptyResourceProvider.prototype.getResults = function () {
var provider = this,
deferred = $.Deferred(),
timer = setTimeout(
function () {
provider.toggleDepleted( true );
// Always resolve with empty value
deferred.resolve( [] );
},
responseDelay );
return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
};
SingleResultResourceProvider.prototype.getResults = function ( howMany ) {
var timer,
provider = this,
deferred = $.Deferred();
timer = setTimeout(
function () {
provider.toggleDepleted( howMany > 1 );
// Always resolve with one value
deferred.resolve( [ 'one result (' + ( itemCounter++ + 1 ) + ')' ] );
},
responseDelay );
return deferred.promise( { abort: function () { clearTimeout( timer ); } } );
};
/* Tests */
QUnit.test( 'Query providers', function ( assert ) {
var done = assert.async(),
providers = [
new FullResourceProvider(),
new EmptyResourceProvider(),
new SingleResultResourceProvider()
],
queue = new ve.dm.APIResultsQueue( {
threshold: 2
} );
assert.expect( 15 );
// Add providers to queue
queue.setProviders( providers );
// Set parameters and fetch
queue.setParams( { foo: 'bar' } );
queue.get( 10 )
.then( function ( data ) {
// Check that we received all requested results
assert.equal( data.length, 10, 'Query 1: Results received.' );
// We've asked for 10 items + 2 threshold from all providers.
// Provider 1 returned 12 results
// Provider 2 returned 0 results
// Provider 3 returned 1 results
// Overall 13 results. 10 were retrieved. 3 left in queue.
assert.equal( queue.getQueueSize(), 3, 'Query 1: Remaining queue size.' );
// Check if sources are depleted
assert.ok( !providers[ 0 ].isDepleted(), 'Query 1: Full provider not depleted.' );
assert.ok( providers[ 1 ].isDepleted(), 'Query 1: Empty provider is depleted.' );
assert.ok( providers[ 2 ].isDepleted(), 'Query 1: Single result provider is depleted.' );
// Ask for more results
return queue.get( 10 );
} )
.then( function ( data1 ) {
// This time, only provider 1 was queried, because the other
// two were marked as depleted.
// * We asked for 10 items
// * There are currently 3 items in the queue
// * The queue queried provider #1 for 12 items
// * The queue returned 10 results as requested
// * 5 results are now left in the queue.
assert.equal( data1.length, 10, 'Query 1: Second set of results received.' );
assert.equal( queue.getQueueSize(), 5, 'Query 1: Remaining queue size.' );
// Change the query
queue.setParams( { foo: 'baz' } );
// Check if sources are depleted
assert.ok( !providers[ 0 ].isDepleted(), 'Query 2: Full provider not depleted.' );
assert.ok( !providers[ 1 ].isDepleted(), 'Query 2: Empty provider not depleted.' );
assert.ok( !providers[ 2 ].isDepleted(), 'Query 2: Single result provider not depleted.' );
return queue.get( 10 );
} )
.then( function ( data2 ) {
// This should be the same as the very first result
assert.equal( data2.length, 10, 'Query 2: Results received.' );
assert.equal( queue.getQueueSize(), 3, 'Query 2: Remaining queue size.' );
// Check if sources are depleted
assert.ok( !providers[ 0 ].isDepleted(), 'Query 2: Full provider not depleted.' );
assert.ok( providers[ 1 ].isDepleted(), 'Query 2: Empty provider is not depleted.' );
assert.ok( providers[ 2 ].isDepleted(), 'Query 2: Single result provider is not depleted.' );
} )
// Finish the async test
.then( done );
} );
QUnit.test( 'Abort providers', function ( assert ) {
var done = assert.async(),
completed = false,
biggerQueue = new ve.dm.APIResultsQueue( {
threshold: 5
} ),
providers2 = [
new FullResourceProvider(),
new EmptyResourceProvider(),
new SingleResultResourceProvider()
];
assert.expect( 1 );
// Make the delay higher
responseDelay = 3;
// Add providers to queue
biggerQueue.setProviders( providers2 );
biggerQueue.setParams( { foo: 'bar' } );
biggerQueue.get( 100 )
.always( function () {
// This should only run if the promise wasn't aborted
completed = true;
} );
// Make the delay higher
responseDelay = 5;
biggerQueue.setParams( { foo: 'baz' } );
biggerQueue.get( 10 )
.then( function () {
assert.ok( !completed, 'Provider promises aborted.' );
} )
// Finish the async test
.then( done );
} );