package cz.muni.fi.pa165;
import cz.muni.fi.pa165.library.backend.ReaderDAOImpl;
import cz.muni.fi.pa165.library.backend.Reader;
import java.sql.DriverManager;
import java.sql.SQLNonTransientConnectionException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import junit.framework.TestCase;
/**
*
* @author Zuzana Foltýnová
*/
public class ReaderDAOImplTest extends TestCase {
private EntityManagerFactory emf;
private ReaderDAOImpl readerDAO;
private EntityManager em;
public ReaderDAOImplTest(String testName){
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
DriverManager.getConnection("jdbc:derby:memory:testDB;create=true").close();
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during database startup.");
}
try {
emf = Persistence.createEntityManagerFactory("testPU");
readerDAO = new ReaderDAOImpl();
em = emf.createEntityManager();
readerDAO.setEntityManager(em);
} catch (Exception ex) {
ex.printStackTrace();
fail("Exception during JPA EntityManager instanciation.");
}
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
emf.close();
try {
DriverManager.getConnection("jdbc:derby:memory:testDB;drop=true").close();
} catch (SQLNonTransientConnectionException ex) {
if (ex.getErrorCode() != 45000) {
throw ex;
}
}
}
private Reader addReader(){
Reader reader = new Reader();
reader.setFirstName("Karel");
reader.setSurname("Novak");
reader.setAddress("Nove Hrady, Praha");
reader.setBirthNumber("12.3.2012");
reader.setTelephoneNumber("+420756362776");
reader.setEmail("mail@seznam.cz");
return reader;
}
private void createTestData(){
for (int i=0; i<10;i++){
Reader readers = new Reader();
readers.setFirstName("Karel"+i);
readers.setSurname("Novak"+i);
readers.setBirthNumber(i+i+".3.2012");
readers.setAddress("Nove Hrady "+i+", Praha");
readers.setTelephoneNumber("+4207563627"+i+i);
readers.setEmail("mail"+i+"@seznam.cz");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(readers);
em.getTransaction().commit();
if (em != null) {
em.close();
}
}
}
private void persist(Reader reader) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(reader);
em.getTransaction().commit();
if (em != null) {
em.close();
}
}
public void testCreateReaderWithWrongArguments() {
try {
readerDAO.createReader(null);
fail("NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
Reader reader = addReader();
reader.setId(1l);
try {
readerDAO.createReader(reader);
fail("Wrong id, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setId(new Long(-1));
try {
readerDAO.createReader(reader);
fail("Wrong id, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setFirstName(null);
try {
readerDAO.createReader(reader);
fail("FirstName is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setFirstName("");
try {
readerDAO.createReader(reader);
fail("FirstName is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setSurname(null);
try {
readerDAO.createReader(reader);
fail("Surname is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setSurname("");
try {
readerDAO.createReader(reader);
fail("Surname is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setBirthNumber(null);
try {
readerDAO.createReader(reader);
fail("Birth number is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setBirthNumber("");
try {
readerDAO.createReader(reader);
fail("Birth number is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setAddress(null);
try {
readerDAO.createReader(reader);
fail("Address is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setAddress("");
try {
readerDAO.createReader(reader);
fail("Address is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setEmail(null);
try {
readerDAO.createReader(reader);
fail("Email is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setEmail("");
try {
readerDAO.createReader(reader);
fail("Email is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
}
public void testFindAllReaders() {
assertEquals("There should be no readers",0, readerDAO.findAllReaders().size());
createTestData();
assertEquals("The number of readers in list is not correct",10, readerDAO.findAllReaders().size());
}
public void testFindReaderById() {
try {
assertNull(readerDAO.findReaderById(new Long(0)));
fail("ID of reader should not be zero");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderById(new Long(-1)));
fail("ID of reader should not be negative");
} catch (IllegalArgumentException ex) {
//OK
}
try {
readerDAO.createReader(null);
fail("ID is null, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
createTestData();
Reader[] readers = readerDAO.findAllReaders().toArray(new Reader[]{});
for(int i=0;i<readers.length;i++){
Reader result = readerDAO.findReaderById(readers[i].getId());
assertEquals("Readers are not equals", readers[i], result);
assertEquals("Correct ID is not return", readers[i].getId(), result.getId());
assertEquals("Correct first name is not return",readers[i].getFirstName(), result.getFirstName());
assertEquals("Correct surname is not return", readers[i].getSurname(), result.getSurname());
assertEquals("Correct birthNumber is not return", readers[i].getBirthNumber(), result.getBirthNumber());
assertEquals("Correct address is not return", readers[i].getAddress(), result.getAddress());
assertEquals("Correct email is not return", readers[i].getEmail(), result.getEmail());
assertEquals("Correct telephoneNumber is not return", readers[i].getTelephoneNumber(), result.getTelephoneNumber());
}
}
public void testFindReaderByName() {
try {
assertNull(readerDAO.findReaderByName("","Novák"));
fail("Name of reader should not be empty");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderByName("Jan",""));
fail("Surname of reader should not be empty");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderByName(null,"Novak"));
fail("Name of reader should not be null");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderByName("Jan",null));
fail("Surname of reader should not be null");
} catch (IllegalArgumentException ex) {
//OK
}
Reader reader = addReader();
persist(reader);
assertEquals("Reader was not find by name", 1, readerDAO.findReaderByName("Karel", "Novak").size());
Reader[] readers = readerDAO.findReaderByName(reader.getFirstName(), reader.getSurname()).toArray(new Reader[]{});;
assertEquals("Readers are not equals", readers[0], reader);
assertEquals("Correct ID is not return", readers[0].getId(), reader.getId());
assertEquals("Correct first name is not return",readers[0].getFirstName(), reader.getFirstName());
assertEquals("Correct surname is not return", readers[0].getSurname(), reader.getSurname());
assertEquals("Correct birthNumber is not return", readers[0].getBirthNumber(), reader.getBirthNumber());
assertEquals("Correct address is not return", readers[0].getAddress(), reader.getAddress());
assertEquals("Correct email is not return", readers[0].getEmail(), reader.getEmail());
assertEquals("Correct telephoneNumber is not return", readers[0].getTelephoneNumber(), reader.getTelephoneNumber());
}
public void testFindReaderByBirthNumber() {
try {
assertNull(readerDAO.findReaderByBirthNumber(""));
fail("Birth number of reader should not be empty");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderByBirthNumber(null));
fail("Birth number of reader should not be null");
} catch (IllegalArgumentException ex) {
//OK
}
createTestData();
Reader[] readers = readerDAO.findAllReaders().toArray(new Reader[]{});
for(int i=0;i<readers.length;i++){
Reader result = readerDAO.findReaderByBirthNumber(readers[i].getBirthNumber());
assertEquals("Readers are not equals", readers[i], result);
assertEquals("Correct ID is not return", readers[i].getId(), result.getId());
assertEquals("Correct first name is not return",readers[i].getFirstName(), result.getFirstName());
assertEquals("Correct surname is not return", readers[i].getSurname(), result.getSurname());
assertEquals("Correct birthNumber is not return", readers[i].getBirthNumber(), result.getBirthNumber());
assertEquals("Correct address is not return", readers[i].getAddress(), result.getAddress());
assertEquals("Correct email is not return", readers[i].getEmail(), result.getEmail());
assertEquals("Correct telephoneNumber is not return", readers[i].getTelephoneNumber(), result.getTelephoneNumber());
}
}
public void testFindReaderByEmail() {
try {
assertNull(readerDAO.findReaderByEmail(""));
fail("Email of reader should not be empty");
} catch (IllegalArgumentException ex) {
//OK
}
try {
assertNull(readerDAO.findReaderByEmail(null));
fail("Email of reader should not be null");
} catch (IllegalArgumentException ex) {
//OK
}
createTestData();
Reader[] readers = readerDAO.findAllReaders().toArray(new Reader[]{});
for(int i=0;i<readers.length;i++){
Reader result = readerDAO.findReaderByEmail(readers[i].getEmail());
assertEquals("Readers are not equals", readers[i], result);
assertEquals("Correct ID is not return", readers[i].getId(), result.getId());
assertEquals("Correct first name is not return",readers[i].getFirstName(), result.getFirstName());
assertEquals("Correct surname is not return", readers[i].getSurname(), result.getSurname());
assertEquals("Correct birthNumber is not return", readers[i].getBirthNumber(), result.getBirthNumber());
assertEquals("Correct address is not return", readers[i].getAddress(), result.getAddress());
assertEquals("Correct email is not return", readers[i].getEmail(), result.getEmail());
assertEquals("Correct telephoneNumber is not return", readers[i].getTelephoneNumber(), result.getTelephoneNumber());
}
}
public void testUpdateReader() {
Reader reader = addReader();
persist(reader);
reader.setFirstName(null);
try {
readerDAO.updateReader(reader);
fail("FirstName is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setFirstName("");
try {
readerDAO.updateReader(reader);
fail("FirstName is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setSurname(null);
try {
readerDAO.updateReader(reader);
fail("Surname is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setSurname("");
try {
readerDAO.updateReader(reader);
fail("Surname is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setBirthNumber(null);
try {
readerDAO.updateReader(reader);
fail("Birth number is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setBirthNumber("");
try {
readerDAO.updateReader(reader);
fail("Birth number is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setAddress(null);
try {
readerDAO.updateReader(reader);
fail("Address is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setAddress("");
try {
readerDAO.updateReader(reader);
fail("Address is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setEmail(null);
try {
readerDAO.updateReader(reader);
fail("Email is null, NullPointerException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setEmail("");
try {
readerDAO.updateReader(reader);
fail("Email is empty, IllegalArgumentException has not been thrown");
} catch (IllegalArgumentException ex) {
//OK
}
reader.setFirstName("Marie");
reader.setSurname("Nová");
reader.setAddress("8859182456");
reader.setBirthNumber("Praha 5");
reader.setEmail("adresa@gmail.com");
reader.setTelephoneNumber("+234455743");
readerDAO.updateReader(reader);
Reader reader2 = readerDAO.findReaderById(reader.getId());
assertEquals("Readers are not equals", reader2, reader);
assertEquals("Correct ID is not return", reader2.getId(), reader.getId());
assertEquals("Correct first name is not return",reader2.getFirstName(), reader.getFirstName());
assertEquals("Correct surname is not return", reader2.getSurname(), reader.getSurname());
assertEquals("Correct birthNumber is not return", reader2.getBirthNumber(), reader.getBirthNumber());
assertEquals("Correct address is not return", reader2.getAddress(), reader.getAddress());
assertEquals("Correct email is not return", reader2.getEmail(), reader.getEmail());
assertEquals("Correct telephoneNumber is not return", reader2.getTelephoneNumber(), reader.getTelephoneNumber());
}
public void testDeleteReader() {
try {
readerDAO.deleteReader(null);
fail("Reader should not be null");
} catch (IllegalArgumentException ex) {
// OK
}
createTestData();
Reader[] readers = readerDAO.findAllReaders().toArray(new Reader[]{});
for(int i=0;i<readers.length;i++){
em.getTransaction().begin();
readerDAO.deleteReader(readers[i]);
em.getTransaction().commit();
}
assertEquals("All of objects has not been removed", readerDAO.findAllReaders().size(), 0);
}
}