package info.ozkan.vipera.business.login;
import static org.junit.Assert.assertTrue;
import info.ozkan.vipera.business.role.Role;
import info.ozkan.vipera.dao.login.AdministratorLoginDao;
import info.ozkan.vipera.entities.Administrator;
import info.ozkan.vipera.login.AdministratorLoginResult;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
/**
* AdministratorLoginManagerImpl birim testleri
*
* @author Ömer Özkan
*
*/
public class AdministratorLoginManagerTest {
/**
* Kullanıcı adı
*/
private final String username = "admin";
/**
* Parola
*/
private final String password = "password";
/**
* Test edilecek olan nesne
*/
private AdministratorLoginManager manager;
/**
* Persistence katmanı nesnesi
*/
private AdministratorLoginDao mockDao;
/**
* Authentication
*/
private Authentication authentication;
/**
* Test verilerini hazırlar
*
* @throws Exception
*/
@Before
public void setUp() throws Exception {
manager = new AdministratorLoginManager();
mockDao = Mockito.mock(AdministratorLoginDao.class);
manager.setLoginDao(mockDao);
authentication = Mockito.mock(Authentication.class);
}
/**
* Yönetici kullanıcı adı ve parolasını girip login butonuna tıklar
* kullanıcı adı geçersizdir.
*
* @throws Exception
*/
@Test(expected = UsernameNotFoundException.class)
public void loginInvalidUsername() throws Exception {
final AdministratorLoginResult daoResult = createDaoResult(AdministratorLoginStatus.INVALID_USERNAME);
setMockReturn(daoResult);
mockAuthentication();
manager.authenticate(authentication);
verify();
}
/**
* DaoResult oluşturur
*
* @param status
* @return
*/
private AdministratorLoginResult createDaoResult(
final AdministratorLoginStatus status) {
final AdministratorLoginResult daoResult = new AdministratorLoginResult();
daoResult.setStatus(status);
return daoResult;
}
/**
* Yönetici kullanıcı adı ve parolasını girip login butonuna tıklar parolası
* geçersizdir.
*
* @throws Exception
*/
@Test(expected = BadCredentialsException.class)
public void loginInvalidPassword() throws Exception {
final AdministratorLoginResult daoResult = createDaoResult(AdministratorLoginStatus.INVALID_PASSWORD);
setMockReturn(daoResult);
mockAuthentication();
manager.authenticate(authentication);
verify();
}
/**
* Yönetici kullanıcı adı ve parolasını girip login butonuna tıklar bilgiler
* geçerlidir ve login işlemi başarılıdır.
*
* @throws Exception
*/
@Test
public void loginSuccessfull() throws Exception {
final AdministratorLoginResult daoResult = createDaoResult(AdministratorLoginStatus.SUCCESS);
final Administrator admin = createAdministrator();
daoResult.setAdministrator(admin);
setMockReturn(daoResult);
mockAuthentication();
final Authentication result = manager.authenticate(authentication);
final GrantedAuthority authority = result.getAuthorities().iterator()
.next();
assertTrue(authority.getAuthority().equals(Role.ROLE_ADMIN));
}
/**
* Kullanıcı adı ve parola kullanarak administrator nesnesi oluşturur
*
* @return
*/
private Administrator createAdministrator() {
final Administrator admin = new Administrator();
admin.setUsername(username);
admin.setPassword(password);
return admin;
}
/**
* Metodların çağrılmasını onaylar
*/
private void verify() {
Mockito.verify(mockDao).findUser(username, password);
Mockito.verify(authentication).getPrincipal();
Mockito.verify(authentication).getCredentials();
}
/**
* Mock nesnenin döndermesi gereken değer
*
* @param daoResult
*/
private void setMockReturn(final AdministratorLoginResult daoResult) {
Mockito.when(mockDao.findUser(username, password))
.thenReturn(daoResult);
}
/**
* Authentication nesnesinin metodlarını mocklar
*/
private void mockAuthentication() {
Mockito.when(authentication.getPrincipal()).thenReturn(username);
Mockito.when(authentication.getCredentials()).thenReturn(password);
}
}