Skip to content

Commit d2457ca

Browse files
authored
Merge pull request #223 from rwjblue/migrate-wait-to-settled
Expose `settled` helper function.
2 parents 79af2d8 + ed85aef commit d2457ca

File tree

8 files changed

+380
-103
lines changed

8 files changed

+380
-103
lines changed

addon-test-support/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export { default as setupContext, getContext, setContext, unsetContext } from '.
99
export { default as teardownContext } from './teardown-context';
1010
export { default as setupRenderingContext } from './setup-rendering-context';
1111
export { default as teardownRenderingContext } from './teardown-rendering-context';
12+
export { default as settled } from './settled';
1213

1314
import Ember from 'ember';
1415
Ember.testing = true;

addon-test-support/legacy-0-6-x/abstract-test-module.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { run } from '@ember/runloop';
22
import { Promise as EmberPromise, resolve } from 'rsvp';
33
import { assign, merge as emberMerge } from '@ember/polyfills';
44
import { _setupPromiseListeners, _teardownPromiseListeners } from '../ext/rsvp';
5-
import { _setupAJAXHooks, _teardownAJAXHooks } from '../wait';
5+
import { _setupAJAXHooks, _teardownAJAXHooks } from '../settled';
66
import { getContext, setContext, unsetContext } from '../setup-context';
77

88
import Ember from 'ember';

addon-test-support/settled.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { run } from '@ember/runloop';
2+
3+
import { Promise as EmberPromise } from 'rsvp';
4+
import jQuery from 'jquery';
5+
6+
import Ember from 'ember';
7+
import global from './global';
8+
9+
let requests;
10+
function incrementAjaxPendingRequests(_, xhr) {
11+
requests.push(xhr);
12+
}
13+
14+
function decrementAjaxPendingRequests(_, xhr) {
15+
// In most Ember versions to date (current version is 2.16) RSVP promises are
16+
// configured to flush in the actions queue of the Ember run loop, however it
17+
// is possible that in the future this changes to use "true" micro-task
18+
// queues.
19+
//
20+
// The entire point here, is that _whenever_ promises are resolved, this
21+
// counter will decrement. In the specific case of AJAX, this means that any
22+
// promises chained off of `$.ajax` will properly have their `.then` called
23+
// _before_ this is decremented (and testing continues)
24+
EmberPromise.resolve().then(() => {
25+
for (let i = 0; i < requests.length; i++) {
26+
if (xhr === requests[i]) {
27+
requests.splice(i, 1);
28+
}
29+
}
30+
});
31+
}
32+
33+
export function _teardownAJAXHooks() {
34+
if (!jQuery) {
35+
return;
36+
}
37+
38+
jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);
39+
jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);
40+
}
41+
42+
export function _setupAJAXHooks() {
43+
requests = [];
44+
45+
if (!jQuery) {
46+
return;
47+
}
48+
49+
jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);
50+
jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);
51+
}
52+
53+
let _internalCheckWaiters;
54+
if (Ember.__loader.registry['ember-testing/test/waiters']) {
55+
_internalCheckWaiters = Ember.__loader.require('ember-testing/test/waiters').checkWaiters;
56+
}
57+
58+
function checkWaiters() {
59+
if (_internalCheckWaiters) {
60+
return _internalCheckWaiters();
61+
} else if (Ember.Test.waiters) {
62+
if (Ember.Test.waiters.any(([context, callback]) => !callback.call(context))) {
63+
return true;
64+
}
65+
}
66+
67+
return false;
68+
}
69+
70+
export default function settled(_options) {
71+
let options = _options || {};
72+
let waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;
73+
let waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;
74+
let waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;
75+
76+
return new EmberPromise(function(resolve) {
77+
let watcher = global.setInterval(function() {
78+
if (waitForTimers && (run.hasScheduledTimers() || run.currentRunLoop)) {
79+
return;
80+
}
81+
82+
if (waitForAJAX && requests && requests.length > 0) {
83+
return;
84+
}
85+
86+
if (waitForWaiters && checkWaiters()) {
87+
return;
88+
}
89+
90+
// Stop polling
91+
global.clearInterval(watcher);
92+
93+
// Synchronously resolve the promise
94+
run(null, resolve);
95+
}, 10);
96+
});
97+
}

addon-test-support/setup-context.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { run } from '@ember/runloop';
22
import { set, setProperties, get, getProperties } from '@ember/object';
33
import buildOwner from './build-owner';
44
import { _setupPromiseListeners } from './ext/rsvp';
5-
import { _setupAJAXHooks } from './wait';
5+
import { _setupAJAXHooks } from './settled';
66

77
let __test_context__;
88

addon-test-support/teardown-context.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { run } from '@ember/runloop';
22
import { _teardownPromiseListeners } from './ext/rsvp';
3-
import { _teardownAJAXHooks } from './wait';
3+
import { _teardownAJAXHooks } from './settled';
44

55
export default function(context) {
66
let { owner } = context;

addon-test-support/wait.js

Lines changed: 7 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,7 @@
1-
/* globals self */
2-
3-
import { run } from '@ember/runloop';
4-
5-
import { Promise as EmberPromise } from 'rsvp';
6-
import jQuery from 'jquery';
7-
8-
import Ember from 'ember';
9-
10-
var requests;
11-
function incrementAjaxPendingRequests(_, xhr) {
12-
requests.push(xhr);
13-
}
14-
15-
function decrementAjaxPendingRequests(_, xhr) {
16-
// In most Ember versions to date (current version is 2.16) RSVP promises are
17-
// configured to flush in the actions queue of the Ember run loop, however it
18-
// is possible that in the future this changes to use "true" micro-task
19-
// queues.
20-
//
21-
// The entire point here, is that _whenever_ promises are resolved, this
22-
// counter will decrement. In the specific case of AJAX, this means that any
23-
// promises chained off of `$.ajax` will properly have their `.then` called
24-
// _before_ this is decremented (and testing continues)
25-
EmberPromise.resolve().then(() => {
26-
for (var i = 0; i < requests.length; i++) {
27-
if (xhr === requests[i]) {
28-
requests.splice(i, 1);
29-
}
30-
}
31-
});
32-
}
33-
34-
export function _teardownAJAXHooks() {
35-
if (!jQuery) {
36-
return;
37-
}
38-
39-
jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);
40-
jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);
41-
}
42-
43-
export function _setupAJAXHooks() {
44-
requests = [];
45-
46-
if (!jQuery) {
47-
return;
48-
}
49-
50-
jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);
51-
jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);
52-
}
53-
54-
var _internalCheckWaiters;
55-
if (Ember.__loader.registry['ember-testing/test/waiters']) {
56-
_internalCheckWaiters = Ember.__loader.require('ember-testing/test/waiters').checkWaiters;
57-
}
58-
59-
function checkWaiters() {
60-
if (_internalCheckWaiters) {
61-
return _internalCheckWaiters();
62-
} else if (Ember.Test.waiters) {
63-
if (Ember.Test.waiters.any(([context, callback]) => !callback.call(context))) {
64-
return true;
65-
}
66-
}
67-
68-
return false;
69-
}
70-
71-
export default function wait(_options) {
72-
var options = _options || {};
73-
var waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;
74-
var waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;
75-
var waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;
76-
77-
return new EmberPromise(function(resolve) {
78-
var watcher = self.setInterval(function() {
79-
if (waitForTimers && (run.hasScheduledTimers() || run.currentRunLoop)) {
80-
return;
81-
}
82-
83-
if (waitForAJAX && requests && requests.length > 0) {
84-
return;
85-
}
86-
87-
if (waitForWaiters && checkWaiters()) {
88-
return;
89-
}
90-
91-
// Stop polling
92-
self.clearInterval(watcher);
93-
94-
// Synchronously resolve the promise
95-
run(null, resolve);
96-
}, 10);
97-
});
98-
}
1+
export {
2+
default,
3+
_setupAJAXHooks,
4+
_setupPromiseListeners,
5+
_teardownAJAXHooks,
6+
_teardownPromiseListeners,
7+
} from './settled';

tests/unit/wait-test.js renamed to tests/unit/legacy-0-6-x/wait-test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import wait from 'ember-test-helpers/wait';
77
import { module, test } from 'qunit';
88
import hbs from 'htmlbars-inline-precompile';
99
import Pretender from 'pretender';
10-
import { fireEvent } from '../helpers/events';
11-
import hasjQuery from '../helpers/has-jquery';
10+
import { fireEvent } from '../../helpers/events';
11+
import hasjQuery from '../../helpers/has-jquery';
1212
import require from 'require';
1313

1414
function ajax(url) {

0 commit comments

Comments
 (0)