import { describe, it, expect, vi } from 'vitest'; import { fireEvent, screen } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import RoutingTab from '@/pages/xray/routing/RoutingTab'; import type { XraySettingsValue } from '@/hooks/useXraySetting'; import { renderWithProviders } from './test-utils'; function settingsWithHiddenLoopback(): XraySettingsValue { return { routing: { rules: [ { type: 'field', outboundTag: 'a', enabled: true }, { type: 'field', inboundTag: ['_bl_bal1'], outboundTag: 'b', enabled: true }, { type: 'field', outboundTag: 'c', enabled: true }, ], }, } as unknown as XraySettingsValue; } describe('RoutingTab hidden-loopback index mapping', () => { it('toggles the visible rule, not the hidden loopback rule that precedes it', () => { const setTemplateSettings = vi.fn(); const initial = settingsWithHiddenLoopback(); const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); renderWithProviders( , ); fireEvent.click(screen.getByRole('tab', { name: /Routing Rules/ })); const switches = document.querySelectorAll('.routing-table .ant-switch'); expect(switches.length).toBe(2); fireEvent.click(switches[1]); expect(setTemplateSettings).toHaveBeenCalledTimes(1); const updater = setTemplateSettings.mock.calls[0][0] as (prev: XraySettingsValue) => XraySettingsValue; const next = updater(initial); const rules = (next.routing as { rules: Array<{ enabled?: boolean }> }).rules; expect(rules[2].enabled).toBe(false); expect(rules[1].enabled).toBe(true); }); });