import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/react';
import React from 'react';
import {
PxlKitLocaleProvider,
usePxlKitLocale,
} from '../../overlay-foundation/PxlKitLocaleProvider';
import { PixelSection } from '../../layout/PixelSection';
/** Helper component to read context and render values for testing */
function LocaleInspector() {
const { locale, upper, lower, fontsUrl } = usePxlKitLocale();
return (
{locale}
{upper('istanbul')}
{lower('ISTANBUL')}
{fontsUrl}
{upper('i')}
{lower('I')}
);
}
describe('PxlKitLocaleProvider', () => {
describe('with Turkish locale', () => {
it('provides locale="tr" to children', () => {
render(
,
);
expect(screen.getByTestId('locale').textContent).toBe('tr');
});
it('upper() correctly handles Turkish i → İ', () => {
render(
,
);
expect(screen.getByTestId('upper-istanbul').textContent).toBe('İSTANBUL');
expect(screen.getByTestId('upper-i').textContent).toBe('İ');
});
it('lower() correctly handles Turkish I → ı', () => {
render(
,
);
expect(screen.getByTestId('lower-ISTANBUL').textContent).toBe('ıstanbul');
expect(screen.getByTestId('lower-I').textContent).toBe('ı');
});
it('provides a Google Fonts URL with latin-ext subset', () => {
render(
,
);
const url = screen.getByTestId('fonts-url').textContent!;
expect(url).toContain('latin-ext');
});
it('renders a wrapper div with lang="tr"', () => {
const { container } = render(
Test
,
);
const langDiv = container.querySelector('[lang="tr"]') as HTMLElement | null;
expect(langDiv).not.toBeNull();
expect(langDiv!.tagName.toLowerCase()).toBe('div');
expect(langDiv!.style.display).toBe('contents');
});
});
describe('with English locale', () => {
it('provides locale="en" to children', () => {
render(
,
);
expect(screen.getByTestId('locale').textContent).toBe('en');
});
it('upper() uses English casing (i → I)', () => {
render(
,
);
expect(screen.getByTestId('upper-istanbul').textContent).toBe('ISTANBUL');
expect(screen.getByTestId('upper-i').textContent).toBe('I');
});
it('lower() uses English casing (I → i)', () => {
render(
,
);
expect(screen.getByTestId('lower-ISTANBUL').textContent).toBe('istanbul');
expect(screen.getByTestId('lower-I').textContent).toBe('i');
});
});
describe('default behavior (no locale prop)', () => {
it('defaults to English locale', () => {
render(
,
);
expect(screen.getByTestId('locale').textContent).toBe('en');
expect(screen.getByTestId('upper-i').textContent).toBe('I');
});
});
});
describe('usePxlKitLocale without provider', () => {
it('uses English defaults when no provider is present', () => {
render();
expect(screen.getByTestId('locale').textContent).toBe('en');
expect(screen.getByTestId('upper-istanbul').textContent).toBe('ISTANBUL');
expect(screen.getByTestId('lower-ISTANBUL').textContent).toBe('istanbul');
});
});
/* ═══════════════════════════════════════════════════════════════════════════════
Nested PxlKitLocaleProvider — inner overrides outer
═══════════════════════════════════════════════════════════════════════════════ */
describe('Nested PxlKitLocaleProvider', () => {
it('inner Turkish provider overrides outer English provider', () => {
render(
content
,
);
const heading = document.querySelector('h3');
// Inner provider is Turkish, so "istanbul" → "İSTANBUL"
expect(heading!.textContent).toBe('İSTANBUL');
});
it('inner English provider overrides outer Turkish provider', () => {
render(
content
,
);
const heading = document.querySelector('h3');
// Inner provider is English, so "istanbul" → "ISTANBUL"
expect(heading!.textContent).toBe('ISTANBUL');
});
it('nested providers set correct lang attributes', () => {
const { container } = render(
Test
,
);
// Both lang divs should exist
expect(container.querySelector('div[lang="en"]')).not.toBeNull();
expect(container.querySelector('div[lang="tr"]')).not.toBeNull();
// Inner child should be inside the tr div
const trDiv = container.querySelector('div[lang="tr"]');
expect(trDiv!.querySelector('[data-testid="inner"]')).not.toBeNull();
});
});
/* ═══════════════════════════════════════════════════════════════════════════════
CSS lang attribute — ensures provider sets lang for CSS text-transform
═══════════════════════════════════════════════════════════════════════════════ */
describe('PxlKitLocaleProvider lang attribute', () => {
it('sets lang="tr" on wrapper div for Turkish', () => {
const { container } = render(
Test
,
);
const wrapper = container.querySelector('div[lang="tr"]') as HTMLElement | null;
expect(wrapper).not.toBeNull();
expect(wrapper!.style.display).toBe('contents');
});
it('sets lang="en" on wrapper div for English', () => {
const { container } = render(
Test
,
);
const wrapper = container.querySelector('div[lang="en"]');
expect(wrapper).not.toBeNull();
});
it('display:contents does not create a layout box', () => {
const { container } = render(
Content
,
);
const wrapper = container.querySelector('div[lang="tr"]') as HTMLElement | null;
expect(wrapper!.style.display).toBe('contents');
// The child should still be accessible
expect(screen.getByTestId('child')).not.toBeNull();
});
});