Files
RenewCMS/web/src/i18n/i18n.spec.ts
T

55 lines
1.8 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest'
import { initializeLocale, locale, setLocale, t, formatNumber } from './index'
afterEach(() => {
vi.restoreAllMocks()
localStorage.clear()
initializeLocale()
})
describe('Resolve the language before rendering', () => {
it('keeps English default with a French browser', () => {
vi.spyOn(navigator, 'language', 'get').mockReturnValue('fr-FR')
localStorage.clear()
initializeLocale()
expect([locale.value, document.documentElement.lang]).toEqual(['en', 'en'])
})
it.each([null, 'en', 'fr', 'unsupported'])(
'resolves stored %s independently of browser language',
(stored) => {
if (stored) localStorage.setItem('renewcms-language', stored)
initializeLocale()
expect([locale.value, document.documentElement.lang]).toEqual(
stored === 'fr' ? ['fr', 'fr'] : ['en', 'en'],
)
},
)
it('defaults to English when preference storage is unreadable', () => {
setLocale('fr')
vi.spyOn(Storage.prototype, 'getItem').mockImplementation(() => {
throw new Error('denied')
})
initializeLocale()
expect([locale.value, document.documentElement.lang]).toEqual(['en', 'en'])
})
})
describe('Remember language on this browser', () => {
it('restores the selected French language on initialization', () => {
setLocale('fr')
initializeLocale()
expect(locale.value).toBe('fr')
})
it('switches when storage cannot be written', () => {
vi.spyOn(Storage.prototype, 'setItem').mockImplementation(() => {
throw new Error('denied')
})
setLocale('fr')
expect([t('Log in'), document.documentElement.lang]).toEqual(['Se connecter', 'fr'])
})
it('formats numbers according to the selected locale', () => {
setLocale('fr')
expect(formatNumber(1234.5)).toBe(new Intl.NumberFormat('fr').format(1234.5))
})
})