import { describe, expect, it } from 'vitest' import type { Locale } from '@/i18n/locales' import { detectLocale, localeForCountry, matchAcceptLanguage, parseAcceptLanguage } from './locale' const all: Locale[] = ['en', 'ru', 'de', 'fr', 'es'] describe('parseAcceptLanguage', () => { it('сортирует по весу, при равном весе сохраняет порядок', () => { expect(parseAcceptLanguage('de;q=0.5, ru-RU, en;q=0.9, fr')).toEqual([ 'ru-ru', 'fr', 'en', 'de', ]) }) it('отбрасывает *, нулевой и битый вес', () => { expect(parseAcceptLanguage('*, es;q=0, de;q=abc, fr;q=0.1')).toEqual(['fr']) }) it('пустой заголовок — пустой список', () => { expect(parseAcceptLanguage(null)).toEqual([]) expect(parseAcceptLanguage('')).toEqual([]) }) }) describe('matchAcceptLanguage', () => { it('берёт основной подтег', () => { expect(matchAcceptLanguage('es-419,es;q=0.9', all)).toBe('es') }) it('пропускает языки, которых нет на домене', () => { expect(matchAcceptLanguage('zh-CN, de;q=0.8', ['en', 'ru'])).toBeNull() expect(matchAcceptLanguage('pt-BR, ru;q=0.7', all)).toBe('ru') }) }) describe('localeForCountry', () => { it('сопоставляет страны по 06-i18n', () => { expect(localeForCountry('KZ', all)).toBe('ru') expect(localeForCountry('at', all)).toBe('de') expect(localeForCountry('MX', all)).toBe('es') expect(localeForCountry('BR', all)).toBeNull() expect(localeForCountry('NL', all)).toBeNull() }) it('учитывает языки домена', () => { expect(localeForCountry('DE', ['en', 'ru'])).toBeNull() }) }) describe('detectLocale', () => { it('язык браузера важнее страны', () => { expect( detectLocale({ acceptLanguage: 'en-US', country: 'RU', enabled: all, fallback: 'en' }), ).toBe('en') }) it('без подходящего языка браузера — страна, затем язык по умолчанию', () => { expect( detectLocale({ acceptLanguage: 'zh', country: 'RU', enabled: all, fallback: 'en' }), ).toBe('ru') expect( detectLocale({ acceptLanguage: null, country: null, enabled: all, fallback: 'en' }), ).toBe('en') }) })