package org.apereo.cas.logout; import org.apereo.cas.authentication.DefaultAuthenticationServiceSelectionPlan; import org.apereo.cas.authentication.DefaultAuthenticationServiceSelectionStrategy; import org.apereo.cas.authentication.principal.AbstractWebApplicationService; import org.apereo.cas.authentication.principal.Service; import org.apereo.cas.services.AbstractRegisteredService; import org.apereo.cas.services.LogoutType; import org.apereo.cas.services.RegisteredServiceTestUtils; import org.apereo.cas.services.ServicesManager; import org.apereo.cas.ticket.TicketGrantingTicket; import org.apereo.cas.util.http.HttpClient; import org.apereo.cas.util.http.HttpMessage; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.net.URL; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; import static org.mockito.Mockito.*; /** * @author Jerome Leleu * @since 4.0.0 */ @RunWith(JUnit4.class) public class DefaultLogoutManagerTests { private static final String ID = "id"; private static final String URL = "http://www.github.com"; private DefaultLogoutManager logoutManager; @Mock private TicketGrantingTicket tgt; private AbstractWebApplicationService simpleWebApplicationServiceImpl; private AbstractRegisteredService registeredService; @Mock private ServicesManager servicesManager; @Mock private HttpClient client; private DefaultSingleLogoutServiceMessageHandler singleLogoutServiceMessageHandler; public DefaultLogoutManagerTests() { MockitoAnnotations.initMocks(this); } @Before public void setUp() { when(client.isValidEndPoint(any(String.class))).thenReturn(true); when(client.isValidEndPoint(any(URL.class))).thenReturn(true); when(client.sendMessageToEndPoint(any(HttpMessage.class))).thenReturn(true); singleLogoutServiceMessageHandler = new DefaultSingleLogoutServiceMessageHandler(client, new SamlCompliantLogoutMessageCreator(), servicesManager, new DefaultSingleLogoutServiceLogoutUrlBuilder(), true, new DefaultAuthenticationServiceSelectionPlan(new DefaultAuthenticationServiceSelectionStrategy())); final Map<String, Service> services = new HashMap<>(); this.simpleWebApplicationServiceImpl = RegisteredServiceTestUtils.getService(URL); services.put(ID, this.simpleWebApplicationServiceImpl); when(this.tgt.getServices()).thenReturn(services); this.logoutManager = new DefaultLogoutManager(new SamlCompliantLogoutMessageCreator(), singleLogoutServiceMessageHandler, false, mock(LogoutExecutionPlan.class)); this.registeredService = RegisteredServiceTestUtils.getRegisteredService(URL); when(servicesManager.findServiceBy(this.simpleWebApplicationServiceImpl)).thenReturn(this.registeredService); } @Test public void verifyServiceLogoutUrlIsUsed() throws Exception { this.registeredService.setLogoutUrl(new URL("https://www.apereo.org")); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); final LogoutRequest logoutRequest = logoutRequests.iterator().next(); assertEquals(logoutRequest.getLogoutUrl(), this.registeredService.getLogoutUrl()); } @Test public void verifyLogoutDisabled() { this.logoutManager = new DefaultLogoutManager(new SamlCompliantLogoutMessageCreator(), singleLogoutServiceMessageHandler, true, mock(LogoutExecutionPlan.class)); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(0, logoutRequests.size()); } @Test public void verifyLogoutAlreadyLoggedOut() { this.simpleWebApplicationServiceImpl.setLoggedOutAlready(true); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(0, logoutRequests.size()); } @Test public void verifyLogoutTypeNotSet() { final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(1, logoutRequests.size()); final LogoutRequest logoutRequest = logoutRequests.iterator().next(); assertEquals(ID, logoutRequest.getTicketId()); assertEquals(this.simpleWebApplicationServiceImpl, logoutRequest.getService()); assertEquals(LogoutRequestStatus.SUCCESS, logoutRequest.getStatus()); } @Test public void verifyLogoutTypeBack() { this.registeredService.setLogoutType(LogoutType.BACK_CHANNEL); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(1, logoutRequests.size()); final LogoutRequest logoutRequest = logoutRequests.iterator().next(); assertEquals(ID, logoutRequest.getTicketId()); assertEquals(this.simpleWebApplicationServiceImpl, logoutRequest.getService()); assertEquals(LogoutRequestStatus.SUCCESS, logoutRequest.getStatus()); } @Test public void verifyLogoutTypeNone() { this.registeredService.setLogoutType(LogoutType.NONE); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(0, logoutRequests.size()); } @Test public void verifyLogoutTypeNull() { this.registeredService.setLogoutType(null); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(1, logoutRequests.size()); final LogoutRequest logoutRequest = logoutRequests.iterator().next(); assertEquals(ID, logoutRequest.getTicketId()); } @Test public void verifyLogoutTypeFront() { this.registeredService.setLogoutType(LogoutType.FRONT_CHANNEL); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(1, logoutRequests.size()); final LogoutRequest logoutRequest = logoutRequests.iterator().next(); assertEquals(ID, logoutRequest.getTicketId()); assertEquals(this.simpleWebApplicationServiceImpl, logoutRequest.getService()); assertEquals(LogoutRequestStatus.NOT_ATTEMPTED, logoutRequest.getStatus()); } @Test public void verifyAsynchronousLogout() { this.registeredService.setLogoutType(LogoutType.BACK_CHANNEL); final Collection<LogoutRequest> logoutRequests = this.logoutManager.performLogout(tgt); assertEquals(1, logoutRequests.size()); } }