/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.web.portal.page; import java.util.ArrayList; import javax.servlet.http.HttpServletResponse; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import com.enonic.cms.api.plugin.ext.http.HttpResponseFilter; import com.enonic.cms.core.Attribute; import com.enonic.cms.core.MockSitePropertiesService; import com.enonic.cms.core.Path; import com.enonic.cms.core.portal.PortalRequest; import com.enonic.cms.core.portal.PortalResponse; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.servlet.ServletRequestAccessor; import com.enonic.cms.core.structure.SiteKey; import com.enonic.cms.core.structure.SitePath; import com.enonic.cms.core.structure.SitePropertyNames; import com.enonic.cms.server.DeploymentAndRequestSetup; import com.enonic.cms.store.dao.SiteDao; import static org.junit.Assert.*; /** * unit tests for HEAD functionality */ public class PortalResponseProcessor_headTest { public static final String CONTENT_VALUE = "content text"; public static final String ETAG_VALUE = "content_F98393E248D02CFD7C597B8E640EED1D8F684824"; public static final String ETAG_VALUE_INCORRECT = "content_F98393E248D02CFD7C597B8E640EED1D8F684824_"; public static final String ETAG_HEADER_NAME = "Etag"; private PortalResponseProcessor portalResponseProcessor = new PortalResponseProcessor(); private MockHttpServletRequest httpServletRequest = new MockHttpServletRequest(); private MockHttpServletResponse httpServletResponse = new MockHttpServletResponse(); private SiteDao siteDao = Mockito.mock( SiteDao.class ); private SitePath sitePath = new SitePath( new SiteKey( 0 ), new Path( "/news/local politics" ) ); private PortalRequest portalRequest = new PortalRequest(); private PortalResponse portalResponse = new PortalResponse(); @Before public void before() { MockSitePropertiesService sitePropertiesService = new MockSitePropertiesService(); sitePropertiesService.setProperty( new SiteKey( 0 ), SitePropertyNames.PAGE_CACHE_HEADERS_ENABLED, "true" ); httpServletRequest.setServerPort( 80 ); ServletRequestAccessor.setRequest( httpServletRequest ); portalResponseProcessor.setHttpRequest( httpServletRequest ); portalResponseProcessor.setHttpResponse( httpServletResponse ); portalResponseProcessor.setRequest( portalRequest ); portalResponseProcessor.setResponse( portalResponse ); portalResponseProcessor.setCacheHeadersEnabledForSite( true ); portalResponseProcessor.setCurrentPortalRequestTrace( null ); portalResponseProcessor.setResponseFilters( new ArrayList<HttpResponseFilter>() ); new DeploymentAndRequestSetup(). appDeployedAtRoot(). originalRequest( "localhost", "/admin/site/0/political news shortcut" ). requestedSite( 0, "political news shortcut" ). requestedAdminDebugAt(). setupAtDefaultPath(). back(). setup( httpServletRequest ); httpServletRequest.setAttribute( Attribute.ORIGINAL_SITEPATH, sitePath ); portalRequest.setOriginalUrl( "http://localhost/admin/site/0/political news shortcut?" ); portalRequest.setRequestTime( new DateTime() ); portalRequest.setSitePath( sitePath ); portalRequest.setRequester( new UserKey( "1" ) ); portalResponse.setContent( CONTENT_VALUE ); } @Test public void testServeResponse_check_modified_GET() throws Exception { httpServletRequest.setMethod( "GET" ); // exercise portalResponseProcessor.serveResponse(); // verify that length is equal to content and content exists assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentLength() ); assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_OK, httpServletResponse.getStatus() ); } @Test public void testServeResponse_check_modified_HEAD() throws Exception { httpServletRequest.setMethod( "HEAD" ); // exercise portalResponseProcessor.serveResponse(); // verify that length is equal to content but no content exists assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentLength() ); assertEquals( 0, httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_OK, httpServletResponse.getStatus() ); } @Test public void testServeResponse_check_not_modified_HEAD() throws Exception { httpServletRequest.setMethod( "HEAD" ); httpServletRequest.addHeader( "If-None-Match", ETAG_VALUE ); // exercise portalResponseProcessor.serveResponse(); // verify that length is equal to content but content does not exist assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentLength() ); // most important test assertEquals( 0, httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_NOT_MODIFIED, httpServletResponse.getStatus() ); } @Test public void testServeResponse_check_not_modified_GET() throws Exception { httpServletRequest.setMethod( "GET" ); httpServletRequest.addHeader( "If-None-Match", ETAG_VALUE ); // exercise portalResponseProcessor.serveResponse(); // verify that length is zero and no content exists assertEquals( 0, httpServletResponse.getContentLength() ); assertEquals( 0, httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_NOT_MODIFIED, httpServletResponse.getStatus() ); } @Test public void testServeResponse_check_not_modified_HEAD_non_matching_etag() throws Exception { httpServletRequest.setMethod( "HEAD" ); httpServletRequest.addHeader( "If-None-Match", ETAG_VALUE_INCORRECT ); // exercise portalResponseProcessor.serveResponse(); // verify that length is equal to content but content does not exist assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentLength() ); // most important test assertEquals( 0, httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_OK, httpServletResponse.getStatus() ); } @Test public void testServeResponse_check_not_modified_GET_non_matching_etag() throws Exception { httpServletRequest.setMethod( "GET" ); httpServletRequest.addHeader( "If-None-Match", ETAG_VALUE_INCORRECT ); // exercise portalResponseProcessor.serveResponse(); // verify that length is zero and no content exists assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentLength() ); assertEquals( CONTENT_VALUE.length(), httpServletResponse.getContentAsByteArray().length ); assertEquals( ETAG_VALUE, httpServletResponse.getHeader( ETAG_HEADER_NAME ) ); assertEquals( HttpServletResponse.SC_OK, httpServletResponse.getStatus() ); } }