Skip to content

Instantly share code, notes, and snippets.

@ruddell
Created January 14, 2018 03:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ruddell/2f04af2ba6a8ea9af94da751e69f9ee8 to your computer and use it in GitHub Desktop.
Save ruddell/2f04af2ba6a8ea9af94da751e69f9ee8 to your computer and use it in GitHub Desktop.
Session Auth SocialServiceIntTest for IgniteJHipster
package com.mycompany.myapp.service;
import com.mycompany.myapp.JhipsterApp;
import com.mycompany.myapp.domain.Authority;
import com.mycompany.myapp.domain.User;
import com.mycompany.myapp.repository.AuthorityRepository;
import com.mycompany.myapp.repository.UserRepository;
import com.mycompany.myapp.security.AuthoritiesConstants;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.social.connect.*;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JhipsterApp.class)
@Transactional
public class SocialServiceIntTest {
@Autowired
private AuthorityRepository authorityRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UserRepository userRepository;
@Mock
private MailService mockMailService;
@Mock
private UserDetailsService userDetailsService;
@Mock
private ConnectionFactoryLocator connectionFactoryLocator;
@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(mockUsersConnectionRepository, authorityRepository,
passwordEncoder, userRepository, userDetailsService, connectionFactoryLocator, mockMailService);
}
@Test
public void testDeleteUserSocialConnection() throws Exception {
// Setup
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
socialService.createSocialUser(connection, "fr");
MultiValueMap<String, Connection<?>> connectionsByProviderId = new LinkedMultiValueMap<>();
connectionsByProviderId.put("PROVIDER", null);
when(mockConnectionRepository.findAllConnections()).thenReturn(connectionsByProviderId);
// Exercise
socialService.deleteUserSocialConnection("LOGIN");
// Verify
verify(mockConnectionRepository, times(1)).removeConnections("PROVIDER");
}
@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",
"IMAGE_URL",
"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",
"OTHER_IMAGE_URL");
Connection<?> connection = createConnection("LOGIN",
"",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"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",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
// Verify
final Optional<User> user = userRepository.findOneByEmailIgnoreCase("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",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
assertThat(user.getFirstName()).isEqualTo("FIRST_NAME");
assertThat(user.getLastName()).isEqualTo("LAST_NAME");
assertThat(user.getImageUrl()).isEqualTo("IMAGE_URL");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateActivatedUserWithRoleUserAndPassword() {
// Setup
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
assertThat(user.getActivated()).isEqualTo(true);
assertThat(user.getPassword()).isNotEmpty();
Authority userAuthority = authorityRepository.findOne(AuthoritiesConstants.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",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
final User user = userRepository.findOneByEmailIgnoreCase("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",
"IMAGE_URL",
"PROVIDER_OTHER_THAN_TWITTER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
assertThat(user.getLogin()).isEqualTo("first_name_last_name");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateUserWithSocialLoginWhenIsTwitter() {
// Setup
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"twitter");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User user = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
assertThat(user.getLogin()).isEqualToIgnoringCase("login");
// Teardown
userRepository.delete(user);
}
@Test
public void testCreateSocialUserShouldCreateSocialConnection() {
// Setup
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
verify(mockConnectionRepository, times(1)).addConnection(connection);
// Teardown
User userToDelete = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
userRepository.delete(userToDelete);
}
@Test
public void testCreateSocialUserShouldNotCreateUserIfEmailAlreadyExist() {
// Setup
createExistingUser("other_login",
"mail@mail.com",
"OTHER_FIRST_NAME",
"OTHER_LAST_NAME",
"OTHER_IMAGE_URL");
long initialUserCount = userRepository.count();
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
assertThat(userRepository.count()).isEqualTo(initialUserCount);
// Teardown
User userToDelete = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
userRepository.delete(userToDelete);
}
@Test
public void testCreateSocialUserShouldNotChangeUserIfEmailAlreadyExist() {
// Setup
createExistingUser("other_login",
"mail@mail.com",
"OTHER_FIRST_NAME",
"OTHER_LAST_NAME",
"OTHER_IMAGE_URL");
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
User userToVerify = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
assertThat(userToVerify.getLogin()).isEqualTo("other_login");
assertThat(userToVerify.getFirstName()).isEqualTo("OTHER_FIRST_NAME");
assertThat(userToVerify.getLastName()).isEqualTo("OTHER_LAST_NAME");
assertThat(userToVerify.getImageUrl()).isEqualTo("OTHER_IMAGE_URL");
// Teardown
userRepository.delete(userToVerify);
}
@Test
public void testCreateSocialUserShouldSendRegistrationValidationEmail() {
// Setup
Connection<?> connection = createConnection("LOGIN",
"mail@mail.com",
"FIRST_NAME",
"LAST_NAME",
"IMAGE_URL",
"PROVIDER");
// Exercise
socialService.createSocialUser(connection, "fr");
//Verify
verify(mockMailService, times(1)).sendSocialRegistrationValidationEmail(anyObject(), anyString());
// Teardown
User userToDelete = userRepository.findOneByEmailIgnoreCase("mail@mail.com").get();
userRepository.delete(userToDelete);
}
private Connection<?> createConnection(String login,
String email,
String firstName,
String lastName,
String imageUrl,
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);
when(connection.getImageUrl()).thenReturn(imageUrl);
return connection;
}
private User createExistingUser(String login,
String email,
String firstName,
String lastName,
String imageUrl) {
User user = new User();
user.setLogin(login);
user.setPassword(passwordEncoder.encode("password"));
user.setEmail(email);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setImageUrl(imageUrl);
return userRepository.saveAndFlush(user);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment