import { render } from '@testing-library/react' import { Editor, promiseWithResolve } from '@tldraw/editor' import { ReactElement } from 'react' /** * Render a component and wait for it to become ready. By default, this includes waiting * for the canvas and fill patterns to pre-render. * * You almost always want to wait for the canvas, but if you are testing a component that passes its * own children and doesn't render the canvas itself, you can set `waitForCanvas` to false. * * Without waiting for patterns, a bunch of "missing `act()`" errors will fill the console, but if * you don't need it (or your're testing the tldraw component without our default shapes, and so * don't have pre-rendered patterns to worry about) you can set `waitForPatterns` to false. */ export async function renderTldrawComponent( element: ReactElement, { waitForPatterns }: { waitForPatterns: boolean } ) { const result = render(element) await result.findAllByTestId('canvas') if (waitForPatterns) await result.findByTestId('ready-pattern-fill-defs') return result } export async function renderTldrawComponentWithEditor( cb: (onMount: (editor: Editor) => void) => ReactElement, opts: { waitForPatterns: boolean } ) { const editorPromise = promiseWithResolve() const element = cb((editor) => { editorPromise.resolve(editor) }) const rendered = await renderTldrawComponent(element, opts) const editor = await editorPromise return { editor, rendered } }