Files
easy-png-tools/web/src/lib/i18n/i18n.test.ts
T

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');
});
});