/* * Copyright 2010-2014 the original author or authors. * * 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. */ package org.springframework.mobile.device.view; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.Locale; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.core.Ordered; import org.springframework.mobile.device.DeviceType; import org.springframework.mobile.device.DeviceUtils; import org.springframework.mobile.device.StubDevice; import org.springframework.mobile.device.site.SitePreference; import org.springframework.mobile.device.site.SitePreferenceHandler; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockServletContext; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * @author Roy Clarkson */ public final class LiteDeviceDelegatingViewResolverTest { private LiteDeviceDelegatingViewResolver viewResolver; private ViewResolver delegateViewResolver; private View view; private MockHttpServletRequest request = new MockHttpServletRequest(); private StubDevice device = new StubDevice(); private String viewName = "home"; private final Locale locale = Locale.ENGLISH; @Before public void setUp() { StaticWebApplicationContext context = new StaticWebApplicationContext(); context.setServletContext(new MockServletContext()); context.refresh(); this.delegateViewResolver = createMock(ViewResolver.class); this.viewResolver = new LiteDeviceDelegatingViewResolver(delegateViewResolver); viewResolver.setApplicationContext(context); request.setRequestURI("/home"); RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); this.view = createMock("view", View.class); } @After public void tearDown() throws Exception { RequestContextHolder.resetRequestAttributes(); } @Test(expected = IllegalArgumentException.class) public void constructWithNullDelegate() throws Exception { this.viewResolver = new LiteDeviceDelegatingViewResolver(null); } @Test public void resolveViewNameNoDeviceNoSitePreferenceRedirect() throws Exception { this.viewName = "redirect:about"; replayMocks("redirect:about"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceRedirectEmpty() throws Exception { this.viewName = "redirect:"; replayMocks("redirect:"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceRedirectAbsoluteUrl() throws Exception { this.viewName = "redirect:http://spring.io"; replayMocks("redirect:http://spring.io"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceRedirectAbsoluteUrlSSL() throws Exception { this.viewName = "redirect:https://spring.io"; replayMocks("redirect:https://spring.io"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceRedirectAbsoluteUrlFTP() throws Exception { this.viewName = "redirect:ftp://spring.io"; replayMocks("redirect:ftp://spring.io"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceForward() throws Exception { this.viewName = "forward:about"; replayMocks("forward:about"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceForwardAbsoluteUrl() throws Exception { this.viewName = "forward:http://spring.io"; replayMocks("forward:http://spring.io"); } @Test public void resolveViewNameNormalDeviceNormalPrefixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("redirect:about"); } @Test public void resolveViewNameNormalDeviceNormalPrefixRedirectToRoot() throws Exception { this.viewName = "redirect:/"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("redirect:/"); } @Test public void resolveViewNameNormalDeviceNormalPrefixRedirectToEmpty() throws Exception { this.viewName = "redirect:"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("redirect:"); } @Test public void resolveViewNameNormalDeviceNormalPrefixRedirectToAbsoluteUrl() throws Exception { this.viewName = "redirect:http://spring.io"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("redirect:http://spring.io"); } @Test public void resolveViewNameNormalDeviceNormalPrefixRedirectToAbsoluteUrlFTP() throws Exception { this.viewName = "redirect:ftp://spring.io"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("redirect:ftp://spring.io"); } @Test public void resolveViewNameNormalDeviceNormalSuffixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalSuffix(".nor"); replayMocks("redirect:about"); } @Test public void resolveViewNameNormalDeviceNormalPrefixForward() throws Exception { this.viewName = "forward:about"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("forward:about"); } @Test public void resolveViewNameNormalDeviceNormalPrefixForwardToRoot() throws Exception { this.viewName = "forward:/"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("forward:/"); } @Test public void resolveViewNameNormalDeviceNormalPrefixForwardToEmpty() throws Exception { this.viewName = "forward:"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("forward:"); } @Test public void resolveViewNameNormalDeviceNormalPrefixForwardToAbsoluteUrl() throws Exception { this.viewName = "forward:http://spring.io"; device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("forward:http://spring.io"); } @Test public void resolveViewNameMobileDeviceMobilePrefixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("redirect:about"); } @Test public void resolveViewNameMobileDeviceMobilePrefixRedirectToRoot() throws Exception { this.viewName = "redirect:/"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("redirect:/"); } @Test public void resolveViewNameMobileDeviceMobilePrefixRedirectToEmpty() throws Exception { this.viewName = "redirect:"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("redirect:"); } @Test public void resolveViewNameMobileDeviceNormalPrefixRedirectToAbsoluteUrl() throws Exception { this.viewName = "redirect:http://spring.io"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("redirect:http://spring.io"); } @Test public void resolveViewNameMobileDeviceNormalPrefixRedirectToAbsoluteUrlSSL() throws Exception { this.viewName = "redirect:https://spring.io"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("redirect:https://spring.io"); } @Test public void resolveViewNameMobileDeviceMobileSuffixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobileSuffix(".mob"); replayMocks("redirect:about"); } @Test public void resolveViewNameMobileDeviceMobilePrefixForward() throws Exception { this.viewName = "forward:about"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("forward:about"); } @Test public void resolveViewNameMobileDeviceMobilePrefixForwardToRoot() throws Exception { this.viewName = "forward:/"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("forward:/"); } @Test public void resolveViewNameMobileDeviceMobilePrefixForwardToEmpty() throws Exception { this.viewName = "forward:"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("forward:"); } @Test public void resolveViewNameMobileDeviceNormalPrefixForwardToAbsoluteUrl() throws Exception { this.viewName = "forward:HTTP://spring.io"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("forward:HTTP://spring.io"); } @Test public void resolveViewNameTabletDeviceTabletPrefixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("redirect:about"); } @Test public void resolveViewNameTabletDeviceTabletPrefixRedirectToRoot() throws Exception { this.viewName = "redirect:/"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("redirect:/"); } @Test public void resolveViewNameTabletDeviceTabletPrefixRedirectToEmpty() throws Exception { this.viewName = "redirect:"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("redirect:"); } @Test public void resolveViewNameTabletDeviceNormalPrefixRedirectToAbsoluteUrl() throws Exception { this.viewName = "redirect:http://spring.io"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("redirect:http://spring.io"); } @Test public void resolveViewNameTabletDeviceTabletSuffixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletSuffix(".tab"); replayMocks("redirect:about"); } @Test public void resolveViewNameTabletDeviceTabletPrefixForward() throws Exception { this.viewName = "forward:about"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("forward:about"); } @Test public void resolveViewNameTabletDeviceTabletPrefixForwardToRoot() throws Exception { this.viewName = "forward:/"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("forward:/"); } @Test public void resolveViewNameTabletDeviceTabletPrefixForwardToEmpty() throws Exception { this.viewName = "forward:"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("forward:"); } @Test public void resolveViewNameTabletDeviceNormalPrefixForwardToAbsoluteUrl() throws Exception { this.viewName = "forward:http://spring.io"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("forward:http://spring.io"); } @Test public void resolveViewNameNormalDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("normal/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameNormalDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalSuffix(".nor"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".nor", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameMobileDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("mobile/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameMobileDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobileSuffix(".mob"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".mob", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameTabletDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("tablet/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameTabletDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletSuffix(".tab"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".tab", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } @Test public void resolveViewNameNoDeviceNoSitePreference() throws Exception { replayMocks(viewName); } @Test public void resolveViewNameNoDeviceNoSitePreferenceNormalPrefix() throws Exception { viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); } @Test public void resolveViewNameNoDeviceNoSitePreferenceNormalSuffix() throws Exception { viewResolver.setNormalSuffix(".norm"); replayMocks(viewName + ".norm"); } @Test public void resolveViewNameNoDeviceNoSitePreferenceNormalPrefixAndSuffix() throws Exception { viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); } @Test public void resolveViewNameNormalDeviceNoSitePreference() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); replayMocks(viewName); } @Test public void resolveViewNameNormalDeviceNoSitePreferenceNormalPrefix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); } @Test public void resolveViewNameNormalDeviceNoSitePreferenceNormalSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalSuffix(".norm"); replayMocks(viewName + ".norm"); } @Test public void resolveViewNameNormalDeviceNoSitePreferenceNormalPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); } @Test public void resolveViewNameNormalDeviceNormalSitePreference() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); replayMocks(viewName); } @Test public void resolveViewNameNormalDeviceNormalSitePreferenceNormalPrefix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); } @Test public void resolveViewNameNormalDeviceNormalSitePreferenceNormalSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalSuffix(".nor"); replayMocks(viewName + ".nor"); } @Test public void resolveViewNameNormalDeviceNormalSitePreferenceNormalPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); } @Test public void resolveViewNameNormalDeviceMobileSitePreference() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); replayMocks(viewName); } @Test public void resolveViewNameNormalDeviceMobileSitePreferenceMobilePrefix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); replayMocks("mobile/" + viewName); } @Test public void resolveViewNameNormalDeviceMobileSitePreferenceMobileSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobileSuffix(".mob"); replayMocks(viewName + ".mob"); } @Test public void resolveViewNameNormalDeviceMobileSitePreferenceMobilePrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); viewResolver.setMobileSuffix(".mob"); replayMocks("mobile/" + viewName + ".mob"); } @Test public void resolveViewNameNormalDeviceTabletSitePreference() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); replayMocks(viewName); } @Test public void resolveViewNameNormalDeviceTabletSitePreferenceTabletPrefix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); replayMocks("tablet/" + viewName); } @Test public void resolveViewNameNormalDeviceTabletSitePreferenceTabletSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletSuffix(".tab"); replayMocks(viewName + ".tab"); } @Test public void resolveViewNameNormalDeviceTabletSitePreferenceTabletPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); viewResolver.setTabletSuffix(".tab"); replayMocks("tablet/" + viewName + ".tab"); } @Test public void resolveViewNameMobileDeviceNoSitePreference() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); replayMocks(viewName); } @Test public void resolveViewNameMobileDeviceNoSitePreferenceMobilePrefix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("mobile/" + viewName); } @Test public void resolveViewNameMobileDeviceNoSitePreferenceMobileSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobileSuffix(".mob"); replayMocks(viewName + ".mob"); } @Test public void resolveViewNameMobileDeviceNoSitePreferenceMobilePrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); viewResolver.setMobileSuffix(".mob"); replayMocks("mobile/" + viewName + ".mob"); } @Test public void resolveViewNameMobileDeviceNormalSitePreference() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); replayMocks(viewName); } @Test public void resolveViewNameMobileDeviceNormalSitePreferenceNormalPrefix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); } @Test public void resolveViewNameMobileDeviceNormalSitePreferenceNormalSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalSuffix(".nor"); replayMocks(viewName + ".nor"); } @Test public void resolveViewNameMobileDeviceNormalSitePreferenceNormalPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); } @Test public void resolveViewNameMobileDeviceMobileSitePreference() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); replayMocks(viewName); } @Test public void resolveViewNameMobileDeviceMobileSitePreferenceMobilePrefix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); replayMocks("mobile/" + viewName); } @Test public void resolveViewNameMobileDeviceMobileSitePreferenceMobileSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobileSuffix(".mob"); replayMocks(viewName + ".mob"); } @Test public void resolveViewNameMobileDeviceMobileSitePreferenceMobilePrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); viewResolver.setMobileSuffix(".mob"); replayMocks("mobile/" + viewName + ".mob"); } @Test public void resolveViewNameMobileDeviceTabletSitePreference() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); } @Test public void resolveViewNameMobileDeviceTabletSitePreferenceTabletPrefix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); replayMocks("tablet/" + viewName); } @Test public void resolveViewNameMobileDeviceTabletSitePreferenceTabletSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletSuffix(".tab"); replayMocks(viewName + ".tab"); } @Test public void resolveViewNameMobileDeviceTabletSitePreferenceTabletPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); viewResolver.setTabletSuffix(".tab"); replayMocks("tablet/" + viewName + ".tab"); } @Test public void resolveViewNameTabletDeviceNoSitePreference() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); replayMocks(viewName); } @Test public void resolveViewNameTabletDeviceNoSitePreferenceTabletPrefix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("tablet/" + viewName); } @Test public void resolveViewNameTabletDeviceNoSitePreferenceTabletSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletSuffix(".tab"); replayMocks(viewName + ".tab"); } @Test public void resolveViewNameTabletDeviceNoSitePreferenceTabletPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); viewResolver.setTabletSuffix(".tab"); replayMocks("tablet/" + viewName + ".tab"); } @Test public void resolveViewNameTabletDeviceNormalSitePreference() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); replayMocks(viewName); } @Test public void resolveViewNameTabletDeviceNormalSitePreferenceNormalPrefix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); } @Test public void resolveViewNameTabletDeviceNormalSitePreferenceNormalSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalSuffix(".nor"); replayMocks(viewName + ".nor"); } @Test public void resolveViewNameTabletDeviceNormalSitePreferenceNormalPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.NORMAL); viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); } @Test public void resolveViewNameTabletDeviceMobileSitePreference() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); replayMocks(viewName); } @Test public void resolveViewNameTabletDeviceMobileSitePreferenceMobilePrefix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); replayMocks("mobile/" + viewName); } @Test public void resolveViewNameTabletDeviceMobileSitePreferenceMobileSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobileSuffix(".mob"); replayMocks(viewName + ".mob"); } @Test public void resolveViewNameTabletDeviceMobileSitePreferenceMobilePrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.MOBILE); viewResolver.setMobilePrefix("mobile/"); viewResolver.setMobileSuffix(".mob"); replayMocks("mobile/" + viewName + ".mob"); } @Test public void resolveViewNameTabletDeviceTabletSitePreference() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); replayMocks(viewName); } @Test public void resolveViewNameTabletDeviceTabletSitePreferenceTabletPrefix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); replayMocks("tablet/" + viewName); } @Test public void resolveViewNameTabletDeviceTabletSitePreferenceTabletSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletSuffix(".tab"); replayMocks(viewName + ".tab"); } @Test public void resolveViewNameTabletDeviceTabletSitePreferenceTabletPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); request.setAttribute(SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE, SitePreference.TABLET); viewResolver.setTabletPrefix("tablet/"); viewResolver.setTabletSuffix(".tab"); replayMocks("tablet/" + viewName + ".tab"); } @Test public void resolveViewNameComplexPath() throws Exception { viewResolver.setNormalPrefix("/vi/e/w/s/"); replayMocks("/vi/e/w/s/" + viewName); } @Test public void implementsOrdered() { assertTrue(viewResolver instanceof Ordered); } @Test public void defaultOrder() { assertEquals(Ordered.LOWEST_PRECEDENCE, viewResolver.getOrder()); } @Test public void modifiedOrdered() { viewResolver.setOrder(Ordered.HIGHEST_PRECEDENCE + 10); assertEquals(Ordered.HIGHEST_PRECEDENCE + 10, viewResolver.getOrder()); } // helpers private void replayMocks(String expectedViewName) throws Exception { expect(delegateViewResolver.resolveViewName(expectedViewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); } }