2 * VisualEditor DataModel ResourceQueue tests.
4 * @copyright 2011-2018 VisualEditor Team and others; see http://ve.mit-license.org
7 QUnit
.module( 'mediawiki.widgets.APIResultsQueue' );
10 var itemCounter
, FullResourceProvider
, EmptyResourceProvider
, SingleResultResourceProvider
;
13 FullResourceProvider = function ( config
) {
15 this.responseDelay
= 1;
17 FullResourceProvider
.super.call( this, '', config
);
19 EmptyResourceProvider = function ( config
) {
21 this.responseDelay
= 1;
23 EmptyResourceProvider
.super.call( this, '', config
);
25 SingleResultResourceProvider = function ( config
) {
27 this.responseDelay
= 1;
29 SingleResultResourceProvider
.super.call( this, '', config
);
32 OO
.inheritClass( FullResourceProvider
, mw
.widgets
.APIResultsProvider
);
33 OO
.inheritClass( EmptyResourceProvider
, mw
.widgets
.APIResultsProvider
);
34 OO
.inheritClass( SingleResultResourceProvider
, mw
.widgets
.APIResultsProvider
);
36 FullResourceProvider
.prototype.getResults = function ( howMany
) {
39 deferred
= $.Deferred();
41 for ( i
= itemCounter
; i
< itemCounter
+ howMany
; i
++ ) {
42 result
.push( 'result ' + ( i
+ 1 ) );
48 // Always resolve with some values
49 deferred
.resolve( result
);
53 return deferred
.promise( { abort: function () { clearTimeout( timer
); } } );
56 EmptyResourceProvider
.prototype.getResults = function () {
58 deferred
= $.Deferred(),
61 provider
.toggleDepleted( true );
62 // Always resolve with empty value
63 deferred
.resolve( [] );
67 return deferred
.promise( { abort: function () { clearTimeout( timer
); } } );
70 SingleResultResourceProvider
.prototype.getResults = function ( howMany
) {
73 deferred
= $.Deferred();
77 provider
.toggleDepleted( howMany
> 1 );
78 // Always resolve with one value
79 deferred
.resolve( [ 'one result (' + ( itemCounter
++ + 1 ) + ')' ] );
83 return deferred
.promise( { abort: function () { clearTimeout( timer
); } } );
88 QUnit
.test( 'Query providers', function ( assert
) {
89 var done
= assert
.async(),
91 new FullResourceProvider(),
92 new EmptyResourceProvider(),
93 new SingleResultResourceProvider()
95 queue
= new mw
.widgets
.APIResultsQueue( {
101 // Add providers to queue
102 queue
.setProviders( providers
);
104 // Set parameters and fetch
105 queue
.setParams( { foo
: 'bar' } );
108 .then( function ( data
) {
109 // Check that we received all requested results
110 assert
.strictEqual( data
.length
, 10, 'Query 1: Results received.' );
111 // We've asked for 10 items + 2 threshold from all providers.
112 // Provider 1 returned 12 results
113 // Provider 2 returned 0 results
114 // Provider 3 returned 1 results
115 // Overall 13 results. 10 were retrieved. 3 left in queue.
116 assert
.strictEqual( queue
.getQueueSize(), 3, 'Query 1: Remaining queue size.' );
118 // Check if sources are depleted
119 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 1: Full provider not depleted.' );
120 assert
.strictEqual( providers
[ 1 ].isDepleted(), true, 'Query 1: Empty provider is depleted.' );
121 assert
.strictEqual( providers
[ 2 ].isDepleted(), true, 'Query 1: Single result provider is depleted.' );
123 // Ask for more results
124 return queue
.get( 10 );
126 .then( function ( data1
) {
127 // This time, only provider 1 was queried, because the other
128 // two were marked as depleted.
129 // * We asked for 10 items
130 // * There are currently 3 items in the queue
131 // * The queue queried provider #1 for 12 items
132 // * The queue returned 10 results as requested
133 // * 5 results are now left in the queue.
134 assert
.strictEqual( data1
.length
, 10, 'Query 1: Second set of results received.' );
135 assert
.strictEqual( queue
.getQueueSize(), 5, 'Query 1: Remaining queue size.' );
138 queue
.setParams( { foo
: 'baz' } );
139 // Check if sources are depleted
140 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 2: Full provider not depleted.' );
141 assert
.strictEqual( providers
[ 1 ].isDepleted(), false, 'Query 2: Empty provider not depleted.' );
142 assert
.strictEqual( providers
[ 2 ].isDepleted(), false, 'Query 2: Single result provider not depleted.' );
144 return queue
.get( 10 );
146 .then( function ( data2
) {
147 // This should be the same as the very first result
148 assert
.strictEqual( data2
.length
, 10, 'Query 2: Results received.' );
149 assert
.strictEqual( queue
.getQueueSize(), 3, 'Query 2: Remaining queue size.' );
150 // Check if sources are depleted
151 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 2: Full provider not depleted.' );
152 assert
.strictEqual( providers
[ 1 ].isDepleted(), true, 'Query 2: Empty provider is not depleted.' );
153 assert
.strictEqual( providers
[ 2 ].isDepleted(), true, 'Query 2: Single result provider is not depleted.' );
155 // Finish the async test
159 QUnit
.test( 'Abort providers', function ( assert
) {
160 var done
= assert
.async(),
162 biggerQueue
= new mw
.widgets
.APIResultsQueue( {
166 new FullResourceProvider(),
167 new EmptyResourceProvider(),
168 new SingleResultResourceProvider()
173 // Make the delay higher
174 providers
.forEach( function ( provider
) { provider
.responseDelay
= 3; } );
176 // Add providers to queue
177 biggerQueue
.setProviders( providers
);
179 biggerQueue
.setParams( { foo
: 'bar' } );
180 biggerQueue
.get( 100 )
181 .always( function () {
182 // This should only run if the promise wasn't aborted
186 // Make the delay higher
187 providers
.forEach( function ( provider
) { provider
.responseDelay
= 5; } );
189 biggerQueue
.setParams( { foo
: 'baz' } );
190 biggerQueue
.get( 10 )
192 assert
.strictEqual( completed
, false, 'Provider promises aborted.' );
194 // Finish the async test
197 }( jQuery
, mediaWiki
) );