// Copyright 2021 99cloud
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import React from 'react';
import zhCN from '../../test/unit/locales/zh-CN';
import enUS from '../../test/unit/locales/en-US';
import ReactIntlUniversal from './translate';
const intl = new ReactIntlUniversal();
const locales = {
'en-US': enUS,
'zh-CN': zhCN,
};
describe('test translate', () => {
it('Set specific locale', () => {
intl.init({ locales, currentLocale: 'zh-CN' });
expect(intl.get('SIMPLE')).toBe('简单');
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.get('SIMPLE')).toBe('Simple');
});
it('Message with variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.get('HELLO', { name: 'Tony' })).toBe('Hello, Tony');
});
it('Message with brace', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.get('BRACE1')).toBe('The format is {var}');
// eslint-disable-next-line no-template-curly-in-string
expect(intl.get('BRACE2')).toBe('The format is ${var}');
});
it('Set specific locale with nested notation', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.get('NESTED.HELLO')).toBe('Hello World');
expect(intl.get('NESTED.HELLO_NAME', { name: 'World' })).toBe(
'Hello, World'
);
});
it('react-intl mirror API formatMessage:variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
const name = 'Tony';
expect(
intl.formatMessage(
{ id: 'HELLO', defaultMessage: `Hello, {name}` },
{ name }
)
).toBe(intl.get('HELLO', { name }));
});
it('react-intl mirror API formatMessage:defaultMessage', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.formatMessage({ id: 'not-exist-key' })).toBe(
intl.get('not-exist-key')
);
});
it('react-intl mirror API formatHTMLMessage:variable', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.formatHTMLMessage(
{ id: 'TIP_VAR', defaultMessage: React.createElement('div') },
{
message: 'your message',
}
);
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This isyour message'
);
});
it('react-intl mirror API formatHTMLMessage:defaultMessage', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.formatHTMLMessage({
id: 'not-exist-key',
defaultMessage: React.createElement('div', { className: 'test' }),
});
expect(reactEl.type).toBe('span');
});
it('HTML Message without variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.getHTML('TIP');
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This is HTML'
);
});
it('HTML Message with variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.getHTML('TIP_VAR', { message: 'your message' });
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This isyour message'
);
});
it('HTML Message without variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.getHTML('TIP');
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This is HTML'
);
});
it('HTML Message with variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.getHTML('TIP_VAR', {
message: 'your message',
});
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This isyour message'
);
});
it('HTML Message with XSS attack', () => {
intl.init({ locales, currentLocale: 'en-US' });
const reactEl = intl.getHTML('TIP_VAR', {
message: '',
});
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This is<script>alert(1)</script>'
);
});
it('HTML Message with disable escape html', () => {
intl.init({ locales, currentLocale: 'en-US', escapeHtml: false });
const reactEl = intl.getHTML('TIP_VAR', {
message: '',
});
expect(reactEl.props.dangerouslySetInnerHTML.__html).toBe(
'This is'
);
});
it('Message with Date', () => {
const start = new Date('Fri Apr 07 2017 17:08:33');
intl.init({ locales, currentLocale: 'en-US' });
expect(
intl.get('SALE_START', {
start,
})
).toBe('Sale begins 4/7/2017');
expect(
intl.get('SALE_END', {
start,
})
).toBe('Sale begins April 7, 2017');
});
it('Message with plural', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(
intl.get('PHOTO', {
num: 0,
})
).toBe('You have no photos.');
expect(
intl.get('PHOTO', {
num: 1,
})
).toBe('You have one photo.');
expect(
intl.get('PHOTO', {
num: 10,
})
).toBe('You have 10 photos.');
intl.init({ locales, currentLocale: 'zh-CN' });
expect(
intl.get('PHOTO', {
num: 1,
})
).toBe('你有1张照片');
});
it('Message with skeleton', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(
intl.get('SKELETON_VAR', {
value: 42.5,
})
).toBe('Increase by 42.5');
expect(
intl.get('SKELETON_VAR', {
value: 42,
})
).toBe('Increase by 42.0');
expect(
intl.get('SKELETON_VAR', {
value: 42.109,
})
).toBe('Increase by 42.11');
expect(
intl.get('SKELETON_SELECTORDINAL', {
year: 2,
})
).toBe("It's my cat's 2nd birthday!");
expect(
intl.get('SKELETON_SELECTORDINAL', {
year: 10,
})
).toBe("It's my cat's 10th birthday!");
});
it('Get locale from localStorage', () => {
localStorage.setItem('lang', 'en-US');
expect(
intl.getLocaleFromLocalStorage({ localStorageLocaleKey: 'lang' })
).toBe('en-US');
});
it('Get locale from browser', () => {
expect(intl.getLocaleFromBrowser()).toBe('en-US');
});
it('Get dot key variables', () => {
intl.init({ locales, currentLocale: 'en-US' });
expect(intl.get('DOT.HELLO')).toBe('Hello World');
});
it('Get init options', () => {
intl.init({ locales, currentLocale: 'en-US' });
const { currentLocale } = intl.getInitOptions();
expect(currentLocale).toBe('en-US');
});
it('Uses fallback locale if key not found in currentLocale', () => {
intl.init({ locales, currentLocale: 'zh-CN', fallbackLocale: 'en-US' });
expect(intl.get('ONLY_IN_ENGLISH')).toBe('ONLY_IN_ENGLISH');
});
it('Resolve language url if currentLocale was matched', async () => {
const result = await intl.init({ locales, currentLocale: 'en' });
expect(result).toBe(undefined);
});
});