package info.ozkan.vipera.views.doctor;
import static org.junit.Assert.assertEquals;
import info.ozkan.vipera.business.doctor.DoctorFacade;
import info.ozkan.vipera.business.doctor.DoctorManagerResult;
import info.ozkan.vipera.business.notification.NotificationSettingFacade;
import info.ozkan.vipera.doctor.DoctorTestData;
import info.ozkan.vipera.entities.Doctor;
import info.ozkan.vipera.entities.NotificationSetting;
import info.ozkan.vipera.jsf.ViperaViewException;
import java.util.ArrayList;
import javax.faces.context.FacesContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* DoctorUpdateBean birim testleri
*
* @author Ömer Özkan
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(FacesContext.class)
public class DoctorUpdateBeanTest {
/**
* FacesContext
*/
@Mock
private FacesContext context;
/**
* İşletme katmanı
*/
@Mock
private DoctorFacade facade;
/**
* Hekim
*/
private Doctor doctor;
/**
* Domain object
*/
private final DoctorUpdateBean doctorUpdate = new DoctorUpdateBean();
/**
* Sonuç sınıfı
*/
private final DoctorManagerResult result = new DoctorManagerResult();
@Mock
private NotificationSettingFacade notificationSettingFacade;
/**
* Test verilerini ilklendirir
*
* @throws Exception
*/
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(FacesContext.class);
PowerMockito.doReturn(context).when(FacesContext.class,
"getCurrentInstance");
doctor = DoctorTestData.getTestData(DoctorTestData.HOUSE);
doctorUpdate.setDoctorFacade(facade);
doctorUpdate.setNotificationSettingFacade(notificationSettingFacade);
Mockito.when(notificationSettingFacade.getAll()).thenReturn(
new ArrayList<NotificationSetting>());
Mockito.when(facade.getById(doctor.getId())).thenReturn(result);
}
/**
* Yönetici, hekimi düzenlerken eposta adresini geçersiz bir şekilde girer.
* Güncelleme işlemi gerçekleşmez. Yöneticiye
* "Girdiğiniz eposta adresi geçersiz!" hata mesajı görüntülenir.
*
* @throws Exception
*/
@Test
public void updateWithInvalidEmail() throws Exception {
setDoctor();
setDoctorIdAndLoad();
doctor.setEmail("invalidEmail");
doctorUpdate.save();
Mockito.verify(facade).getById(doctor.getId());
Mockito.verify(context)
.addMessage(null, DoctorUpdateBean.EMAIL_INVALID);
}
private void setDoctor() {
result.addDoctor(doctor);
result.setSuccess(true);
}
/**
* Yönetici, kayıtlı olmayan bir hekimi düzenlemeye çalışır. 404 Hata
* sayfasına yönlendirilir.
*
* @throws Exception
*/
@Test(expected = ViperaViewException.class)
public void updateWithInvalidId() throws Exception {
result.setSuccess(false);
setDoctorIdAndLoad();
Mockito.verify(facade).getById(doctor.getId());
}
/**
* Yönetici, id bilgisi boş olan bir adres ile düzenleme sayfasına gider.
* 404 hata sayfasına yönlendirilir.
*
* @throws Exception
*/
@Test(expected = ViperaViewException.class)
public void updateWithEmptyId() throws Exception {
doctorUpdate.setId(null);
doctorUpdate.loadDoctor();
}
/**
* Yönetici, hekim bilgilerini değiştirir ve kaydet butonuna tıklar.
* Güncelleme işlemi başarı ile gerçekleşir. Yöneticiye
* "<Hekim Tam Adı> Güncellendi!" mesajı gösterilir.
*
* @throws Exception
*/
@Test
public void updateSuccessfullWithoutPassword() throws Exception {
final DoctorManagerResult updateResult = createSuccessUpdateOperation();
Mockito.when(facade.update(doctor)).thenReturn(updateResult);
doctorUpdate.save();
Mockito.verify(facade).getById(doctor.getId());
Mockito.verify(facade).update(doctor);
Mockito.verify(context).addMessage(null, DoctorUpdateBean.SUCCESS);
}
/**
* Yönetici, hekim bilgilerini değiştirir. Parola alanını da değiştirir.
* Kayet butonuna tıklar. Güncelleme işlemi başarı ile gerçekleşir.
* Yöneticiye "<Hekim Tam Adı>" Güncellendi" mesajı gösterilir.
*
* @throws Exception
*/
@Test
public void updateSuccessfullWithPassword() throws Exception {
final DoctorManagerResult updateResult = createSuccessUpdateOperation();
Mockito.when(facade.update(doctor)).thenReturn(updateResult);
final String newPassword = "newPassword";
doctorUpdate.setPassword(newPassword);
doctorUpdate.setPassword2(newPassword);
doctorUpdate.save();
assertEquals(newPassword, doctor.getPassword());
Mockito.verify(facade).getById(doctor.getId());
Mockito.verify(facade).update(doctor);
Mockito.verify(context).addMessage(null, DoctorUpdateBean.SUCCESS);
}
/**
* Başarılı update işlemi için gereken işlemleri gerçekleştirir.
*
* @return
*/
private DoctorManagerResult createSuccessUpdateOperation() {
setDoctor();
setDoctorNameAndSurname();
setDoctorIdAndLoad();
final DoctorManagerResult updateResult = createSuccessManagerResult();
return updateResult;
}
/**
* İşlemin başarılı olmasını tanımlayan değerleri atar
*
* @return
*/
private DoctorManagerResult createSuccessManagerResult() {
final DoctorManagerResult updateResult = new DoctorManagerResult();
updateResult.setSuccess(true);
return updateResult;
}
/**
* DoctorID'si atar ve hekim yükleme işlemini gerçekleştirir.
*/
private void setDoctorIdAndLoad() {
doctorUpdate.setId(doctor.getId());
doctorUpdate.loadDoctor();
}
/**
* Hekimin adı ve soyadını tanımlar
*/
private void setDoctorNameAndSurname() {
doctor.setName("Editted");
doctor.setSurname("Doctor");
}
}