Skip to content

Commit 90fcea7

Browse files
authored
Merge pull request #994 from wagenet/better-onerror-handling
2 parents 3d267cd + ff1867c commit 90fcea7

File tree

6 files changed

+94
-28
lines changed

6 files changed

+94
-28
lines changed

addon-test-support/@ember/test-helpers/setup-context.ts

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { setOwner } from '@ember/application';
55

66
import buildOwner, { Owner } from './build-owner';
77
import { _setupAJAXHooks, _teardownAJAXHooks } from './settled';
8+
import { _prepareOnerror } from './setup-onerror';
89
import Ember from 'ember';
910
import { assert } from '@ember/debug';
1011
import global from './global';
@@ -180,6 +181,8 @@ export default function setupContext(
180181

181182
registerDestructor(context, cleanup);
182183

184+
_prepareOnerror(context);
185+
183186
return Promise.resolve()
184187
.then(() => {
185188
let application = getApplication();

addon-test-support/@ember/test-helpers/setup-onerror.ts

+41-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Ember from 'ember';
2+
import { BaseContext, getContext } from './setup-context';
23

3-
const ORIGINAL_EMBER_ONERROR: (error: Error) => void | undefined = Ember.onerror;
4+
let cachedOnerror: Map<BaseContext, ((error: Error) => void) | undefined> = new Map();
45

56
/**
67
* Sets the `Ember.onerror` function for tests. This value is intended to be reset after
@@ -21,8 +22,20 @@ const ORIGINAL_EMBER_ONERROR: (error: Error) => void | undefined = Ember.onerror
2122
* });
2223
*/
2324
export default function setupOnerror(onError?: (error: Error) => void): void {
25+
let context = getContext();
26+
27+
if (!context) {
28+
throw new Error('Must setup test context before calling setupOnerror');
29+
}
30+
31+
if (!cachedOnerror.has(context)) {
32+
throw new Error(
33+
'_cacheOriginalOnerror must be called before setupOnerror. Normally, this will happen as part of your test harness.'
34+
);
35+
}
36+
2437
if (typeof onError !== 'function') {
25-
onError = ORIGINAL_EMBER_ONERROR;
38+
onError = cachedOnerror.get(context);
2639
}
2740

2841
Ember.onerror = onError;
@@ -42,3 +55,29 @@ export default function setupOnerror(onError?: (error: Error) => void): void {
4255
* })
4356
*/
4457
export const resetOnerror: Function = setupOnerror;
58+
59+
/**
60+
* Caches the current value of Ember.onerror. When `setupOnerror` is called without a value
61+
* or when `resetOnerror` is called the value will be set to what was cached here.
62+
*
63+
* @private
64+
* @param {BaseContext} context the text context
65+
*/
66+
export function _prepareOnerror(context: BaseContext) {
67+
if (cachedOnerror.has(context)) {
68+
throw new Error('_prepareOnerror should only be called once per-context');
69+
}
70+
71+
cachedOnerror.set(context, Ember.onerror);
72+
}
73+
74+
/**
75+
* Removes the cached value of Ember.onerror.
76+
*
77+
* @private
78+
* @param {BaseContext} context the text context
79+
*/
80+
export function _cleanupOnerror(context: BaseContext) {
81+
resetOnerror();
82+
cachedOnerror.delete(context);
83+
}

addon-test-support/@ember/test-helpers/teardown-context.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { TestContext } from './setup-context';
22
import { Promise } from './-utils';
33
import settled from './settled';
4+
import { _cleanupOnerror } from './setup-onerror';
45
import { destroy } from '@ember/destroyable';
56

67
/**
@@ -29,6 +30,8 @@ export default function teardownContext(
2930

3031
return Promise.resolve()
3132
.then(() => {
33+
_cleanupOnerror(context);
34+
3235
destroy(context);
3336
})
3437
.finally(() => {

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
},
4646
"devDependencies": {
4747
"@ember/optional-features": "^2.0.0",
48-
"@types/ember": "^3.16.3",
48+
"@types/ember": "^3.16.4",
4949
"@types/ember-data": "^3.16.8",
5050
"@types/ember-testing-helpers": "^0.0.4",
5151
"@types/rsvp": "^4.0.3",
+42-21
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,67 @@
11
import Ember from 'ember';
22
import { module, test } from 'qunit';
33
import hasEmberVersion from '@ember/test-helpers/has-ember-version';
4+
import { setupContext, teardownContext } from '@ember/test-helpers';
45
import { setupOnerror, resetOnerror } from '@ember/test-helpers';
56

67
module('setupOnerror', function (hooks) {
7-
hooks.afterEach(function () {
8-
resetOnerror();
8+
let context;
9+
10+
hooks.beforeEach(function () {
11+
context = {};
12+
});
13+
14+
hooks.afterEach(async function () {
15+
if (context.owner) {
16+
await teardownContext(context);
17+
}
918
});
1019

1120
if (hasEmberVersion(2, 4)) {
12-
test('Ember.onerror is undefined by default', function (assert) {
13-
assert.expect(1);
21+
module('with context set', function (hooks) {
22+
hooks.beforeEach(async function () {
23+
await setupContext(context);
24+
});
1425

15-
assert.equal(Ember.onerror, undefined);
16-
});
26+
test('Ember.onerror is undefined by default', function (assert) {
27+
assert.expect(1);
1728

18-
test('Ember.onerror is setup correctly', async function (assert) {
19-
assert.expect(2);
29+
assert.equal(Ember.onerror, undefined);
30+
});
2031

21-
let onerror = err => err;
32+
test('Ember.onerror is setup correctly', async function (assert) {
33+
assert.expect(2);
2234

23-
assert.equal(Ember.onerror, undefined);
35+
let onerror = err => err;
2436

25-
setupOnerror(onerror);
37+
assert.equal(Ember.onerror, undefined);
2638

27-
assert.equal(Ember.onerror, onerror);
28-
});
39+
setupOnerror(onerror);
40+
41+
assert.equal(Ember.onerror, onerror);
42+
});
2943

30-
test('Ember.onerror is reset correctly', async function (assert) {
31-
assert.expect(3);
44+
test('Ember.onerror is reset correctly', async function (assert) {
45+
assert.expect(3);
3246

33-
let onerror = err => err;
47+
let onerror = err => err;
3448

35-
assert.equal(Ember.onerror, undefined);
49+
assert.equal(Ember.onerror, undefined);
3650

37-
setupOnerror(onerror);
51+
setupOnerror(onerror);
3852

39-
assert.equal(Ember.onerror, onerror);
53+
assert.equal(Ember.onerror, onerror);
4054

41-
resetOnerror();
55+
resetOnerror();
56+
57+
assert.equal(Ember.onerror, undefined);
58+
});
59+
});
4260

43-
assert.equal(Ember.onerror, undefined);
61+
test('it raises an error without context', function (assert) {
62+
assert.throws(() => {
63+
setupOnerror();
64+
}, /Must setup test context before calling setupOnerror/);
4465
});
4566
}
4667
});

yarn.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -1776,10 +1776,10 @@
17761776
"@types/jquery" "*"
17771777
"@types/rsvp" "*"
17781778

1779-
"@types/ember@*", "@types/ember@^3.16.3":
1780-
version "3.16.3"
1781-
resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.16.3.tgz#e2e9c24e56d8161ffcdbfa16d6a1e7e032bb557b"
1782-
integrity sha512-KkRs2F2dv6CuNfj9GFpJULL+8g+foJNEkOwSIqf5+RxaHjsg9NSVg9phTK4RItbndMyECCtOGOwWQAJ4cQgiiA==
1779+
"@types/ember@*", "@types/ember@^3.16.4":
1780+
version "3.16.4"
1781+
resolved "https://registry.yarnpkg.com/@types/ember/-/ember-3.16.4.tgz#bfccd8ed198ca7bee09878a3423ca6e1a9caac17"
1782+
integrity sha512-kCZNxuCofZN2sYUltfUmPegqAr1wvZ4b6aH0i8AsG+AsUiaWCDzVfCayMfr4CRUOhUiQ2VA9AOgnZT+JgBvjXQ==
17831783
dependencies:
17841784
"@types/ember__application" "*"
17851785
"@types/ember__array" "*"

0 commit comments

Comments
 (0)