package org.jooby.internal.pac4j; import com.google.common.collect.ImmutableList; import org.jooby.*; import org.jooby.pac4j.Auth; import org.jooby.pac4j.AuthStore; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; import org.junit.Test; import org.junit.runner.RunWith; import org.pac4j.core.client.Client; import org.pac4j.core.client.Clients; import org.pac4j.core.context.Cookie; import org.pac4j.core.context.Pac4jConstants; import org.pac4j.core.context.WebContext; import org.pac4j.core.credentials.Credentials; import org.pac4j.core.exception.HttpAction; import org.pac4j.core.profile.CommonProfile; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.util.Collection; import java.util.List; import java.util.Map; import static org.easymock.EasyMock.*; @RunWith(PowerMockRunner.class) @PrepareForTest({AuthCallback.class, Clients.class}) public class AuthCallbackTest { private Block ctx = unit -> { Request req = unit.get(Request.class); expect(req.require(WebContext.class)).andReturn(unit.get(WebContext.class)); }; @SuppressWarnings({"unchecked", "rawtypes"}) private Block auth = unit -> { WebContext ctx = unit.get(WebContext.class); Credentials creds = unit.get(Credentials.class); Client client = unit.get(Client.class); expect(client.getCredentials(ctx)).andReturn(creds); expect(client.getUserProfile(creds, ctx)).andReturn(unit.get(CommonProfile.class)); }; private Block setProfileId = unit -> { CommonProfile profile = unit.get(CommonProfile.class); String profileId = "profileId"; expect(profile.getId()).andReturn(profileId); Mutant requestedURL = unit.mock(Mutant.class); expect(requestedURL.value("/")).andReturn("/"); Session session = unit.mock(Session.class); expect(session.set(Auth.ID, profileId)).andReturn(session); expect(session.unset(Pac4jConstants.REQUESTED_URL)).andReturn(requestedURL); Request req = unit.get(Request.class); expect(req.set(Auth.ID, profileId)).andReturn(req); expect(req.session()).andReturn(session); Response rsp = unit.get(Response.class); rsp.redirect("/"); }; private Block setProfileId2 = unit -> { CommonProfile profile = unit.get(CommonProfile.class); String profileId = "profileId"; expect(profile.getId()).andReturn(profileId); Mutant requestedURL = unit.mock(Mutant.class); expect(requestedURL.value("/")).andReturn("/"); Session session = unit.mock(Session.class); expect(session.set(Auth.ID, profileId)).andReturn(session); expect(session.unset(Pac4jConstants.REQUESTED_URL)).andReturn(requestedURL); Request req = unit.get(Request.class); expect(req.set(Auth.ID, profileId)).andReturn(req); expect(req.session()).andReturn(session); Response rsp = unit.get(Response.class); rsp.redirect("/"); }; @SuppressWarnings("unchecked") private Block onSuccess = unit -> { CommonProfile profile = unit.get(CommonProfile.class); unit.get(AuthStore.class) .set(profile); }; @SuppressWarnings("rawtypes") private Block oneClient = unit -> { Client client = unit.get(Client.class); List<Client> clientList = ImmutableList.of(client); Clients clients = unit.get(Clients.class); expect(clients.findAllClients()).andReturn(clientList); }; @Test public void defaults() throws Exception { new MockUnit(Clients.class, AuthStore.class) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "/"); }); } @Test public void handleWith1Client() throws Exception { new MockUnit(Clients.class, Client.class, AuthStore.class, Request.class, Response.class, Route.Chain.class, WebContext.class, Credentials.class, CommonProfile.class) .expect(ctx) .expect(auth) .expect(setProfileId) .expect(onSuccess) .expect(oneClient) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "") .handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @Test public void handleWith2Client() throws Exception { new MockUnit(Clients.class, Client.class, AuthStore.class, Request.class, Response.class, Route.Chain.class, WebContext.class, Credentials.class, CommonProfile.class) .expect(ctx) .expect(auth) .expect(setProfileId2) .expect(onSuccess) .expect(oneClient) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "") .handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @SuppressWarnings({"rawtypes", "unchecked"}) @Test public void handleNoProfile() throws Exception { new MockUnit(Clients.class, Client.class, AuthStore.class, Request.class, Response.class, Route.Chain.class, WebContext.class, Credentials.class, CommonProfile.class) .expect(ctx) .expect(unit -> { WebContext ctx = unit.get(WebContext.class); Credentials creds = unit.get(Credentials.class); Client client = unit.get(Client.class); expect(client.getCredentials(ctx)).andReturn(creds); expect(client.getUserProfile(creds, ctx)).andReturn(null); }) .expect(oneClient) .expect(unit -> { Mutant requestedURL = unit.mock(Mutant.class); expect(requestedURL.value("/")).andReturn("/"); Session session = unit.mock(Session.class); expect(session.unset(Pac4jConstants.REQUESTED_URL)).andReturn(requestedURL); Request req = unit.get(Request.class); expect(req.session()).andReturn(session); Response rsp = unit.get(Response.class); rsp.redirect("/"); }) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "") .handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @SuppressWarnings("rawtypes") @Test public void handleWithNClient() throws Exception { new MockUnit(Clients.class, Client.class, AuthStore.class, Request.class, Response.class, Route.Chain.class, WebContext.class, Credentials.class, CommonProfile.class) .expect(ctx) .expect(auth) .expect(setProfileId) .expect(onSuccess) .expect(unit -> { Client client1 = unit.get(Client.class); Client client2 = unit.mock(Client.class); List<Client> clientList = ImmutableList.of(client1, client2); Clients clients = unit.get(Clients.class); expect(clients.findAllClients()).andReturn(clientList); }) .expect(unit -> { Client client = unit.get(Client.class); WebContext ctx = unit.get(WebContext.class); Clients clients = unit.get(Clients.class); expect(clients.findClient(ctx)).andReturn(client); }) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "") .handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } @SuppressWarnings({"rawtypes"}) @Test public void requireAction() throws Exception { new MockUnit(Clients.class, Client.class, AuthStore.class, Request.class, Response.class, Route.Chain.class, WebContext.class, Credentials.class) .expect(ctx) .expect(unit -> { WebContext ctx = unit.get(WebContext.class); Client client = unit.get(Client.class); expect(client.getCredentials(ctx)).andThrow( HttpAction.redirect("m", ctx(), "url")); }) .expect(oneClient) .expect(unit -> { Response rsp = unit.get(Response.class); expect(rsp.committed()).andReturn(true); }) .run(unit -> { new AuthCallback(unit.get(Clients.class), unit.get(AuthStore.class), "") .handle(unit.get(Request.class), unit.get(Response.class), unit.get(Route.Chain.class)); }); } private WebContext ctx() { return new WebContext() { @Override public void writeResponseContent(final String content) { } @Override public void setSessionAttribute(final String name, final Object value) { } @Override public void setResponseStatus(final int code) { } @Override public void setResponseHeader(final String name, final String value) { } @Override public Object getSessionAttribute(final String name) { return null; } @Override public int getServerPort() { return 0; } @Override public boolean isSecure() { return false; } @Override public String getPath() { return null; } @Override public String getServerName() { return null; } @Override public String getScheme() { return null; } @Override public Map<String, String[]> getRequestParameters() { return null; } @Override public String getRequestParameter(final String name) { return null; } @Override public String getRequestMethod() { return null; } @Override public String getRequestHeader(final String name) { return null; } @Override public String getFullRequestURL() { return null; } @Override public Object getRequestAttribute(final String name) { return null; } @Override public void setRequestAttribute(final String name, final Object value) { } @Override public Object getSessionIdentifier() { return null; } @Override public String getRemoteAddr() { return null; } @Override public void setResponseContentType(final String content) { } @Override public Collection<Cookie> getRequestCookies() { return null; } @Override public void addResponseCookie(final Cookie cookie) { } }; } }