diff --git a/types/ember__test-helpers/ember__test-helpers-tests.ts b/types/ember__test-helpers/ember__test-helpers-tests.ts new file mode 100644 index 0000000000..9fe9e4c297 --- /dev/null +++ b/types/ember__test-helpers/ember__test-helpers-tests.ts @@ -0,0 +1,95 @@ +/// + +import { test } from 'qunit'; +import Application from '@ember/application'; +import hbs from 'htmlbars-inline-precompile'; +import { + click, + doubleClick, + tap, + focus, + blur, + triggerEvent, + triggerKeyEvent, + fillIn, + render, + find, + findAll, + getRootElement, + pauseTest, + resumeTest, + waitFor, + waitUntil, + settled, + isSettled, + getSettledState, + visit, + currentURL, + currentRouteName, + setApplication +} from '@ember/test-helpers'; + +const MyApp = Application.extend({ modulePrefix: 'my-app' }); + +setApplication(MyApp.create()); + +test('DOM interactions', async () => { + await render(hbs`
Hello, world
`); + + await click('.message'); + await doubleClick('.message'); + await tap('.message'); + await focus('.message'); + await blur('.message'); + await triggerEvent('.message', 'custom-event'); + await triggerKeyEvent('.message', 'keydown', 'Enter', { ctrlKey: true }); + await fillIn('.message', 'content'); + + const messageElement = find('.message')!; + await click(messageElement); + await doubleClick(messageElement); + await tap(messageElement); + await focus(messageElement); + await blur(messageElement); + await triggerEvent(messageElement, 'custom-event'); + await triggerKeyEvent(messageElement, 'keydown', 'Enter', { ctrlKey: true }); + await fillIn(messageElement, 'content'); + + const allMessages = findAll('.message'); + for (const element of allMessages) { + await click(element); + } + + const root = getRootElement(); + await click(root); +}); + +test('routing helpers', async (assert) => { + await visit('/foo'); + + assert.equal(currentURL(), '/foo'); + assert.equal(currentRouteName(), 'foo'); +}); + +test('pause and resume', async () => { + await pauseTest(); + setTimeout(resumeTest, 1000); +}); + +test('wait helpers', async (assert) => { + await render(hbs`
Hello
`); + + await waitFor('.message', { count: 1, timeout: 10, timeoutMessage: 'uh oh' }); + await waitUntil(() => 'hello', { timeout: 1000, timeoutMessage: 'boom' }); + + await settled(); + assert.ok(isSettled()); + + const { + hasPendingRequests, + hasPendingTimers, + hasPendingWaiters, + hasRunLoop, + pendingRequestCount + } = getSettledState(); +}); diff --git a/types/ember__test-helpers/index.d.ts b/types/ember__test-helpers/index.d.ts new file mode 100644 index 0000000000..067222b425 --- /dev/null +++ b/types/ember__test-helpers/index.d.ts @@ -0,0 +1,220 @@ +// Type definitions for @ember/test-helpers 0.7 +// Project: https://github.com/emberjs/ember-test-helpers +// Definitions by: Dan Freeman +// James C. Davis +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.6 + +/// + +declare module '@ember/test-helpers' { + // DOM Interaction Helpers + + export type Target = string | Element; + + export { default as click } from '@ember/test-helpers/dom/click'; + export { default as doubleClick } from '@ember/test-helpers/dom/double-click'; + export { default as tap } from '@ember/test-helpers/dom/tap'; + export { default as focus } from '@ember/test-helpers/dom/focus'; + export { default as blur } from '@ember/test-helpers/dom/blur'; + export { default as triggerEvent } from '@ember/test-helpers/dom/trigger-event'; + export { default as triggerKeyEvent } from '@ember/test-helpers/dom/trigger-key-event'; + export { default as fillIn } from '@ember/test-helpers/dom/fill-in'; + + // DOM Query Helpers + + export { default as find } from '@ember/test-helpers/dom/find'; + export { default as findAll } from '@ember/test-helpers/dom/find-all'; + export { default as getRootElement } from '@ember/test-helpers/dom/get-root-element'; + + // Routing Helpers + + export { visit, currentRouteName, currentURL } from '@ember/test-helpers/setup-application-context'; + + // Rendering Helpers + + export { render, clearRender } from '@ember/test-helpers/setup-rendering-context'; + + // Wait Helpers + + export { default as waitFor } from '@ember/test-helpers/dom/wait-for'; + export { default as waitUntil } from '@ember/test-helpers/wait-until'; + export { default as settled, isSettled, getSettledState } from '@ember/test-helpers/settled'; + + // Pause Helpers + + export { pauseTest, resumeTest } from '@ember/test-helpers/setup-context'; + + // Test Framework APIs + + export { setResolver, getResolver } from '@ember/test-helpers/resolver'; + export { default as setupContext, getContext, setContext, unsetContext } from '@ember/test-helpers/setup-context'; + export { default as teardownContext } from '@ember/test-helpers/teardown-context'; + export { default as setupRenderingContext } from '@ember/test-helpers/setup-rendering-context'; + export { default as teardownRenderingContext } from '@ember/test-helpers/teardown-rendering-context'; + export { getApplication, setApplication } from '@ember/test-helpers/application'; + export { default as setupApplicationContext } from '@ember/test-helpers/setup-application-context'; + export { default as teardownApplicationContext } from '@ember/test-helpers/teardown-application-context'; + export { default as validateErrorHandler } from '@ember/test-helpers/validate-error-handler'; +} + +declare module '@ember/test-helpers/dom/click' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target): Promise; +} + +declare module '@ember/test-helpers/dom/double-click' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target): Promise; +} + +declare module '@ember/test-helpers/dom/tap' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target): Promise; +} + +declare module '@ember/test-helpers/dom/focus' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target): Promise; +} + +declare module '@ember/test-helpers/dom/blur' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target): Promise; +} + +declare module '@ember/test-helpers/dom/trigger-event' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target, eventType: string, options?: object): Promise; +} + +declare module '@ember/test-helpers/dom/trigger-key-event' { + import { Target } from '@ember/test-helpers'; + + export type KeyEvent = 'keydown' | 'keyup' | 'keypress'; + + export interface KeyModifiers { + ctrlKey?: boolean; + altKey?: boolean; + shiftKey?: boolean; + metaKey?: boolean; + } + + export default function(target: Target, eventType: KeyEvent, key: number | string, modifiers?: KeyModifiers): Promise; +} + +declare module '@ember/test-helpers/dom/fill-in' { + import { Target } from '@ember/test-helpers'; + + export default function(target: Target, text: string): Promise; +} + +declare module '@ember/test-helpers/dom/find' { + export default function(selector: string): Element | null; +} + +declare module '@ember/test-helpers/dom/find-all' { + export default function(selector: string): Element[]; +} + +declare module '@ember/test-helpers/dom/get-root-element' { + export default function(): Element; +} + +declare module '@ember/test-helpers/setup-application-context' { + export default function(context: Context): Promise; + export function visit(url: string): Promise; + export function currentRouteName(): string; + export function currentURL(): string; +} + +declare module '@ember/test-helpers/setup-rendering-context' { + import { TemplateFactory } from 'htmlbars-inline-precompile'; + + export default function(context: Context): Promise; + export function render(template: TemplateFactory): Promise; + export function clearRender(): Promise; +} + +declare module '@ember/test-helpers/dom/wait-for' { + export interface Options { + timeout?: number; + count?: number; + timeoutMessage?: string; + } + + export default function(selector: string, options?: Options): Promise; +} + +declare module '@ember/test-helpers/wait-until' { + export interface Options { + timeout?: number; + timeoutMessage?: string; + } + + export default function(callback: () => T, options?: Options): Promise; +} + +declare module '@ember/test-helpers/settled' { + export interface SettledState { + hasRunLoop: boolean; + hasPendingTimers: boolean; + hasPendingWaiters: boolean; + hasPendingRequests: boolean; + pendingRequestCount: number; + } + + export default function(): Promise; + export function isSettled(): boolean; + export function getSettledState(): SettledState; +} + +declare module '@ember/test-helpers/setup-context' { + import Resolver from '@ember/application/resolver'; + + export default function(context: C, options?: { resolver?: Resolver }): Promise; + export function getContext(): object; + export function setContext(context: object): void; + export function unsetContext(): void; + + export function pauseTest(): Promise; + export function resumeTest(): void; +} + +declare module '@ember/test-helpers/resolver' { + import Resolver from '@ember/application/resolver'; + + export function setResolver(resolver: Resolver): void; + export function getResolver(): Resolver; +} + +declare module '@ember/test-helpers/teardown-context' { + export default function(context: object): Promise; +} + +declare module '@ember/test-helpers/teardown-rendering-context' { + export default function(context: object): Promise; +} + +declare module '@ember/test-helpers/teardown-application-context' { + export default function(context: object): Promise; +} + +declare module '@ember/test-helpers/validate-error-handler' { + import Error from '@ember/error'; + + export default function(callback?: (error: Error) => void): { isValid: boolean, message: string }; +} + +declare module '@ember/test-helpers/application' { + import Application from '@ember/application'; + + export function getApplication(): Application; + export function setApplication(application: Application): void; +} diff --git a/types/ember__test-helpers/tsconfig.json b/types/ember__test-helpers/tsconfig.json new file mode 100644 index 0000000000..de0efdd984 --- /dev/null +++ b/types/ember__test-helpers/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "@ember/test-helpers": ["ember__test-helpers"] + } + }, + "files": [ + "index.d.ts", + "ember__test-helpers-tests.ts" + ] +} diff --git a/types/ember__test-helpers/tslint.json b/types/ember__test-helpers/tslint.json new file mode 100644 index 0000000000..4c4fc86ace --- /dev/null +++ b/types/ember__test-helpers/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + "strict-export-declare-modifiers": false + } +}