Skip to content

Commit

Permalink
Feature - adds setupEmberOnerror function to allow patching Ember.one…
Browse files Browse the repository at this point in the history
…rror in tests
  • Loading branch information
scalvert committed Jan 25, 2019
1 parent dca422b commit 21f11ec
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
1 change: 1 addition & 0 deletions addon-test-support/@ember/test-helpers/index.ts
Expand Up @@ -7,6 +7,7 @@ export {
unsetContext,
pauseTest,
resumeTest,
setupOnerror,
} from './setup-context';
export { default as teardownContext } from './teardown-context';
export { default as setupRenderingContext, render, clearRender } from './setup-rendering-context';
Expand Down
27 changes: 27 additions & 0 deletions addon-test-support/@ember/test-helpers/setup-context.ts
Expand Up @@ -132,6 +132,29 @@ export function resumeTest(): void {
context.resumeTest();
}

const ORIGINAL_EMBER_ONERROR: (error: Error) => void | undefined = Ember.onerror;

/**
Sets the Ember.onerror function for the duration of a single test. This
value is reset after each test to ensure correct test isolation.
@public
@param {Function} onError the onError function to be set on Ember.onerror
*/
export function setupOnerror(onError: (error: Error) => void): void {
let context = getContext();
let contextGuid = guidFor(context);
let contextCleanup = CLEANUP[contextGuid];

if (!Array.isArray(contextCleanup)) {
throw new Error(
'You must use `setupContext` / `setupRenderingContext` / `setupApplicationContext` in order to use `setupOnerror`'
);
}

Ember.onerror = onError;
}

export const CLEANUP = Object.create(null);

/**
Expand Down Expand Up @@ -261,6 +284,10 @@ export default function(
}, 'TestAdapter paused promise');
};

CLEANUP[contextGuid].push(() => {
Ember.onerror = ORIGINAL_EMBER_ONERROR;
});

_setupAJAXHooks();

return context as TestContext;
Expand Down
60 changes: 60 additions & 0 deletions tests/unit/setup-ember-onerror-test.js
@@ -0,0 +1,60 @@
import Ember from 'ember';
import { module, test } from 'qunit';
import hasEmberVersion from '@ember/test-helpers/has-ember-version';
import { setupContext, teardownContext, setupOnerror } from '@ember/test-helpers';

module('setupOnerror', function() {
if (!hasEmberVersion(2, 4)) {
test('Will throw if on < Ember 2.4', function(assert) {
assert.expect(1);

assert.throws(function() {
setupOnerror();
}, 'The `setupOnerror` function requires that you be on a minimum version of Ember 2.4.');
});
}

if (hasEmberVersion(2, 4)) {
test('Ember.onerror is undefined by default', function(assert) {
assert.expect(1);

assert.equal(Ember.onerror, undefined);
});

test('Ember.onerror is set correctly when using setupOnerror', async function(assert) {
assert.expect(2);

let context = {};
let onerror = err => err;

assert.equal(Ember.onerror, undefined);

await setupContext(context);

setupOnerror(onerror);

assert.equal(Ember.onerror, onerror);

await teardownContext(context);
});

test('Ember.onerror is reset correctly when teardownContext is invoked', async function(assert) {
assert.expect(3);

let context = {};
let onerror = err => err;

assert.equal(Ember.onerror, undefined);

await setupContext(context);

setupOnerror(onerror);

assert.equal(Ember.onerror, onerror);

await teardownContext(context);

assert.equal(Ember.onerror, undefined);
});
}
});

0 comments on commit 21f11ec

Please sign in to comment.