`,
- 'route:posts/post': Route.extend({
+ 'route:posts/post': class extends Route {
model(params) {
return params;
- },
- }),
+ }
+ },
});
});
- setupApplicationTest(hooks);
-
test('can render', async function (assert) {
await visit('/');
- assert.equal(currentRouteName(), 'index');
- assert.equal(currentURL(), '/');
+ assert.strictEqual(currentRouteName(), 'index');
+ assert.strictEqual(currentURL(), '/');
- assert.equal(
+ assert.strictEqual(
this.element.querySelector('.nav').textContent,
'posts | widgets'
);
- assert.equal(this.element.querySelector('h1').textContent, 'Hello World!');
+ assert.strictEqual(
+ this.element.querySelector('h1').textContent,
+ 'Hello World!'
+ );
});
test('can perform a basic template rendering for nested route', async function (assert) {
await visit('/posts/1');
- assert.equal(currentRouteName(), 'posts.post');
- assert.equal(currentURL(), '/posts/1');
+ assert.strictEqual(currentRouteName(), 'posts.post');
+ assert.strictEqual(currentURL(), '/posts/1');
- assert.equal(
+ assert.strictEqual(
this.element.querySelector('.nav').textContent,
'posts | widgets'
);
- assert.equal(this.element.querySelector('.post-id').textContent, '1');
+ assert.strictEqual(this.element.querySelector('.post-id').textContent, '1');
});
test('can visit multiple times', async function (assert) {
await visit('/posts/1');
- assert.equal(currentRouteName(), 'posts.post');
- assert.equal(currentURL(), '/posts/1');
+ assert.strictEqual(currentRouteName(), 'posts.post');
+ assert.strictEqual(currentURL(), '/posts/1');
- assert.equal(
+ assert.strictEqual(
this.element.querySelector('.nav').textContent,
'posts | widgets'
);
- assert.equal(this.element.querySelector('.post-id').textContent, '1');
+ assert.strictEqual(this.element.querySelector('.post-id').textContent, '1');
await visit('/');
- assert.equal(currentRouteName(), 'index');
- assert.equal(currentURL(), '/');
+ assert.strictEqual(currentRouteName(), 'index');
+ assert.strictEqual(currentURL(), '/');
- assert.equal(
+ assert.strictEqual(
this.element.querySelector('.nav').textContent,
'posts | widgets'
);
- assert.equal(this.element.querySelector('h1').textContent, 'Hello World!');
+ assert.strictEqual(
+ this.element.querySelector('h1').textContent,
+ 'Hello World!'
+ );
await visit('/posts/2');
- assert.equal(currentRouteName(), 'posts.post');
- assert.equal(currentURL(), '/posts/2');
+ assert.strictEqual(currentRouteName(), 'posts.post');
+ assert.strictEqual(currentURL(), '/posts/2');
- assert.equal(
+ assert.strictEqual(
this.element.querySelector('.nav').textContent,
'posts | widgets'
);
- assert.equal(this.element.querySelector('.post-id').textContent, '2');
+ assert.strictEqual(this.element.querySelector('.post-id').textContent, '2');
});
test('can navigate amongst routes', async function (assert) {
await visit('/');
- assert.equal(currentRouteName(), 'index');
- assert.equal(currentURL(), '/');
+ assert.strictEqual(currentRouteName(), 'index');
+ assert.strictEqual(currentURL(), '/');
await click('a[href="/posts"]');
- assert.equal(currentRouteName(), 'posts.index');
- assert.equal(currentURL(), '/posts');
+ assert.strictEqual(currentRouteName(), 'posts.index');
+ assert.strictEqual(currentURL(), '/posts');
- assert.equal(this.element.querySelector('h1').textContent, 'Posts Page');
+ assert.strictEqual(
+ this.element.querySelector('h1').textContent,
+ 'Posts Page'
+ );
});
});
diff --git a/test-app/tests/helpers/index.js b/test-app/tests/helpers/index.js
new file mode 100644
index 00000000..7f70de80
--- /dev/null
+++ b/test-app/tests/helpers/index.js
@@ -0,0 +1,42 @@
+import {
+ setupApplicationTest as upstreamSetupApplicationTest,
+ setupRenderingTest as upstreamSetupRenderingTest,
+ setupTest as upstreamSetupTest,
+} from 'ember-qunit';
+
+// This file exists to provide wrappers around ember-qunit's / ember-mocha's
+// test setup functions. This way, you can easily extend the setup that is
+// needed per test type.
+
+function setupApplicationTest(hooks, options) {
+ upstreamSetupApplicationTest(hooks, options);
+
+ // Additional setup for application tests can be done here.
+ //
+ // For example, if you need an authenticated session for each
+ // application test, you could do:
+ //
+ // hooks.beforeEach(async function () {
+ // await authenticateSession(); // ember-simple-auth
+ // });
+ //
+ // This is also a good place to call test setup functions coming
+ // from other addons:
+ //
+ // setupIntl(hooks); // ember-intl
+ // setupMirage(hooks); // ember-cli-mirage
+}
+
+function setupRenderingTest(hooks, options) {
+ upstreamSetupRenderingTest(hooks, options);
+
+ // Additional setup for rendering tests can be done here.
+}
+
+function setupTest(hooks, options) {
+ upstreamSetupTest(hooks, options);
+
+ // Additional setup for unit tests can be done here.
+}
+
+export { setupApplicationTest, setupRenderingTest, setupTest };
diff --git a/test-app/tests/helpers/resolver.js b/test-app/tests/helpers/resolver.js
new file mode 100644
index 00000000..b5059ef1
--- /dev/null
+++ b/test-app/tests/helpers/resolver.js
@@ -0,0 +1,5 @@
+export function setResolverRegistry(owner, registry) {
+ for (let [key, value] of Object.entries(registry)) {
+ owner.register(key, value);
+ }
+}
diff --git a/addon/tests/index.html b/test-app/tests/index.html
similarity index 86%
rename from addon/tests/index.html
rename to test-app/tests/index.html
index b74fc8be..e4b2e696 100644
--- a/addon/tests/index.html
+++ b/test-app/tests/index.html
@@ -2,7 +2,7 @@
- Dummy Tests
+ TestApp Tests
@@ -10,7 +10,7 @@
{{content-for "test-head"}}
-
+
{{content-for "head-footer"}}
@@ -30,7 +30,7 @@
-
+
{{content-for "body-footer"}}
diff --git a/addon/tests/integration/.gitkeep b/test-app/tests/integration/.gitkeep
similarity index 100%
rename from addon/tests/integration/.gitkeep
rename to test-app/tests/integration/.gitkeep
diff --git a/addon/tests/integration/setup-rendering-test-test.js b/test-app/tests/integration/setup-rendering-test-test.js
similarity index 74%
rename from addon/tests/integration/setup-rendering-test-test.js
rename to test-app/tests/integration/setup-rendering-test-test.js
index e3a57c52..78923073 100644
--- a/addon/tests/integration/setup-rendering-test-test.js
+++ b/test-app/tests/integration/setup-rendering-test-test.js
@@ -1,22 +1,18 @@
+/* eslint-disable ember/no-classic-components */
import { module, test } from 'qunit';
import Component from '@ember/component';
import { helper } from '@ember/component/helper';
import { hbs } from 'ember-cli-htmlbars';
import { setupRenderingTest } from 'ember-qunit';
import { render } from '@ember/test-helpers';
-import { setResolverRegistry } from '../helpers/resolver';
module('setupRenderingTest tests', function (hooks) {
- hooks.beforeEach(function () {
- setResolverRegistry({});
- });
-
setupRenderingTest(hooks);
test('can render a simple template', async function (assert) {
await render(hbs`
Hello!
`);
- assert.equal(this.element.textContent, 'Hello!');
+ assert.strictEqual(this.element.textContent, 'Hello!');
});
test('can invoke template only components', async function (assert) {
@@ -24,20 +20,24 @@ module('setupRenderingTest tests', function (hooks) {
'template:components/template-only',
hbs`template-only component here`
);
- await render(hbs`{{template-only}}`);
+ await render(hbs``);
- assert.equal(this.element.textContent, 'template-only component here');
+ assert.strictEqual(
+ this.element.textContent,
+ 'template-only component here'
+ );
});
test('can invoke JS only components', async function (assert) {
this.owner.register(
'component:js-only',
+ // eslint-disable-next-line ember/no-classic-classes
Component.extend({
classNames: ['js-only'],
})
);
- await render(hbs`{{js-only}}`);
+ await render(hbs``);
assert.ok(
this.element.querySelector('.js-only'),
@@ -53,6 +53,6 @@ module('setupRenderingTest tests', function (hooks) {
await render(hbs`{{jax "max"}}`);
- assert.equal(this.element.textContent, 'max-jax');
+ assert.strictEqual(this.element.textContent, 'max-jax');
});
});
diff --git a/test-app/tests/integration/setup-test-test.js b/test-app/tests/integration/setup-test-test.js
new file mode 100644
index 00000000..30e373f0
--- /dev/null
+++ b/test-app/tests/integration/setup-test-test.js
@@ -0,0 +1,50 @@
+import { module, test } from 'qunit';
+import Service, { inject as injectService } from '@ember/service';
+import { setupTest } from 'ember-qunit';
+import hasEmberVersion from '@ember/test-helpers/has-ember-version';
+
+module('setupTest tests', function (hooks) {
+ if (!hasEmberVersion(2, 4)) {
+ return;
+ }
+
+ setupTest(hooks);
+
+ test('can be used for unit style testing', function (assert) {
+ this.owner.register(
+ 'service:foo',
+ class extends Service {
+ someMethod() {
+ return 'hello thar!';
+ }
+ }
+ );
+
+ let subject = this.owner.lookup('service:foo');
+
+ assert.strictEqual(subject.someMethod(), 'hello thar!');
+ });
+
+ test('can access a shared service instance', function (assert) {
+ this.owner.register('service:bar', class extends Service {});
+ this.owner.register(
+ 'service:foo',
+ class extends Service {
+ @injectService bar;
+
+ someMethod() {
+ this.set('bar.someProp', 'derp');
+ }
+ }
+ );
+
+ let subject = this.owner.lookup('service:foo');
+ let bar = this.owner.lookup('service:bar');
+
+ assert.notOk(bar.get('someProp'), 'precond - initially undefined');
+
+ subject.someMethod();
+
+ assert.strictEqual(bar.get('someProp'), 'derp', 'property updated');
+ });
+});
diff --git a/test-app/tests/test-helper.js b/test-app/tests/test-helper.js
new file mode 100644
index 00000000..81843044
--- /dev/null
+++ b/test-app/tests/test-helper.js
@@ -0,0 +1,12 @@
+import Application from 'test-app/app';
+import config from 'test-app/config/environment';
+import * as QUnit from 'qunit';
+import { setApplication } from '@ember/test-helpers';
+import { setup } from 'qunit-dom';
+import { start } from 'ember-qunit';
+
+setApplication(Application.create(config.APP));
+
+setup(QUnit.assert);
+
+start();
diff --git a/addon/tests/unit/.gitkeep b/test-app/tests/unit/.gitkeep
similarity index 100%
rename from addon/tests/unit/.gitkeep
rename to test-app/tests/unit/.gitkeep
diff --git a/addon/tests/unit/adapter-test.js b/test-app/tests/unit/adapter-test.js
similarity index 92%
rename from addon/tests/unit/adapter-test.js
rename to test-app/tests/unit/adapter-test.js
index 2ea588cc..33c94990 100644
--- a/addon/tests/unit/adapter-test.js
+++ b/test-app/tests/unit/adapter-test.js
@@ -9,6 +9,7 @@ import { Promise } from 'rsvp';
module('QUnitAdapter');
test('asyncStart waits for asyncEnd to finish a test', function (assert) {
+ assert.expect(1);
const adapter = QUnitAdapter.create();
adapter.asyncStart();
@@ -19,6 +20,7 @@ test('asyncStart waits for asyncEnd to finish a test', function (assert) {
});
test('asyncStart waits for equal numbers of asyncEnd to finish a test', function (assert) {
+ assert.expect(1);
const adapter = QUnitAdapter.create();
adapter.asyncStart();
@@ -32,6 +34,7 @@ test('asyncStart waits for equal numbers of asyncEnd to finish a test', function
});
test('asyncStart should handle skipped tests that has no assert', function (assert) {
+ assert.expect(2);
let FakeQUnitWithoutAssert = {
config: {
current: {},
@@ -41,7 +44,7 @@ test('asyncStart should handle skipped tests that has no assert', function (asse
const adapter = QUnitAdapter.create({ qunit: FakeQUnitWithoutAssert });
adapter.asyncStart();
- assert.equal(adapter.doneCallbacks.length, 1);
+ assert.strictEqual(adapter.doneCallbacks.length, 1);
assert.deepEqual(adapter.doneCallbacks, [
{
test: FakeQUnitWithoutAssert.config.current,
@@ -54,6 +57,7 @@ module('QUnitAdapter - Balanced async with native Promise', function () {
const adapter = QUnitAdapter.create();
test('asyncStart invoked', function (assert) {
+ assert.expect(1);
adapter.asyncStart();
assert.ok(true);
@@ -74,6 +78,7 @@ module('QUnitAdapter - Balanced async with RSVP.Promise', function () {
const adapter = QUnitAdapter.create();
test('asyncStart invoked', function (assert) {
+ assert.expect(1);
adapter.asyncStart();
assert.ok(true);
diff --git a/addon/tests/unit/ember-testing-test.js b/test-app/tests/unit/ember-testing-test.js
similarity index 80%
rename from addon/tests/unit/ember-testing-test.js
rename to test-app/tests/unit/ember-testing-test.js
index 0628127c..f6d26756 100644
--- a/addon/tests/unit/ember-testing-test.js
+++ b/test-app/tests/unit/ember-testing-test.js
@@ -3,6 +3,6 @@ import { module, test } from 'qunit';
module('setupEmberTesting', function () {
test('Ember.testing is true in all test contexts', function (assert) {
- assert.strictEqual(Ember.testing, true);
+ assert.true(Ember.testing);
});
});
diff --git a/addon/tests/unit/setup-ember-onerror-validation-test.js b/test-app/tests/unit/setup-ember-onerror-validation-test.js
similarity index 100%
rename from addon/tests/unit/setup-ember-onerror-validation-test.js
rename to test-app/tests/unit/setup-ember-onerror-validation-test.js
diff --git a/addon/tests/unit/test-isolation-validation-test.js b/test-app/tests/unit/test-isolation-validation-test.js
similarity index 84%
rename from addon/tests/unit/test-isolation-validation-test.js
rename to test-app/tests/unit/test-isolation-validation-test.js
index d956ed71..24c12e96 100644
--- a/addon/tests/unit/test-isolation-validation-test.js
+++ b/test-app/tests/unit/test-isolation-validation-test.js
@@ -1,6 +1,6 @@
-import Ember from 'ember';
import { later, _backburner as backburner } from '@ember/runloop';
-import { module, test } from 'qunit';
+import { registerWaiter, unregisterWaiter } from '@ember/test';
+import QUnit, { module, test } from 'qunit';
import { installTestNotIsolatedHook } from 'ember-qunit/test-isolation-validation';
import { getDebugInfo } from '@ember/test-helpers';
import patchAssert from './utils/patch-assert-helper';
@@ -14,17 +14,12 @@ if (getDebugInfo()) {
return !isWaiterPending;
};
- // In Ember < 2.8 `registerWaiter` expected to be bound to
- // `Ember.Test` 😭
- //
- // Once we have dropped support for < 2.8 we should swap this to
- // use:
- //
- // import { registerWaiter } from '@ember/test';
- Ember.Test.registerWaiter(waiter);
+ // eslint-disable-next-line ember/no-legacy-test-waiters
+ registerWaiter(waiter);
QUnit.on('testEnd', function () {
- Ember.Test.unregisterWaiter(this._waiter);
+ // eslint-disable-next-line ember/no-legacy-test-waiters
+ unregisterWaiter(this._waiter);
});
hooks.beforeEach(function () {
diff --git a/addon/tests/unit/unhandled-rejection-test.js b/test-app/tests/unit/unhandled-rejection-test.js
similarity index 93%
rename from addon/tests/unit/unhandled-rejection-test.js
rename to test-app/tests/unit/unhandled-rejection-test.js
index d7d4b159..6f7dd065 100644
--- a/addon/tests/unit/unhandled-rejection-test.js
+++ b/test-app/tests/unit/unhandled-rejection-test.js
@@ -21,6 +21,7 @@ module('unhandle promise rejections', function (hooks) {
});
test('RSVP promises cause an unhandled rejection', function (assert) {
+ assert.expect(2);
let done = assert.async();
window.onerror = (message) => {
@@ -36,7 +37,7 @@ module('unhandle promise rejections', function (hooks) {
};
// ensure we do not exit this test until the assertion has happened
- setTimeout(done, 10);
+ setTimeout(() => done(), 10);
new RSVPPromise((resolve) => {
setTimeout(resolve);
@@ -47,10 +48,11 @@ module('unhandle promise rejections', function (hooks) {
if (HAS_NATIVE_PROMISE && HAS_UNHANDLED_REJECTION_HANDLER) {
test('native promises cause an unhandled rejection', function (assert) {
+ assert.expect(1);
let done = assert.async();
// ensure we do not exit this test until the assertion has happened
- setTimeout(done, 10);
+ setTimeout(() => done(), 10);
new self.Promise((resolve) => {
setTimeout(resolve);
diff --git a/addon/tests/unit/utils/patch-assert-helper.js b/test-app/tests/unit/utils/patch-assert-helper.js
similarity index 100%
rename from addon/tests/unit/utils/patch-assert-helper.js
rename to test-app/tests/unit/utils/patch-assert-helper.js
diff --git a/test-app/types/index.d.ts b/test-app/types/index.d.ts
new file mode 100644
index 00000000..d11b83d5
--- /dev/null
+++ b/test-app/types/index.d.ts
@@ -0,0 +1,272 @@
+// Type definitions for ember-qunit 5.0
+// Project: https://github.com/emberjs/ember-qunit#readme
+// Definitions by: Dan Freeman
+// Chris Krycho
+// James C. Davis
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// Minimum TypeScript Version: 4.4
+
+import EmberTestAdapter from '@ember/test/adapter';
+import { Resolver } from '@ember/owner';
+import { TestContext } from '@ember/test-helpers';
+
+/**
+ * Sets a Resolver globally which will be used to look up objects from each test's container.
+ */
+export function setResolver(resolver: Resolver): void;
+
+/**
+ * Options for configuring the test runner. Normally, you will not need to
+ * customize this. It is exported primarily so that end user app code can name
+ * it when passing it back to the framework.
+ */
+export interface SetupTestOptions {
+ /**
+ * The resolver to use when instantiating container-managed entities in the test.
+ */
+ resolver?: Resolver | undefined;
+}
+
+/**
+ * Sets up acceptance tests.
+ *
+ * The `setupApplicationTest` function is used for all acceptance tests. It
+ * is invoked in the callback scope of a QUnit module (aka "nested module").
+ *
+ * Once invoked, all subsequent hooks.beforeEach and test invocations will
+ * have access to the following:
+ * * `this.owner` - the owner object that been set on the test context.
+ * * `this.pauseTest` and `this.resumeTest` - allow easy pausing/resuming of tests.
+ * * `this.element` which returns the DOM element representing the application's root element.
+ */
+export function setupApplicationTest(
+ hooks: NestedHooks,
+ options?: SetupTestOptions
+): void;
+
+/**
+ * Sets up tests that need to render snippets of templates.
+ *
+ * The setupRenderingTest method is used for tests that need to render
+ * snippets of templates. It is also invoked in the callback scope of a
+ * QUnit module (aka "nested module").
+ *
+ * Once invoked, all subsequent hooks.beforeEach and test invocations will
+ * have access to the following:
+ * * All of the methods / properties listed for `setupTest`
+ * * this.render(...) - Renders the provided template snippet returning a
+ * promise that resolves once rendering has completed
+ * * An importable render function that de-sugars into this.render will be
+ * the default output of blueprints
+ * * this.element - Returns the native DOM element representing the element
+ * that was rendered via this.render
+ * * this.$(...) - When jQuery is present, executes a jQuery selector with
+ * the current this.element as its root
+ */
+export function setupRenderingTest(
+ hooks: NestedHooks,
+ options?: SetupTestOptions
+): void;
+
+/**
+ * Sets up tests that do not need to render snippets of templates.
+ *
+ * The `setupTest` method is used for all types of tests except for those
+ * that need to render snippets of templates. It is invoked in the callback
+ * scope of a QUnit module (aka "nested module").
+ *
+ * Once invoked, all subsequent hooks.beforeEach and test invocations will
+ * have access to the following:
+ * * this.owner - This exposes the standard "owner API" for the test environment.
+ * * this.set / this.setProperties - Allows setting values on the test context.
+ * * this.get / this.getProperties - Retrieves values from the test context.
+ */
+export function setupTest(hooks: NestedHooks, options?: SetupTestOptions): void;
+
+export class QUnitAdapter extends EmberTestAdapter {}
+
+export { module, test, skip, only, todo } from 'qunit';
+
+interface QUnitStartOptions {
+ /**
+ * If `false` tests will not be loaded automatically.
+ */
+ loadTests?: boolean | undefined;
+
+ /**
+ * If `false` the test container will not be setup based on `devmode`,
+ * `dockcontainer`, or `nocontainer` URL params.
+ */
+ setupTestContainer?: boolean | undefined;
+
+ /**
+ * If `false` tests will not be automatically started (you must run
+ * `QUnit.start()` to kick them off).
+ */
+ startTests?: boolean | undefined;
+
+ /**
+ * If `false` the default Ember.Test adapter will not be updated.
+ */
+ setupTestAdapter?: boolean | undefined;
+
+ /**
+ * `false` opts out of the default behavior of setting `Ember.testing`
+ * to `true` before all tests and back to `false` after each test will.
+ */
+ setupEmberTesting?: boolean | undefined;
+
+ /**
+ * If `false` validation of `Ember.onerror` will be disabled.
+ */
+ setupEmberOnerrorValidation?: boolean | undefined;
+
+ /**
+ * If `false` test isolation validation will be disabled.
+ */
+ setupTestIsolationValidation?: boolean | undefined;
+}
+
+export function start(options?: QUnitStartOptions): void;
+
+// SAFETY: all of the `TC extends TestContext` generics below are just wildly,
+// impossibly unsafe. QUnit cannot -- ever! -- guarantee that the test context
+// is properly set up in a type-safe way to match this. However, it is the only
+// way to handle setting state in a TS-visible way prior to Ember RFC 0785,
+// which is slooooowly rolling out across the ecosystem in conjunction with the
+// `` feature.
+
+declare global {
+ // NOTE: disables `no-unnecessary-generics` inline because, unfortunately,
+ // the design of Ember's test tooling (and indeed *QUnit's* test system)
+ // requires that we allow users to update the type of the context of the
+ // test. This is indeed strictly *wrong*! However, changing it will require
+ // changing how Ember handles testing. See [the PR][pr] for further details.
+ //
+ // [pr]: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56494
+
+ interface NestedHooks {
+ /**
+ * Runs after the last test. If additional tests are defined after the
+ * module's queue has emptied, it will not run this hook again.
+ */
+ after(
+ fn: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Runs after each test.
+ */
+ afterEach(
+ fn: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Runs before the first test.
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ before(
+ fn: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Runs before each test.
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ beforeEach(
+ fn: (this: TC, assert: Assert) => void | Promise
+ ): void;
+ }
+
+ interface QUnit {
+ /**
+ * Add a test to run.
+ *
+ * Add a test to run using `QUnit.test()`.
+ *
+ * The `assert` argument to the callback contains all of QUnit's assertion
+ * methods. Use this argument to call your test assertions.
+ *
+ * `QUnit.test()` can automatically handle the asynchronous resolution of a
+ * Promise on your behalf if you return a thenable Promise as the result of
+ * your callback function.
+ *
+ * @param name Title of unit being tested
+ * @param callback Function to close over assertions
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ // provide this guarantee. However, it's also the only way to support TS
+ // in tests in Ember until we move the community over entirely to using
+ // `` and local scope.
+ test(
+ name: string,
+ callback: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Adds a test to exclusively run, preventing all other tests from running.
+ *
+ * Use this method to focus your test suite on a specific test. QUnit.only
+ * will cause any other tests in your suite to be ignored.
+ *
+ * Note, that if more than one QUnit.only is present only the first instance
+ * will run.
+ *
+ * This is an alternative to filtering tests to run in the HTML reporter. It
+ * is especially useful when you use a console reporter or in a codebase
+ * with a large set of long running tests.
+ *
+ * @param name Title of unit being tested
+ * @param callback Function to close over assertions
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ // provide this guarantee. However, it's also the only way to support TS
+ // in tests in Ember until we move the community over entirely to using
+ // `` and local scope.
+ only(
+ name: string,
+ callback: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Use this method to test a unit of code which is still under development (in a “todo” state).
+ * The test will pass as long as one failing assertion is present.
+ *
+ * If all assertions pass, then the test will fail signaling that `QUnit.todo` should
+ * be replaced by `QUnit.test`.
+ *
+ * @param name Title of unit being tested
+ * @param callback Function to close over assertions
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ // provide this guarantee. However, it's also the only way to support TS
+ // in tests in Ember until we move the community over entirely to using
+ // `` and local scope.
+ todo(
+ name: string,
+ callback: (this: TC, assert: Assert) => void | Promise
+ ): void;
+
+ /**
+ * Adds a test like object to be skipped.
+ *
+ * Use this method to replace QUnit.test() instead of commenting out entire
+ * tests.
+ *
+ * This test's prototype will be listed on the suite as a skipped test,
+ * ignoring the callback argument and the respective global and module's
+ * hooks.
+ *
+ * @param name Title of unit being tested
+ * @param callback Function to close over assertions
+ */
+ // SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
+ // provide this guarantee. However, it's also the only way to support TS
+ // in tests in Ember until we move the community over entirely to using
+ // `` and local scope.
+ skip(
+ name: string,
+ callback?: (this: TC, assert: Assert) => void | Promise
+ ): void;
+ }
+}
diff --git a/test-app/types/local-types.d.ts b/test-app/types/local-types.d.ts
new file mode 100644
index 00000000..2109bac6
--- /dev/null
+++ b/test-app/types/local-types.d.ts
@@ -0,0 +1,2 @@
+import 'ember-source/types';
+import 'ember-source/types/preview';
diff --git a/test-app/types/tsconfig.json b/test-app/types/tsconfig.json
new file mode 100644
index 00000000..9b0a3352
--- /dev/null
+++ b/test-app/types/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "extends": "@tsconfig/ember",
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "ember-qunit": [
+ "./index.d.ts"
+ ],
+ }
+ }
+}
From 9ebe673834dacc9f5267a81b18192378f245df22 Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Mon, 12 Jun 2023 11:15:34 -0400
Subject: [PATCH 2/5] Update @ember/test-helpers in the new app
---
addon/package.json | 2 +-
pnpm-lock.yaml | 143 +++++++++++++++++-------------------------
test-app/package.json | 4 +-
3 files changed, 62 insertions(+), 87 deletions(-)
diff --git a/addon/package.json b/addon/package.json
index 606592c7..65cb8a0d 100644
--- a/addon/package.json
+++ b/addon/package.json
@@ -51,7 +51,7 @@
"@ember/optional-features": "^2.0.0",
"@ember/string": "^3.1.1",
"@ember/test-helpers": "^3.0.3",
- "@embroider/test-setup": "^2.1.1",
+ "@embroider/test-setup": "^3.0.1",
"@glimmer/component": "^1.1.2",
"@tsconfig/ember": "^2.0.0",
"@types/qunit": "^2.19.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 197ed777..0423ea95 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -54,8 +54,8 @@ importers:
specifier: ^3.0.3
version: 3.0.3(ember-source@4.10.0)(webpack@5.75.0)
'@embroider/test-setup':
- specifier: ^2.1.1
- version: 2.1.1
+ specifier: ^3.0.1
+ version: 3.0.1
'@glimmer/component':
specifier: ^1.1.2
version: 1.1.2(@babel/core@7.21.0)
@@ -166,14 +166,14 @@ importers:
specifier: ^3.0.1
version: 3.1.1
'@ember/test-helpers':
- specifier: ^2.9.3
- version: 2.9.3(@babel/core@7.21.0)(ember-source@4.10.0)
+ specifier: ^3.0.3
+ version: 3.0.3(ember-source@4.10.0)(webpack@5.75.0)
'@ember/test-waiters':
specifier: ^3.0.2
version: 3.0.2
'@embroider/test-setup':
- specifier: ^2.1.1
- version: 2.1.1
+ specifier: ^3.0.1
+ version: 3.0.1
'@glimmer/component':
specifier: ^1.1.2
version: 1.1.2(@babel/core@7.21.0)
@@ -415,7 +415,7 @@ packages:
'@babel/helper-plugin-utils': 7.19.0
debug: 4.3.4
lodash.debounce: 4.0.8
- resolve: 1.22.3
+ resolve: 1.22.1
semver: 6.3.0
transitivePeerDependencies:
- supports-color
@@ -1499,28 +1499,6 @@ packages:
- supports-color
dev: true
- /@ember/test-helpers@2.9.3(@babel/core@7.21.0)(ember-source@4.10.0):
- resolution: {integrity: sha512-ejVg4Dj+G/6zyLvQsYOvmGiOLU6AS94tY4ClaO1E2oVvjjtVJIRmVLFN61I+DuyBg9hS3cFoPjQRTZB9MRIbxQ==}
- engines: {node: 10.* || 12.* || 14.* || 15.* || >= 16.*}
- peerDependencies:
- ember-source: '>=3.8.0'
- dependencies:
- '@ember/test-waiters': 3.0.2
- '@embroider/macros': 1.10.0
- '@embroider/util': 1.11.1(ember-source@4.10.0)
- broccoli-debug: 0.6.5
- broccoli-funnel: 3.0.8
- ember-cli-babel: 7.26.11
- ember-cli-htmlbars: 6.2.0
- ember-destroyable-polyfill: 2.0.3(@babel/core@7.21.0)
- ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/environment-ember-loose'
- - '@glint/template'
- - supports-color
- dev: true
-
/@ember/test-helpers@3.0.3(ember-source@4.10.0)(webpack@5.75.0):
resolution: {integrity: sha512-W8fEWritv36W216wmuusOlsUJs+iDFkOvHratI8tw466NV4deq9TVej1p5DtUFeDUUP/E14IxqrNNC3qaYszfQ==}
engines: {node: 16.* || >= 18}
@@ -1528,7 +1506,7 @@ packages:
ember-source: ^4.0.0 || ^5.0.0
dependencies:
'@ember/test-waiters': 3.0.2
- '@embroider/macros': 1.10.0
+ '@embroider/macros': 1.11.0
broccoli-debug: 0.6.5
broccoli-funnel: 3.0.8
ember-auto-import: 2.6.1(webpack@5.75.0)
@@ -1536,6 +1514,7 @@ packages:
ember-cli-htmlbars: 6.2.0
ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0)
transitivePeerDependencies:
+ - '@glint/template'
- supports-color
- webpack
dev: true
@@ -1582,8 +1561,8 @@ packages:
ember-cli-babel: 7.26.11
find-up: 5.0.0
lodash: 4.17.21
- resolve: 1.22.3
- semver: 7.3.8
+ resolve: 1.22.2
+ semver: 7.5.1
transitivePeerDependencies:
- supports-color
dev: true
@@ -1611,37 +1590,27 @@ packages:
js-string-escape: 1.0.1
lodash: 4.17.21
resolve-package-path: 4.0.3
- semver: 7.3.8
+ semver: 7.5.1
typescript-memoize: 1.1.1
dev: true
- /@embroider/test-setup@2.1.1:
- resolution: {integrity: sha512-t81a2z2OEFAOZVbV7wkgiDuCyZ3ajD7J7J+keaTfNSRiXoQgeFFASEECYq1TCsH8m/R+xHMRiY59apF2FIeFhw==}
+ /@embroider/test-setup@3.0.1:
+ resolution: {integrity: sha512-t7R2f10iZDSNw3ovWAPM63GRQTu63uihpVh6CvHev5XkLt8B7tdxcxGyO6RbdF5Hu+pbsUu8sD0kAlR1gopmxg==}
engines: {node: 12.* || 14.* || >= 16}
- dependencies:
- lodash: 4.17.21
- resolve: 1.22.1
- dev: true
-
- /@embroider/util@1.11.1(ember-source@4.10.0):
- resolution: {integrity: sha512-IqzlEQahM2cfLvo4PULA2WyvROqr9jRmeSv0GGZzpitWCh6l4FDwweOLSArdlKSXdQxHkKhwBMCi//7DhKjRlg==}
- engines: {node: 14.* || >= 16}
peerDependencies:
- '@glint/environment-ember-loose': ^1.0.0
- '@glint/template': ^1.0.0
- ember-source: '*'
+ '@embroider/compat': ^3.0.0
+ '@embroider/core': ^3.0.0
+ '@embroider/webpack': ^3.0.0
peerDependenciesMeta:
- '@glint/environment-ember-loose':
+ '@embroider/compat':
optional: true
- '@glint/template':
+ '@embroider/core':
+ optional: true
+ '@embroider/webpack':
optional: true
dependencies:
- '@embroider/macros': 1.11.0
- broccoli-funnel: 3.0.8
- ember-cli-babel: 7.26.11
- ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0)
- transitivePeerDependencies:
- - supports-color
+ lodash: 4.17.21
+ resolve: 1.22.2
dev: true
/@eslint-community/eslint-utils@4.4.0(eslint@8.39.0):
@@ -1917,7 +1886,7 @@ packages:
resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
dependencies:
'@gar/promisify': 1.1.3
- semver: 7.3.8
+ semver: 7.5.1
dev: true
/@npmcli/move-file@1.1.2:
@@ -2884,7 +2853,7 @@ packages:
glob: 7.2.3
pkg-up: 2.0.0
reselect: 3.0.1
- resolve: 1.22.3
+ resolve: 1.22.2
/babel-plugin-module-resolver@4.1.0:
resolution: {integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==}
@@ -2894,7 +2863,7 @@ packages:
glob: 7.2.3
pkg-up: 3.1.0
reselect: 4.1.6
- resolve: 1.22.3
+ resolve: 1.22.1
dev: true
/babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.0):
@@ -3442,7 +3411,7 @@ packages:
ensure-posix-path: 1.1.1
fs-extra: 8.1.0
minimatch: 3.1.2
- resolve: 1.22.3
+ resolve: 1.22.1
rsvp: 4.8.5
symlink-or-copy: 1.3.1
walk-sync: 1.1.4
@@ -4910,7 +4879,7 @@ packages:
ember-cli-babel-plugin-helpers: 1.1.1
execa: 1.0.0
fs-extra: 7.0.1
- resolve: 1.22.1
+ resolve: 1.22.2
rsvp: 4.8.5
semver: 6.3.0
stagehand: 1.0.0
@@ -4930,7 +4899,7 @@ packages:
ember-cli-babel-plugin-helpers: 1.1.1
execa: 2.1.0
fs-extra: 8.1.0
- resolve: 1.22.3
+ resolve: 1.22.2
rsvp: 4.8.5
semver: 6.3.0
stagehand: 1.0.0
@@ -4944,7 +4913,7 @@ packages:
resolution: {integrity: sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==}
engines: {node: '>= 4'}
dependencies:
- resolve: 1.22.1
+ resolve: 1.22.2
semver: 5.7.1
dev: true
@@ -5150,18 +5119,6 @@ packages:
- supports-color
dev: true
- /ember-destroyable-polyfill@2.0.3(@babel/core@7.21.0):
- resolution: {integrity: sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw==}
- engines: {node: 10.* || >= 12}
- dependencies:
- ember-cli-babel: 7.26.11
- ember-cli-version-checker: 5.1.2
- ember-compatibility-helpers: 1.2.6(@babel/core@7.21.0)
- transitivePeerDependencies:
- - '@babel/core'
- - supports-color
- dev: true
-
/ember-disable-prototype-extensions@1.1.3:
resolution: {integrity: sha512-SB9NcZ27OtoUk+gfalsc3QU17+54OoqR668qHcuvHByk4KAhGxCKlkm9EBlKJcGr7yceOOAJqohTcCEBqfRw9g==}
engines: {node: '>= 0.10.0'}
@@ -7064,7 +7021,7 @@ packages:
heimdalljs: 0.2.6
heimdalljs-logger: 0.1.10
path-root: 0.1.1
- resolve: 1.22.1
+ resolve: 1.22.2
resolve-package-path: 1.2.7
transitivePeerDependencies:
- supports-color
@@ -7125,7 +7082,7 @@ packages:
resolution: {integrity: sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
dependencies:
- lru-cache: 7.14.0
+ lru-cache: 7.18.3
dev: true
/http-cache-semantics@4.1.1:
@@ -7502,6 +7459,7 @@ packages:
resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
dependencies:
has: 1.0.3
+ dev: true
/is-core-module@2.12.1:
resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
@@ -8356,8 +8314,8 @@ packages:
dependencies:
yallist: 4.0.0
- /lru-cache@7.14.0:
- resolution: {integrity: sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==}
+ /lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
dev: true
@@ -9099,7 +9057,7 @@ packages:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
hosted-git-info: 2.8.9
- resolve: 1.22.3
+ resolve: 1.22.2
semver: 5.7.1
validate-npm-package-license: 3.0.4
dev: true
@@ -10103,7 +10061,7 @@ packages:
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
engines: {node: '>= 0.10'}
dependencies:
- resolve: 1.22.3
+ resolve: 1.22.2
dev: true
/redeyed@1.0.1:
@@ -10347,21 +10305,21 @@ packages:
resolution: {integrity: sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==}
dependencies:
path-root: 0.1.1
- resolve: 1.22.3
+ resolve: 1.22.2
/resolve-package-path@2.0.0:
resolution: {integrity: sha512-/CLuzodHO2wyyHTzls5Qr+EFeG6RcW4u6//gjYvUfcfyuplIX1SSccU+A5A9A78Gmezkl3NBkFAMxLbzTY9TJA==}
engines: {node: 8.* || 10.* || >= 12}
dependencies:
path-root: 0.1.1
- resolve: 1.22.3
+ resolve: 1.22.2
/resolve-package-path@3.1.0:
resolution: {integrity: sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA==}
engines: {node: 10.* || >= 12}
dependencies:
path-root: 0.1.1
- resolve: 1.22.3
+ resolve: 1.22.2
/resolve-package-path@4.0.3:
resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==}
@@ -10386,7 +10344,15 @@ packages:
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
hasBin: true
dependencies:
- is-core-module: 2.11.0
+ is-core-module: 2.12.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ /resolve@1.22.2:
+ resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.12.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -10397,6 +10363,7 @@ packages:
is-core-module: 2.12.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ dev: true
/responselike@1.0.2:
resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
@@ -10631,6 +10598,14 @@ packages:
dependencies:
lru-cache: 6.0.0
+ /semver@7.5.1:
+ resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
/send@0.18.0:
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
engines: {node: '>= 0.8.0'}
@@ -11892,7 +11867,7 @@ packages:
resolution: {integrity: sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA==}
dependencies:
resolve-package-path: 3.1.0
- semver: 7.3.8
+ semver: 7.5.1
dev: true
/validate-peer-dependencies@2.2.0:
diff --git a/test-app/package.json b/test-app/package.json
index fe64095a..aab79e43 100644
--- a/test-app/package.json
+++ b/test-app/package.json
@@ -29,9 +29,9 @@
"@babel/eslint-parser": "^7.19.1",
"@ember/optional-features": "^2.0.0",
"@ember/string": "^3.0.1",
- "@ember/test-helpers": "^2.9.3",
+ "@ember/test-helpers": "^3.0.3",
"@ember/test-waiters": "^3.0.2",
- "@embroider/test-setup": "^2.1.1",
+ "@embroider/test-setup": "^3.0.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"@tsconfig/ember": "^2.0.0",
From 710aaa2a1c7032ce00b44687f4cd60900a28e220 Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Mon, 12 Jun 2023 15:05:22 -0400
Subject: [PATCH 3/5] Remove unsupported ember from ember-try.js
---
test-app/config/ember-try.js | 8 --------
1 file changed, 8 deletions(-)
diff --git a/test-app/config/ember-try.js b/test-app/config/ember-try.js
index d129073d..88329ed9 100644
--- a/test-app/config/ember-try.js
+++ b/test-app/config/ember-try.js
@@ -7,14 +7,6 @@ module.exports = async function () {
return {
usePnpm: true,
scenarios: [
- {
- name: 'ember-lts-3.28',
- npm: {
- devDependencies: {
- 'ember-source': '~3.28.0',
- },
- },
- },
{
name: 'ember-lts-4.4',
npm: {
From e80834dd05101e6fc04c52e90368512ae368735e Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Mon, 12 Jun 2023 15:20:01 -0400
Subject: [PATCH 4/5] Cleanup
---
addon/CONTRIBUTING.md | 6 +++---
addon/RELEASE.md | 2 +-
addon/package.json | 3 +--
package.json | 11 ++++-------
test-app/README.md | 3 +--
5 files changed, 10 insertions(+), 15 deletions(-)
diff --git a/addon/CONTRIBUTING.md b/addon/CONTRIBUTING.md
index 7ad58885..f79a9fca 100644
--- a/addon/CONTRIBUTING.md
+++ b/addon/CONTRIBUTING.md
@@ -4,12 +4,12 @@
* `git clone `
* `cd ember-qunit`
-* `yarn install`
+* `pnpm install`
## Linting
-* `yarn lint`
-* `yarn lint:fix`
+* `pnpm lint`
+* `pnpm lint:fix`
## Running tests
diff --git a/addon/RELEASE.md b/addon/RELEASE.md
index 55e91ed6..7d79c6c9 100644
--- a/addon/RELEASE.md
+++ b/addon/RELEASE.md
@@ -31,7 +31,7 @@ Once the prep work is completed, the actual release is straight forward:
* First, ensure that you have installed your projects dependencies:
```sh
-yarn install
+pnpm install
```
* Second, ensure that you have obtained a
diff --git a/addon/package.json b/addon/package.json
index 65cb8a0d..d7a59899 100644
--- a/addon/package.json
+++ b/addon/package.json
@@ -126,7 +126,6 @@
}
},
"volta": {
- "node": "18.16.0",
- "yarn": "1.22.19"
+ "extends": "../package.json"
}
}
diff --git a/package.json b/package.json
index ff3be3c4..d41aa2b6 100644
--- a/package.json
+++ b/package.json
@@ -5,15 +5,12 @@
"license": "MIT",
"repository": "https://github.com/emberjs/ember-qunit",
"scripts": {
- "lint": "yarn workspaces run lint",
- "lint:fix": "yarn workspaces run lint:fix",
- "test": "yarn workspaces run test"
+ "lint": "pnpm --filter '*' lint",
+ "lint:fix": "pnpm --filter '*' lint:fix",
+ "test": "pnpm --filter '*' test"
},
- "workspaces": [
- "addon"
- ],
"volta": {
"node": "18.16.0",
- "yarn": "1.22.19"
+ "pnpm": "8.6.1"
}
}
diff --git a/test-app/README.md b/test-app/README.md
index 8f4a03f0..00a38931 100644
--- a/test-app/README.md
+++ b/test-app/README.md
@@ -1,7 +1,6 @@
# test-app
-This README outlines the details of collaborating on this Ember application.
-A short introduction of this app could easily go here.
+This is the test-app for ember-qunit.
## Prerequisites
From 76e8b3e45418205f58a23fd348d4ac6cc88c91c2 Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Mon, 12 Jun 2023 15:20:50 -0400
Subject: [PATCH 5/5] Testapp README cleanup
---
test-app/README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/test-app/README.md b/test-app/README.md
index 00a38931..ee725570 100644
--- a/test-app/README.md
+++ b/test-app/README.md
@@ -16,7 +16,7 @@ You will need the following things properly installed on your computer.
* `git clone ` this repository
* `cd test-app`
-* `yarn install`
+* `pnpm install`
## Running / Development
@@ -35,8 +35,8 @@ Make use of the many generators for code, try `ember help generate` for more det
### Linting
-* `yarn lint`
-* `yarn lint:fix`
+* `pnpm lint`
+* `pnpm lint:fix`
### Building