/* vim: set ts=2 et sw=2 cindent fo=qroca: */ package com.globant.katari.core.spring; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Arrays; import org.apache.commons.collections.ListUtils; import org.junit.Test; import org.springframework.util.FileCopyUtils; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.*; public class KatariMessageSourceTest { @Test public void calculateFilenamesForLocale_noDebug() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); List<String> fileNames = messageSource.calculateFilenamesForLocale( "classpath:messages", Locale.US); assertThat(fileNames.size(), is(2)); assertThat(fileNames.get(0), is("classpath:messages_en_US")); assertThat(fileNames.get(1), is("classpath:messages_en")); } @Test public void calculateFilenamesForLocale_withFallback() { KatariMessageSource messageSource = new KatariMessageSource(Locale.UK); List<String> fileNames = messageSource.calculateFilenamesForLocale( "classpath:messages", Locale.US); assertThat(fileNames.size(), is(3)); assertThat(fileNames.get(0), is("classpath:messages_en_US")); assertThat(fileNames.get(1), is("classpath:messages_en")); // Falls back to Locale.UK (en_GB). assertThat(fileNames.get(2), is("classpath:messages_en_GB")); } @Test public void calculateFilenamesForLocale_noDebugAndDir() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); List<String> fileNames = messageSource.calculateFilenamesForLocale( "classpath:com/lang/messages", Locale.US); assertThat(fileNames.size(), is(4)); assertThat(fileNames.get(0), is("classpath:com/lang_en_US/messages")); assertThat(fileNames.get(1), is("classpath:com/lang/messages_en_US")); assertThat(fileNames.get(2), is("classpath:com/lang_en/messages")); assertThat(fileNames.get(3), is("classpath:com/lang/messages_en")); } @Test public void calculateFilenamesForLocale_debug() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); messageSource.setDebug(true); messageSource.setDebugPrefix("fs"); List<String> fileNames = messageSource.calculateFilenamesForLocale( "classpath:messages", Locale.US); assertThat(fileNames.size(), is(4)); assertThat(fileNames.get(0), is("file:fs/messages_en_US")); assertThat(fileNames.get(1), is("file:fs/messages_en")); assertThat(fileNames.get(2), is("classpath:messages_en_US")); assertThat(fileNames.get(3), is("classpath:messages_en")); } @Test public void calculateFilenamesForLocale_debugAndDir() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); messageSource.setDebug(true); messageSource.setDebugPrefix("fs"); List<String> fileNames = messageSource.calculateFilenamesForLocale( "classpath:com/lang/messages", Locale.US); assertThat(fileNames.size(), is(8)); assertThat(fileNames.get(0), is("file:fs/com/lang_en_US/messages")); assertThat(fileNames.get(1), is("file:fs/com/lang/messages_en_US")); assertThat(fileNames.get(2), is("file:fs/com/lang_en/messages")); assertThat(fileNames.get(3), is("file:fs/com/lang/messages_en")); assertThat(fileNames.get(4), is("classpath:com/lang_en_US/messages")); assertThat(fileNames.get(5), is("classpath:com/lang/messages_en_US")); assertThat(fileNames.get(6), is("classpath:com/lang_en/messages")); assertThat(fileNames.get(7), is("classpath:com/lang/messages_en")); } @Test public void getMessage_fromClasspath() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); messageSource.setDebug(false); messageSource.setDebugPrefix( "src/test/resources/com/lang/katari/core/spring"); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("test1", null, Locale.US); assertThat(message, is("original_1")); } @Test public void getMessage_fromFs() { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); messageSource.setDebug(true); messageSource.setDebugPrefix( "src/test/resources/com/globant/katari/core/spring"); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("test1", null, Locale.US); assertThat(message, is("overriden_1")); } @Test public void getMessage_fromFsNoCached() throws Exception { KatariMessageSource messageSource = new KatariMessageSource(Locale.US); messageSource.setDebug(true); messageSource.setDebugPrefix("target/test-data"); messageSource.setBasename("classpath:katariMessageSource"); // Copy katariMessageSource.properties to target. This does not override // test2. File dest = new File("target/test-data"); dest.mkdirs(); File src = new File("src/test/resources/com/globant/katari/core/" + "spring/katariMessageSource_en.properties"); File dst = new File("target/test-data/katariMessageSource_en.properties"); FileCopyUtils.copy(src, dst); // The message sources checks the timpestamp of the file to reload. dst.setLastModified(System.currentTimeMillis() - 10000); String message = messageSource.getMessage("test2", null, Locale.US); assertThat(message, is("original_2")); // Copy katariMessageSource2.properties to target. This overrides test2. File src2 = new File("src/test/resources/com/globant/katari/core/" + "spring/katariMessageSource2.properties"); FileCopyUtils.copy(src2, dst); dst.setLastModified(System.currentTimeMillis()); message = messageSource.getMessage("test2", null, Locale.US); assertThat(message, is("overriden_2")); } @Test public void getMessage_overrideInParent() { KatariMessageSource parent = new KatariMessageSource(Locale.US); parent.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSource"); KatariMessageSource messageSource; messageSource = new KatariMessageSource("local-login", parent); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("test1", null, Locale.US); assertThat(message, is("overriden_1")); } @Test public void getMessage_overrideForModule() { KatariMessageSource parent = new KatariMessageSource(Locale.US); parent.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSource"); KatariMessageSource messageSource; messageSource = new KatariMessageSource("local-login", parent); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("test2", null, Locale.US); assertThat(message, is("overriden_2_for_module_name")); } @Test public void getMessage_sibling() { KatariMessageSource parent = new KatariMessageSource(Locale.US); parent.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSource"); KatariMessageSource dependency = new KatariMessageSource(Locale.US); dependency.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSourceDep"); KatariMessageSource messageSource; messageSource = new KatariMessageSource("local-login", parent, Arrays.asList(new KatariMessageSource[]{dependency})); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("dependency1", null, Locale.US); assertThat(message, is("message from dependency")); } @Test public void getMessage_siblingOverriden() { KatariMessageSource parent = new KatariMessageSource(Locale.US); parent.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSource"); KatariMessageSource dependency = new KatariMessageSource(Locale.US); dependency.setBasename( "classpath:com/globant/katari/core/spring/katariMessageSourceDep"); String dependencyMessage; dependencyMessage = dependency.getMessage("dependency2", null, Locale.US); // This is just to be sure that we are loading the correct file. assertThat(dependencyMessage, is("overriden message from dependency")); ArrayList<KatariMessageSource> dependencies; dependencies = new ArrayList<KatariMessageSource>(); dependencies.add(dependency); KatariMessageSource messageSource; messageSource = new KatariMessageSource("local-login", parent, dependencies); messageSource.setBasename("classpath:katariMessageSource"); String message = messageSource.getMessage("dependency2", null, Locale.US); // Bonjour is overriden by the parent. assertThat(message, is("hey you")); } }