package org.sigmah.server.util;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.sigmah.shared.Cookies;
import org.sigmah.shared.Language;
/**
* Languages related tests.
*
* @author Denis Colliot (dcolliot@ideia.fr)
*/
public class LanguageTest {
/**
* Default language.
*/
private static final Language DEFAULT_LANGUAGE = Language.EN;
/**
* HTTP request {@code Accept-Language} header name.
*/
private static final String ACCEPT_LANGUAGE_HEADER = "Accept-Language";
/**
* Retrieves language from HTTP cookies.
*/
@Test
public void fromCookies() {
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
// Default language.
Mockito.when(request.getCookies()).thenReturn(null);
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(new Cookie[] { });
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(cookies(null));
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
// Language detected.
Mockito.when(request.getCookies()).thenReturn(cookies(Language.FR));
Assert.assertEquals(Language.FR, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(cookies(Language.EN));
Assert.assertEquals(Language.EN, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(cookies(Language.ES));
Assert.assertEquals(Language.ES, Languages.getLanguage(request));
}
/**
* Retrieves language from HTTP header.
*/
@Test
public void fromHeader() {
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
// Default language.
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("");
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn(null);
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
// Language detected.
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("fr,fr-fr;q=0.8,en;q=0.6,es;q=0.4,en-us;q=0.2");
Assert.assertEquals(Language.FR, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("fr-fr,fr;q=0.8,en;q=0.6,es;q=0.4,en-us;q=0.2");
Assert.assertEquals(Language.FR, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("en-us,en;q=0.8,fr-fr;q=0.6,fr;q=0.4,es;q=0.2");
Assert.assertEquals(Language.EN, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("en,en-us;q=0.8,fr-fr;q=0.6,fr;q=0.4,es;q=0.2");
Assert.assertEquals(Language.EN, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("es;en,en-us;q=0.8,fr-fr;q=0.6,fr;q=0.4,q=0.2");
Assert.assertEquals(Language.ES, Languages.getLanguage(request));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("q=0.8;es;en,en-us;fr-fr;q=0.6,fr;q=0.4,q=0.2");
Assert.assertEquals(Language.ES, Languages.getLanguage(request));
}
/**
* Retrieves language from HTTP cookies or header.
*/
@Test
public void fromBoth() {
final HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
// Default language.
Mockito.when(request.getCookies()).thenReturn(null);
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn(null);
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(null);
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("");
Assert.assertEquals(DEFAULT_LANGUAGE, Languages.getLanguage(request));
// Language detected.
Mockito.when(request.getCookies()).thenReturn(null);
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("fr-fr,fr;q=0.8,en;q=0.6,es;q=0.4,en-us;q=0.2");
Assert.assertEquals(Language.FR, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(cookies(Language.FR));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("en;fr-fr,fr;q=0.8;q=0.6,es;q=0.4,en-us;q=0.2");
Assert.assertEquals(Language.FR, Languages.getLanguage(request));
Mockito.when(request.getCookies()).thenReturn(cookies(null));
Mockito.when(request.getHeader(ACCEPT_LANGUAGE_HEADER)).thenReturn("es;fr-fr,fr;q=0.8;q=0.6,es;q=0.4,en-us;q=0.2");
Assert.assertEquals(Language.ES, Languages.getLanguage(request));
}
/**
* Builds a {@link Cookie} array with the given {@code language} value.
*
* @param language
* The {@link Language} instance, may be {@code null}.
* @return A {@link Cookie} array containing the {@link Cookies#LANGUAGE_COOKIE} key referencing the given
* {@code language} value.
*/
private static Cookie[] cookies(final Language language) {
return new Cookie[] { new Cookie(Cookies.LANGUAGE_COOKIE, language != null ? language.getLocale() : null)
};
}
}