/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2014 Wisdom Framework * %% * 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. * #L% */ package org.wisdom.i18n; import com.google.common.collect.Iterators; import org.assertj.core.data.MapEntry; import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; import org.wisdom.api.i18n.InternationalizationService; import java.util.*; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Check the internationalization service implementation. */ public class InternationalizationServiceSingletonTest { private InternationalizationServiceSingleton svc; @Before public void setUp() { svc = new InternationalizationServiceSingleton(null); } @Test public void addBundle() { Bundle bundle = getMockBundle(); List<I18nExtension> extensions = svc.addingBundle(bundle, null); assertThat(extensions.size()).isEqualTo(2); assertThat(svc.getAllMessages(Locale.FRENCH)).containsKeys("lang", "welcome", "autre"); assertThat(svc.get(Locale.FRENCH, "lang")).isEqualTo("français"); // When the locale is not supported, return default. assertThat(svc.get(Locale.CHINA, "lang")).isEqualTo("english"); } @Test public void testGetAllMessages() { Bundle bundle = getMockBundle(); List<I18nExtension> extensions = svc.addingBundle(bundle, null); assertThat(extensions).isNotEmpty(); Map<String, String> messages = svc.getAllMessages(Locale.FRENCH); assertThat(messages).contains( MapEntry.entry("welcome", "bonjour"), MapEntry.entry("lang", "français"), MapEntry.entry("autre", "autre"), MapEntry.entry("extra", "extra") ); messages = svc.getAllMessages(Locale.CHINA); assertThat(messages).contains( MapEntry.entry("welcome", "hello"), MapEntry.entry("lang", "english"), MapEntry.entry("extra", "extra") ); assertThat(messages).doesNotContainKey("autre"); } @Test public void addBundleAndRemoveIt() throws Exception { Bundle bundle = getMockBundle(); List<I18nExtension> extensions = svc.addingBundle(bundle, null); assertThat(extensions.size()).isEqualTo(2); assertThat(svc.getAllMessages(Locale.FRENCH)).hasSize(5); String etag = svc.etag(Locale.FRENCH); assertThat(etag).isNotNull().isNotEqualTo("0"); // Wait one second to be sure timestamps are different. Thread.sleep(1000); svc.removedBundle(bundle, null, extensions); assertThat(svc.getAllMessages(Locale.FRENCH)).hasSize(0); String etag2 = svc.etag(Locale.FRENCH); assertThat(etag2).isNotNull() .isNotEmpty() .isNotEqualTo(etag) .isNotEqualTo("0"); } @Test public void testGetMessagesOnAnOrderedSetOfLocales() { Bundle bundle = getMockBundle(); List<I18nExtension> extensions = svc.addingBundle(bundle, null); assertThat(extensions).isNotEmpty(); String value = svc.get(new Locale[] {Locale.FRENCH}, "welcome"); assertThat(value).isEqualTo("bonjour"); value = svc.get(new Locale[] {Locale.ENGLISH}, "welcome"); assertThat(value).isEqualTo("hello"); value = svc.get(new Locale[] {InternationalizationService.DEFAULT_LOCALE}, "welcome"); assertThat(value).isEqualTo("hello"); value = svc.get(new Locale[] {Locale.FRENCH, Locale.ENGLISH}, "extra"); assertThat(value).isEqualTo("extra"); value = svc.get(new Locale[] {Locale.ENGLISH, Locale.FRENCH}, "autre"); assertThat(value).isEqualTo("autre"); } public static Bundle getMockBundle() { List<String> structure = Arrays.asList( "/i18n/messages.properties", "/i18n/messages_fr.properties" ); Enumeration<String> paths = Iterators.asEnumeration(structure.iterator()); Bundle bundle = mock(Bundle.class); when(bundle.getEntryPaths(anyString())).thenReturn(paths); when(bundle.getEntry("/i18n/messages.properties")) .thenReturn(InternationalizationServiceSingletonTest.class.getClassLoader() .getResource("i18n/messages.properties")); when(bundle.getEntry("/i18n/messages_fr.properties")) .thenReturn(InternationalizationServiceSingletonTest.class.getClassLoader() .getResource("i18n/messages_fr.properties")); return bundle; } }