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 (typeof text === 'string' ? content.includes(text) : text.test(content)) {
50 return
51 }
52 await new Promise(resolve => setTimeout(resolve, 10))
53 }
54 throw new Error(`Text "${text}" not found within timeout`)
55}
56
57export function mockLocalStorage(initialData: Record<string, string> = {}): void {
58 const store: Record<string, string> = { ...initialData }
59
60 Object.defineProperty(window, 'localStorage', {
61 value: {
62 getItem: (key: string) => store[key] || null,
63 setItem: (key: string, value: string) => { store[key] = value },
64 removeItem: (key: string) => { delete store[key] },
65 clear: () => { Object.keys(store).forEach(key => delete store[key]) },
66 key: (index: number) => Object.keys(store)[index] || null,
67 get length() { return Object.keys(store).length },
68 },
69 writable: true,
70 })
71}
72
73export function setAuthState(session: {
74 did: string
75 handle: string
76 email?: string
77 emailConfirmed?: boolean
78 accessJwt: string
79 refreshJwt: string
80}): void {
81 localStorage.setItem('session', JSON.stringify(session))
82}
83
84export function clearAuthState(): void {
85 localStorage.removeItem('session')
86}