svelte-i18n/test/runtime/stores/formatters.test.ts
2020-11-05 17:52:22 -03:00

126 lines
3.4 KiB
TypeScript

import { get } from 'svelte/store';
import {
$format,
$formatTime,
$formatDate,
$formatNumber,
} from '../../../src/runtime/stores/formatters';
import { init } from '../../../src/runtime/configs';
import { addMessages } from '../../../src/runtime/stores/dictionary';
import { $locale } from '../../../src/runtime/stores/locale';
import {
MessageFormatter,
TimeFormatter,
DateFormatter,
NumberFormatter,
} from '../../../src/runtime/types';
let formatMessage: MessageFormatter;
let formatTime: TimeFormatter;
let formatDate: DateFormatter;
let formatNumber: NumberFormatter;
$locale.subscribe(() => {
formatMessage = get($format);
formatTime = get($formatTime);
formatDate = get($formatDate);
formatNumber = get($formatNumber);
});
addMessages('en', require('../../fixtures/en.json'));
addMessages('en-GB', require('../../fixtures/en-GB.json'));
addMessages('pt', require('../../fixtures/pt.json'));
addMessages('pt-BR', require('../../fixtures/pt-BR.json'));
addMessages('pt-PT', require('../../fixtures/pt-PT.json'));
beforeEach(() => {
init({ fallbackLocale: 'en' });
});
test('formats a message by its id and the current locale', () => {
expect(formatMessage({ id: 'form.field_1_name' })).toBe('Name');
});
test('formats a message by its id and the a passed locale', () => {
expect(formatMessage({ id: 'form.field_1_name', locale: 'pt' })).toBe('Nome');
});
test('formats a message with interpolated values', () => {
expect(formatMessage({ id: 'photos', values: { n: 0 } })).toBe(
'You have no photos.',
);
expect(formatMessage({ id: 'photos', values: { n: 1 } })).toBe(
'You have one photo.',
);
expect(formatMessage({ id: 'photos', values: { n: 21 } })).toBe(
'You have 21 photos.',
);
});
test('formats the default value with interpolated values', () => {
expect(
formatMessage({
id: 'non-existent',
default: '{food}',
values: { food: 'potato' },
}),
).toBe('potato');
});
test('formats the key with interpolated values', () => {
expect(
formatMessage({
id: '{food}',
values: { food: 'potato' },
}),
).toBe('potato');
});
test('accepts a message id as first argument', () => {
expect(formatMessage('form.field_1_name')).toBe('Name');
});
test('accepts a message id as first argument and formatting options as second', () => {
expect(formatMessage('form.field_1_name', { locale: 'pt' })).toBe('Nome');
});
test('throws if no locale is set', () => {
$locale.set(null);
expect(() => formatMessage('form.field_1_name')).toThrow(
'[svelte-i18n] Cannot format a message without first setting the initial locale.',
);
});
test('uses a missing message default value', () => {
expect(formatMessage('missing', { default: 'Missing Default' })).toBe(
'Missing Default',
);
});
test('warn on missing messages', () => {
const { warn } = global.console;
jest.spyOn(global.console, 'warn').mockImplementation();
formatMessage('missing');
expect(console.warn).toBeCalledWith(
`[svelte-i18n] The message "missing" was not found in "en".`,
);
global.console.warn = warn;
});
describe('format utilities', () => {
it('time', () => {
expect(formatTime(new Date(2019, 0, 1, 20, 37))).toBe('8:37 PM');
});
it('date', () => {
expect(formatDate(new Date(2019, 0, 1, 20, 37))).toBe('1/1/19');
});
it('number', () => {
expect(formatNumber(123123123)).toBe('123,123,123');
});
});