diff --git a/addon-test-support/@ember/test-helpers/-internal/get-component-manager.ts b/addon-test-support/@ember/test-helpers/-internal/get-component-manager.ts deleted file mode 100644 index 66da3eadd..000000000 --- a/addon-test-support/@ember/test-helpers/-internal/get-component-manager.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Ember from 'ember'; -import { - macroCondition, - importSync, - dependencySatisfies, -} from '@embroider/macros'; -import type { InternalComponentManager } from '@glimmer/interfaces'; - -let getComponentManager: ( - definition: object, - owner: object -) => InternalComponentManager | null; - -if (macroCondition(dependencySatisfies('ember-source', '>=3.27.0-alpha.1'))) { - let _getComponentManager = - //@ts-ignore - importSync('@glimmer/manager').getInternalComponentManager; - - getComponentManager = (definition: object, owner: object) => { - return _getComponentManager(definition, true); - }; -} else if ( - macroCondition(dependencySatisfies('ember-source', '>=3.25.0-beta.1')) -) { - let _getComponentManager = (Ember as any).__loader.require( - '@glimmer/manager' - ).getInternalComponentManager; - - getComponentManager = (definition: object, owner: object) => { - return _getComponentManager(definition, true); - }; -} else { - let _getComponentManager = (Ember as any).__loader.require( - '@glimmer/runtime' - ).getComponentManager; - - getComponentManager = (definition: object, owner: object) => { - return _getComponentManager(owner, definition); - }; -} - -export default getComponentManager; diff --git a/addon-test-support/@ember/test-helpers/-internal/is-component.ts b/addon-test-support/@ember/test-helpers/-internal/is-component.ts deleted file mode 100644 index eb691f269..000000000 --- a/addon-test-support/@ember/test-helpers/-internal/is-component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { macroCondition, dependencySatisfies } from '@embroider/macros'; - -import getComponentManager from './get-component-manager'; - -/** - * We should ultimately get a new API from @glimmer/runtime that provides this functionality - * (see https://github.com/emberjs/rfcs/pull/785 for more info). - * @private - * @param {Object} maybeComponent The thing you think might be a component - * @param {Object} owner Owner, we need this for old versions of getComponentManager - * @returns {boolean} True if it's a component, false if not - */ -function isComponent(maybeComponent: object, owner: object): boolean { - if (macroCondition(dependencySatisfies('ember-source', '>=3.25.0-beta.1'))) { - return !!getComponentManager(maybeComponent, owner); - } else { - return ( - !!getComponentManager(maybeComponent, owner) || - ['@ember/component', '@ember/component/template-only'].includes( - maybeComponent.toString() - ) - ); - } -} - -export default isComponent; diff --git a/addon-test-support/@ember/test-helpers/-internal/render-settled.ts b/addon-test-support/@ember/test-helpers/-internal/render-settled.ts index b5a366342..329da31f4 100644 --- a/addon-test-support/@ember/test-helpers/-internal/render-settled.ts +++ b/addon-test-support/@ember/test-helpers/-internal/render-settled.ts @@ -1,4 +1,3 @@ -import Ember from 'ember'; import { macroCondition, importSync, @@ -11,20 +10,14 @@ if (macroCondition(dependencySatisfies('ember-source', '>=4.5.0-beta.1'))) { //@ts-ignore renderSettled = importSync('@ember/renderer').renderSettled; } else if ( - macroCondition(dependencySatisfies('ember-source', '>=3.27.0-alpha.1')) + macroCondition(dependencySatisfies('ember-source', '>=4.0.0-alpha.1')) ) { //@ts-ignore renderSettled = importSync('@ember/-internals/glimmer').renderSettled; -} else if ( - macroCondition(dependencySatisfies('ember-source', '>=3.6.0-alpha.1')) -) { - renderSettled = (Ember as any).__loader.require( - '@ember/-internals/glimmer' - ).renderSettled; } else { - renderSettled = (Ember as any).__loader.require( - 'ember-glimmer' - ).renderSettled; + throw new Error( + 'Using an unsupported version of Ember (@ember/test-helpers@3.0.0+ requires Ember 4 or higher)' + ); } export default renderSettled; diff --git a/addon-test-support/@ember/test-helpers/setup-application-context.ts b/addon-test-support/@ember/test-helpers/setup-application-context.ts index e8c41c9e8..2a45c01cc 100644 --- a/addon-test-support/@ember/test-helpers/setup-application-context.ts +++ b/addon-test-support/@ember/test-helpers/setup-application-context.ts @@ -6,7 +6,6 @@ import { TestContext, } from './setup-context'; import global from './global'; -import hasEmberVersion from './has-ember-version'; import settled from './settled'; import getTestMetadata from './test-metadata'; import { runHooks } from './-internal/helper-hooks'; @@ -18,9 +17,7 @@ export interface ApplicationTestContext extends TestContext { element?: Element | null; } -const CAN_USE_ROUTER_EVENTS = hasEmberVersion(3, 6); let routerTransitionsPending: boolean | null = null; -const ROUTER = new WeakMap(); const HAS_SETUP_ROUTER = new WeakMap(); // eslint-disable-next-line require-jsdoc @@ -37,33 +34,7 @@ export function isApplicationTestContext( @returns {(boolean|null)} if there are pending transitions */ export function hasPendingTransitions(): boolean | null { - if (CAN_USE_ROUTER_EVENTS) { - return routerTransitionsPending; - } - - let context = getContext(); - - // there is no current context, we cannot check - if (context === undefined) { - return null; - } - - let router = ROUTER.get(context); - - if (router === undefined) { - // if there is no router (e.g. no `visit` calls made yet), we cannot - // check for pending transitions but this is explicitly not an error - // condition - return null; - } - - let routerMicrolib = router._routerMicrolib || router.router; - - if (routerMicrolib === undefined) { - return null; - } - - return !!routerMicrolib.activeTransition; + return routerTransitionsPending; } /** @@ -90,28 +61,20 @@ export function setupRouterSettlednessTracking() { let { owner } = context; let router: Router | RouterService; - if (CAN_USE_ROUTER_EVENTS) { - // SAFETY: unfortunately we cannot `assert` here at present because the - // class is not exported, only the type, since it is not designed to be - // sub-classed. The most we can do at present is assert that it at least - // *exists* and assume that if it does exist, it is bound correctly. - let routerService = owner.lookup('service:router'); - assert('router service is not set up correctly', !!routerService); - router = routerService as RouterService; - - // track pending transitions via the public routeWillChange / routeDidChange APIs - // routeWillChange can fire many times and is only useful to know when we have _started_ - // transitioning, we can then use routeDidChange to signal that the transition has settled - router.on('routeWillChange', () => (routerTransitionsPending = true)); - router.on('routeDidChange', () => (routerTransitionsPending = false)); - } else { - // SAFETY: similarly, this cast cannot be made safer because on the versions - // where we fall into this path, this is *also* not an exported class. - let mainRouter = owner.lookup('router:main'); - assert('router:main is not available', !!mainRouter); - router = mainRouter as Router; - ROUTER.set(context, router); - } + + // SAFETY: unfortunately we cannot `assert` here at present because the + // class is not exported, only the type, since it is not designed to be + // sub-classed. The most we can do at present is assert that it at least + // *exists* and assume that if it does exist, it is bound correctly. + let routerService = owner.lookup('service:router'); + assert('router service is not set up correctly', !!routerService); + router = routerService as RouterService; + + // track pending transitions via the public routeWillChange / routeDidChange APIs + // routeWillChange can fire many times and is only useful to know when we have _started_ + // transitioning, we can then use routeDidChange to signal that the transition has settled + router.on('routeWillChange', () => (routerTransitionsPending = true)); + router.on('routeDidChange', () => (routerTransitionsPending = false)); // hook into teardown to reset local settledness state let ORIGINAL_WILL_DESTROY = router.willDestroy; @@ -204,8 +167,6 @@ export function currentRouteName(): string { return currentRouteName; } -const HAS_CURRENT_URL_ON_ROUTER = hasEmberVersion(2, 13); - /** @public @returns {string} the applications current url @@ -220,29 +181,22 @@ export function currentURL(): string { let router = context.owner.lookup('router:main'); - if (HAS_CURRENT_URL_ON_ROUTER) { - let routerCurrentURL = get(router, 'currentURL'); + let routerCurrentURL = get(router, 'currentURL'); - // SAFETY: this path is a lie for the sake of the public-facing types. The - // framework itself sees this path, but users never do. A user who calls the - // API without calling `visit()` will see an `UnrecognizedURLError`, rather - // than getting back `null`. - if (routerCurrentURL === null) { - return routerCurrentURL as never as string; - } + // SAFETY: this path is a lie for the sake of the public-facing types. The + // framework itself sees this path, but users never do. A user who calls the + // API without calling `visit()` will see an `UnrecognizedURLError`, rather + // than getting back `null`. + if (routerCurrentURL === null) { + return routerCurrentURL as never as string; + } - assert( - `currentUrl should be a string, but was ${typeof routerCurrentURL}`, - typeof routerCurrentURL === 'string' - ); + assert( + `currentUrl should be a string, but was ${typeof routerCurrentURL}`, + typeof routerCurrentURL === 'string' + ); - return routerCurrentURL; - } else { - // SAFETY: this is *positively ancient* and should probably be removed at - // some point; old routers which don't have `currentURL` *should* have a - // `location` with `getURL()` per the docs for 2.12. - return (get(router, 'location') as any).getURL(); - } + return routerCurrentURL; } /** diff --git a/addon-test-support/@ember/test-helpers/setup-rendering-context.ts b/addon-test-support/@ember/test-helpers/setup-rendering-context.ts index 728af2974..0be3197cf 100644 --- a/addon-test-support/@ember/test-helpers/setup-rendering-context.ts +++ b/addon-test-support/@ember/test-helpers/setup-rendering-context.ts @@ -15,12 +15,22 @@ import { Owner } from './build-owner'; import getTestMetadata from './test-metadata'; import { assert } from '@ember/debug'; import { runHooks } from './-internal/helper-hooks'; -import hasEmberVersion from './has-ember-version'; -import isComponent from './-internal/is-component'; -import { macroCondition, dependencySatisfies } from '@embroider/macros'; import { ComponentRenderMap, SetUsage } from './setup-context'; import { ensureSafeComponent } from '@embroider/util'; -import type { ComponentInstance } from '@glimmer/interfaces'; +import type { + ComponentInstance, + InternalComponentManager, +} from '@glimmer/interfaces'; +import { importSync } from '@embroider/macros'; + +let getInternalComponentManager: ( + definition: object +) => InternalComponentManager; + +// this would be much better as a regular `import` statement, but there really isn't any way to make typescript happy with thayar +getInternalComponentManager = + //@ts-ignore + importSync('@glimmer/manager').getInternalComponentManager; const OUTLET_TEMPLATE = hbs`{{outlet}}`; const EMPTY_TEMPLATE = hbs``; @@ -33,6 +43,19 @@ export interface RenderingTestContext extends TestContext { [hasCalledSetupRenderingContext]?: true; } +/** + * We should ultimately get a new API from @glimmer/runtime that provides this functionality + * (see https://github.com/emberjs/rfcs/pull/785 for more info). + * @private + * @param {Object} maybeComponent The thing you think might be a component + * @returns {boolean} True if it's a component, false if not + */ +function isComponent(maybeComponent: object): boolean { + let manager = getInternalComponentManager(maybeComponent); + + return !!manager; +} + // Isolates the notion of transforming a TextContext into a RenderingTestContext. // eslint-disable-next-line require-jsdoc function prepare(context: TestContext): RenderingTestContext { @@ -131,19 +154,31 @@ export function render( let OutletTemplate = lookupOutletTemplate(owner); let ownerToRenderFrom = options?.owner || owner; - if (macroCondition(dependencySatisfies('ember-source', '<3.24.0'))) { - // Pre 3.24, we just don't support rendering components at all, so we error - // if we find anything that isn't a template. - const isTemplate = - ('__id' in templateOrComponent && '__meta' in templateOrComponent) || - ('id' in templateOrComponent && 'meta' in templateOrComponent); + if (isComponent(templateOrComponent)) { + // We use this to track when `render` is used with a component so that we can throw an + // assertion if `this.{set,setProperty} is used in the same test + ComponentRenderMap.set(context, true); - if (!isTemplate) { - throw new Error( - `Using \`render\` with something other than a pre-compiled template is not supported until Ember 3.24 (you are on ${Ember.VERSION}).` + const setCalls = SetUsage.get(context); + + if (setCalls !== undefined) { + assert( + `You cannot call \`this.set\` or \`this.setProperties\` when passing a component to \`render\`, but they were called for the following properties:\n${setCalls + .map((key) => ` - ${key}`) + .join('\n')}` ); } + let ProvidedComponent = ensureSafeComponent( + templateOrComponent, + context + ); + + context = { + ProvidedComponent, + }; + templateOrComponent = INVOKE_PROVIDED_COMPONENT; + } else { templateId += 1; let templateFullName = `template:-undertest-${templateId}` as const; ownerToRenderFrom.register(templateFullName, templateOrComponent); @@ -151,40 +186,6 @@ export function render( ownerToRenderFrom, templateFullName ); - } else { - if (isComponent(templateOrComponent, owner)) { - // We use this to track when `render` is used with a component so that we can throw an - // assertion if `this.{set,setProperty} is used in the same test - ComponentRenderMap.set(context, true); - - const setCalls = SetUsage.get(context); - - if (setCalls !== undefined) { - assert( - `You cannot call \`this.set\` or \`this.setProperties\` when passing a component to \`render\`, but they were called for the following properties:\n${setCalls - .map((key) => ` - ${key}`) - .join('\n')}` - ); - } - - let ProvidedComponent = ensureSafeComponent( - templateOrComponent, - context - ); - - context = { - ProvidedComponent, - }; - templateOrComponent = INVOKE_PROVIDED_COMPONENT; - } else { - templateId += 1; - let templateFullName = `template:-undertest-${templateId}` as const; - ownerToRenderFrom.register(templateFullName, templateOrComponent); - templateOrComponent = lookupTemplate( - ownerToRenderFrom, - templateFullName - ); - } } let outletState = { @@ -216,20 +217,6 @@ export function render( }; toplevelView.setOutletState(outletState); - // Ember's rendering engine is integration with the run loop so that when a run - // loop starts, the rendering is scheduled to be done. - // - // Ember should be ensuring an instance on its own here (the act of - // setting outletState should ensureInstance, since we know we need to - // render), but on Ember < 3.23 that is not guaranteed. - if (!hasEmberVersion(3, 23)) { - // SAFETY: this was correct and type checked on the Ember v3 types, but - // since the `run` namespace does not exist in Ember v4, this no longer - // can be type checked. When (eventually) dropping support for Ember v3, - // and therefore for versions before 3.23, this can be removed entirely. - (run as any).backburner.ensureInstance(); - } - // returning settled here because the actual rendering does not happen until // the renderer detects it is dirty (which happens on backburner's end // hook), see the following implementation details: diff --git a/tests/integration/dom/scroll-to-test.js b/tests/integration/dom/scroll-to-test.js index e24804a1c..0383dbb5b 100644 --- a/tests/integration/dom/scroll-to-test.js +++ b/tests/integration/dom/scroll-to-test.js @@ -7,7 +7,6 @@ import { setupRenderingContext, teardownContext, } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { buildExpectedSteps, registerHooks, @@ -15,10 +14,6 @@ import { } from '../../helpers/register-hooks'; module('DOM Helper: scroll-to', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(async function () { await setupContext(this); await setupRenderingContext(this); diff --git a/tests/integration/rerender-test.js b/tests/integration/rerender-test.js index a7e03d13c..8d4d0ac2f 100644 --- a/tests/integration/rerender-test.js +++ b/tests/integration/rerender-test.js @@ -16,13 +16,8 @@ import GlimmerComponent from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { hbs } from 'ember-cli-htmlbars'; import { module, test } from 'qunit'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('rerender real-world', function (hooks) { - // this test requires Ember 3.25 in order to use lexically scoped values in templates - if (!hasEmberVersion(3, 25)) { - return; - } hooks.beforeEach(async function () { await setupContext(this); await setupRenderingContext(this); diff --git a/tests/integration/settled-test.js b/tests/integration/settled-test.js index f17bc51c4..ab9ccaef7 100644 --- a/tests/integration/settled-test.js +++ b/tests/integration/settled-test.js @@ -12,7 +12,6 @@ import { render, rerender, } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { module, test } from 'qunit'; import { hbs } from 'ember-cli-htmlbars'; import Pretender from 'pretender'; @@ -119,10 +118,6 @@ const TestComponent5 = Component.extend({ }); module('settled real-world scenarios', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(async function () { await setupContext(this); await setupRenderingContext(this); diff --git a/tests/integration/setup-rendering-context-test.js b/tests/integration/setup-rendering-context-test.js index dfc169d67..eecce659e 100644 --- a/tests/integration/setup-rendering-context-test.js +++ b/tests/integration/setup-rendering-context-test.js @@ -15,7 +15,6 @@ import { } from '@ember/test-helpers'; import templateOnly from '@ember/component/template-only'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { setResolverRegistry } from '../helpers/resolver'; import { hbs } from 'ember-cli-htmlbars'; import { precompileTemplate } from '@ember/template-compilation'; @@ -143,60 +142,56 @@ module('setupRenderingContext "real world"', function (hooks) { }); module('lexical scope access', function () { - if (hasEmberVersion(3, 28)) { - test('can render components passed as locals', async function (assert) { - let add = helper(function ([first, second]) { - return first + second; - }); - - await render( - precompileTemplate('{{add 1 3}}', { - scope() { - return { add }; - }, - }) - ); - - assert.equal(this.element.textContent, '4'); + test('can render components passed as locals', async function (assert) { + let add = helper(function ([first, second]) { + return first + second; }); - } + + await render( + precompileTemplate('{{add 1 3}}', { + scope() { + return { add }; + }, + }) + ); + + assert.equal(this.element.textContent, '4'); + }); }); module('render with a component', function () { - if (hasEmberVersion(3, 25)) { - test('can render locally defined components', async function (assert) { - class MyComponent extends GlimmerComponent {} + test('can render locally defined components', async function (assert) { + class MyComponent extends GlimmerComponent {} - setComponentTemplate(hbs`my name is {{@name}}`, MyComponent); + setComponentTemplate(hbs`my name is {{@name}}`, MyComponent); - const somePerson = new (class { - @tracked name = 'Zoey'; - })(); + const somePerson = new (class { + @tracked name = 'Zoey'; + })(); - const template = precompileTemplate( - '', - { - scope() { - return { - somePerson, - MyComponent, - }; - }, - } - ); + const template = precompileTemplate( + '', + { + scope() { + return { + somePerson, + MyComponent, + }; + }, + } + ); - const component = setComponentTemplate(template, templateOnly()); + const component = setComponentTemplate(template, templateOnly()); - await render(component); + await render(component); - assert.equal(this.element.textContent, 'my name is Zoey'); + assert.equal(this.element.textContent, 'my name is Zoey'); - somePerson.name = 'Tomster'; + somePerson.name = 'Tomster'; - await rerender(); + await rerender(); - assert.equal(this.element.textContent, 'my name is Tomster'); - }); - } + assert.equal(this.element.textContent, 'my name is Tomster'); + }); }); }); diff --git a/tests/unit/dom/blur-test.js b/tests/unit/dom/blur-test.js index ca35996b6..768eb68b2 100644 --- a/tests/unit/dom/blur-test.js +++ b/tests/unit/dom/blur-test.js @@ -8,7 +8,6 @@ import { } from '@ember/test-helpers'; import { buildInstrumentedElement, insertElement } from '../../helpers/events'; import { isEdge } from '../../helpers/browser-detect'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; let focusSteps = ['focus', 'focusin']; let blurSteps = ['blur', 'focusout']; @@ -18,10 +17,6 @@ if (isEdge) { } module('DOM Helper: blur', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, elementWithFocus; hooks.beforeEach(async function (assert) { diff --git a/tests/unit/dom/click-test.js b/tests/unit/dom/click-test.js index 8440eb8bc..be953d10b 100644 --- a/tests/unit/dom/click-test.js +++ b/tests/unit/dom/click-test.js @@ -5,7 +5,6 @@ import { instrumentElement, insertElement, } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { registerHooks, unregisterHooks, @@ -13,10 +12,6 @@ import { } from '../../helpers/register-hooks'; module('DOM Helper: click', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/double-click-test.js b/tests/unit/dom/double-click-test.js index ef658d42e..64f79d0f0 100644 --- a/tests/unit/dom/double-click-test.js +++ b/tests/unit/dom/double-click-test.js @@ -9,7 +9,6 @@ import { instrumentElement, insertElement, } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { registerHooks, unregisterHooks, @@ -27,10 +26,6 @@ const expectedEvents = [ ]; module('DOM Helper: doubleClick', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/fill-in-test.js b/tests/unit/dom/fill-in-test.js index 5d44dec17..f20172e40 100644 --- a/tests/unit/dom/fill-in-test.js +++ b/tests/unit/dom/fill-in-test.js @@ -2,7 +2,6 @@ import { module, test } from 'qunit'; import { fillIn, setupContext, teardownContext } from '@ember/test-helpers'; import { buildInstrumentedElement, insertElement } from '../../helpers/events'; import { isFirefox } from '../../helpers/browser-detect'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { registerHooks, unregisterHooks, @@ -16,10 +15,6 @@ if (isFirefox) { } module('DOM Helper: fillIn', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/find-all-test.js b/tests/unit/dom/find-all-test.js index 28575ba96..bb0122ec1 100644 --- a/tests/unit/dom/find-all-test.js +++ b/tests/unit/dom/find-all-test.js @@ -1,12 +1,7 @@ import { module, test } from 'qunit'; import { findAll, setupContext, teardownContext } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: findAll', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element1, element2; hooks.beforeEach(function () { diff --git a/tests/unit/dom/find-test.js b/tests/unit/dom/find-test.js index b2b9abe3c..e139a5ec8 100644 --- a/tests/unit/dom/find-test.js +++ b/tests/unit/dom/find-test.js @@ -1,12 +1,7 @@ import { module, test } from 'qunit'; import { find, setupContext, teardownContext } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: find', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/focus-test.js b/tests/unit/dom/focus-test.js index b54e3a98c..f7c93ba4d 100644 --- a/tests/unit/dom/focus-test.js +++ b/tests/unit/dom/focus-test.js @@ -11,7 +11,6 @@ import { instrumentElement, } from '../../helpers/events'; import { isEdge } from '../../helpers/browser-detect'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; let focusSteps = ['focus', 'focusin']; let blurSteps = ['blur', 'focusout']; @@ -21,10 +20,6 @@ if (isEdge) { } module('DOM Helper: focus', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/get-root-element-test.js b/tests/unit/dom/get-root-element-test.js index 3c57ac7a0..235e394f5 100644 --- a/tests/unit/dom/get-root-element-test.js +++ b/tests/unit/dom/get-root-element-test.js @@ -4,13 +4,8 @@ import { setupContext, teardownContext, } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: getRootElement', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context; hooks.beforeEach(function () { diff --git a/tests/unit/dom/logging-test.js b/tests/unit/dom/logging-test.js index cdbdcface..63186b7cf 100644 --- a/tests/unit/dom/logging-test.js +++ b/tests/unit/dom/logging-test.js @@ -6,15 +6,10 @@ import { setupRenderingContext, teardownContext, } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { elementToString } from '@ember/test-helpers/dom/-logging'; import { hbs } from 'ember-cli-htmlbars'; module('elementToString()', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(async function () { await setupContext(this); await setupRenderingContext(this); diff --git a/tests/unit/dom/select-files-test.js b/tests/unit/dom/select-files-test.js index 6253d6475..597141063 100644 --- a/tests/unit/dom/select-files-test.js +++ b/tests/unit/dom/select-files-test.js @@ -5,13 +5,8 @@ import { teardownContext, } from '@ember/test-helpers'; import { buildInstrumentedElement } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: selectFiles', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; const textFile = new Blob(['Hello World'], { type: 'text/plain' }); diff --git a/tests/unit/dom/tab-test.js b/tests/unit/dom/tab-test.js index 855b83a1e..461f93088 100644 --- a/tests/unit/dom/tab-test.js +++ b/tests/unit/dom/tab-test.js @@ -11,7 +11,6 @@ import { instrumentElement, } from '../../helpers/events'; import { isEdge } from '../../helpers/browser-detect'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; let _focusSteps = ['focus', 'focusin']; let _blurSteps = isEdge ? ['focusout', 'blur'] : ['blur', 'focusout']; @@ -34,10 +33,6 @@ function moveFocus(from, to) { } module('DOM Helper: tab', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element, elements; hooks.beforeEach(function () { diff --git a/tests/unit/dom/tap-test.js b/tests/unit/dom/tap-test.js index d1a2ac541..70df6e0c4 100644 --- a/tests/unit/dom/tap-test.js +++ b/tests/unit/dom/tap-test.js @@ -1,7 +1,6 @@ import { module, test } from 'qunit'; import { tap, setupContext, teardownContext } from '@ember/test-helpers'; import { buildInstrumentedElement, insertElement } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { registerHooks, unregisterHooks, @@ -9,10 +8,6 @@ import { } from '../../helpers/register-hooks'; module('DOM Helper: tap', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/trigger-event-test.js b/tests/unit/dom/trigger-event-test.js index 792b5f476..84bf84ccc 100644 --- a/tests/unit/dom/trigger-event-test.js +++ b/tests/unit/dom/trigger-event-test.js @@ -6,13 +6,8 @@ import { _registerHook, } from '@ember/test-helpers'; import { buildInstrumentedElement, insertElement } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: triggerEvent', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/trigger-key-event-test.js b/tests/unit/dom/trigger-key-event-test.js index 3f30fe75d..72030d307 100644 --- a/tests/unit/dom/trigger-key-event-test.js +++ b/tests/unit/dom/trigger-key-event-test.js @@ -6,13 +6,8 @@ import { _registerHook, } from '@ember/test-helpers'; import { buildInstrumentedElement, insertElement } from '../../helpers/events'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: triggerKeyEvent', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/type-in-test.js b/tests/unit/dom/type-in-test.js index 0a433f851..37b176b6f 100644 --- a/tests/unit/dom/type-in-test.js +++ b/tests/unit/dom/type-in-test.js @@ -4,7 +4,6 @@ import { buildInstrumentedElement, insertElement } from '../../helpers/events'; import { isFirefox } from '../../helpers/browser-detect'; import { debounce } from '@ember/runloop'; import { Promise } from 'rsvp'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { registerHooks, unregisterHooks, @@ -57,10 +56,6 @@ if (isFirefox) { } module('DOM Helper: typeIn', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, element; hooks.beforeEach(function () { diff --git a/tests/unit/dom/wait-for-test.js b/tests/unit/dom/wait-for-test.js index cfaa989ce..b9f0822ca 100644 --- a/tests/unit/dom/wait-for-test.js +++ b/tests/unit/dom/wait-for-test.js @@ -1,12 +1,7 @@ import { module, test } from 'qunit'; import { waitFor, setupContext, teardownContext } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; module('DOM Helper: waitFor', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - let context, rootElement; hooks.beforeEach(function () { diff --git a/tests/unit/settled-test.js b/tests/unit/settled-test.js index 498bcb0e1..e0a5928dc 100644 --- a/tests/unit/settled-test.js +++ b/tests/unit/settled-test.js @@ -2,7 +2,6 @@ import Ember from 'ember'; import { module, test } from 'qunit'; import { isSettled, getSettledState } from '@ember/test-helpers'; import { TestDebugInfo } from '@ember/test-helpers/-internal/debug-info'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { _setupAJAXHooks, _teardownAJAXHooks, @@ -16,10 +15,6 @@ import ajax from '../helpers/ajax'; const WAITER_NAME = 'custom-waiter'; module('settled', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(function (assert) { _setupAJAXHooks(); diff --git a/tests/unit/setup-application-context-test.js b/tests/unit/setup-application-context-test.js index 4c4052f21..698afaa2d 100644 --- a/tests/unit/setup-application-context-test.js +++ b/tests/unit/setup-application-context-test.js @@ -15,7 +15,6 @@ import { _registerHook, isSettled, } from '@ember/test-helpers'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { setResolverRegistry } from '../helpers/resolver'; import { hbs } from 'ember-cli-htmlbars'; @@ -30,10 +29,6 @@ Router.map(function () { }); module('setupApplicationContext', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(async function () { let registry = { 'router:main': Router, @@ -69,19 +64,6 @@ module('setupApplicationContext', function (hooks) { }), }; - if (!hasEmberVersion(3, 12)) { - registry = { - ...registry, - // overrides for older Ember's - 'template:application': hbs` - - {{outlet}} - `, - 'template:links-to-slow': hbs`{{#link-to "slow" class="to-slow"}}to slow{{/link-to}}`, - 'template:posts/post': hbs`
{{model.post_id}}
`, - }; - } - setResolverRegistry(registry); await setupContext(this); diff --git a/tests/unit/setup-context-test.js b/tests/unit/setup-context-test.js index 291756029..aefd8f555 100644 --- a/tests/unit/setup-context-test.js +++ b/tests/unit/setup-context-test.js @@ -17,7 +17,6 @@ import { } from '@ember/test-helpers'; import { getDeprecationsForContext } from '@ember/test-helpers/-internal/deprecations'; import { getWarningsForContext } from '@ember/test-helpers/-internal/warnings'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { setResolverRegistry, createCustomResolver, @@ -31,10 +30,6 @@ import Ember from 'ember'; import { deprecate, warn } from '@ember/debug'; module('setupContext', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - hooks.beforeEach(function () { setResolverRegistry({ 'service:foo': Service.extend({ isFoo: true }), @@ -76,13 +71,11 @@ module('setupContext', function (hooks) { 'has expected lookup interface' ); - if (hasEmberVersion(2, 12)) { - assert.equal( - typeof owner.factoryFor, - 'function', - 'has expected factory interface' - ); - } + assert.equal( + typeof owner.factoryFor, + 'function', + 'has expected factory interface' + ); }); overwriteTest(context, 'owner'); diff --git a/tests/unit/setup-ember-onerror-test.js b/tests/unit/setup-ember-onerror-test.js index 8d309781a..322e88dba 100644 --- a/tests/unit/setup-ember-onerror-test.js +++ b/tests/unit/setup-ember-onerror-test.js @@ -1,6 +1,5 @@ import Ember from 'ember'; import { module, test } from 'qunit'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; import { setupContext, teardownContext } from '@ember/test-helpers'; import { setupOnerror, resetOnerror } from '@ember/test-helpers'; @@ -17,56 +16,54 @@ module('setupOnerror', function (hooks) { } }); - if (hasEmberVersion(2, 4)) { - module('with context set', function (hooks) { - hooks.beforeEach(async function () { - await setupContext(context); - }); + module('with context set', function (hooks) { + hooks.beforeEach(async function () { + await setupContext(context); + }); - test('Ember.onerror is undefined by default', function (assert) { - assert.expect(1); + test('Ember.onerror is undefined by default', function (assert) { + assert.expect(1); - assert.equal(Ember.onerror, undefined); - }); + assert.equal(Ember.onerror, undefined); + }); - test('Ember.onerror is setup correctly', async function (assert) { - assert.expect(2); + test('Ember.onerror is setup correctly', async function (assert) { + assert.expect(2); - let onerror = (err) => err; + let onerror = (err) => err; - assert.equal(Ember.onerror, undefined); + assert.equal(Ember.onerror, undefined); - setupOnerror(onerror); + setupOnerror(onerror); - assert.equal(Ember.onerror, onerror); - }); + assert.equal(Ember.onerror, onerror); + }); - test('Ember.onerror is reset correctly', async function (assert) { - assert.expect(3); + test('Ember.onerror is reset correctly', async function (assert) { + assert.expect(3); - let onerror = (err) => err; + let onerror = (err) => err; - assert.equal(Ember.onerror, undefined); + assert.equal(Ember.onerror, undefined); - setupOnerror(onerror); + setupOnerror(onerror); - assert.equal(Ember.onerror, onerror); + assert.equal(Ember.onerror, onerror); - resetOnerror(); + resetOnerror(); - assert.equal(Ember.onerror, undefined); - }); + assert.equal(Ember.onerror, undefined); }); + }); - test('it raises an error without context', function (assert) { - assert.throws(() => { - setupOnerror(); - }, /Must setup test context before calling setupOnerror/); - }); + test('it raises an error without context', function (assert) { + assert.throws(() => { + setupOnerror(); + }, /Must setup test context before calling setupOnerror/); + }); - test('resetOnerror does not raise an error without context', function (assert) { - resetOnerror(); - assert.ok(true, 'nothing was thrown'); - }); - } + test('resetOnerror does not raise an error without context', function (assert) { + resetOnerror(); + assert.ok(true, 'nothing was thrown'); + }); }); diff --git a/tests/unit/setup-rendering-context-test.js b/tests/unit/setup-rendering-context-test.js index 72bdf05db..741ae4289 100644 --- a/tests/unit/setup-rendering-context-test.js +++ b/tests/unit/setup-rendering-context-test.js @@ -31,7 +31,6 @@ import { getOwner } from '@ember/application'; import Engine from '@ember/engine'; import { precompileTemplate } from '@ember/template-compilation'; import templateOnly from '@ember/component/template-only'; -import hasEmberVersion from '@ember/test-helpers/has-ember-version'; async function buildEngineOwner(parentOwner, registry) { parentOwner.register( @@ -532,346 +531,178 @@ module('setupRenderingContext', function (hooks) { assert.equal(getOwner(this), this.owner); }); - if (hasEmberVersion(3, 25)) { - // render tests for components in 3.25+ where we can use lexical scope - module('using render with a component in Ember >= 3.25', function () { - test('works with a template-only component', async function (assert) { - const name = 'Chris'; - - const template = precompileTemplate( - '

hello my name is {{name}}

', - { - scope() { - return { - name, - }; - }, - } - ); - const component = setComponentTemplate(template, templateOnly()); - await render(component); - assert.equal( - this.element.textContent, - 'hello my name is Chris', - 'has rendered content' - ); - }); - - test('works with a glimmer component', async function (assert) { - const name = 'Chris'; - const template = precompileTemplate( - '

hello my name is {{name}} and my favorite color is {{this.favoriteColor}}

', - { - scope() { - return { - name, - }; - }, - } - ); + module('using render with a component in Ember >= 3.25', function () { + test('works with a template-only component', async function (assert) { + const name = 'Chris'; - class Foo extends GlimmerComponent { - favoriteColor = 'red'; + const template = precompileTemplate( + '

hello my name is {{name}}

', + { + scope() { + return { + name, + }; + }, } + ); + const component = setComponentTemplate(template, templateOnly()); + await render(component); + assert.equal( + this.element.textContent, + 'hello my name is Chris', + 'has rendered content' + ); + }); - setComponentTemplate(template, Foo); - await render(Foo); - - assert.equal( - this.element.textContent, - 'hello my name is Chris and my favorite color is red', - 'has rendered content' - ); - }); - - test('works with a classic component', async function (assert) { - const name = 'Chris'; - const template = precompileTemplate( - '

hello my name is {{name}} and my favorite color is {{this.favoriteColor}}

', - { - scope() { - return { - name, - }; - }, - } - ); - - const Foo = Component.extend({ - favoriteColor: 'red', - }); - - setComponentTemplate(template, Foo); - await render(Foo); - - assert.equal( - this.element.textContent, - 'hello my name is Chris and my favorite color is red', - 'has rendered content' - ); - }); - - test('components passed to render do *not* have access to the test context', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); - - class Foo extends GlimmerComponent { - foo = 'foo'; + test('works with a glimmer component', async function (assert) { + const name = 'Chris'; + const template = precompileTemplate( + '

hello my name is {{name}} and my favorite color is {{this.favoriteColor}}

', + { + scope() { + return { + name, + }; + }, } + ); - const component = setComponentTemplate(template, Foo); - - this.foo = 'bar'; - - await render(component); + class Foo extends GlimmerComponent { + favoriteColor = 'red'; + } - assert.equal(this.element.textContent, 'the value of foo is foo'); - }); + setComponentTemplate(template, Foo); + await render(Foo); - test('setting properties on the test context *before* rendering a component throws an assertion', async function (assert) { - assert.expect(1); - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); + assert.equal( + this.element.textContent, + 'hello my name is Chris and my favorite color is red', + 'has rendered content' + ); + }); - class Foo extends GlimmerComponent {} - - const component = setComponentTemplate(template, Foo); - - this.set('foo', 'FOO'); - this.set('bar', 'BAR'); - this.setProperties({ - baz: 'BAZ', - baq: 'BAQ', - }); - - let error; - try { - await render(component); - } catch (err) { - error = err; - } finally { - assert.equal( - error.toString(), - `Error: Assertion Failed: You cannot call \`this.set\` or \`this.setProperties\` when passing a component to \`render\`, but they were called for the following properties: - - foo - - bar - - baz - - baq` - ); + test('works with a classic component', async function (assert) { + const name = 'Chris'; + const template = precompileTemplate( + '

hello my name is {{name}} and my favorite color is {{this.favoriteColor}}

', + { + scope() { + return { + name, + }; + }, } + ); + + const Foo = Component.extend({ + favoriteColor: 'red', }); - test('setting properties on the test context *after* rendering a component throws an assertion', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); + setComponentTemplate(template, Foo); + await render(Foo); - class Foo extends GlimmerComponent {} + assert.equal( + this.element.textContent, + 'hello my name is Chris and my favorite color is red', + 'has rendered content' + ); + }); - const component = setComponentTemplate(template, Foo); + test('components passed to render do *not* have access to the test context', async function (assert) { + const template = precompileTemplate('the value of foo is {{this.foo}}'); - await render(component); + class Foo extends GlimmerComponent { + foo = 'foo'; + } - assert.throws( - () => this.set('foo', 'FOO'), - (err) => { - return err - .toString() - .includes( - 'You cannot call `this.set` when passing a component to `render()` (the rendered component does not have access to the test context).' - ); - }, - 'errors on this.set' - ); + const component = setComponentTemplate(template, Foo); - assert.throws( - () => this.setProperties({ foo: 'bar?' }), - (err) => { - return err - .toString() - .includes( - 'You cannot call `this.setProperties` when passing a component to `render()` (the rendered component does not have access to the test context)' - ); - }, - 'errors on this.setProperties' - ); - }); + this.foo = 'bar'; - test('setting properties on the test context when rendering a template does not throw an assertion', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); + await render(component); - this.set('foo', 'FOO'); - this.setProperties({ - foo: 'bar?', - }); - - await render(template); - - assert.true(true, 'no assertions are thrown'); - }); + assert.equal(this.element.textContent, 'the value of foo is foo'); }); - } else if (hasEmberVersion(3, 24)) { - module('using render with a component in Ember < 3.25', function () { - test('works with a template-only component', async function (assert) { - const template = precompileTemplate( - '

this is a template-only component with no dynamic content

' - ); - const component = setComponentTemplate(template, templateOnly()); - await render(component); - assert.equal( - this.element.textContent, - 'this is a template-only component with no dynamic content', - 'has rendered content' - ); - }); - test('works with a glimmer component', async function (assert) { - const template = precompileTemplate( - '

hello my favorite color is {{this.favoriteColor}}

' - ); + test('setting properties on the test context *before* rendering a component throws an assertion', async function (assert) { + assert.expect(1); + const template = precompileTemplate('the value of foo is {{this.foo}}'); - class Foo extends GlimmerComponent { - favoriteColor = 'red'; - } + class Foo extends GlimmerComponent {} - const component = setComponentTemplate(template, Foo); + const component = setComponentTemplate(template, Foo); - await render(component); - assert.equal( - this.element.textContent, - 'hello my favorite color is red', - 'has rendered content' - ); + this.set('foo', 'FOO'); + this.set('bar', 'BAR'); + this.setProperties({ + baz: 'BAZ', + baq: 'BAQ', }); - test('works with a classic component', async function (assert) { - const template = precompileTemplate( - '

hello my favorite color is {{this.favoriteColor}}

' - ); - - const Foo = Component.extend({ - favoriteColor: 'red', - }); - - const component = setComponentTemplate(template, Foo); - + let error; + try { await render(component); - + } catch (err) { + error = err; + } finally { assert.equal( - this.element.textContent, - 'hello my favorite color is red', - 'has rendered content' - ); - }); - - test('components passed to render do *not* have access to the test context', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' + error.toString(), + `Error: Assertion Failed: You cannot call \`this.set\` or \`this.setProperties\` when passing a component to \`render\`, but they were called for the following properties: +- foo +- bar +- baz +- baq` ); + } + }); - class Foo extends GlimmerComponent { - foo = 'foo'; - } - - const component = setComponentTemplate(template, Foo); - - this.foo = 'bar'; - - await render(component); + test('setting properties on the test context *after* rendering a component throws an assertion', async function (assert) { + const template = precompileTemplate('the value of foo is {{this.foo}}'); - assert.equal(this.element.textContent, 'the value of foo is foo'); - }); + class Foo extends GlimmerComponent {} - test('setting properties on the test context *before* rendering a component throws an assertion', async function (assert) { - assert.expect(1); - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); + const component = setComponentTemplate(template, Foo); - class Foo extends GlimmerComponent {} - - const component = setComponentTemplate(template, Foo); - - this.set('foo', 'FOO'); - this.set('bar', 'BAR'); - this.setProperties({ - baz: 'BAZ', - baq: 'BAQ', - }); - - let error; - try { - await render(component); - } catch (err) { - error = err; - } finally { - assert.equal( - error.toString(), - `Error: Assertion Failed: You cannot call \`this.set\` or \`this.setProperties\` when passing a component to \`render\`, but they were called for the following properties: - - foo - - bar - - baz - - baq` - ); - } - }); + await render(component); - test('setting properties on the test context *after* rendering a component throws an assertion', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); - - class Foo extends GlimmerComponent {} - - const component = setComponentTemplate(template, Foo); + assert.throws( + () => this.set('foo', 'FOO'), + (err) => { + return err + .toString() + .includes( + 'You cannot call `this.set` when passing a component to `render()` (the rendered component does not have access to the test context).' + ); + }, + 'errors on this.set' + ); - await render(component); + assert.throws( + () => this.setProperties({ foo: 'bar?' }), + (err) => { + return err + .toString() + .includes( + 'You cannot call `this.setProperties` when passing a component to `render()` (the rendered component does not have access to the test context)' + ); + }, + 'errors on this.setProperties' + ); + }); - assert.throws( - () => this.set('foo', 'FOO'), - (err) => { - return err - .toString() - .includes( - 'You cannot call `this.set` when passing a component to `render()` (the rendered component does not have access to the test context).' - ); - }, - 'errors on this.set' - ); + test('setting properties on the test context when rendering a template does not throw an assertion', async function (assert) { + const template = precompileTemplate('the value of foo is {{this.foo}}'); - assert.throws( - () => this.setProperties({ foo: 'bar?' }), - (err) => { - return err - .toString() - .includes( - 'You cannot call `this.setProperties` when passing a component to `render()` (the rendered component does not have access to the test context)' - ); - }, - 'errors on this.setProperties' - ); + this.set('foo', 'FOO'); + this.setProperties({ + foo: 'bar?', }); - test('setting properties on the test context when rendering a template does not throw an assertion', async function (assert) { - const template = precompileTemplate( - 'the value of foo is {{this.foo}}' - ); - - this.set('foo', 'FOO'); - this.setProperties({ - foo: 'bar?', - }); - - await render(template); + await render(template); - assert.true(true, 'no assertions are thrown'); - }); + assert.true(true, 'no assertions are thrown'); }); - } + }); } module('with only application set', function (hooks) { diff --git a/tests/unit/teardown-context-test.js b/tests/unit/teardown-context-test.js index fcf7a4bc1..e27e16bd6 100644 --- a/tests/unit/teardown-context-test.js +++ b/tests/unit/teardown-context-test.js @@ -9,7 +9,6 @@ import { 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'; @@ -18,10 +17,6 @@ import setupManualTestWaiter from '../helpers/manual-test-waiter'; import { registerDestructor } from '@ember/destroyable'; module('teardownContext', function (hooks) { - if (!hasEmberVersion(2, 4)) { - return; - } - setupManualTestWaiter(hooks); let context;