package org.ovirt.engine.core.utils.servlet;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.servlet.FilterChain;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner.Silent;
@RunWith(Silent.class)
public class LocaleFilterTest {
LocaleFilter testFilter;
@Mock
HttpServletRequest mockRequest;
@Mock
HttpServletResponse mockResponse;
@Mock
FilterChain mockChain;
@Mock
ServletContext mockServletContext;
@Before
public void setUp() throws Exception {
when(mockRequest.getServletContext()).thenReturn(mockServletContext);
testFilter = new LocaleFilter();
}
@Test
public void testDoFilterFromParameter() throws IOException, ServletException {
Locale testLocale = Locale.GERMANY;
when(mockRequest.getParameter(LocaleFilter.LOCALE)).thenReturn(testLocale.toString());
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, testLocale);
Cookie cookie = new Cookie(LocaleFilter.LOCALE, testLocale.toString());
cookie.setMaxAge(Integer.MAX_VALUE); //Doesn't expire.
verify(mockResponse, times(1)).addCookie(any());
}
@Test
public void testDoFilterFromParameterWithCookie() throws IOException, ServletException {
Locale testLocale = Locale.JAPAN;
Cookie[] cookies = createCookies(Locale.GERMAN);
when(mockRequest.getParameter(LocaleFilter.LOCALE)).thenReturn(testLocale.toString());
when(mockRequest.getCookies()).thenReturn(cookies);
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, testLocale);
verify(mockResponse, times(1)).addCookie(any());
}
@Test
public void testDoFilterFromCookie() throws IOException, ServletException {
Locale testLocale = Locale.GERMANY;
Cookie[] cookies = createCookies(testLocale);
when(mockRequest.getCookies()).thenReturn(cookies);
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, testLocale);
verify(mockResponse, times(1)).addCookie(any());
}
@Test
public void testDoFilterFromCookieNull() throws IOException, ServletException {
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
//Verify that it defaulted to the US locale
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, Locale.US);
verify(mockResponse, times(1)).addCookie(any());
}
@Test
public void testDoFilterFromCookieDifferent() throws IOException, ServletException {
Cookie[] cookies = new Cookie[2];
cookies[0] = new Cookie("name", "value");
cookies[1] = new Cookie("name2", "value2");
when(mockRequest.getCookies()).thenReturn(cookies);
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
//Verify that it defaulted to the US locale
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, Locale.US);
verify(mockResponse, times(1)).addCookie(any());
}
@Test
public void testDoFilterFromRequest() throws IOException, ServletException {
when(mockRequest.getLocale()).thenReturn(Locale.JAPANESE);
testFilter.doFilter(mockRequest, mockResponse, mockChain);
verify(mockChain).doFilter(mockRequest, mockResponse);
verify(mockResponse, times(1)).addCookie(any());
verify(mockRequest).setAttribute(LocaleFilter.LOCALE, Locale.JAPAN);
}
@Test
public void testInit() throws ServletException {
testFilter.init(null);
//Should not throw an exception.
}
@Test
public void testDestroy() {
testFilter.destroy();
//Should not throw an exception.
}
/*
* Helper methods.
*/
private Cookie[] createCookies(Locale... locales) {
List<Cookie> cookieList = new ArrayList<>();
for(Locale locale: locales) {
cookieList.add(new Cookie(LocaleFilter.LOCALE, locale.toString()));
}
return cookieList.toArray(new Cookie[cookieList.size()]);
}
}