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 Object.defineProperty(window, 'localStorage', {
60 value: {
61 getItem: (key: string) => store[key] || null,
62 setItem: (key: string, value: string) => { store[key] = value },
63 removeItem: (key: string) => { delete store[key] },
64 clear: () => { Object.keys(store).forEach(key => delete store[key]) },
65 key: (index: number) => Object.keys(store)[index] || null,
66 get length() { return Object.keys(store).length },
67 },
68 writable: true,
69 })
70}
71
72export function setAuthState(session: {
73 did: string
74 handle: string
75 email?: string
76 emailConfirmed?: boolean
77 accessJwt: string
78 refreshJwt: string
79}): void {
80 localStorage.setItem('session', JSON.stringify(session))
81}
82
83export function clearAuthState(): void {
84 localStorage.removeItem('session')
85}