ember-qunit
Version:
QUnit helpers for testing Ember.js applications
283 lines (253 loc) • 10.3 kB
TypeScript
// Type definitions for ember-qunit 5.0
// Project: https://github.com/emberjs/ember-qunit#readme
// Definitions by: Dan Freeman <https://github.com/dfreeman>
// Chris Krycho <https://github.com/chriskrycho>
// James C. Davis <https://github.com/jamescdavis>
// 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` 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` test isolation validation will be disabled.
*/
setupTestIsolationValidation?: boolean | undefined;
}
export function setupEmberOnerrorValidation(): void;
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
// `<template>` 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<TC extends TestContext>(
fn: (this: TC, assert: Assert) => void | Promise<void>
): void;
/**
* Runs after each test.
*/
afterEach<TC extends TestContext>(
fn: (this: TC, assert: Assert) => void | Promise<void>
): void;
/**
* Runs before the first test.
*/
// SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
before<TC extends TestContext>(
fn: (this: TC, assert: Assert) => void | Promise<void>
): void;
/**
* Runs before each test.
*/
// SAFETY: this is just wildly, impossibly unsafe. QUnit cannot -- ever! --
beforeEach<TC extends TestContext>(
fn: (this: TC, assert: Assert) => void | Promise<void>
): void;
}
interface QUnit {
/**
* 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
// `<template>` and local scope.
only<TC extends TestContext>(
name: string,
callback: (this: TC, assert: Assert) => void | Promise<unknown>
): 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
// `<template>` and local scope.
todo<TC extends TestContext>(
name: string,
callback: (this: TC, assert: Assert) => void | Promise<unknown>
): 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
// `<template>` and local scope.
skip<TC extends TestContext>(
name: string,
callback?: (this: TC, assert: Assert) => void | Promise<unknown>
): void;
}
namespace QUnit {
interface TestFunction {
// 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
// `<template>` and local scope.
<TC extends TestContext>(
name: string,
callback: (this: TC, assert: Assert) => void | Promise<unknown>
): void;
}
interface SkipFunction {
<TC extends TestContext>(
name: string,
callback?: (this: TC, assert: Assert) => void | Promise<unknown>
): void;
}
interface TodoFunction {
<TC extends TestContext>(
name: string,
callback?: (this: TC, assert: Assert) => void | Promise<unknown>
): void;
}
interface OnlyFunction {
<TC extends TestContext>(
name: string,
callback: (this: TC, assert: Assert) => void | Promise<unknown>
): void;
}
interface EachFunction {
<TC extends TestContext, T>(
name: string,
dataset: T[],
callback: (this: TC, assert: Assert, data: T) => void | Promise<unknown>
): void;
}
}
}