From 379e1863323fdcb93049946449d465a34e4ba24a Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 21 Oct 2021 14:59:19 +0200 Subject: [PATCH] Remove all exports from test-utils-core Signed-off-by: Johan Haals --- packages/test-utils-core/api-report.md | 91 +------ packages/test-utils-core/src/index.ts | 11 +- packages/test-utils-core/src/setupTests.ts | 17 -- .../test-utils-core/src/testUtils/Keyboard.js | 224 ------------------ .../src/testUtils/Keyboard.test.js | 108 --------- .../test-utils-core/src/testUtils/index.tsx | 19 -- .../src/testUtils/logCollector.test.ts | 96 -------- .../src/testUtils/logCollector.ts | 144 ----------- .../src/testUtils/testingLibrary.ts | 41 ---- 9 files changed, 5 insertions(+), 746 deletions(-) delete mode 100644 packages/test-utils-core/src/setupTests.ts delete mode 100644 packages/test-utils-core/src/testUtils/Keyboard.js delete mode 100644 packages/test-utils-core/src/testUtils/Keyboard.test.js delete mode 100644 packages/test-utils-core/src/testUtils/index.tsx delete mode 100644 packages/test-utils-core/src/testUtils/logCollector.test.ts delete mode 100644 packages/test-utils-core/src/testUtils/logCollector.ts delete mode 100644 packages/test-utils-core/src/testUtils/testingLibrary.ts diff --git a/packages/test-utils-core/api-report.md b/packages/test-utils-core/api-report.md index a72e5d3038..f21c749727 100644 --- a/packages/test-utils-core/api-report.md +++ b/packages/test-utils-core/api-report.md @@ -3,94 +3,5 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ReactElement } from 'react'; -import { RenderResult } from '@testing-library/react'; - -// @public @deprecated (undocumented) -export type AsyncLogCollector = () => Promise; - -// @public @deprecated (undocumented) -export type CollectedLogs = { - [key in T]: string[]; -}; - -// @public @deprecated (undocumented) -export class Keyboard { - constructor( - target: any, - { - debug, - }?: { - debug?: boolean | undefined; - }, - ); - // (undocumented) - click(): Promise; - // (undocumented) - debug: boolean; - // (undocumented) - document: any; - // (undocumented) - enter(value: any): Promise; - // (undocumented) - escape(): Promise; - // (undocumented) - get focused(): any; - // (undocumented) - static fromReadableInput(input: any): any; - // (undocumented) - _log(message: any, ...args: any[]): void; - // (undocumented) - _pretty(element: any): string; - // (undocumented) - send(chars: any): Promise; - // (undocumented) - _sendKey(key: any, charCode: any, action: any): Promise; - // (undocumented) - tab(): Promise; - // (undocumented) - static toReadableInput(chars: any): any; - // (undocumented) - toString(): string; - // (undocumented) - static type(target: any, input: any): Promise; - // (undocumented) - type(input: any): Promise; - // (undocumented) - static typeDebug(target: any, input: any): Promise; -} - -// @public @deprecated (undocumented) -export type LogCollector = AsyncLogCollector | SyncLogCollector; - -// @public @deprecated (undocumented) -export type LogFuncs = 'log' | 'warn' | 'error'; - -// @public @deprecated -export function renderWithEffects(nodes: ReactElement): Promise; - -// @public @deprecated (undocumented) -export type SyncLogCollector = () => void; - -// @public @deprecated -export function withLogCollector( - callback: AsyncLogCollector, -): Promise>; - -// @public @deprecated -export function withLogCollector( - callback: SyncLogCollector, -): CollectedLogs; - -// @public @deprecated -export function withLogCollector( - logsToCollect: T[], - callback: AsyncLogCollector, -): Promise>; - -// @public @deprecated -export function withLogCollector( - logsToCollect: T[], - callback: SyncLogCollector, -): CollectedLogs; +// (No @packageDocumentation comment for this package) ``` diff --git a/packages/test-utils-core/src/index.ts b/packages/test-utils-core/src/index.ts index 5658523c11..8f0a5b31e1 100644 --- a/packages/test-utils-core/src/index.ts +++ b/packages/test-utils-core/src/index.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -/** - * Utilities to test Backstage core - * - * @packageDocumentation - */ - -export * from './testUtils'; +export {}; +throw new Error( + 'This module has been removed. Use @backstage/dev-utils instead', +); diff --git a/packages/test-utils-core/src/setupTests.ts b/packages/test-utils-core/src/setupTests.ts deleted file mode 100644 index 963c0f188b..0000000000 --- a/packages/test-utils-core/src/setupTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import '@testing-library/jest-dom'; diff --git a/packages/test-utils-core/src/testUtils/Keyboard.js b/packages/test-utils-core/src/testUtils/Keyboard.js deleted file mode 100644 index b0600eb78d..0000000000 --- a/packages/test-utils-core/src/testUtils/Keyboard.js +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { act, fireEvent } from '@testing-library/react'; - -const codes = { - Tab: 9, - Enter: 10, - Click: 17 /* This keyboard can click, deal with it */, - Esc: 27, -}; - -/** - * @public - * @deprecated because of no usages. */ -export class Keyboard { - static async type(target, input) { - await new Keyboard(target).type(input); - } - - static async typeDebug(target, input) { - await new Keyboard(target, { debug: true }).type(input); - } - - static toReadableInput(chars) { - return chars.split('').map(char => { - switch (char.charCodeAt(0)) { - case codes.Tab: - return ''; - case codes.Enter: - return ''; - case codes.Click: - return ''; - case codes.Esc: - return ''; - default: - return char; - } - }); - } - - static fromReadableInput(input) { - return input.trim().replace(/\s*<([a-zA-Z]+)>\s*/g, (match, name) => { - if (name in codes) { - return String.fromCharCode(codes[name]); - } - throw new Error(`Unknown char name: '${name}'`); - }); - } - - constructor(target, { debug = false } = {}) { - this.debug = debug; - - if (target.ownerDocument) { - this.document = target.ownerDocument; - } else if (target.baseElement) { - this.document = target.baseElement.ownerDocument; - } else { - throw new TypeError( - 'Keyboard(target): target must be DOM node or react-testing-library render() output', - ); - } - } - - toString() { - return `Keyboard{document=${this.document}, debug=${this.debug}}`; - } - - _log(message, ...args) { - if (this.debug) { - // eslint-disable-next-line no-console - console.log(`[Keyboard] ${message}`, ...args); - } - } - - _pretty(element) { - const attrs = [...element.attributes] - .map(attr => `${attr.name}="${attr.value}"`) - .join(' '); - return `<${element.nodeName.toLocaleLowerCase('en-US')} ${attrs}>`; - } - - get focused() { - return this.document.activeElement; - } - - async type(input) { - this._log( - `sending sequence '${input}' with initial focus ${this._pretty( - this.focused, - )}`, - ); - await this.send(Keyboard.fromReadableInput(input)); - } - - async send(chars) { - for (const key of chars.split('')) { - const charCode = key.charCodeAt(0); - - if (charCode === codes.Tab) { - await this.tab(); - continue; - } - - const focused = this.focused; - if (!focused || focused === this.document.body) { - throw Error( - `No element focused in document while trying to type '${Keyboard.toReadableInput( - chars, - )}'`, - ); - } - const nextValue = (focused.value || '') + key; - - if (charCode >= 32) { - await this._sendKey(key, charCode, () => { - this._log( - `sending +${key} = '${nextValue}' to ${this._pretty(focused)}`, - ); - fireEvent.change(focused, { - target: { value: nextValue }, - bubbles: true, - cancelable: true, - }); - }); - } else if (charCode === codes.Enter) { - await this.enter(focused.value || ''); - } else if (charCode === codes.Esc) { - await this.escape(); - } else if (charCode === codes.Click) { - await this.click(); - } else { - throw new Error(`Unsupported char code, ${charCode}`); - } - } - } - - async click() { - this._log(`clicking ${this._pretty(this.focused)}`); - await act(async () => fireEvent.click(this.focused)); - } - - async tab() { - await this._sendKey('Tab', codes.Tab, () => { - const focusable = this.document.querySelectorAll( - [ - 'a[href]', - 'area[href]', - 'input:not([disabled])', - 'select:not([disabled])', - 'textarea:not([disabled])', - 'button:not([disabled])', - 'iframe', - 'object', - 'embed', - '*[tabindex]', - '*[contenteditable]', - ].join(','), - ); - - const tabbable = [...focusable].filter(el => { - return el.tabIndex >= 0; - }); - - const focused = this.document.activeElement; - const focusedIndex = tabbable.indexOf(focused); - const nextFocus = tabbable[focusedIndex + (1 % tabbable.length)]; - - this._log( - `tabbing to ${this._pretty(nextFocus)} ${this.focused.textContent}`, - ); - nextFocus.focus(); - }); - } - - async enter(value) { - this._log(`submitting '${value}' via ${this._pretty(this.focused)}`); - await act(() => - this._sendKey('Enter', codes.Enter, () => { - if (this.focused.type === 'button') { - fireEvent.click(this.focused, { target: { value } }); - } else { - fireEvent.submit(this.focused, { - target: { value }, - bubbles: true, - cancelable: true, - }); - } - }), - ); - } - - async escape() { - this._log(`escape from ${this._pretty(this.focused)}`); - await act(async () => this._sendKey('Escape', codes.Esc)); - } - - async _sendKey(key, charCode, action) { - const event = { key, charCode, keyCode: charCode, which: charCode }; - const focused = this.focused; - - if (fireEvent.keyDown(focused, event)) { - if (fireEvent.keyPress(focused, event)) { - if (action) { - action(); - } - } - } - fireEvent.keyUp(focused, event); - } -} diff --git a/packages/test-utils-core/src/testUtils/Keyboard.test.js b/packages/test-utils-core/src/testUtils/Keyboard.test.js deleted file mode 100644 index 41ee3a12d6..0000000000 --- a/packages/test-utils-core/src/testUtils/Keyboard.test.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from 'react'; -import { Keyboard } from './Keyboard'; -import { render } from '@testing-library/react'; - -describe('testUtils.Keyboard', () => { - it('types into some inputs with focus and submits a form', async () => { - const typed1 = []; - const typed2 = []; - const typed3 = []; - - let submitted = false; - const handleSubmit = event => { - event.preventDefault(); - submitted = true; - }; - - const rendered = render( -
- typed1.push(value)} /> - typed2.push(value)} - /* eslint-disable-next-line jsx-a11y/no-autofocus */ - autoFocus - /> - typed3.push(value)} /> -
, - ); - - const keyboard = new Keyboard(rendered); - await keyboard.send('xy'); - await keyboard.tab(); - await keyboard.send('abc'); - await keyboard.enter(); - - expect(typed1).toEqual([]); - expect(typed2).toEqual(['x', 'xy']); - expect(typed3).toEqual(['a', 'ab', 'abc']); - expect(submitted).toBe(true); - }); - - it('can use Keyboard.type to send readable input', async () => { - const typed1 = []; - const typed2 = []; - const typed3 = []; - - let submitted = false; - const handleSubmit = event => { - event.preventDefault(); - submitted = true; - }; - - const rendered = render( -
- typed1.push(value)} - /> - typed2.push(value)} - /> - typed3.push(value)} - /> -
, - ); - - await Keyboard.type(rendered, ' a b c '); - - expect(typed1).toEqual(['1a']); - expect(typed2).toEqual(['2b']); - expect(typed3).toEqual(['3c']); - expect(submitted).toBe(true); - }); - - it('should be able to navigate a radio input with click', async () => { - const selections = []; - - const rendered = render( -
selections.push(value)}> - - - -
, - ); - - await Keyboard.type(rendered, ' '); - - expect(selections).toEqual(['a', 'c']); - }); -}); diff --git a/packages/test-utils-core/src/testUtils/index.tsx b/packages/test-utils-core/src/testUtils/index.tsx deleted file mode 100644 index 6f6aa43ea9..0000000000 --- a/packages/test-utils-core/src/testUtils/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export * from './Keyboard'; -export * from './logCollector'; -export * from './testingLibrary'; diff --git a/packages/test-utils-core/src/testUtils/logCollector.test.ts b/packages/test-utils-core/src/testUtils/logCollector.test.ts deleted file mode 100644 index d877e4d10b..0000000000 --- a/packages/test-utils-core/src/testUtils/logCollector.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* eslint-disable no-console */ - -import { withLogCollector } from './logCollector'; - -describe('logCollector', () => { - it('should collect some logs synchronously', () => { - const logs = withLogCollector(() => { - console.log('a'); - console.warn('b'); - console.error('c'); - console.error('3'); - console.warn('2'); - console.log('1'); - }); - - expect(logs.log).toEqual(['a', '1']); - expect(logs.warn).toEqual(['b', '2']); - expect(logs.error).toEqual(['c', '3']); - }); - - it('should collect some logs asynchrnously', async () => { - const logs = await withLogCollector(async () => { - console.log('a'); - console.warn('b'); - console.error('c'); - console.error('3'); - console.warn('2'); - console.log('1'); - }); - - expect(logs.log).toEqual(['a', '1']); - expect(logs.warn).toEqual(['b', '2']); - expect(logs.error).toEqual(['c', '3']); - }); - - it('should collect specific logs synchronously', () => { - const missedLogs = withLogCollector(() => { - const logs = withLogCollector(['warn', 'log'], () => { - console.log('a'); - console.warn('b'); - console.error('c'); - console.error('3'); - console.warn('2'); - console.log('1'); - }); - - expect(logs.log).toEqual(['a', '1']); - expect(logs.warn).toEqual(['b', '2']); - // @ts-ignore - expect(logs.error).toEqual([]); - }); - - expect(missedLogs.log).toEqual([]); - expect(missedLogs.warn).toEqual([]); - expect(missedLogs.error).toEqual(['c', '3']); - }); - - it('should collect specific logs asynchrnously', async () => { - const missedLogs = await withLogCollector(async () => { - const logs = await withLogCollector(['error'], async () => { - console.log('a'); - console.warn('b'); - console.error('c'); - console.error('3'); - console.warn('2'); - console.log('1'); - }); - - // @ts-ignore - expect(logs.log).toEqual([]); - // @ts-ignore - expect(logs.warn).toEqual([]); - expect(logs.error).toEqual(['c', '3']); - }); - - expect(missedLogs.log).toEqual(['a', '1']); - expect(missedLogs.warn).toEqual(['b', '2']); - expect(missedLogs.error).toEqual([]); - }); -}); diff --git a/packages/test-utils-core/src/testUtils/logCollector.ts b/packages/test-utils-core/src/testUtils/logCollector.ts deleted file mode 100644 index 22f06e172b..0000000000 --- a/packages/test-utils-core/src/testUtils/logCollector.ts +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* eslint-disable no-console */ - -/** - * @public - * @deprecated import from test-utils instead */ -export type LogFuncs = 'log' | 'warn' | 'error'; -/** - * @public - * @deprecated import from test-utils instead */ -export type AsyncLogCollector = () => Promise; -/** - * @public - * @deprecated import from test-utils instead */ -export type SyncLogCollector = () => void; -/** - * @public - * @deprecated import from test-utils instead */ -export type LogCollector = AsyncLogCollector | SyncLogCollector; -/** - * @public - * @deprecated import from test-utils instead */ -export type CollectedLogs = { [key in T]: string[] }; - -const allCategories = ['log', 'warn', 'error']; - -/** - * Asynchronous log collector with that collects all categories - * @public - * @deprecated import from test-utils instead */ -export function withLogCollector( - callback: AsyncLogCollector, -): Promise>; - -/** - * Synchronous log collector with that collects all categories - * @public - * @deprecated import from test-utils instead */ -export function withLogCollector( - callback: SyncLogCollector, -): CollectedLogs; - -/** - * Asynchronous log collector with that only collects selected categories - * @public - * @deprecated import from test-utils instead - */ - -export function withLogCollector( - logsToCollect: T[], - callback: AsyncLogCollector, -): Promise>; - -/** - * Synchronous log collector with that only collects selected categories - * @public - * @deprecated import from test-utils instead */ -export function withLogCollector( - logsToCollect: T[], - callback: SyncLogCollector, -): CollectedLogs; - -/** - * @public - * @deprecated import from test-utils instead - * */ -export function withLogCollector( - logsToCollect: LogFuncs[] | LogCollector, - callback?: LogCollector, -): CollectedLogs | Promise> { - const oneArg = !callback; - const actualCallback = (oneArg ? logsToCollect : callback) as LogCollector; - const categories = (oneArg ? allCategories : logsToCollect) as LogFuncs[]; - - const logs = { - log: new Array(), - warn: new Array(), - error: new Array(), - }; - - const origLog = console.log; - const origWarn = console.warn; - const origError = console.error; - - if (categories.includes('log')) { - console.log = (message: string) => { - logs.log.push(message); - }; - } - if (categories.includes('warn')) { - console.warn = (message: string) => { - logs.warn.push(message); - }; - } - if (categories.includes('error')) { - console.error = (message: string) => { - logs.error.push(message); - }; - } - - const restore = () => { - console.log = origLog; - console.warn = origWarn; - console.error = origError; - }; - - try { - const ret = actualCallback(); - - if (!ret || !ret.then) { - restore(); - return logs; - } - - return ret.then( - () => { - restore(); - return logs; - }, - error => { - restore(); - throw error; - }, - ); - } catch (error) { - restore(); - throw error; - } -} diff --git a/packages/test-utils-core/src/testUtils/testingLibrary.ts b/packages/test-utils-core/src/testUtils/testingLibrary.ts deleted file mode 100644 index 953a414968..0000000000 --- a/packages/test-utils-core/src/testUtils/testingLibrary.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ReactElement } from 'react'; -import { act } from 'react-dom/test-utils'; -import { render, RenderResult } from '@testing-library/react'; - -/** - * Simplifies rendering of async components in by taking care of the wrapping inside act - * @remarks - * Components using useEffect to perform an asynchronous action (such as fetch) must be rendered within an async - * act call to properly get the final state, even with mocked responses. This utility method makes the signature a bit - * cleaner, since act doesn't return the result of the evaluated function. - * https://github.com/testing-library/react-testing-library/issues/281 - * https://github.com/facebook/react/pull/14853 - * @public - * @deprecated import from test-utils instead - */ -export async function renderWithEffects( - nodes: ReactElement, -): Promise { - let value: RenderResult; - await act(async () => { - value = render(nodes); - }); - // @ts-ignore - return value; -}