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');
});
});