package alien4cloud.security;
import java.util.List;
import javax.annotation.Resource;
import javax.naming.NamingException;
import alien4cloud.security.model.User;
import alien4cloud.security.users.IAlienUserDao;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.mockito.Mockito;
import org.springframework.ldap.core.ContextSource;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import alien4cloud.security.spring.ldap.LdapAuthenticationProvider;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ldap-authentication-provider-security-test.xml")
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class LdapAuthenticationProviderTest extends AbstractLdapTest {
@Resource
private IAlienUserDao alienUserDao;
@Resource
private LdapTemplate ldapTemplate;
@Resource
private LdapAuthenticationProvider ldapAuthenticationProvider;
@Test
public void testLdapUserImport() throws NamingException {
Mockito.when(ldapTemplate.getContextSource()).thenReturn(Mockito.mock(ContextSource.class));
int userCount = 10;
List<User> users = prepareGetAllUserMock(userCount);
// for each user we should check if it exists in the user repository and only if not then we add it.
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (i % 2 == 0) {
user.setLastName("test");
Mockito.when(alienUserDao.find(user.getUsername())).thenReturn(user);
} else {
Mockito.when(alienUserDao.find(user.getUsername())).thenReturn(user);
}
}
ldapAuthenticationProvider.importLdapUsers();
Mockito.verify(alienUserDao, Mockito.times(users.size())).save(Mockito.any(User.class));
}
@Test
public void testAuthenticate() {
String userName = "admin";
String password = "admin";
Mockito.when(ldapTemplate.authenticate("", getUserIdKey() + "=" + userName, password)).thenReturn(true);
ldapAuthenticationProvider.authenticate(new UsernamePasswordAuthenticationToken(userName, password));
}
@Test(expected = BadCredentialsException.class)
public void testAuthenticateShouldFailIfWrontPassword() {
String userName = "admin";
String password = "admin";
Mockito.when(ldapTemplate.authenticate("", getUserIdKey() + "=" + userName, password)).thenReturn(false);
ldapAuthenticationProvider.authenticate(new UsernamePasswordAuthenticationToken(userName, password));
}
}