import { describe, it, expect, vi } from 'vitest'; import { render } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import NostrProvider from './NostrProvider'; import { AppProvider } from '@/components/AppProvider'; import { AppConfig } from '@/contexts/AppContext'; import { NWelshman } from '@nostrify/welshman'; // Mock NWelshman since it requires network access vi.mock('@nostrify/welshman', () => ({ NWelshman: vi.fn().mockImplementation(() => ({ query: vi.fn().mockResolvedValue([]), event: vi.fn().mockResolvedValue(undefined), req: vi.fn().mockImplementation(async function* () { yield ['EOSE', '']; }), close: vi.fn().mockResolvedValue(undefined), })), })); const defaultConfig: AppConfig = { theme: "light", relayUrl: "wss://relay.primal.net", }; const presetRelays = [ { url: 'wss://relay.nostr.band', name: 'Nostr.Band' }, { url: 'wss://relay.damus.io', name: 'Damus' }, ]; describe('NostrProvider with NWelshman', () => { it('renders children without errors', () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false }, }, }); const TestComponent = () =>
Test content
; const { getByTestId } = render( ); expect(getByTestId('test-child')).toBeInTheDocument(); }); it('creates NWelshman with router configuration', async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false }, }, }); const TestComponent = () =>
Test
; render( ); // Verify NWelshman was instantiated expect(vi.mocked(NWelshman)).toHaveBeenCalled(); // Verify router was passed with correct configuration const routerArg = vi.mocked(NWelshman).mock.calls[0][0]; expect(routerArg).toBeDefined(); expect(typeof routerArg.options.getUserPubkey).toBe('function'); expect(typeof routerArg.options.getStaticRelays).toBe('function'); expect(typeof routerArg.options.getIndexerRelays).toBe('function'); expect(typeof routerArg.options.getSearchRelays).toBe('function'); expect(typeof routerArg.options.getRelayQuality).toBe('function'); // Test router methods return expected values const staticRelays = routerArg.options.getStaticRelays(); expect(staticRelays).toContain('wss://relay.primal.net'); expect(staticRelays).toContain('wss://relay.nostr.band'); const indexerRelays = routerArg.options.getIndexerRelays(); expect(indexerRelays).toContain('wss://relay.nostr.band'); const searchRelays = routerArg.options.getSearchRelays(); expect(searchRelays).toContain('wss://relay.nostr.band'); expect(routerArg.options.getRedundancy()).toBe(2); expect(routerArg.options.getLimit()).toBe(5); }); it('handles relay quality scoring', async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false }, }, }); const TestComponent = () =>
Test
; render( ); const routerArg = vi.mocked(NWelshman).mock.calls[vi.mocked(NWelshman).mock.calls.length - 1][0]; const getRelayQuality = routerArg.options.getRelayQuality; // Test quality scoring expect(getRelayQuality('wss://relay.primal.net')).toBe(1.0); // User's configured relay expect(getRelayQuality('wss://relay.damus.io')).toBe(0.9); // High quality relay expect(getRelayQuality('wss://nostr.band')).toBe(0.9); // High quality relay expect(getRelayQuality('wss://unknown.relay')).toBe(0.5); // Unknown relay }); });