81 lines
2.5 KiB
TypeScript
81 lines
2.5 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { getLocale, initLocale, setLocale } from './locale.svelte';
|
|
import { interpolate, t } from './t';
|
|
import { ru } from './ru';
|
|
|
|
type Store = Record<string, string>;
|
|
|
|
function stubStorage(): { store: Store } {
|
|
const store: Store = {};
|
|
vi.stubGlobal('localStorage', {
|
|
getItem: (k: string) => (k in store ? store[k] : null),
|
|
setItem: (k: string, v: string) => {
|
|
store[k] = v;
|
|
}
|
|
});
|
|
vi.stubGlobal('window', {});
|
|
return { store };
|
|
}
|
|
|
|
beforeEach(() => {
|
|
setLocale('ru');
|
|
delete (ru.home as Record<string, string>).onlyRuKey;
|
|
vi.unstubAllGlobals();
|
|
});
|
|
|
|
describe('t', () => {
|
|
it('возвращает строку по точечному пути активной локали', () => {
|
|
expect(t('header.workspace')).toBe('Рабочая область');
|
|
setLocale('en');
|
|
expect(t('header.catalog')).toBe('Catalog');
|
|
});
|
|
|
|
it('фолбэк на базовую локаль, если в активной нет ключа', () => {
|
|
(ru.home as Record<string, string>).onlyRuKey = 'Только русская строка';
|
|
setLocale('en');
|
|
expect(t('home.onlyRuKey')).toBe('Только русская строка');
|
|
});
|
|
|
|
it('неизвестный путь возвращает сам путь', () => {
|
|
expect(t('no.such.key')).toBe('no.such.key');
|
|
});
|
|
});
|
|
|
|
describe('interpolate', () => {
|
|
it('подставляет переменные в шаблон', () => {
|
|
expect(interpolate('Шаг {n} из {total}', { n: 2, total: 5 })).toBe('Шаг 2 из 5');
|
|
});
|
|
|
|
it('оставляет плейсхолдер без переменной как есть', () => {
|
|
expect(interpolate('Привет, {name}!', {})).toBe('Привет, {name}!');
|
|
});
|
|
|
|
it('без переменных возвращает строку без изменений', () => {
|
|
expect(interpolate('Просто текст')).toBe('Просто текст');
|
|
});
|
|
});
|
|
|
|
describe('персист локали', () => {
|
|
it('initLocale читает сохранённый выбор', () => {
|
|
const { store } = stubStorage();
|
|
store['locale'] = 'en';
|
|
initLocale();
|
|
expect(getLocale()).toBe('en');
|
|
});
|
|
|
|
it('initLocale игнорирует мусор в хранилище', () => {
|
|
const { store } = stubStorage();
|
|
store['locale'] = 'fr';
|
|
initLocale();
|
|
expect(getLocale()).toBe('ru');
|
|
});
|
|
|
|
it('setLocale сохраняет выбор в localStorage', () => {
|
|
const { store } = stubStorage();
|
|
initLocale();
|
|
setLocale('en');
|
|
expect(store['locale']).toBe('en');
|
|
expect(getLocale()).toBe('en');
|
|
});
|
|
});
|