import { describe, it, expect, vi } from 'vitest' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { DNSDetectionResult } from '../DNSDetectionResult' import type { DetectionResult } from '../../api/dnsDetection' import type { DNSProvider } from '../../api/dnsProviders' // Mock react-i18next vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string, params?: Record) => { const translations: Record = { 'dns_detection.detecting': 'Detecting DNS provider...', 'dns_detection.detected': `${params?.provider} detected`, 'dns_detection.confidence_high': 'High confidence', 'dns_detection.confidence_medium': 'Medium confidence', 'dns_detection.confidence_low': 'Low confidence', 'dns_detection.confidence_none': 'No match', 'dns_detection.not_detected': 'Could not detect DNS provider', 'dns_detection.use_suggested': `Use ${params?.provider}`, 'dns_detection.select_manually': 'Select manually', 'dns_detection.nameservers': 'Nameservers', 'dns_detection.error': `Detection failed: ${params?.error}`, } return translations[key] || key }, }), })) describe('DNSDetectionResult', () => { const mockSuggestedProvider: DNSProvider = { id: 1, uuid: 'test-uuid', name: 'Production Cloudflare', provider_type: 'cloudflare', enabled: true, is_default: true, has_credentials: true, propagation_timeout: 120, polling_interval: 5, success_count: 10, failure_count: 0, created_at: '2026-01-01T00:00:00Z', updated_at: '2026-01-01T00:00:00Z', } it('should show loading state', () => { render( ) expect(screen.getByText('Detecting DNS provider...')).toBeInTheDocument() }) it('should show error message', () => { const result: DetectionResult = { domain: 'example.com', detected: false, nameservers: [], confidence: 'none', error: 'Network error', } render() expect(screen.getByText(/Detection failed: Network error/)).toBeInTheDocument() }) it('should show not detected message with nameservers', () => { const result: DetectionResult = { domain: 'example.com', detected: false, nameservers: ['ns1.unknown.com', 'ns2.unknown.com'], confidence: 'none', } render() expect(screen.getByText('Could not detect DNS provider')).toBeInTheDocument() expect(screen.getByText(/nameservers/i)).toBeInTheDocument() expect(screen.getByText('ns1.unknown.com')).toBeInTheDocument() expect(screen.getByText('ns2.unknown.com')).toBeInTheDocument() }) it('should show successful detection with high confidence', () => { const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'cloudflare', nameservers: ['ns1.cloudflare.com', 'ns2.cloudflare.com'], confidence: 'high', suggested_provider: mockSuggestedProvider, } render() expect(screen.getByText('cloudflare detected')).toBeInTheDocument() expect(screen.getByText('High confidence')).toBeInTheDocument() expect(screen.getByText('Use Production Cloudflare')).toBeInTheDocument() expect(screen.getByText('Select manually')).toBeInTheDocument() }) it('should call onUseSuggested when "Use" button is clicked', async () => { const user = userEvent.setup() const onUseSuggested = vi.fn() const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'cloudflare', nameservers: ['ns1.cloudflare.com'], confidence: 'high', suggested_provider: mockSuggestedProvider, } render( ) await user.click(screen.getByText('Use Production Cloudflare')) expect(onUseSuggested).toHaveBeenCalledWith(mockSuggestedProvider) }) it('should call onSelectManually when "Select manually" button is clicked', async () => { const user = userEvent.setup() const onSelectManually = vi.fn() const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'cloudflare', nameservers: ['ns1.cloudflare.com'], confidence: 'high', suggested_provider: mockSuggestedProvider, } render( ) await user.click(screen.getByText('Select manually')) expect(onSelectManually).toHaveBeenCalled() }) it('should show medium confidence badge', () => { const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'route53', nameservers: ['ns-123.awsdns-12.com'], confidence: 'medium', } render() expect(screen.getByText('Medium confidence')).toBeInTheDocument() }) it('should show low confidence badge', () => { const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'digitalocean', nameservers: ['ns1.digitalocean.com'], confidence: 'low', } render() expect(screen.getByText('Low confidence')).toBeInTheDocument() }) it('should show expandable nameservers list', async () => { const user = userEvent.setup() const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'cloudflare', nameservers: ['ns1.cloudflare.com', 'ns2.cloudflare.com', 'ns3.cloudflare.com'], confidence: 'high', suggested_provider: mockSuggestedProvider, } render() // Nameservers are in a details element const summary = screen.getByText(/Nameservers \(3\)/) await user.click(summary) expect(screen.getByText('ns1.cloudflare.com')).toBeInTheDocument() expect(screen.getByText('ns2.cloudflare.com')).toBeInTheDocument() expect(screen.getByText('ns3.cloudflare.com')).toBeInTheDocument() }) it('should not show action buttons when no suggested provider', () => { const result: DetectionResult = { domain: 'example.com', detected: true, provider_type: 'cloudflare', nameservers: ['ns1.cloudflare.com'], confidence: 'high', } render() expect(screen.queryByText(/Use/)).not.toBeInTheDocument() expect(screen.queryByText('Select manually')).not.toBeInTheDocument() }) })