55 lines
1.8 KiB
TypeScript
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))
|
|
})
|
|
})
|