diff options
author | Sebastian <sebasjm@gmail.com> | 2022-01-04 17:06:17 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2022-01-04 17:06:24 -0300 |
commit | 9f8139e09b21ec12f9b9ba4926ea80557698c559 (patch) | |
tree | dba5aacf50e89176bee35cfdd1002cc61c3f52e5 /packages/taler-wallet-webextension/src/test-utils.ts | |
parent | 2e71117f59e0ae6106930e705ae6a54a9839281b (diff) | |
download | wallet-core-9f8139e09b21ec12f9b9ba4926ea80557698c559.tar.xz |
replace jest with mocha
Diffstat (limited to 'packages/taler-wallet-webextension/src/test-utils.ts')
-rw-r--r-- | packages/taler-wallet-webextension/src/test-utils.ts | 91 |
1 files changed, 85 insertions, 6 deletions
diff --git a/packages/taler-wallet-webextension/src/test-utils.ts b/packages/taler-wallet-webextension/src/test-utils.ts index 2fe2c43bd..fbb7c56ff 100644 --- a/packages/taler-wallet-webextension/src/test-utils.ts +++ b/packages/taler-wallet-webextension/src/test-utils.ts @@ -14,13 +14,15 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { ComponentChildren, FunctionalComponent, h as render, VNode } from "preact"; +import { PendingTestFunction, TestFunction } from "mocha"; +import { ComponentChildren, Fragment, FunctionalComponent, h as create, render as renderIntoDom, VNode } from "preact"; +import { render as renderToString } from "preact-render-to-string"; export function createExample<Props>( Component: FunctionalComponent<Props>, props: Partial<Props>, ): ComponentChildren { - const Render = (args: any) => render(Component, args); + const Render = (args: any): VNode => create(Component, args); Render.args = props; return Render; } @@ -31,12 +33,89 @@ export function createExampleWithCustomContext<Props, ContextProps>( ContextProvider: FunctionalComponent<ContextProps>, contextProps: Partial<ContextProps>, ): ComponentChildren { - const Render = (args: any): VNode => render(Component, args); - const WithContext = (args: any): VNode => render(ContextProvider, { ...contextProps, children: [Render(args)] } as any); + const Render = (args: any): VNode => create(Component, args); + const WithContext = (args: any): VNode => create(ContextProvider, { ...contextProps, children: [Render(args)] } as any); WithContext.args = props return WithContext } -export function NullLink({ children }: { children?: ComponentChildren }) { - return render("a", { children, href: "javascript:void(0);" }); +export function NullLink({ children }: { children?: ComponentChildren }): VNode { + return create("a", { children, href: "javascript:void(0);" }); } + +export function renderNodeOrBrowser(Component: any, args: any): void { + const vdom = create(Component, args); + if (typeof window === "undefined") { + renderToString(vdom); + } else { + const div = document.createElement("div"); + document.body.appendChild(div); + renderIntoDom(vdom, div); + renderIntoDom(null, div); + document.body.removeChild(div); + } +} + +interface Mounted<T> { + unmount: () => void; + result: { current: T | null }; + waitNextUpdate: () => Promise<void>; +} + +export function mountBrowser<T>(callback: () => T, Context?: ({ children }: { children: any }) => VNode): Mounted<T> { + const result: { current: T | null } = { + current: null + } + const listener: Array<() => void> = [] + + // component that's going to hold the hook + function Component(): VNode { + const hookResult = callback() + // save the hook result + result.current = hookResult + // notify to everyone waiting for an update and clean the queue + listener.splice(0, listener.length).forEach(cb => cb()) + return create(Fragment, {}) + } + + // create the vdom with context if required + const vdom = !Context ? create(Component, {}) : create(Context, { children: [create(Component, {})] },); + + // in non-browser environment (server side rendering) just serialize to + // string and exit + if (typeof window === "undefined") { + renderToString(vdom); + return { unmount: () => null, result } as any + } + + // do the render into the DOM + const div = document.createElement("div"); + document.body.appendChild(div); + renderIntoDom(vdom, div); + + // clean up callback + function unmount(): any { + document.body.removeChild(div); + } + + // waiter callback + async function waitNextUpdate(): Promise<void> { + await new Promise((res, rej) => { + const tid = setTimeout(() => { + rej(Error("waiting for an update but the hook didn't make one")) + }, 100) + + listener.push(() => { + clearTimeout(tid) + res(undefined) + }) + }) + } + + return { + unmount, result, waitNextUpdate + } +} + +export const justBrowser_it: PendingTestFunction | TestFunction = + typeof window === 'undefined' ? it.skip : it
\ No newline at end of file |