package me.moodcat.backend;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import javax.persistence.EntityNotFoundException;
import javax.ws.rs.NotAuthorizedException;
import me.moodcat.database.controllers.UserDAO;
import me.moodcat.database.entities.User;
import me.moodcat.soundcloud.SoundCloudException;
import me.moodcat.soundcloud.SoundCloudIdentifier;
import me.moodcat.soundcloud.models.MeModel;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.inject.Provider;
@RunWith(MockitoJUnitRunner.class)
public class UserBackendTest {
private static final String BOGUS = "bogus";
private static final String TOKEN = "user_token";
private static final int USER_ID = 2;
private static final int ANOTHER_USER_ID = 3;
@Mock
private Provider<UserDAO> userDAOProvider;
@Mock
private SoundCloudIdentifier soundCloudIdentifier;
@InjectMocks
private UserBackend userBackend;
@Mock
private User user;
private User anotherUser;
@Mock
private MeModel meModel;
@Mock
private UserDAO userDAO;
@Captor
private ArgumentCaptor<User> userCaptor;
@Before
public void setUp() throws SoundCloudException {
when(userDAOProvider.get()).thenReturn(userDAO);
when(soundCloudIdentifier.getMe(TOKEN)).thenReturn(meModel);
when(soundCloudIdentifier.getMe(BOGUS))
.thenThrow(new SoundCloudException("Invalid token."));
when(meModel.getId()).thenReturn(USER_ID);
when(userDAO.findBySoundcloudId(USER_ID)).thenReturn(user);
when(userDAO.merge(user)).thenReturn(user);
when(userDAO.persist(Matchers.any())).thenAnswer(
(invocation) -> invocation.getArgumentAt(0, User.class));
anotherUser = new User();
anotherUser.setAccessToken(TOKEN);
anotherUser.setSoundCloudUserId(ANOTHER_USER_ID);
}
@Test
public void canRetrieveUser() {
when(userDAO.findByAccessToken(anyString())).thenThrow(new EntityNotFoundException());
assertEquals(user, userBackend.loginUsingSoundCloud(TOKEN));
verify(user).setAccessToken(TOKEN);
}
@Test(expected = NotAuthorizedException.class)
public void whenUserIsNotFoundWithTokenThrowNotAuthorized() {
when(userDAO.findByAccessToken(anyString())).thenThrow(new EntityNotFoundException());
userBackend.loginUsingSoundCloud(BOGUS);
}
@Test
public void whenUserIsNotFoundCreateTheUser() {
when(meModel.getId()).thenReturn(ANOTHER_USER_ID);
when(userDAO.findByAccessToken(anyString())).thenThrow(new EntityNotFoundException());
when(userDAO.findBySoundcloudId(ANOTHER_USER_ID)).thenThrow(new EntityNotFoundException());
assertEquals(anotherUser, userBackend.loginUsingSoundCloud(TOKEN));
}
@Test
public void canRetrieveUserByToken() {
when(userDAO.findByAccessToken(TOKEN)).thenReturn(anotherUser);
assertEquals(anotherUser, userBackend.loginUsingSoundCloud(TOKEN));
}
}