Skip to content

Commit

Permalink
Merge pull request #413 from emberjs/hjdivad/clear-requests-on-teardown
Browse files Browse the repository at this point in the history
Clear requests array when tearing down
  • Loading branch information
rwjblue authored Sep 28, 2018
2 parents d61b7ec + 01f42df commit 2635eca
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 2 deletions.
7 changes: 7 additions & 0 deletions addon-test-support/@ember/test-helpers/settled.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ function decrementAjaxPendingRequests(event, xhr) {
@private
*/
export function _teardownAJAXHooks() {
// jQuery will not invoke `ajaxComplete` if
// 1. `transport.send` throws synchronously and
// 2. it has an `error` option which also throws synchronously

// We can no longer handle any remaining requests
requests = [];

if (!jQuery) {
return;
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,4 @@
"**/sane": "^2.5.2",
"ember-cli/testem": "~2.6.0"
}
}
}
5 changes: 4 additions & 1 deletion tests/helpers/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ import { Promise } from 'rsvp';
import hasjQuery from '../helpers/has-jquery';
import $ from 'jquery'; // FYI - not present in all scenarios
import require from 'require';
import { join } from '@ember/runloop';

export default function ajax(url) {
if (hasjQuery()) {
return new Promise((resolve, reject) => {
$.ajax(url, {
success: resolve,
error: reject,
error(reason) {
join(null, reject, reason);
},
cache: false,
});
});
Expand Down
1 change: 1 addition & 0 deletions tests/helpers/qunit-module-for.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default function qunitModuleFor(testModule) {
},
afterEach(assert) {
return testModule.teardown(assert).finally(() => {
Ember.Test.adapter = null;
if (Ember.testing) {
throw new Error('should not have Ember.testing === true after tests have finished');
}
Expand Down
16 changes: 16 additions & 0 deletions tests/test-helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import QUnit from 'qunit';
import { registerDeprecationHandler } from '@ember/debug';
import AbstractTestLoader from 'ember-cli-test-loader/test-support/index';
import Ember from 'ember';
import { isSettled, getSettledState } from '@ember/test-helpers';

if (QUnit.config.seed) {
QUnit.config.reorder = false;
}

let moduleLoadFailures = [];
let cleanupFailures = [];
let asyncLeakageFailures = [];

QUnit.done(function() {
if (moduleLoadFailures.length) {
Expand All @@ -18,6 +20,10 @@ QUnit.done(function() {
if (cleanupFailures.length) {
throw new Error('\n' + cleanupFailures.join('\n'));
}

if (asyncLeakageFailures.length) {
throw new Error('\n' + asyncLeakageFailures.join('\n'));
}
});

class TestLoader extends AbstractTestLoader {
Expand Down Expand Up @@ -71,6 +77,16 @@ QUnit.testDone(function({ module, name }) {
console.error(message);
testElementContainer.innerHTML = expected;
}

if (!isSettled()) {
let message = `Expected to be settled after ${module}: ${name}, but was \`${JSON.stringify(
getSettledState()
)}\``;
asyncLeakageFailures.push(message);

// eslint-disable-next-line
console.error(message);
}
});

QUnit.assert.noDeprecations = function(callback) {
Expand Down
26 changes: 26 additions & 0 deletions tests/unit/teardown-context-test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { module, test } from 'qunit';
import Service from '@ember/service';
import { isSettled, getSettledState } from '@ember/test-helpers';
import { getContext, setupContext, teardownContext } from 'ember-test-helpers';
import { setResolverRegistry } from '../helpers/resolver';
import hasEmberVersion from 'ember-test-helpers/has-ember-version';
import Ember from 'ember';
import hasjQuery from '../helpers/has-jquery';
import ajax from '../helpers/ajax';
import Pretender from 'pretender';

module('teardownContext', function(hooks) {
if (!hasEmberVersion(2, 4)) {
Expand All @@ -12,13 +16,18 @@ module('teardownContext', function(hooks) {

let context;
hooks.beforeEach(function() {
this.pretender = new Pretender();
setResolverRegistry({
'service:foo': Service.extend({ isFoo: true }),
});
context = {};
return setupContext(context);
});

hooks.afterEach(function() {
this.pretender.shutdown();
});

test('it destroys any instances created', async function(assert) {
let instance = context.owner.lookup('service:foo');
assert.notOk(instance.isDestroyed, 'precond - not destroyed');
Expand All @@ -45,4 +54,21 @@ module('teardownContext', function(hooks) {

assert.strictEqual(getContext(), undefined, 'context is unset');
});

if (hasjQuery()) {
test('out of balance xhr semaphores are cleaned up on teardown', async function(assert) {
this.pretender.unhandledRequest = function(/* verb, path, request */) {
throw new Error(`Synchronous error from Pretender.prototype.unhandledRequest`);
};

ajax('/some/totally/invalid/url');

await teardownContext(context);

assert.ok(
isSettled(),
`out of balance xhr semaphores are cleaned up on teardown: ${getSettledState()}`
);
});
}
});

0 comments on commit 2635eca

Please sign in to comment.