this repo has no description
1import { render, type RenderResult } from "@testing-library/svelte";
2import { tick } from "svelte";
3import type { ComponentType } from "svelte";
4
5export async function renderAndWait<T extends ComponentType>(
6 component: T,
7 options?: Parameters<typeof render>[1],
8): Promise<RenderResult<T>> {
9 const result = render(component, options);
10 await tick();
11 await new Promise((resolve) => setTimeout(resolve, 0));
12 return result;
13}
14
15export async function waitForElement(
16 queryFn: () => HTMLElement | null,
17 timeout = 1000,
18): Promise<HTMLElement> {
19 const start = Date.now();
20 while (Date.now() - start < timeout) {
21 const element = queryFn();
22 if (element) return element;
23 await new Promise((resolve) => setTimeout(resolve, 10));
24 }
25 throw new Error("Element not found within timeout");
26}
27
28export async function waitForElementToDisappear(
29 queryFn: () => HTMLElement | null,
30 timeout = 1000,
31): Promise<void> {
32 const start = Date.now();
33 while (Date.now() - start < timeout) {
34 const element = queryFn();
35 if (!element) return;
36 await new Promise((resolve) => setTimeout(resolve, 10));
37 }
38 throw new Error("Element still present after timeout");
39}
40
41export async function waitForText(
42 container: HTMLElement,
43 text: string | RegExp,
44 timeout = 1000,
45): Promise<void> {
46 const start = Date.now();
47 while (Date.now() - start < timeout) {
48 const content = container.textContent || "";
49 if (
50 typeof text === "string" ? content.includes(text) : text.test(content)
51 ) {
52 return;
53 }
54 await new Promise((resolve) => setTimeout(resolve, 10));
55 }
56 throw new Error(`Text "${text}" not found within timeout`);
57}
58
59export function mockLocalStorage(
60 initialData: Record<string, string> = {},
61): void {
62 const store: Record<string, string> = { ...initialData };
63 Object.defineProperty(window, "localStorage", {
64 value: {
65 getItem: (key: string) => store[key] || null,
66 setItem: (key: string, value: string) => {
67 store[key] = value;
68 },
69 removeItem: (key: string) => {
70 delete store[key];
71 },
72 clear: () => {
73 Object.keys(store).forEach((key) => delete store[key]);
74 },
75 key: (index: number) => Object.keys(store)[index] || null,
76 get length() {
77 return Object.keys(store).length;
78 },
79 },
80 writable: true,
81 });
82}
83
84export function setAuthState(session: {
85 did: string;
86 handle: string;
87 email?: string;
88 emailConfirmed?: boolean;
89 accessJwt: string;
90 refreshJwt: string;
91}): void {
92 localStorage.setItem("session", JSON.stringify(session));
93}
94
95export function clearAuthState(): void {
96 localStorage.removeItem("session");
97}