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 () {
54 clearTimeout( timer
);
58 EmptyResourceProvider
.prototype.getResults = function () {
60 deferred
= $.Deferred(),
63 provider
.toggleDepleted( true );
64 // Always resolve with empty value
65 deferred
.resolve( [] );
69 return deferred
.promise( { abort: function () {
70 clearTimeout( timer
);
74 SingleResultResourceProvider
.prototype.getResults = function ( howMany
) {
77 deferred
= $.Deferred();
81 provider
.toggleDepleted( howMany
> 1 );
82 // Always resolve with one value
83 deferred
.resolve( [ 'one result (' + ( itemCounter
++ + 1 ) + ')' ] );
87 return deferred
.promise( { abort: function () {
88 clearTimeout( timer
);
94 QUnit
.test( 'Query providers', function ( assert
) {
95 var done
= assert
.async(),
97 new FullResourceProvider(),
98 new EmptyResourceProvider(),
99 new SingleResultResourceProvider()
101 queue
= new mw
.widgets
.APIResultsQueue( {
107 // Add providers to queue
108 queue
.setProviders( providers
);
110 // Set parameters and fetch
111 queue
.setParams( { foo
: 'bar' } );
114 .then( function ( data
) {
115 // Check that we received all requested results
116 assert
.strictEqual( data
.length
, 10, 'Query 1: Results received.' );
117 // We've asked for 10 items + 2 threshold from all providers.
118 // Provider 1 returned 12 results
119 // Provider 2 returned 0 results
120 // Provider 3 returned 1 results
121 // Overall 13 results. 10 were retrieved. 3 left in queue.
122 assert
.strictEqual( queue
.getQueueSize(), 3, 'Query 1: Remaining queue size.' );
124 // Check if sources are depleted
125 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 1: Full provider not depleted.' );
126 assert
.strictEqual( providers
[ 1 ].isDepleted(), true, 'Query 1: Empty provider is depleted.' );
127 assert
.strictEqual( providers
[ 2 ].isDepleted(), true, 'Query 1: Single result provider is depleted.' );
129 // Ask for more results
130 return queue
.get( 10 );
132 .then( function ( data1
) {
133 // This time, only provider 1 was queried, because the other
134 // two were marked as depleted.
135 // * We asked for 10 items
136 // * There are currently 3 items in the queue
137 // * The queue queried provider #1 for 12 items
138 // * The queue returned 10 results as requested
139 // * 5 results are now left in the queue.
140 assert
.strictEqual( data1
.length
, 10, 'Query 1: Second set of results received.' );
141 assert
.strictEqual( queue
.getQueueSize(), 5, 'Query 1: Remaining queue size.' );
144 queue
.setParams( { foo
: 'baz' } );
145 // Check if sources are depleted
146 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 2: Full provider not depleted.' );
147 assert
.strictEqual( providers
[ 1 ].isDepleted(), false, 'Query 2: Empty provider not depleted.' );
148 assert
.strictEqual( providers
[ 2 ].isDepleted(), false, 'Query 2: Single result provider not depleted.' );
150 return queue
.get( 10 );
152 .then( function ( data2
) {
153 // This should be the same as the very first result
154 assert
.strictEqual( data2
.length
, 10, 'Query 2: Results received.' );
155 assert
.strictEqual( queue
.getQueueSize(), 3, 'Query 2: Remaining queue size.' );
156 // Check if sources are depleted
157 assert
.strictEqual( providers
[ 0 ].isDepleted(), false, 'Query 2: Full provider not depleted.' );
158 assert
.strictEqual( providers
[ 1 ].isDepleted(), true, 'Query 2: Empty provider is not depleted.' );
159 assert
.strictEqual( providers
[ 2 ].isDepleted(), true, 'Query 2: Single result provider is not depleted.' );
161 // Finish the async test
165 QUnit
.test( 'Abort providers', function ( assert
) {
166 var done
= assert
.async(),
168 biggerQueue
= new mw
.widgets
.APIResultsQueue( {
172 new FullResourceProvider(),
173 new EmptyResourceProvider(),
174 new SingleResultResourceProvider()
179 // Make the delay higher
180 providers
.forEach( function ( provider
) {
181 provider
.responseDelay
= 3;
184 // Add providers to queue
185 biggerQueue
.setProviders( providers
);
187 biggerQueue
.setParams( { foo
: 'bar' } );
188 biggerQueue
.get( 100 )
189 .always( function () {
190 // This should only run if the promise wasn't aborted
194 // Make the delay higher
195 providers
.forEach( function ( provider
) {
196 provider
.responseDelay
= 5;
199 biggerQueue
.setParams( { foo
: 'baz' } );
200 biggerQueue
.get( 10 )
202 assert
.strictEqual( completed
, false, 'Provider promises aborted.' );
204 // Finish the async test