Skip to content

Commit

Permalink
Merge pull request #498 from rwjblue/add-settled-opt-out
Browse files Browse the repository at this point in the history
Add ability to opt-out of automatic settledness waiting in teardown.
  • Loading branch information
rwjblue authored Dec 10, 2018
2 parents c7922bb + 3475d23 commit e75585e
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
import { nextTickPromise } from './-utils';
import settled from './settled';

/**
Used by test framework addons to tear down the provided context after testing is completed.
@public
@param {Object} context the context to setup
@param {Object} [options] options used to override defaults
@param {boolean} [options.waitForSettled=true] should the teardown wait for `settled()`ness
@returns {Promise<void>} resolves when settled
*/
export default function(context: object): Promise<void> {
return settled();
export default function(context: object, options?: { waitForSettled?: boolean }): Promise<void> {
let waitForSettled = true;
if (options !== undefined && 'waitForSettled' in options) {
waitForSettled = options.waitForSettled!;
}

if (waitForSettled) {
return settled();
}

return nextTickPromise();
}
23 changes: 20 additions & 3 deletions addon-test-support/@ember/test-helpers/teardown-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,18 @@ import Ember from 'ember';
@public
@param {Object} context the context to setup
@param {Object} [options] options used to override defaults
@param {boolean} [options.waitForSettled=true] should the teardown wait for `settled()`ness
@returns {Promise<void>} resolves when settled
*/
export default function teardownContext(context: TestContext): Promise<void> {
export default function teardownContext(
context: TestContext,
options?: { waitForSettled?: boolean }
): Promise<void> {
let waitForSettled = true;
if (options !== undefined && 'waitForSettled' in options) {
waitForSettled = options.waitForSettled!;
}
return nextTickPromise()
.then(() => {
let { owner } = context;
Expand All @@ -31,13 +40,21 @@ export default function teardownContext(context: TestContext): Promise<void> {

unsetContext();

return settled();
if (waitForSettled) {
return settled();
}

return nextTickPromise();
})
.finally(() => {
let contextGuid = guidFor(context);

runDestroyablesFor(CLEANUP, contextGuid);

return settled();
if (waitForSettled) {
return settled();
}

return nextTickPromise();
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,28 @@ import settled from './settled';
@public
@param {Object} context the context to setup
@param {Object} [options] options used to override defaults
@param {boolean} [options.waitForSettled=true] should the teardown wait for `settled()`ness
@returns {Promise<void>} resolves when settled
*/
export default function teardownRenderingContext(context: RenderingTestContext): Promise<void> {
export default function teardownRenderingContext(
context: RenderingTestContext,
options?: { waitForSettled?: boolean }
): Promise<void> {
let waitForSettled = true;
if (options !== undefined && 'waitForSettled' in options) {
waitForSettled = options.waitForSettled!;
}

return nextTickPromise().then(() => {
let contextGuid = guidFor(context);

runDestroyablesFor(RENDERING_CLEANUP, contextGuid);

return settled();
if (waitForSettled) {
return settled();
}

return nextTickPromise();
});
}
13 changes: 13 additions & 0 deletions tests/helpers/manual-test-waiter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { registerWaiter, unregisterWaiter } from '@ember/test';

export default function setupManualTestWaiter(hooks) {
hooks.beforeEach(function() {
this.shouldWait = false;
this._waiter = () => !this.shouldWait;
registerWaiter(this._waiter);
});

hooks.afterEach(function() {
unregisterWaiter(this._waiter);
});
}
27 changes: 26 additions & 1 deletion tests/unit/teardown-context-test.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
import { module, test } from 'qunit';
import Service from '@ember/service';
import { getContext, setupContext, teardownContext, getSettledState } from '@ember/test-helpers';
import {
getContext,
setupContext,
teardownContext,
getSettledState,
settled,
isSettled,
} 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';
import setupManualTestWaiter from '../helpers/manual-test-waiter';

module('teardownContext', function(hooks) {
if (!hasEmberVersion(2, 4)) {
return;
}

setupManualTestWaiter(hooks);

let context;
hooks.beforeEach(function() {
this.pretender = new Pretender();
Expand Down Expand Up @@ -69,4 +79,19 @@ module('teardownContext', function(hooks) {
assert.equal(state.pendingRequestCount, 0, 'pendingRequestCount is 0');
});
}

test('can opt out of waiting for settledness', async function(assert) {
this.shouldWait = true;

assert.equal(isSettled(), false, 'should not be settled');

await teardownContext(context, { waitForSettled: false });

assert.equal(isSettled(), false, 'should not be settled');

this.shouldWait = false;
await settled();

assert.equal(isSettled(), true, 'should be settled');
});
});
20 changes: 20 additions & 0 deletions tests/unit/teardown-rendering-context-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ import {
setupRenderingContext,
teardownContext,
teardownRenderingContext,
settled,
isSettled,
} from '@ember/test-helpers';
import hasEmberVersion from '@ember/test-helpers/has-ember-version';
import setupManualTestWaiter from '../helpers/manual-test-waiter';

module('teardownRenderingContext', function(hooks) {
if (!hasEmberVersion(2, 4)) {
return;
}
setupManualTestWaiter(hooks);

hooks.beforeEach(async function() {
await setupContext(this);
Expand Down Expand Up @@ -54,4 +58,20 @@ module('teardownRenderingContext', function(hooks) {
'previous ember-testing element is no longer in DOM'
);
});

test('can opt out of waiting for settledness', async function(assert) {
this.shouldWait = true;

assert.equal(isSettled(), false, 'should not be settled');

await teardownRenderingContext(this, { waitForSettled: false });
await teardownContext(this, { waitForSettled: false });

assert.equal(isSettled(), false, 'should not be settled');

this.shouldWait = false;
await settled();

assert.equal(isSettled(), true, 'should be settled');
});
});

0 comments on commit e75585e

Please sign in to comment.