react-localization/spec/LocalizedStrings.spec.js

201 lines
6.3 KiB
JavaScript

import React from 'react';
import LocalizedStrings from '../lib/LocalizedStrings';
describe('Main Library Functions', function () {
global.navigator = {};
let strings;
beforeEach(() => {
strings = new LocalizedStrings({
en: {
language:"english",
how:"How do you want your egg today?",
boiledEgg:"Boiled egg",
softBoiledEgg:"Soft-boiled egg",
choice:"How to choose the egg",
formattedValue:"I'd like some {0} and {1}, or just {0}",
ratings: {
excellent:"excellent",
good:"good",
missingComplex:"missing value"
},
missing:"missing value",
currentDate: "The current date is {month} {day}, {year}!",
falsy: "{0} {1} {2} {3} {4} {5}"
},
it: {
language: "italian",
how:"Come vuoi il tuo uovo oggi?",
boiledEgg:"Uovo sodo",
softBoiledEgg:"Uovo alla coque",
choice:"Come scegliere l'uovo",
ratings: {
excellent:"eccellente",
good:"buono"
},
formattedValue:"Vorrei un po' di {0} e {1}, o solo {0}",
currentDate: "La data corrente è {month} {day}, {year}!",
falsy: "{0} {1} {2} {3} {4} {5}"
}
});
});
it("Set default language to en", function(){
expect(strings.getLanguage()).toEqual("en");
});
it("List available languages", function(){
expect(strings.getAvailableLanguages()).toEqual(["en", "it"]);
});
//Default language
it('Extract simple value from default language', function () {
expect(strings.how).toEqual('How do you want your egg today?');
});
it('Extract complex value from default language', function () {
expect(strings.ratings.good).toEqual('good');
});
it('Get complex missing key from default language', function () {
expect(strings.ratings.missingComplex).toEqual('missing value');
});
it('Get missing key from default language', function () {
expect(strings.ratings.notfound).toBe(undefined);
});
it('Format string in default language', function () {
expect(strings.formatString(strings.formattedValue, "cake", "ice-cream"))
.toEqual("I'd like some cake and ice-cream, or just cake");
});
//Switch language
it("Switch language to italian", function(){
strings.setLanguage("it");
expect(strings.getLanguage()).toEqual("it");
});
it('Extract simple value from other language', function () {
strings.setLanguage("it");
expect(strings.how).toEqual('Come vuoi il tuo uovo oggi?');
});
it('Extract complex value from other language', function () {
strings.setLanguage("it");
expect(strings.ratings.good).toEqual('buono');
});
it('Get missing key from other language', function () {
strings.setLanguage("it");
expect(strings.missing).toEqual('missing value');
});
it('Get complex missing key from other language', function () {
strings.setLanguage("it");
expect(strings.ratings.missingComplex).toEqual('missing value');
});
it('Format string in other language', function () {
strings.setLanguage("it");
expect(strings.formatString(strings.formattedValue, "torta", "gelato"))
.toEqual("Vorrei un po' di torta e gelato, o solo torta");
});
it('Get string in a different language', function () {
strings.setLanguage("it");
expect(strings.getString("choice", "en")).toBe("How to choose the egg");
});
it('Switch to different props', function () {
strings.setContent({
fr: {
"hello":"bonjour"
},
en: {
"hello":"hello"
},
it: {
"hello":"ciao"
}
});
strings.setLanguage("fr");
expect(strings.hello).toEqual('bonjour');
});
it('Switch to different props not working', function () {
strings = new LocalizedStrings({
en: {
a: {
b: { x: "foo", y: "bar" },
c: { z: "baz" }
}
}
});
strings.setContent({
en: {
a: {
b: { x: "a.b.x", y: "a.b.y" },
c: { z: "a.c.z" }
}
}
});
strings.setLanguage("en");
expect(strings.a.b.x).toEqual('a.b.x');
});
it('Handles named tokens as part of the format string', () => {
const formatTokens = {
month: "January",
day: "12",
year: "2018"
};
expect(strings.formatString(strings.currentDate, formatTokens))
.toEqual("The current date is January 12, 2018!");
});
it('Handles falsy values', () => {
// falsy: "{0} {1} {2} {3} {4} {5}"
expect(strings.formatString(strings.falsy, 0, false, '', null, undefined, NaN))
.toEqual([0, " ", false, " ", '', " ", null, " ", undefined, " ", NaN].join(''));
});
it('Handles empty values', () => {
expect(strings.formatString(strings.thisKeyDoesNotExist, { thisReplacement: 'doesNotExist'}))
.toEqual('');
});
describe('formatString with React components', () => {
const reactStrings = new LocalizedStrings({
en: {
onlyForMembers: "Only who have {0} can enter",
onlyForMembersStrong: "Only who have {0} can {1}",
helloThere: "Hello {0}! Are you sure {0} is your name?",
boldText: "Some {bold} text"
},
fi: {
onlyForMembers: "Vain {0} voivat tulla",
onlyForMembersStrong: "Vain {0} voivat {1}",
helloThere: "Moi {0}! Onko {0} varmasti nimesi?",
}
});
it('one React component', () => {
expect(reactStrings.formatString(reactStrings.onlyForMembers, <a href="#">logged in</a>))
.toEqual(["Only who have ", [<a href="#" key="1">logged in</a>], " can enter"]);
});
it('two React component', () => {
expect(reactStrings.formatString(reactStrings.onlyForMembersStrong, <a href="#">logged in</a>, <b>enter</b>))
.toEqual(["Only who have ", [<a href="#" key="1">logged in</a>], " can ", [<b key="3">enter</b>]]);
});
it('one React component twice in a string', () => {
expect(reactStrings.formatString(reactStrings.helloThere, <i>Henrik</i>))
.toEqual(["Hello ", [<i key="1">Henrik</i>], "! Are you sure ", [<i key="3">Henrik</i>], " is your name?"]);
});
it('Handles named tokens with components', () => {
expect(reactStrings.formatString(reactStrings.boldText, {
bold: <span className="bold">BOLD</span>
})).toEqual(["Some ", [<span key="1" className="bold">BOLD</span>], " text"]);
});
});
});