package br.com.caelum.vraptor.i18n; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import java.util.Enumeration; import java.util.HashMap; import java.util.Locale; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; import javax.servlet.jsp.jstl.core.Config; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import br.com.caelum.vraptor.http.MutableRequest; @SuppressWarnings("deprecation") public class I18nLocalizationTest { @Mock MutableRequest request; @Mock ServletContext context; HttpSession session; I18nLocalization i18n; private Object defaultLocale; class MockHttpSession implements HttpSession { private HashMap<String, Object> params = new HashMap<>(); @Override public Enumeration<String> getAttributeNames() { return null; } @Override public long getCreationTime() { return 0; } @Override public String getId() { return null; } @Override public long getLastAccessedTime() { return 0; } @Override public int getMaxInactiveInterval() { return 0; } @Override public ServletContext getServletContext() { return null; } @Override public HttpSessionContext getSessionContext() { return null; } @Override public Object getValue(String arg0) { return null; } @Override public String[] getValueNames() { return null; } @Override public void invalidate() {} @Override public boolean isNew() { return false; } @Override public void putValue(String arg0, Object arg1) {} @Override public void removeAttribute(String arg0) {} @Override public void removeValue(String arg0) {} @Override public void setMaxInactiveInterval(int arg0) {} @Override public Object getAttribute(String name) { return params.get(name); } @Override public void setAttribute(String name, Object value) { params.put(name, value); } } @Before public void setUp() throws Exception { initMocks(this); session = new MockHttpSession(); defaultLocale = Locale.getDefault(); when(request.getSession()).thenReturn(session); when(request.getServletContext()).thenReturn(context); i18n = new I18nLocalization(request); } private void assertDefaultLocale() { assertEquals(defaultLocale, i18n.getLocale()); } private void setLocaleEn() { session.setAttribute(Config.FMT_LOCALE + ".session", new Locale("en")); } private void setLocalePt_BR() { session.setAttribute(Config.FMT_LOCALE + ".session", new Locale("pt_BR")); } @Test public void shouldNotSetLocaleFromParameterIfNull() { when(request.getParameter("_locale")).thenReturn(null); assertDefaultLocale(); setLocaleEn(); Locale locale = getLocale(); i18n.getBundle(locale); assertNotNull(locale); assertEquals("en", locale.getLanguage()); } @Test public void shouldSetLocaleFromParameterIfExists() { when(request.getParameter("_locale")).thenReturn("pt_BR"); assertDefaultLocale(); setLocaleEn(); assertEquals(getLocale().getLanguage(), "en"); setLocalePt_BR(); Locale locale = getLocale(); i18n.getBundle(locale); assertNotNull(locale); assertEquals("pt_br", locale.getLanguage()); } private Locale getLocale() { return i18n.getLocale(); } }