package me.moodcat.api.filters;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import javax.ws.rs.NotAuthorizedException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import me.moodcat.backend.UserBackend;
import me.moodcat.core.mappers.NotAuthorizedExceptionMapper;
import me.moodcat.database.entities.User;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class AuthorizationFilterTest {
private static final String TOKEN = "token";
@InjectMocks
private AuthorizationFilter filter;
@Mock
private UserBackend userBackend;
@Mock
private NotAuthorizedExceptionMapper notAuthorizedExceptionMapper;
@Mock
private ContainerRequestContext containerRequestContext;
@Mock
private UriInfo uriInfo;
@Mock
private MultivaluedMap<String, String> multiValuedMap;
@Mock
private Response response;
@Before
public void setUp() {
when(containerRequestContext.getUriInfo()).thenReturn(uriInfo);
when(uriInfo.getQueryParameters()).thenReturn(multiValuedMap);
when(multiValuedMap.getFirst(AuthorizationFilter.TOKEN_PARAMETER)).thenReturn(TOKEN);
when(notAuthorizedExceptionMapper.toResponse(any())).thenReturn(response);
}
@Test
public void filtersNonExistingUser() throws IOException {
when(userBackend.loginUsingSoundCloud(TOKEN)).thenThrow(new NotAuthorizedException("Invalid token."));
this.filter.filter(containerRequestContext);
verify(containerRequestContext).abortWith(response);
}
@Test
public void doesNotFilterValidUser() throws IOException {
User user = mock(User.class);
when(userBackend.loginUsingSoundCloud(TOKEN)).thenReturn(user);
this.filter.filter(containerRequestContext);
verify(containerRequestContext).setProperty(anyString(), eq(user));
}
@Test
public void doesNotFilterCallWhichShouldNotRequireAuthorization() throws IOException {
when(multiValuedMap.getFirst(AuthorizationFilter.TOKEN_PARAMETER)).thenReturn("");
this.filter.filter(containerRequestContext);
verify(containerRequestContext, never()).abortWith(any());
verify(containerRequestContext, never()).setProperty(anyString(), any());
}
}