import * as React from 'react'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { LanguageSwitcher } from './LanguageSwitcher'; import { usePathname } from 'next/navigation'; // Mock next/navigation vi.mock('next/navigation', () => ({ usePathname: vi.fn(), })); // Mock TransitionLink to render standard anchor tag and forward all props vi.mock('@/components/ui/TransitionLink', () => ({ TransitionLink: ({ children, href, onClick, ...props }: any) => ( {children} ), })); // Mock HoverShineOverlay vi.mock('@/components/ui/HoverShineOverlay', () => ({ HoverShineOverlay: () =>
, })); describe('LanguageSwitcher TDD', () => { beforeEach(() => { vi.clearAllMocks(); }); it('translates /en/trade-fairs to /de/messen when switching to German', () => { (usePathname as any).mockReturnValue('/en/trade-fairs'); render(); const deLink = screen.getByLabelText('Switch to Deutsch'); expect(deLink.getAttribute('href')).toBe('/de/messen'); }); it('translates /de/messen to /en/trade-fairs when switching to English', () => { (usePathname as any).mockReturnValue('/de/messen'); render(); const enLink = screen.getByLabelText('Switch to English'); expect(enLink.getAttribute('href')).toBe('/en/trade-fairs'); }); it('translates /en/about-us to /de/ueber-uns when switching to German', () => { vi.mocked(usePathname).mockReturnValue('/en/about-us'); render(); const deLink = screen.getByLabelText('Switch to Deutsch'); expect(deLink.getAttribute('href')).toBe('/de/ueber-uns'); }); it('translates /de/ueber-uns to /en/about-us when switching to English', () => { vi.mocked(usePathname).mockReturnValue('/de/ueber-uns'); render(); const enLink = screen.getByLabelText('Switch to English'); expect(enLink.getAttribute('href')).toBe('/en/about-us'); }); it('preserves nested paths like blog posts', () => { vi.mocked(usePathname).mockReturnValue('/de/blog/some-post'); render(); const enLink = screen.getByLabelText('Switch to English'); expect(enLink.getAttribute('href')).toBe('/en/blog/some-post'); }); });