aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/test-utils.ts
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2022-01-04 17:06:17 -0300
committerSebastian <sebasjm@gmail.com>2022-01-04 17:06:24 -0300
commit9f8139e09b21ec12f9b9ba4926ea80557698c559 (patch)
treedba5aacf50e89176bee35cfdd1002cc61c3f52e5 /packages/taler-wallet-webextension/src/test-utils.ts
parent2e71117f59e0ae6106930e705ae6a54a9839281b (diff)
downloadwallet-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.ts91
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