69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
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')
|
||
|
|
})
|
||
|
|
})
|