package info.ozkan.vipera.views.login;
import static org.junit.Assert.assertEquals;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
/**
* AdministratorLoginBean birim test sınıfı issueNo: 35
*
* @author Ömer Özkan
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(FacesContext.class)
public class AdministratorLoginBeanTest {
/**
* FacesContext mock nesnesi
*/
private FacesContext context;
/**
* Kullanıcı adı
*/
private final String username = "admin";
/**
* Testler için kullanılan boş string
*/
private final String empty = "";
/**
* parola
*/
private final String password = "password";
/**
* Test edilen sınıf nesnesi
*/
private AdministratorLoginBean loginBean;
/**
* Business nesnesi
*/
private AuthenticationManager manager;
/**
* Spring security Authentication nesnesi
*/
private Authentication request;
/**
* Testler için gerekli verileri hazırlar
*/
@Before
public void setUp() throws Exception {
context = Mockito.mock(FacesContext.class);
PowerMockito.mockStatic(FacesContext.class);
PowerMockito.doReturn(context).when(FacesContext.class,
"getCurrentInstance");
loginBean = new AdministratorLoginBean();
manager = Mockito.mock(AuthenticationManager.class);
loginBean.setAdminAuthManager(manager);
request = new UsernamePasswordAuthenticationToken(username, password);
}
/**
* Yönetici kullanıcı adını boş bırakarak login butonuna basar. Login işlemi
* başarısızdır. Lütfen Kullanıcı adınızı ve parolanızı giriniz hata mesajı
* gönderilir
*
* @throws Exception
*/
@Test
public void loginEmptyUsername() throws Exception {
setCredentials(empty, password);
loginBean.login(null);
assertAccessDenied();
assertEmptyField();
}
/**
* Yönetici parolasını boş bırakarak login butonuna basar. Login işlemi
* başarısızdır. Lütfen Kullanıcı adınızı ve parolanızı giriniz hata mesajı
* gönderilir.
*
* @throws Exception
*/
@Test
public void loginEmptyPassword() throws Exception {
setCredentials(username, empty);
loginBean.login(null);
assertAccessDenied();
assertEmptyField();
}
/**
* Yönetici kullanıcı adını ve parolasını girerek login butonuna tıklar.
* Kullanıcı adı sistemde bulunmaz "Geçersiz giriş, lütfen kullanıcı adınızı
* ve parolanızı tekrar giriniz!" hatası gösterilir.
*
* @throws Exception
*/
@Test
public void loginUsernameInvalid() throws Exception {
// generateLoginResult(AdministratorLoginStatus.INVALID_USERNAME);
final Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Mockito.when(manager.authenticate(request)).thenThrow(
new UsernameNotFoundException(""));
setCredentials(username, password);
loginBean.login(null);
assertAccessDenied();
verifyMessage(AdministratorLoginBean.INVALID_LOGIN);
verifyLoginManager();
}
/**
* Yönetici kullanıcı adını ve parolasını girerek login butonuna tıklar.
* Kullanıcı adı sistemde kayıtlıdır fakat parola yanlıştır "Geçersiz giriş,
* lütfen kullanıcı adınızı ve parolanızı tekrar giriniz!" hatası
* gösterilir.
*
* @throws Exception
*/
@Test
public void loginPasswordInvalid() throws Exception {
final Authentication request = new UsernamePasswordAuthenticationToken(
username, password);
Mockito.when(manager.authenticate(request)).thenThrow(
new BadCredentialsException(""));
setCredentials(username, password);
loginBean.login(null);
verifyMessage(AdministratorLoginBean.INVALID_LOGIN);
verifyLoginManager();
}
/**
* Yönetici kullanıcı adı ve parolasını girer. Bilgiler geçerlidir. Yönetici
* yönetim paneline yönlendirilir.
*
* @throws Exception
*/
@Test
public void loginSuccessfull() throws Exception {
Mockito.when(manager.authenticate(request)).thenReturn(request);
final SecurityContext securityContext = Mockito
.mock(SecurityContext.class);
SecurityContextHolder.setContext(securityContext);
setCredentials(username, password);
loginBean.login(null);
assertEquals(loginBean.login(), AdministratorLoginBean.INDEX_PAGE);
Mockito.verify(securityContext).setAuthentication(request);
verifyLoginManager();
}
/**
* Manager nesnesinin authenticate metodunu çağırdığını doğrular
*/
private void verifyLoginManager() {
Mockito.verify(manager).authenticate(request);
}
/**
* FacesMessage nesnesinin istenilen mesaj olup olmadığını kontrol eder
*
* @param message
* Message
*/
private void verifyMessage(final FacesMessage message) {
Mockito.verify(context).addMessage(null, message);
}
/**
* Kullanıcı ve parola alanlarının boş girilmesi durumunda test edilecek
* olan mesaj
*/
private void assertEmptyField() {
verifyMessage(AdministratorLoginBean.EMPTY_FIELD);
}
/**
* Login işlemi başarısız olduğu durumlarda tekrar login sayfasına
* yönlendirilmesini test eder
*/
private void assertAccessDenied() {
final String returnedPage = loginBean.login();
assertEquals(AdministratorLoginBean.LOGIN_PAGE, returnedPage);
}
/**
* Kullanıcı adı ve parolayı bean nesnesine enjekte eder
*
* @param username
* Kullanıcı adı
* @param password
* Parola
*/
private void setCredentials(final String username, final String password) {
loginBean.setUsername(username);
loginBean.setPassword(password);
}
}