Files
veilix.app/src/core/routing/locale.test.ts
T

69 lines
2.4 KiB
TypeScript
Raw Normal View History

2026-10-21 05:08:05 +02:00
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')
})
})