package info.ozkan.vipera.business.doctor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import info.ozkan.vipera.dao.doctor.DoctorBrowseFilter;
import info.ozkan.vipera.dao.doctor.DoctorDao;
import info.ozkan.vipera.dao.doctor.DoctorDaoResult;
import info.ozkan.vipera.doctor.DoctorTestData;
import info.ozkan.vipera.entities.Doctor;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
/**
* DoctorManagerImpl birim testleri
*
* @author Ömer Özkan
*
*/
public class DoctorManagerImplTest {
/**
* Veri katmanı nesnesi
*/
private DoctorDao dao;
/**
* Test edilen sınıfın nesnesi
*/
private final DoctorManagerImpl manager = new DoctorManagerImpl();
/**
* Testlerde kullanılan doctor nesnesi
*/
private Doctor doctor;
/**
* Arama işleminde kullanılan model nesnesi
*/
private final DoctorBrowseModel model = new DoctorBrowseModel();
/**
* Arama işleminde manager sınıfının kullandığı filter sınıfı
*/
private final DoctorBrowseFilter filter = new DoctorBrowseFilter();
/**
* Test verilerini ilklendirir
*/
@Before
public void setUp() {
dao = Mockito.mock(DoctorDao.class);
doctor = DoctorTestData.getTestData(DoctorTestData.HOUSE);
manager.setDoctorDao(dao);
}
/**
* TCKN ile kayıtlı sistemde bir hekim bulunmaktadır. Aynı TCKN ile iki ayrı
* hekim sisteme kaydedilemez. İlgili hata gösterilir.
*
* @throws Exception
*/
@Test
public void addDoctorWithExistTCKN() throws Exception {
final DoctorDaoResult daoResult = createDaoResult(false,
DoctorManagerError.TCKN_HAS_EXIST);
setDaoReturnForAdd(daoResult);
final DoctorManagerResult result = manager.add(doctor);
assertFalse(result.isSuccess());
assertTrue(result.getErrors().contains(
DoctorManagerError.TCKN_HAS_EXIST));
verifyDao();
}
/**
* Yönetici, hekim bilgilerini hatasız ve eksiksiz girer. Hekim veritabanına
* kaydedilir.
*
* @throws Exception
*/
@Test
public void addDoctorSuccessfull() throws Exception {
final DoctorDaoResult daoResult = createDaoResult(true, null);
setDaoReturnForAdd(daoResult);
final DoctorManagerResult result = manager.add(doctor);
assertTrue(result.isSuccess());
assertTrue(result.getErrors().size() == 0);
}
/**
* Veritabanında belirli bir TCKN ile kayıtlı olan bir hekim, get metodu ile
* elde edilir
*
* @throws Exception
*/
@Test
public void getDoctor() throws Exception {
final DoctorDaoResult daoResult = createDaoResult(true, null);
daoResult.setDoctor(doctor);
setDaoReturnForGet(daoResult);
final DoctorManagerResult result = manager.getByTckn(doctor.getTckn());
assertTrue(result.isSuccess());
assertEquals(doctor, result.getDoctor());
Mockito.verify(dao).getByTckn(doctor.getTckn());
}
/**
* Yönetici, TCKN girerek hekim arar. Sistemde kayıtlı bir doktor bulunur.
* İlgili doktor listelenir. TCKN girildiğinde diğer alanlara bakılmaz.
*
* @throws Exception
*/
@Test
public void searchDoctorByTCKN() throws Exception {
model.setTckn(doctor.getTckn());
model.setEmail("bla");
model.setSurname("bla");
filter.addFilter("tckn", doctor.getTckn());
configureMockDaoFind();
assertTestDoctor();
verifyDaoFind();
}
/**
* Yönetici, hekim adına "greg" yazar. Gregory House sonuç listesinde yer
* alır.
*
* @throws Exception
*/
@Test
public void searchDoctorByName() throws Exception {
final String testNameCriteria = "greg";
model.setName(testNameCriteria);
filter.addFilter("name", testNameCriteria);
filter.addFilter("surname", null);
filter.addFilter("title", null);
filter.addFilter("enabled", null);
configureMockDaoFind();
assertTestDoctor();
verifyDaoFind();
}
/**
* Dao find metodunu mock'lar
*/
private void configureMockDaoFind() {
final List<Doctor> list = Arrays.asList(doctor);
Mockito.when(dao.find(filter)).thenReturn(list);
}
/**
* Dao get metodunu mock'lar
*
* @param daoResult
*/
private void setDaoReturnForGet(final DoctorDaoResult daoResult) {
Mockito.when(dao.getByTckn(doctor.getTckn())).thenReturn(daoResult);
}
/**
* dao metodunun çağrıldığını geçerler
*/
private void verifyDao() {
Mockito.verify(dao).add(doctor);
}
/**
* Dao nesnesinin add metodu çağrıldığında hangi result nesnesini
* döndereceğini tanımlar
*
* @param daoResult
*/
private void setDaoReturnForAdd(final DoctorDaoResult daoResult) {
Mockito.when(dao.add(doctor)).thenReturn(daoResult);
}
/**
* Ekleme sonucunu ve hata nesnelerinden DoctorDaoResult nesnesi üretir.
*
* @param success
* Başarı durumu
* @param error
* Hata
* @return DoctorDaoResult nesnesi
*/
private DoctorDaoResult createDaoResult(final boolean success,
final DoctorManagerError error) {
final DoctorDaoResult daoResult = new DoctorDaoResult();
daoResult.setSuccess(success);
daoResult.setError(error);
return daoResult;
}
/**
* Test hekim nesnesinin arama sonucunda doğru sonucu verip vermediğini
* kontrol eder
*/
private void assertTestDoctor() {
final List<Doctor> result = manager.search(model).getDoctors();
assertEquals(1, result.size());
assertEquals(doctor, result.get(0));
}
/**
* dao nesnesinin find metodunun çağrıldığını onaylar
*/
private void verifyDaoFind() {
Mockito.verify(dao).find(filter);
}
}