react-native-i18n-auto
Version:
Auto i18n tool for React Native with full TypeScript support
107 lines (99 loc) • 3.54 kB
JavaScript
;
var _setup = require("../i18n/setup");
describe('I18n Manager', function () {
beforeEach(function () {
// Reset i18n state before each test
_setup.i18n.clearCache();
_setup.i18n.setLocales({
en: {
HELLO: 'Hello',
WELCOME: 'Welcome, {name}!',
NESTED: {
KEY: 'Nested Value'
}
},
ko: {
HELLO: '안녕하세요',
WELCOME: '{name}님 환영합니다!',
NESTED: {
KEY: '중첩된 값'
}
}
});
});
describe('Basic Translation', function () {
it('should translate simple keys correctly', function () {
_setup.i18n.setLanguage('en');
expect(_setup.i18n.t('HELLO')).toBe('Hello');
_setup.i18n.setLanguage('ko');
expect(_setup.i18n.t('HELLO')).toBe('안녕하세요');
});
it('should return key if translation is not found', function () {
_setup.i18n.setLanguage('en');
expect(_setup.i18n.t('NONEXISTENT_KEY')).toBe('NONEXISTENT_KEY');
});
});
describe('Language Management', function () {
it('should change language successfully', function () {
expect(_setup.i18n.setLanguage('en')).toBe(true);
expect(_setup.i18n.getLanguage()).toBe('en');
expect(_setup.i18n.setLanguage('ko')).toBe(true);
expect(_setup.i18n.getLanguage()).toBe('ko');
});
it('should fail to change to unsupported language', function () {
// Explicitly set initial language to en
_setup.i18n.setLanguage('en');
expect(_setup.i18n.setLanguage('fr')).toBe(false);
// Language should remain unchanged
expect(_setup.i18n.getLanguage()).toBe('en');
});
it('should provide list of available languages', function () {
var languages = _setup.i18n.getAvailableLanguages();
expect(languages).toHaveLength(2);
expect(languages).toEqual(expect.arrayContaining([expect.objectContaining({
code: 'en',
name: 'English'
}), expect.objectContaining({
code: 'ko',
name: 'Korean'
})]));
});
});
describe('Cache Management', function () {
it('should cache translations', function () {
_setup.i18n.setLanguage('en');
var key = 'HELLO';
// First call should cache the result
expect(_setup.i18n.t(key)).toBe('Hello');
// Modify internal state (this is for testing only)
var translations = _setup.i18n.translations;
translations.en.HELLO = 'Modified Hello';
// Should still return cached value
expect(_setup.i18n.t(key)).toBe('Hello');
// After clearing cache, should return new value
_setup.i18n.clearCache();
expect(_setup.i18n.t(key)).toBe('Modified Hello');
});
it('should clear cache successfully', function () {
_setup.i18n.setLanguage('en');
_setup.i18n.t('HELLO'); // Cache this translation
_setup.i18n.clearCache();
// Verify cache is empty
expect(_setup.i18n.cache).toEqual({});
});
});
describe('Event Handling', function () {
it('should notify listeners when language changes', function () {
var listener = jest.fn();
var unsubscribe = _setup.i18n.onLanguageChange(listener);
_setup.i18n.setLanguage('ko');
expect(listener).toHaveBeenCalledTimes(1);
_setup.i18n.setLanguage('en');
expect(listener).toHaveBeenCalledTimes(2);
// Unsubscribe should work
unsubscribe();
_setup.i18n.setLanguage('ko');
expect(listener).toHaveBeenCalledTimes(2);
});
});
});