package com.worktajm.service;
import com.worktajm.Application;
import com.worktajm.domain.Authority;
import com.worktajm.domain.User;
import com.worktajm.repository.AuthorityRepository;
import com.worktajm.repository.UserRepository;
import com.worktajm.service.MailService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.social.connect.*;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.transaction.annotation.Transactional;
import javax.inject.Inject;
import java.util.Optional;
import static org.assertj.core.api.StrictAssertions.assertThat;
import static org.mockito.Mockito.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@Transactional
public class SocialServiceIntTest {
@Inject
private AuthorityRepository authorityRepository;
@Inject
private PasswordEncoder passwordEncoder;
@Inject
private UserRepository userRepository;
@Mock
private MailService mockMailService;
@Mock
private UsersConnectionRepository mockUsersConnectionRepository;
@Mock
private ConnectionRepository mockConnectionRepository;
private SocialService socialService;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
doNothing().when(mockMailService).sendSocialRegistrationValidationEmail(anyObject(), anyString());
doNothing().when(mockConnectionRepository).addConnection(anyObject());
when(mockUsersConnectionRepository.createConnectionRepository(anyString())).thenReturn(mockConnectionRepository);
socialService = new SocialService();
ReflectionTestUtils.setField(socialService, "authorityRepository", authorityRepository);
ReflectionTestUtils.setField(socialService, "passwordEncoder", passwordEncoder);
ReflectionTestUtils.setField(socialService, "mailService", mockMailService);
ReflectionTestUtils.setField(socialService, "userRepository", userRepository);
ReflectionTestUtils.setField(socialService, "usersConnectionRepository", mockUsersConnectionRepository);
}
@Test(expected = IllegalArgumentException.class)
public void testCreateSocialUserShouldThrowExceptionIfConnectionIsNull() {
// Exercise
socialService.createSocialUser(null, "fr");
}
@Test(expected = IllegalArgumentException.class)
public void testCreateSocialUserShouldThrowExceptionIfConnectionHasNoEmailAndNoLogin() {
// Setup
Connection<?> connection = createConnection("",
"",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
}
@Test(expected = IllegalArgumentException.class)
public void testCreateSocialUserShouldThrowExceptionIfConnectionHasNoEmailAndLoginAlreadyExist() {
// Setup
User user = createExistingUser("@LOGIN",
"mail@mail.com",
"OTHER_FIRST_NAME",
"OTHER_LAST_NAME");
Connection<?> connection = createConnection("@LOGIN",
"",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
try {
// Exercise
socialService.createSocialUser(connection, "fr");
} finally {
// Teardown
userRepository.delete(user);
}
}
@Test
public void testCreateSocialUserShouldCreateUserIfNotExist() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
// Verify
final Optional<User> user = userRepository.findOneByEmail("mail@mail.com");
assertThat(user).isPresent();
// Teardown
userRepository.delete(user.get());
}
@Test
public void testCreateSocialUserShouldCreateUserWithSocialInformation() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(user.getFirstName()).isEqualTo("FIRST_NAME");
assertThat(user.getLastName()).isEqualTo("LAST_NAME");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateActivatedUserWithRoleUserAndPassword() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(user.getActivated()).isEqualTo(true);
assertThat(user.getPassword()).isNotEmpty();
Authority userAuthority = authorityRepository.findOne("ROLE_USER");
assertThat(user.getAuthorities().toArray()).containsExactly(userAuthority);
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateUserWithExactLangKey() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
final User user = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(user.getLangKey()).isEqualTo("fr");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateUserWithLoginSameAsEmailIfNotTwitter() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER_OTHER_THAN_TWITTER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(user.getLogin()).isEqualTo("mail@mail.com");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateUserWithSocialLoginWhenIsTwitter() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"twitter");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(user.getLogin()).isEqualTo("@LOGIN");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateSocialConnection() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
verify(mockConnectionRepository, times(1)).addConnection(connection);
// Teardown
User userToDelete = userRepository.findOneByEmail("mail@mail.com").get();
userRepository.delete(userToDelete);
}
@Test
public void testCreateSocialUserShouldNotCreateUserIfEmailAlreadyExist() {
// Setup
User user = createExistingUser("@OTHER_LOGIN",
"mail@mail.com",
"OTHER_FIRST_NAME",
"OTHER_LAST_NAME");
long initialUserCount = userRepository.count();
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
assertThat(userRepository.count()).isEqualTo(initialUserCount);
// Teardown
User userToDelete = userRepository.findOneByEmail("mail@mail.com").get();
userRepository.delete(userToDelete);
}
@Test
public void testCreateSocialUserShouldNotChangeUserIfEmailAlreadyExist() {
// Setup
long initialUserCount = userRepository.count();
User user = createExistingUser("@OTHER_LOGIN",
"mail@mail.com",
"OTHER_FIRST_NAME",
"OTHER_LAST_NAME");
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User userToVerify = userRepository.findOneByEmail("mail@mail.com").get();
assertThat(userToVerify.getLogin()).isEqualTo("@OTHER_LOGIN");
assertThat(userToVerify.getFirstName()).isEqualTo("OTHER_FIRST_NAME");
assertThat(userToVerify.getLastName()).isEqualTo("OTHER_LAST_NAME");
// Teardown
userRepository.delete(userToVerify);
}
@Test
public void testCreateSocialUserShouldSendRegistrationValidationEmail() {
// Setup
Connection<?> connection = createConnection("@LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
verify(mockMailService, times(1)).sendSocialRegistrationValidationEmail(anyObject(), anyString());
// Teardown
User userToDelete = userRepository.findOneByEmail("mail@mail.com").get();
userRepository.delete(userToDelete);
}
private Connection<?> createConnection(String login,
String email,
String firstName,
String lastName,
String providerId) {
UserProfile userProfile = mock(UserProfile.class);
when(userProfile.getEmail()).thenReturn(email);
when(userProfile.getUsername()).thenReturn(login);
when(userProfile.getFirstName()).thenReturn(firstName);
when(userProfile.getLastName()).thenReturn(lastName);
Connection<?> connection = mock(Connection.class);
ConnectionKey key = new ConnectionKey(providerId, "PROVIDER_USER_ID");
when(connection.fetchUserProfile()).thenReturn(userProfile);
when(connection.getKey()).thenReturn(key);
return connection;
}
private User createExistingUser(String login,
String email,
String firstName,
String lastName) {
User user = new User();
user.setLogin(login);
user.setPassword(passwordEncoder.encode("password"));
user.setEmail(email);
user.setFirstName(firstName);
user.setLastName(lastName);
return userRepository.saveAndFlush(user);
}
}