package fr.ippon.tatami.service;
import fr.ippon.tatami.AbstractCassandraTatamiTest;
import fr.ippon.tatami.domain.User;
import fr.ippon.tatami.security.AuthenticationService;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import javax.inject.Inject;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class FriendshipServiceTest extends AbstractCassandraTatamiTest {
@Inject
public UserService userService;
@Inject
public FriendshipService friendshipService;
@Test
public void shouldGetAUserServiceInjected() {
assertThat(userService, notNullValue());
}
@Test
public void shouldGetAFollowerServiceInjected() {
assertThat(friendshipService, notNullValue());
}
@Test
public void shouldFollowUser() {
mockAuthentication("userWhoWantToFollow@ippon.fr");
User userWhoWillBeFollowed = new User();
userWhoWillBeFollowed.setLogin("userWhoWillBeFollowed@ippon.fr");
userService.createUser(userWhoWillBeFollowed);
userWhoWillBeFollowed.setDailyDigestSubscription(false);
userWhoWillBeFollowed.setWeeklyDigestSubscription(false);
userService.updateUser(userWhoWillBeFollowed);
User userWhoFollow = userService.getUserByUsername("userWhoWantToFollow");
assertThat(userWhoFollow.getFriendsCount(), is(0L));
assertTrue(friendshipService.followUser("userWhoWillBeFollowed"));
/* verify */
userWhoFollow = userService.getUserByUsername("userWhoWantToFollow");
assertThat(userWhoFollow.getFriendsCount(), is(1L));
User userWhoIsFollowed = userService.getUserByUsername("userWhoWillBeFollowed");
assertThat(userWhoIsFollowed.getFollowersCount(), is(1L));
// Clean up
friendshipService.unfollowUser("userWhoWillBeFollowed");
}
@Test
public void shouldNotFollowUserBecauseUserDoesNotExist() {
mockAuthentication("userWhoWantToFollow@ippon.fr");
assertFalse(friendshipService.followUser("unknownUser"));
/* verify */
User userWhoFollow = userService.getUserByUsername("userWhoWantToFollow");
assertThat(userWhoFollow.getFriendsCount(), is(0L));
}
@Test
public void shouldNotFollowUserBecauseUserIsAlreadyFollowed() throws Exception {
mockAuthentication("userWhoFollow@ippon.fr");
assertFalse(friendshipService.followUser("userWhoIsFollowed"));
/* verify */
User userWhoFollow = userService.getUserByUsername("userWhoFollow");
assertThat(userWhoFollow.getFriendsCount(), is(1L));
assertThat(userWhoFollow.getFollowersCount(), is(0L));
User userWhoIsFollowed = userService.getUserByUsername("userWhoIsFollowed");
assertThat(userWhoIsFollowed.getFriendsCount(), is(0L));
assertThat(userWhoIsFollowed.getFollowersCount(), is(1L));
}
@Test
public void shouldNotFollowUserBecauseSameUser() throws Exception {
mockAuthentication("userWhoWantToFollow@ippon.fr");
User userWhoFollow = userService.getUserByUsername("userWhoWantToFollow");
assertThat(userWhoFollow.getFriendsCount(), is(0L));
assertThat(userWhoFollow.getFollowersCount(), is(0L));
assertFalse(friendshipService.followUser("userWhoWantToFollow"));
/* verify */
userWhoFollow = userService.getUserByUsername("userWhoWantToFollow");
assertThat(userWhoFollow.getFriendsCount(), is(0L));
assertThat(userWhoFollow.getFollowersCount(), is(0L));
}
@Test
public void shouldForgetUser() {
mockAuthentication("userWhoWantToForget@ippon.fr");
User userWhoWantToForget = userService.getUserByUsername("userWhoWantToForget");
assertThat(userWhoWantToForget.getFriendsCount(), is(1L));
User userToForget = new User();
userToForget.setLogin("userToForget@ippon.fr");
userService.createUser(userToForget);
userToForget.setDailyDigestSubscription(false);
userToForget.setWeeklyDigestSubscription(false);
userService.updateUser(userToForget);
assertTrue(friendshipService.unfollowUser("userToForget"));
userWhoWantToForget = userService.getUserByUsername("userWhoWantToForget");
assertThat(userWhoWantToForget.getFriendsCount(), is(0L));
User userWhoIsForgotten = userService.getUserByUsername("userToForget");
assertThat(userWhoIsForgotten.getFollowersCount(), is(0L));
}
@Test
public void shouldNotForgetUserBecauseUserDoesNotExist() {
mockAuthentication("userWhoWantToForget@ippon.fr");
assertFalse(friendshipService.unfollowUser("unknownUser"));
/* verify */
User userWhoWantToForget = userService.getUserByUsername("userWhoWantToForget");
assertThat(userWhoWantToForget.getFriendsCount(), is(0L));
}
private void mockAuthentication(String login) {
User authenticateUser = constructAUser(login);
AuthenticationService mockAuthenticationService = mock(AuthenticationService.class);
when(mockAuthenticationService.getCurrentUser()).thenReturn(authenticateUser);
ReflectionTestUtils.setField(friendshipService, "authenticationService", mockAuthenticationService);
ReflectionTestUtils.setField(userService, "authenticationService", mockAuthenticationService);
}
}