/**
* Copyright (C) 2012-2017 the original author or authors.
*
* 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.
*/
package ninja.i18n;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import java.util.Date;
import java.util.Map;
import java.util.Optional;
import ninja.Context;
import ninja.Cookie;
import ninja.Result;
import ninja.Results;
import ninja.utils.NinjaConstant;
import ninja.utils.NinjaProperties;
import org.joda.time.DateTime;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MessagesImplTest {
@Mock
private NinjaProperties ninjaProperties;
@Mock
Context context;
Result result;
@Test
public void testGetWithLanguage() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
// that will refer to messages_en.properties:
assertEquals("english", messages.get("language", Optional.of("en-US")).get());
assertEquals("english", messages.get("language", Optional.of("en-CA")).get());
assertEquals("english", messages.get("language", Optional.of("en-UK")).get());
// that will refer to messages_de.properties:
assertEquals("deutsch", messages.get("language", Optional.of("de")).get());
assertEquals("deutsch", messages.get("language", Optional.of("de-DE")).get());
// that will refer to messages_fr-FR.properties:
assertEquals("français", messages.get("language", Optional.of("fr-FR")).get());
// that will refer to messages_fr-FR.properties:
assertEquals("français", messages.get("language", Optional.of("da,fr-FR;q=0.8")).get());
assertEquals("français", messages.get("language", Optional.of("da;q=0.9, fr-FR; q=0.8")).get());
// that will refer to messages_de.properties:
assertEquals("deutsch", messages.get("language", Optional.of("de,fr-FR;q=0.8")).get());
assertEquals("deutsch", messages.get("language", Optional.of("de;q=0.9, fr-FR; q=0.8")).get());
assertEquals("defaultlanguage", messages.get("language", Optional.of("fr")).get());
assertEquals(Optional.empty(), messages.get("a_non_existing_key", Optional.of("fr")));
}
@Test
public void testGetWithContextAndResult() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
result = Results.ok();
// test with context Accept Header
when(context.getAcceptLanguage()).thenReturn("en-US");
assertEquals("english", messages.get("language", context, Optional.of(result)).get());
when(context.getAcceptLanguage()).thenReturn("en-CA");
assertEquals("english", messages.get("language", context, Optional.of(result)).get());
when(context.getAcceptLanguage()).thenReturn("en-UK");
assertEquals("english", messages.get("language", context, Optional.of(result)).get());
// test that result overwrites context AcceptHeader
lang.setLanguage("de", result);
assertEquals("deutsch", messages.get("language", context, Optional.of(result)).get());
result = Results.ok();
lang.setLanguage("de-DE", result);
assertEquals("deutsch", messages.get("language", context, Optional.of(result)).get());
// that forced language from context works with empty result
result = Results.ok();
when(context.getCookie(Mockito.anyString())).thenReturn(
Cookie.builder("name", "fr-FR").build());
assertEquals("français", messages.get("language", context, Optional.of(result)).get());
//and the result overwrites it again...
result = Results.ok();
lang.setLanguage("de-DE", result);
assertEquals("deutsch", messages.get("language", context, Optional.of(result)).get());
}
@Test
public void testGetWithLanguageAndParameters() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
// that will refer to messages_en.properties:
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", Optional.of("en-US"), "test_parameter").get());
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", Optional.of("en-CA"), "test_parameter").get());
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", Optional.of("en-UK"), "test_parameter").get());
// that will refer to messages_de.properties:
assertEquals("Toröööö - das ist der platzhalter: test_parameter",
messages.get("message_with_placeholder", Optional.of("de"), "test_parameter").get());
assertEquals("Toröööö - das ist der platzhalter: test_parameter",
messages.get("message_with_placeholder", Optional.of("de-DE"), "test_parameter").get());
}
@Test
public void testGetWithContextAndResultAndParameters() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
result = Results.ok();
when(context.getAcceptLanguage()).thenReturn("en-US");
assertEquals("this is the placeholder: test_parameter",
messages.getWithDefault("message_with_placeholder", "default value", context, Optional.of(result), "test_parameter"));
when(context.getAcceptLanguage()).thenReturn("fr-FR");
assertEquals("c'est le placeholder: test_parameter",
messages.getWithDefault("message_with_placeholder", "default value", context, Optional.of(result), "test_parameter"));
when(context.getAcceptLanguage()).thenReturn("fr-FR");
assertEquals("c'est le message default: test_parameter",
messages.getWithDefault("i_do_not_exist", "c''est le message default: {0}", context, Optional.of(result), "test_parameter"));
}
@Test
public void testGetWithDefaultAndLanguage() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
assertEquals("this is the placeholder: test_parameter",
messages.getWithDefault("message_with_placeholder", "default value", Optional.of("en-US"), "test_parameter"));
assertEquals("c'est le placeholder: test_parameter",
messages.getWithDefault("message_with_placeholder", "default value", Optional.of("fr-FR"), "test_parameter"));
assertEquals("c'est le message default: test_parameter",
messages.getWithDefault("i_do_not_exist", "c''est le message default: {0}", Optional.of("fr-FR"), "test_parameter"));
}
@Test
public void testGetWithDefaultAndContextAndResult() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
result = Results.ok();
// test with context Accept Header
when(context.getAcceptLanguage()).thenReturn("en-US");
// that will refer to messages_en.properties:
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
when(context.getAcceptLanguage()).thenReturn("en-CA");
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
when(context.getAcceptLanguage()).thenReturn("en-UK");
assertEquals("this is the placeholder: test_parameter",
messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
// that will refer to messages_de.properties:
lang.setLanguage("de", result);
assertEquals("Toröööö - das ist der platzhalter: test_parameter",
messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
lang.setLanguage("de-DE", result);
assertEquals("Toröööö - das ist der platzhalter: test_parameter",
messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
// that forced language from context works with empty result
result = Results.ok();
when(context.getCookie(Mockito.anyString())).thenReturn(
Cookie.builder("name", "fr-FR").build());
assertEquals("c'est le placeholder: test_parameter", messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
//and the result overwrites it again...
result = Results.ok();
lang.setLanguage("de-DE", result);
assertEquals("Toröööö - das ist der platzhalter: test_parameter", messages.get("message_with_placeholder", context, Optional.of(result), "test_parameter").get());
}
@Test
public void testGetWithSpecialI18nPlaceholder() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Date DATE_1970_JAN = new DateTime(1970, 1, 1, 1, 1).toDate();
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
// test fallback to default (english in that case)
Optional<String> language = Optional.empty();
Optional<String> result = messages.get("message_with_placeholder_date", language, DATE_1970_JAN);
assertEquals("that's a date: Jan 1, 1970", result.get());
// de as language
language = Optional.of("de");
result = messages.get("message_with_placeholder_date", language, DATE_1970_JAN);
assertEquals("das ist ein datum: 01.01.1970", result.get());
// fr as language
language = Optional.of("fr-FR");
result = messages.get("message_with_placeholder_date", language, DATE_1970_JAN);
assertEquals("c'est la date: 1 janv. 1970", result.get());
// en as language
language = Optional.of("en");
result = messages.get("message_with_placeholder_date", language, DATE_1970_JAN);
assertEquals("that's a date: Jan 1, 1970", result.get());
}
@Test
public void testGetAllWithLanguage() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Messages lang = new MessagesImpl(ninjaProperties, null);
// US locale testing:
Map<Object, Object> map = lang.getAll(Optional.of("en-US"));
assertEquals(5, map.keySet().size());
assertTrue(map.containsKey("language"));
assertTrue(map.containsKey("message_with_placeholder"));
assertTrue(map.containsKey("a_property_only_in_the_defaultLanguage"));
assertTrue(map.containsKey("a_propert_with_commas"));
assertEquals("english", map.get("language"));
// GERMAN locale testing:
map = lang.getAll(Optional.of("de"));
assertEquals(5, map.keySet().size());
assertTrue(map.containsKey("language"));
assertTrue(map.containsKey("message_with_placeholder"));
assertTrue(map.containsKey("a_property_only_in_the_defaultLanguage"));
assertTrue(map.containsKey("a_propert_with_commas"));
assertEquals("deutsch", map.get("language"));
assertEquals("Toröööö - das ist der platzhalter: {0}",
map.get("message_with_placeholder"));
}
@Test
public void testGetAllWithContextAndResult() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
result = Results.ok();
when(context.getAcceptLanguage()).thenReturn("en-US");
// US locale testing:
Map<Object, Object> map = messages.getAll(context, Optional.of(result));
assertEquals(5, map.keySet().size());
assertTrue(map.containsKey("language"));
assertTrue(map.containsKey("message_with_placeholder"));
assertTrue(map.containsKey("a_property_only_in_the_defaultLanguage"));
assertTrue(map.containsKey("a_propert_with_commas"));
assertEquals("english", map.get("language"));
// GERMAN locale testing:
lang.setLanguage("de", result);
map = messages.getAll(context, Optional.of(result));
assertEquals(5, map.keySet().size());
assertTrue(map.containsKey("language"));
assertTrue(map.containsKey("message_with_placeholder"));
assertTrue(map.containsKey("a_property_only_in_the_defaultLanguage"));
assertTrue(map.containsKey("a_propert_with_commas"));
assertEquals("deutsch", map.get("language"));
assertEquals("Toröööö - das ist der platzhalter: {0}",
map.get("message_with_placeholder"));
// reset result and set context cookie:
result = Results.ok();
when(context.getCookie(Mockito.anyString())).thenReturn(
Cookie.builder("name", "en").build());
map = messages.getAll(context, Optional.of(result));
assertEquals(5, map.keySet().size());
assertTrue(map.containsKey("language"));
assertTrue(map.containsKey("message_with_placeholder"));
assertTrue(map.containsKey("a_property_only_in_the_defaultLanguage"));
assertTrue(map.containsKey("a_propert_with_commas"));
assertEquals("english", map.get("language"));
}
@Test
public void testCorrectParsingOfDelimitersInPropertiesFiles() {
when(ninjaProperties.getStringArray(NinjaConstant.applicationLanguages))
.thenReturn(new String[] { "en", "de", "fr-FR" });
Lang lang = new LangImpl(ninjaProperties);
Messages messages = new MessagesImpl(ninjaProperties, lang);
assertEquals("prop1, prop2, prop3",
messages.get("a_propert_with_commas", Optional.of("en-US")).get());
}
}