/** * @jest-environment jsdom */ import React from 'react' import { render, screen, fireEvent, waitFor } from '@testing-library/react' import '@testing-library/jest-dom' import ProxySettings from '.' // Mock ResizeObserver class ResizeObserverMock { observe() {} unobserve() {} disconnect() {} } global.ResizeObserver = ResizeObserverMock as any // Mock global window.core global.window.core = { api: { getAppConfigurations: () => jest.fn(), updateAppConfiguration: () => jest.fn(), relaunch: () => jest.fn(), }, } // Mock dependencies jest.mock('@/hooks/useConfigurations', () => ({ useConfigurations: () => ({ configurePullOptions: jest.fn(), }), })) jest.mock('jotai', () => { const originalModule = jest.requireActual('jotai') return { ...originalModule, useAtom: jest.fn().mockImplementation((atom) => { switch (atom) { case 'proxyEnabledAtom': return [true, jest.fn()] case 'proxyAtom': return ['', jest.fn()] case 'proxyUsernameAtom': return ['', jest.fn()] case 'proxyPasswordAtom': return ['', jest.fn()] case 'ignoreSslAtom': return [false, jest.fn()] case 'verifyProxySslAtom': return [true, jest.fn()] case 'verifyProxyHostSslAtom': return [true, jest.fn()] case 'verifyPeerSslAtom': return [true, jest.fn()] case 'verifyHostSslAtom': return [true, jest.fn()] case 'noProxyAtom': return ['localhost', jest.fn()] default: return [null, jest.fn()] } }), } }) describe('ProxySettings', () => { const mockOnBack = jest.fn() beforeEach(() => { jest.clearAllMocks() }) it('renders the component', async () => { render() await waitFor(() => { expect(screen.getByText('HTTPS Proxy')).toBeInTheDocument() expect(screen.getByText('Proxy URL')).toBeInTheDocument() expect(screen.getByText('Authentication')).toBeInTheDocument() expect(screen.getByText('No Proxy')).toBeInTheDocument() expect(screen.getByText('SSL Verification')).toBeInTheDocument() }) }) it('handles back navigation', async () => { render() const backButton = screen.getByText('Advanced Settings') fireEvent.click(backButton) expect(mockOnBack).toHaveBeenCalled() }) it('toggles password visibility', () => { render() const passwordVisibilityToggle = screen.getByTestId('password-visibility-toggle') const passwordInput = screen.getByTestId('proxy-password') expect(passwordInput).toHaveAttribute('type', 'password') fireEvent.click(passwordVisibilityToggle) expect(passwordInput).toHaveAttribute('type', 'text') fireEvent.click(passwordVisibilityToggle) expect(passwordInput).toHaveAttribute('type', 'password') }) it('allows clearing input fields', async () => { render() // Test clearing proxy URL const proxyInput = screen.getByTestId('proxy-input') fireEvent.change(proxyInput, { target: { value: 'http://test.proxy' } }) const clearProxyButton = screen.getByTestId('clear-proxy-button') fireEvent.click(clearProxyButton) expect(proxyInput).toHaveValue('') // Test clearing username const usernameInput = screen.getByTestId('proxy-username') fireEvent.change(usernameInput, { target: { value: 'testuser' } }) // Test clearing password const passwordInput = screen.getByTestId('proxy-password') fireEvent.change(passwordInput, { target: { value: 'testpassword' } }) }) it('renders SSL verification switches', async () => { render() const sslSwitches = [ 'Ignore SSL certificates', 'Verify Proxy SSL', 'Verify Proxy Host SSL', 'Verify Peer SSL', 'Verify Host SSL' ] sslSwitches.forEach(switchText => { const switchElement = screen.getByText(switchText) expect(switchElement).toBeInTheDocument() }) }) })