import { render, type RenderResult } from '@testing-library/svelte' import { tick } from 'svelte' import type { ComponentType } from 'svelte' export async function renderAndWait( component: T, options?: Parameters[1] ): Promise> { const result = render(component, options) await tick() await new Promise(resolve => setTimeout(resolve, 0)) return result } export async function waitForElement( queryFn: () => HTMLElement | null, timeout = 1000 ): Promise { const start = Date.now() while (Date.now() - start < timeout) { const element = queryFn() if (element) return element await new Promise(resolve => setTimeout(resolve, 10)) } throw new Error('Element not found within timeout') } export async function waitForElementToDisappear( queryFn: () => HTMLElement | null, timeout = 1000 ): Promise { const start = Date.now() while (Date.now() - start < timeout) { const element = queryFn() if (!element) return await new Promise(resolve => setTimeout(resolve, 10)) } throw new Error('Element still present after timeout') } export async function waitForText( container: HTMLElement, text: string | RegExp, timeout = 1000 ): Promise { const start = Date.now() while (Date.now() - start < timeout) { const content = container.textContent || '' if (typeof text === 'string' ? content.includes(text) : text.test(content)) { return } await new Promise(resolve => setTimeout(resolve, 10)) } throw new Error(`Text "${text}" not found within timeout`) } export function mockLocalStorage(initialData: Record = {}): void { const store: Record = { ...initialData } Object.defineProperty(window, 'localStorage', { value: { getItem: (key: string) => store[key] || null, setItem: (key: string, value: string) => { store[key] = value }, removeItem: (key: string) => { delete store[key] }, clear: () => { Object.keys(store).forEach(key => delete store[key]) }, key: (index: number) => Object.keys(store)[index] || null, get length() { return Object.keys(store).length }, }, writable: true, }) } export function setAuthState(session: { did: string handle: string email?: string emailConfirmed?: boolean accessJwt: string refreshJwt: string }): void { localStorage.setItem('session', JSON.stringify(session)) } export function clearAuthState(): void { localStorage.removeItem('session') }