org.jasig.portal.portlet.container.services.PortletCookieServiceImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.portal.portlet.container.services.PortletCookieServiceImplTest.java

Source

/**
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig licenses this file to you 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.jasig.portal.portlet.container.services;

import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.Cookie;

import org.apache.commons.lang.time.DateUtils;
import org.easymock.EasyMock;
import org.jasig.portal.portlet.dao.IPortletCookieDao;
import org.jasig.portal.portlet.om.IPortalCookie;
import org.jasig.portal.portlet.om.IPortletCookie;
import org.jasig.portal.portlet.om.IPortletWindowId;
import org.joda.time.DateTime;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

/**
 * Tests for {@link PortletCookieServiceImpl}.
 * 
 * @author Nicholas Blair
 * @version $Id$
 */
public class PortletCookieServiceImplTest {

    /**
     * Control test invocation of {@link PortletCookieServiceImpl#updatePortalCookie(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.
     */
    @Test
    public void testUpdatePortletCookieControl() {
        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);

        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");
        EasyMock.expect(portletCookieDao.createPortalCookie(PortletCookieServiceImpl.DEFAULT_MAX_AGE))
                .andReturn(portalCookie);
        EasyMock.expect(portletCookieDao.updatePortalCookieExpiration(portalCookie,
                PortletCookieServiceImpl.DEFAULT_MAX_AGE)).andReturn(portalCookie);
        EasyMock.replay(portletCookieDao);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        cookieService.updatePortalCookie(request, response);

        Cookie[] cookies = response.getCookies();
        Assert.assertNotNull(cookies);
        Assert.assertEquals(1, cookies.length);
        EasyMock.verify(portletCookieDao);
    }

    /**
     * Test {@link PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}.
     * that results in creating a new PortalCookie.
     */
    @Test
    public void testGetOrCreatePortalCookieCreate() {
        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);

        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");
        EasyMock.expect(portletCookieDao.createPortalCookie(PortletCookieServiceImpl.DEFAULT_MAX_AGE))
                .andReturn(portalCookie);
        EasyMock.replay(portletCookieDao);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        MockHttpServletRequest request = new MockHttpServletRequest();
        cookieService.getOrCreatePortalCookie(request);

        EasyMock.verify(portletCookieDao);
    }

    /**
     * Test {@link PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}.
     * that results in returning an existing portalcookie from the request cookies
     */
    @Test
    public void testGetOrCreatePortalCookieGetExistingFromRequestCookies() {
        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);
        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");

        EasyMock.expect(portletCookieDao.getPortalCookie("ABCDEF")).andReturn(portalCookie);
        EasyMock.replay(portletCookieDao);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        MockHttpServletRequest request = new MockHttpServletRequest();
        Cookie[] cookies = new Cookie[1];
        Cookie cookie = new Cookie(IPortletCookieService.DEFAULT_PORTAL_COOKIE_NAME, "ABCDEF");
        cookies[0] = cookie;
        request.setCookies(cookies);

        IPortalCookie result = cookieService.getOrCreatePortalCookie(request);
        Assert.assertEquals(portalCookie, result);
        EasyMock.verify(portletCookieDao);
    }

    /**
     * Test {@link PortletCookieServiceImpl#getOrCreatePortalCookie(javax.servlet.http.HttpServletRequest)}.
     * that results in returning an existing portalcookie from the id stored in the session.
     */
    @Test
    public void testGetOrCreatePortalCookieGetExistingFromSession() {
        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);
        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");

        EasyMock.expect(portletCookieDao.getPortalCookie("ABCDEF")).andReturn(portalCookie);
        EasyMock.replay(portletCookieDao);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        MockHttpServletRequest request = new MockHttpServletRequest();
        request.getSession().setAttribute(PortletCookieServiceImpl.SESSION_ATTRIBUTE__PORTAL_COOKIE_ID, "ABCDEF");

        IPortalCookie result = cookieService.getOrCreatePortalCookie(request);
        Assert.assertEquals(portalCookie, result);
        EasyMock.verify(portletCookieDao);
    }

    /**
     * Control test for adding a portlet cookie: no existing portalCookie, portlet cookie requires persistence.
     */
    @Test
    public void testAddCookieControl() {
        Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue");
        // max age will trigger persistence
        portletCookie.setMaxAge(360);

        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);

        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");

        EasyMock.expect(portletCookieDao.createPortalCookie(PortletCookieServiceImpl.DEFAULT_MAX_AGE))
                .andReturn(portalCookie);
        EasyMock.expect(portletCookieDao.addOrUpdatePortletCookie(portalCookie, portletCookie))
                .andReturn(portalCookie);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class);
        EasyMock.replay(portletCookieDao, mockWindowId);

        MockHttpServletRequest request = new MockHttpServletRequest();
        cookieService.addCookie(request, mockWindowId, portletCookie);

        EasyMock.verify(portletCookieDao, mockWindowId);
    }

    /**
     * Control test for removing a portlet cookie.
     * Logic is nearly identical to create, as both {@link IPortletCookieDao#addOrUpdatePortletCookie(IPortalCookie, Cookie)} is used
     * in both scenarios.
     */
    @Test
    public void testAddCookieRemove() {
        Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue");
        // max age will trigger persistence removal
        portletCookie.setMaxAge(0);

        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);

        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");

        EasyMock.expect(portletCookieDao.createPortalCookie(PortletCookieServiceImpl.DEFAULT_MAX_AGE))
                .andReturn(portalCookie);
        EasyMock.expect(portletCookieDao.addOrUpdatePortletCookie(portalCookie, portletCookie))
                .andReturn(portalCookie);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class);
        EasyMock.replay(portletCookieDao, mockWindowId);

        MockHttpServletRequest request = new MockHttpServletRequest();
        cookieService.addCookie(request, mockWindowId, portletCookie);

        EasyMock.verify(portletCookieDao, mockWindowId);
    }

    /**
     * Control test for adding a portlet cookie with maxAge == -1, which results in a session-only cookie.
     */
    @Test
    public void testAddCookieSessionOnly() {
        Cookie portletCookie = new Cookie("somePortletCookieName", "somePortletCookieValue");
        // max age will trigger persistence
        portletCookie.setMaxAge(-1);

        IPortletCookieDao portletCookieDao = EasyMock.createMock(IPortletCookieDao.class);

        MockPortalCookie portalCookie = new MockPortalCookie();
        portalCookie.setValue("ABCDEF");

        EasyMock.expect(portletCookieDao.createPortalCookie(PortletCookieServiceImpl.DEFAULT_MAX_AGE))
                .andReturn(portalCookie);

        PortletCookieServiceImpl cookieService = new PortletCookieServiceImpl();
        cookieService.setPortletCookieDao(portletCookieDao);

        IPortletWindowId mockWindowId = EasyMock.createMock(IPortletWindowId.class);
        EasyMock.replay(portletCookieDao, mockWindowId);

        MockHttpServletRequest request = new MockHttpServletRequest();
        cookieService.addCookie(request, mockWindowId, portletCookie);

        Map<String, SessionOnlyPortletCookieImpl> sessionOnlyMap = cookieService
                .getSessionOnlyPortletCookieMap(request);
        SessionOnlyPortletCookieImpl sessionOnlyCookie = sessionOnlyMap.get("somePortletCookieName");
        Assert.assertNotNull(sessionOnlyCookie);
        Assert.assertEquals(-1, sessionOnlyCookie.getMaxAge());
        Assert.assertEquals("somePortletCookieValue", sessionOnlyCookie.getValue());

        EasyMock.verify(portletCookieDao, mockWindowId);
    }

    /**
     * Mock {@link IPortalCookie} used in these tests.
     * 
     * @author Nicholas Blair
     * @version $Id$
     */
    class MockPortalCookie implements IPortalCookie {

        private DateTime created = DateTime.now();
        private DateTime expires = DateTime.now().plusHours(1);
        private Set<IPortletCookie> portletCookies = new HashSet<IPortletCookie>();
        private String value;

        @Override
        public DateTime getCreated() {
            return this.created;
        }

        @Override
        public DateTime getExpires() {
            return this.expires;
        }

        @Override
        public Set<IPortletCookie> getPortletCookies() {
            return this.portletCookies;
        }

        @Override
        public String getValue() {
            return this.value;
        }

        @Override
        public void setExpires(DateTime expires) {
            this.expires = expires;
        }

        public void setCreated(DateTime created) {
            this.created = created;
        }

        public void setPortletCookies(Set<IPortletCookie> portletCookies) {
            this.portletCookies = portletCookies;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

}