/*
* 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 the following location:
*
* 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.cas.web.flow;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.Cookie;
import org.jasig.cas.AbstractCentralAuthenticationServiceTest;
import org.jasig.cas.logout.LogoutRequest;
import org.jasig.cas.logout.LogoutRequestStatus;
import org.jasig.cas.services.DefaultServicesManagerImpl;
import org.jasig.cas.services.InMemoryServiceRegistryDaoImpl;
import org.jasig.cas.services.RegisteredServiceImpl;
import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;
import org.jasig.cas.web.support.WebUtils;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.webflow.context.servlet.ServletExternalContext;
import org.springframework.webflow.core.collection.LocalAttributeMap;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
/**
* @author Scott Battaglia
* @since 3.0
*/
public class LogoutActionTests extends AbstractCentralAuthenticationServiceTest {
private static final String COOKIE_TGC_ID = "CASTGC";
private LogoutAction logoutAction;
private CookieRetrievingCookieGenerator warnCookieGenerator;
private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;
private InMemoryServiceRegistryDaoImpl serviceRegistryDao;
private DefaultServicesManagerImpl serviceManager;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private RequestContext requestContext;
@Before
public void onSetUp() throws Exception {
this.request = new MockHttpServletRequest();
this.response = new MockHttpServletResponse();
this.requestContext = mock(RequestContext.class);
final ServletExternalContext servletExternalContext = mock(ServletExternalContext.class);
when(this.requestContext.getExternalContext()).thenReturn(servletExternalContext);
when(servletExternalContext.getNativeRequest()).thenReturn(request);
when(servletExternalContext.getNativeResponse()).thenReturn(response);
final LocalAttributeMap flowScope = new LocalAttributeMap();
when(this.requestContext.getFlowScope()).thenReturn(flowScope);
this.warnCookieGenerator = new CookieRetrievingCookieGenerator();
this.serviceRegistryDao = new InMemoryServiceRegistryDaoImpl();
this.serviceManager = new DefaultServicesManagerImpl(serviceRegistryDao);
this.serviceManager.reload();
this.warnCookieGenerator.setCookieName("test");
this.ticketGrantingTicketCookieGenerator = new CookieRetrievingCookieGenerator();
this.ticketGrantingTicketCookieGenerator.setCookieName(COOKIE_TGC_ID);
this.logoutAction = new LogoutAction();
this.logoutAction.setServicesManager(this.serviceManager);
}
@Test
public void testLogoutNoCookie() throws Exception {
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
}
@Test
public void testLogoutForServiceWithFollowRedirectsAndMatchingService() throws Exception {
this.request.addParameter("service", "TestService");
final RegisteredServiceImpl impl = new RegisteredServiceImpl();
impl.setServiceId("TestService");
impl.setName("TestService");
impl.setEnabled(true);
this.serviceManager.save(impl);
this.logoutAction.setFollowServiceRedirects(true);
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
assertEquals("TestService", this.requestContext.getFlowScope().get("logoutRedirectUrl"));
}
@Test
public void logoutForServiceWithNoFollowRedirects() throws Exception {
this.request.addParameter("service", "TestService");
this.logoutAction.setFollowServiceRedirects(false);
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
assertNull(this.requestContext.getFlowScope().get("logoutRedirectUrl"));
}
@Test
public void logoutForServiceWithFollowRedirectsNoAllowedService() throws Exception {
this.request.addParameter("service", "TestService");
final RegisteredServiceImpl impl = new RegisteredServiceImpl();
impl.setServiceId("http://FooBar");
impl.setName("FooBar");
this.serviceManager.save(impl);
this.logoutAction.setFollowServiceRedirects(true);
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
assertNull(this.requestContext.getFlowScope().get("logoutRedirectUrl"));
}
@Test
public void testLogoutCookie() throws Exception {
Cookie cookie = new Cookie(COOKIE_TGC_ID, "test");
this.request.setCookies(new Cookie[] {cookie});
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
}
@Test
public void testLogoutRequestBack() throws Exception {
final Cookie cookie = new Cookie(COOKIE_TGC_ID, "test");
this.request.setCookies(new Cookie[] {cookie});
LogoutRequest logoutRequest = new LogoutRequest("", null);
logoutRequest.setStatus(LogoutRequestStatus.SUCCESS);
WebUtils.putLogoutRequests(this.requestContext, Arrays.asList(logoutRequest));
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FINISH_EVENT, event.getId());
}
@SuppressWarnings("unchecked")
@Test
public void testLogoutRequestFront() throws Exception {
final Cookie cookie = new Cookie(COOKIE_TGC_ID, "test");
this.request.setCookies(new Cookie[] {cookie});
final LogoutRequest logoutRequest = new LogoutRequest("", null);
WebUtils.putLogoutRequests(this.requestContext, Arrays.asList(logoutRequest));
final Event event = this.logoutAction.doExecute(this.requestContext);
assertEquals(LogoutAction.FRONT_EVENT, event.getId());
List<LogoutRequest> logoutRequests = WebUtils.getLogoutRequests(this.requestContext);
assertEquals(1, logoutRequests.size());
assertEquals(logoutRequest, logoutRequests.get(0));
}
}