Eliminated AbstractDatabaseTest, replaced with Spring Configuration.

master
Markus Kreth 7 years ago
parent fae6c92da4
commit 806b61368c
  1. 8
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusiness.java
  2. 14
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/AbstractDaoImpl.java
  3. 6
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDao.java
  4. 13
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDaoImpl.java
  5. 2
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDaoImpl.java
  6. 2
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/data/ClubEvent.java
  7. 2
      src/main/resources/application.properties
  8. 2
      src/test/java/de/kreth/vaadin/clubhelper/AbstractHibernateConfiguration.java
  9. 11
      src/test/java/de/kreth/vaadin/clubhelper/HibernateHolder.java
  10. 31
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusinessSpringTest.java
  11. 2
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/business/EventBusinessTest.java
  12. 77
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/ClubEventDataTest.java
  13. 56
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/PersonDaoTest.java
  14. 36
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/TestDatabaseHelper.java
  15. 126
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/dao/TestDatabaseHelperImpl.java
  16. 25
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/PersonFilterTest.java
  17. 16
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/tests/TestConfiguration.java
  18. 14
      src/test/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/tests/VaadinClubhelperApplicationTests.java
  19. 8
      src/test/resources/application.properties

@ -22,7 +22,7 @@ public class EventBusiness {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
@Autowired @Autowired
ClubEventDao dao; ClubEventDao clubEventDao;
@Autowired @Autowired
AltersgruppeDao altersgruppeDao; AltersgruppeDao altersgruppeDao;
@ -30,7 +30,7 @@ public class EventBusiness {
private ClubEvent current; private ClubEvent current;
public synchronized List<ClubEvent> loadEvents() { public synchronized List<ClubEvent> loadEvents() {
List<ClubEvent> list = dao.listAll(); List<ClubEvent> list = clubEventDao.listAll();
log.trace("Returning events from database: {}", list); log.trace("Returning events from database: {}", list);
return list; return list;
} }
@ -46,7 +46,7 @@ public class EventBusiness {
public void changePersons(Set<Person> selected) { public void changePersons(Set<Person> selected) {
if (current != null) { if (current != null) {
try { try {
dao.addPersons(current, selected); clubEventDao.addPersons(current, selected);
log.info("Updated {}, {} with participants: {}", current.getCaption(), current.getStart(), selected); log.info("Updated {}, {} with participants: {}", current.getCaption(), current.getStart(), selected);
} catch (Exception e) { } catch (Exception e) {
log.error("Unable to update Event {}, {}, {} with participants: {}", current.getId(), log.error("Unable to update Event {}, {}, {} with participants: {}", current.getId(),
@ -79,7 +79,7 @@ public class EventBusiness {
public void storeAltersgruppe(Altersgruppe edited) { public void storeAltersgruppe(Altersgruppe edited) {
altersgruppeDao.save(edited); altersgruppeDao.save(edited);
dao.update(current); clubEventDao.update(current);
} }
public EventMeldung createMeldung() { public EventMeldung createMeldung() {

@ -13,7 +13,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.EntityAccessor;
public abstract class AbstractDaoImpl<T extends EntityAccessor> implements IDao<T> { public abstract class AbstractDaoImpl<T extends EntityAccessor> implements IDao<T> {
@Autowired @Autowired
protected EntityManager em; protected EntityManager entityManager;
private final Class<T> entityClass; private final Class<T> entityClass;
@ -26,27 +26,27 @@ public abstract class AbstractDaoImpl<T extends EntityAccessor> implements IDao<
@Transactional @Transactional
public void save(T obj) { public void save(T obj) {
if (em.contains(obj) || obj.hasValidId()) { if (entityManager.contains(obj) || obj.hasValidId()) {
em.merge(obj); entityManager.merge(obj);
} else { } else {
em.persist(obj); entityManager.persist(obj);
} }
} }
@Override @Override
@Transactional @Transactional
public T update(T obj) { public T update(T obj) {
return em.merge(obj); return entityManager.merge(obj);
} }
@Override @Override
public T get(Object primaryKey) { public T get(Object primaryKey) {
return em.find(entityClass, primaryKey); return entityManager.find(entityClass, primaryKey);
} }
@Override @Override
public List<T> listAll() { public List<T> listAll() {
TypedQuery<T> query = em.createNamedQuery(entityClass.getSimpleName() + ".findAll", entityClass); TypedQuery<T> query = entityManager.createNamedQuery(entityClass.getSimpleName() + ".findAll", entityClass);
return query.getResultList(); return query.getResultList();
} }

@ -2,17 +2,11 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import java.util.Collection; import java.util.Collection;
import javax.persistence.EntityManager;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
public interface ClubEventDao extends IDao<ClubEvent> { public interface ClubEventDao extends IDao<ClubEvent> {
void setEntityManager(EntityManager em);
EntityManager getEntityManager();
/** /**
* Updates Event with participants, {@link ClubEvent} and {@link Person} must be * Updates Event with participants, {@link ClubEvent} and {@link Person} must be
* persistent already. * persistent already.

@ -6,7 +6,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query; import javax.persistence.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@ -23,16 +22,6 @@ public class ClubEventDaoImpl extends AbstractDaoImpl<ClubEvent> implements Club
super(ClubEvent.class); super(ClubEvent.class);
} }
@Override
public void setEntityManager(EntityManager em) {
this.em = em;
}
@Override
public EntityManager getEntityManager() {
return em;
}
@Override @Override
public void addPersons(ClubEvent event, Collection<Person> updated) { public void addPersons(ClubEvent event, Collection<Person> updated) {
List<Person> added = new ArrayList<>(updated); List<Person> added = new ArrayList<>(updated);
@ -48,7 +37,7 @@ public class ClubEventDaoImpl extends AbstractDaoImpl<ClubEvent> implements Club
} }
} }
Query insertQuery = em.createNativeQuery( Query insertQuery = entityManager.createNativeQuery(
"INSERT INTO clubevent_has_person (clubevent_id, person_id) VALUES (:eventId,:personId)"); "INSERT INTO clubevent_has_person (clubevent_id, person_id) VALUES (:eventId,:personId)");
for (Person p : added) { for (Person p : added) {
insertQuery.setParameter("eventId", event.getId()); insertQuery.setParameter("eventId", event.getId());

@ -15,7 +15,7 @@ public class PersonDaoImpl extends AbstractDaoImpl<Person> implements PersonDao
@Override @Override
public Person findLoginUser(String username, String password) { public Person findLoginUser(String username, String password) {
TypedQuery<Person> query = em.createNamedQuery(Person.QUERY_FINDLOGIN, Person.class); TypedQuery<Person> query = entityManager.createNamedQuery(Person.QUERY_FINDLOGIN, Person.class);
query.setParameter("username", username); query.setParameter("username", username);
query.setParameter("password", password); query.setParameter("password", password);
return query.getSingleResult(); return query.getSingleResult();

@ -11,6 +11,7 @@ import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany; import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne; import javax.persistence.OneToOne;
import javax.persistence.Transient; import javax.persistence.Transient;
@ -30,6 +31,7 @@ public class ClubEvent extends BasicItem implements EntityAccessor {
private String organizerDisplayName; private String organizerDisplayName;
@ManyToMany @ManyToMany
private Set<Person> persons; private Set<Person> persons;
@OneToMany
private Set<Altersgruppe> altersgruppen; private Set<Altersgruppe> altersgruppen;
@OneToOne @OneToOne
@JoinColumn(name = "id", nullable = true) @JoinColumn(name = "id", nullable = true)

@ -4,4 +4,4 @@ spring.datasource.password=0773
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

@ -17,7 +17,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Startpass;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.StartpassStartrechte; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.StartpassStartrechte;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Version; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Version;
public class AbstractHibernateConfiguration implements HibernateConfiguration { public abstract class AbstractHibernateConfiguration implements HibernateConfiguration {
@Override @Override
public void configure(Configuration configuration) { public void configure(Configuration configuration) {

@ -8,14 +8,12 @@ import org.hibernate.cfg.Configuration;
public enum HibernateHolder { public enum HibernateHolder {
INSTANCE; INSTANCE;
private final Configuration configuration = createConfig(); private final Configuration configuration;
private org.hibernate.cfg.Configuration createConfig() { private HibernateHolder() {
Configuration configuration = new Configuration(); configuration = new Configuration();
HibernateConfiguration config = new H2MemoryConfiguration(); HibernateConfiguration config = new H2MemoryConfiguration();
config.configure(configuration); config.configure(configuration);
return configuration;
} }
public static Properties getProperties() { public static Properties getProperties() {
@ -26,7 +24,4 @@ public enum HibernateHolder {
return INSTANCE.configuration.buildSessionFactory(); return INSTANCE.configuration.buildSessionFactory();
} }
// public static Configuration configuration() {
// return INSTANCE.configuration;
// }
} }

@ -7,12 +7,10 @@ import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.hibernate.Session;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
@ -22,8 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.SpringExtension;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.AbstractDatabaseTest; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.TestDatabaseHelper;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.AbstractDatabaseTest.DB_TYPE;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
@ -42,6 +39,9 @@ class EventBusinessSpringTest {
@Autowired @Autowired
private EntityManager entityManager; private EntityManager entityManager;
@Autowired
private TestDatabaseHelper testDatabaseHelper;
private TypedQuery<ClubeventHasPerson> all; private TypedQuery<ClubeventHasPerson> all;
@BeforeEach @BeforeEach
@ -55,7 +55,7 @@ class EventBusinessSpringTest {
@AfterEach @AfterEach
void shutdown() { void shutdown() {
entityManager.clear(); entityManager.clear();
((Session) entityManager).doWork(conn -> AbstractDatabaseTest.cleanDatabase(conn, DB_TYPE.H2)); testDatabaseHelper.cleanDatabase();
} }
private void insertTestData() { private void insertTestData() {
@ -71,7 +71,7 @@ class EventBusinessSpringTest {
entityManager.persist(p); entityManager.persist(p);
persons.add(p); persons.add(p);
} }
event = AbstractDatabaseTest.creteEvent(); event = testDatabaseHelper.creteEvent();
assertNull(event.getPersons()); assertNull(event.getPersons());
entityManager.persist(event); entityManager.persist(event);
entityManager.getTransaction().commit(); entityManager.getTransaction().commit();
@ -107,23 +107,4 @@ class EventBusinessSpringTest {
assertEquals(2, result.size()); assertEquals(2, result.size());
} }
class DatabaseHelper extends AbstractDatabaseTest {
public DatabaseHelper(EntityManager em) {
this((Session) em);
}
public DatabaseHelper(Session session) {
this.session = session;
}
@Override
public void transactional(Runnable r) {
super.transactional(r);
}
@Override
public void transactional(Consumer<Session> r) {
super.transactional(r);
}
}
} }

@ -42,7 +42,7 @@ class EventBusinessTest {
void setUp() throws Exception { void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
eventBusiness = new EventBusiness(); eventBusiness = new EventBusiness();
eventBusiness.dao = dao; eventBusiness.clubEventDao = dao;
eventBusiness.altersgruppeDao = altersgruppeDao; eventBusiness.altersgruppeDao = altersgruppeDao;
} }

@ -9,32 +9,49 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.hibernate.IdentifierLoadAccess; import javax.persistence.EntityManager;
import org.hibernate.query.Query;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.tests.TestConfiguration;
@SpringBootTest
@ContextConfiguration(classes = TestConfiguration.class)
public class ClubEventDataTest {
@Autowired
private EntityManager entityManager;
public class ClubEventDataTest extends AbstractDatabaseTest { @Autowired
TestDatabaseHelper testDatabaseHelper;
@AfterEach
public void cleanDatabase() {
testDatabaseHelper.cleanDatabase();
}
@Test @Test
public void testSaveAndSelectEvent() { public void testSaveAndSelectEvent() {
ClubEvent ev = creteEvent(); ClubEvent ev = testDatabaseHelper.creteEvent();
transactional(() -> session.save(ev)); testDatabaseHelper.transactional(() -> entityManager.persist(ev));
Query<ClubEvent> query = session.createNamedQuery("ClubEvent.findAll", ClubEvent.class); List<ClubEvent> result = testDatabaseHelper.allClubEvent();
List<ClubEvent> result = query.list();
assertEquals(1, result.size()); assertEquals(1, result.size());
} }
@Test @Test
public void testEventWithPerson() { public void testEventWithPerson() {
ClubEvent ev = creteEvent(); ClubEvent ev = testDatabaseHelper.creteEvent();
Person person = testInsertPerson(); Person person = testDatabaseHelper.testInsertPerson();
Set<Person> persons = ev.getPersons(); Set<Person> persons = ev.getPersons();
if (persons == null) { if (persons == null) {
persons = new HashSet<>(); persons = new HashSet<>();
@ -42,9 +59,9 @@ public class ClubEventDataTest extends AbstractDatabaseTest {
} }
persons.add(person); persons.add(person);
transactional(() -> session.save(ev)); testDatabaseHelper.transactional(() -> entityManager.persist(ev));
List<ClubeventHasPerson> loadEventPersons = loadEventPersons(); List<ClubeventHasPerson> loadEventPersons = testDatabaseHelper.loadEventPersons();
assertFalse(loadEventPersons.isEmpty()); assertFalse(loadEventPersons.isEmpty());
ClubeventHasPerson link = loadEventPersons.get(0); ClubeventHasPerson link = loadEventPersons.get(0);
assertEquals(person.getId(), link.getPersonId()); assertEquals(person.getId(), link.getPersonId());
@ -54,62 +71,60 @@ public class ClubEventDataTest extends AbstractDatabaseTest {
@Test @Test
public void changeEventsPersons() { public void changeEventsPersons() {
ClubEvent ev = creteEvent(); ClubEvent ev = testDatabaseHelper.creteEvent();
transactional(() -> session.save(ev)); testDatabaseHelper.transactional(() -> entityManager.persist(ev));
Person person = testInsertPerson(); Person person = testDatabaseHelper.testInsertPerson();
Person person2 = new Person(); Person person2 = new Person();
person2.setId(person.getId() + 1);
person2.setPrename(person.getPrename() + "_2"); person2.setPrename(person.getPrename() + "_2");
person2.setSurname(person.getSurname() + "_2"); person2.setSurname(person.getSurname() + "_2");
person2.setBirth(LocalDate.now()); person2.setBirth(LocalDate.now());
transactional(() -> session.save(person2)); testDatabaseHelper.transactional(() -> entityManager.persist(person2));
IdentifierLoadAccess<ClubEvent> idLoadAccess = session.byId(ClubEvent.class); ClubEvent loaded = entityManager.find(ClubEvent.class, ev.getId());
ClubEvent loaded = idLoadAccess.load(ev.getId());
assertNotNull(loaded); assertNotNull(loaded);
if (loaded.getPersons() == null) { if (loaded.getPersons() == null) {
loaded.setPersons(new HashSet<>()); loaded.setPersons(new HashSet<>());
} }
loaded.add(person); loaded.add(person);
transactional(() -> session.update(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
loaded.add(person2); loaded.add(person2);
transactional(() -> session.update(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
List<ClubeventHasPerson> entries = loadEventPersons(); List<ClubeventHasPerson> entries = testDatabaseHelper.loadEventPersons();
assertEquals(2, entries.size()); assertEquals(2, entries.size());
} }
@Test @Test
public void testChangeEventParticipantsRapidly() { public void testChangeEventParticipantsRapidly() {
final ClubEvent created = creteEvent(); final ClubEvent created = testDatabaseHelper.creteEvent();
transactional(() -> { testDatabaseHelper.transactional(() -> {
session.save(created); entityManager.persist(created);
}); });
final ClubEvent ev = session.byId(ClubEvent.class).load(created.getId()); final ClubEvent ev = entityManager.find(ClubEvent.class, created.getId());
List<Person> persons = insertPersons(6); List<Person> persons = testDatabaseHelper.insertPersons(6);
for (Person p : persons) { for (Person p : persons) {
ev.add(p); ev.add(p);
transactional(() -> session.merge(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
} }
ev.remove(persons.get(2)); ev.remove(persons.get(2));
transactional(() -> session.merge(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
ev.remove(persons.get(4)); ev.remove(persons.get(4));
transactional(() -> session.merge(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
ev.getPersons().add(persons.get(2)); ev.getPersons().add(persons.get(2));
ev.getPersons().add(persons.get(4)); ev.getPersons().add(persons.get(4));
transactional(() -> session.merge(ev)); testDatabaseHelper.transactional(() -> entityManager.merge(ev));
List<ClubeventHasPerson> result = loadEventPersons(); List<ClubeventHasPerson> result = testDatabaseHelper.loadEventPersons();
assertEquals(6, result.size()); assertEquals(6, result.size());
} }

@ -5,20 +5,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@ -33,44 +26,36 @@ public class PersonDaoTest {
@Autowired @Autowired
private PersonDao personDao; private PersonDao personDao;
@Autowired @Autowired
private EntityManager entityManager; private EntityManager entityManager;
private Person person; @Autowired
private TypedQuery<Person> q; private TestDatabaseHelper testDatabaseHelper;
private final String truncateString = createTruncateString(); private Person person;
@BeforeEach @BeforeEach
public void setUp() throws Exception { public void setUp() throws Exception {
testDatabaseHelper.cleanDatabase();
person = new Person(); person = new Person();
person.setPrename("prename"); person.setPrename("prename");
person.setSurname("surname"); person.setSurname("surname");
person.setBirth(LocalDate.of(2018, 11, 8)); person.setBirth(LocalDate.of(2018, 11, 8));
person.setPassword("password"); person.setPassword("password");
q = entityManager.createNamedQuery(Person.QUERY_FINDALL, Person.class); assertTrue(entityManager.createNamedQuery(Person.QUERY_FINDALL, Person.class).getResultList().isEmpty());
assertTrue(q.getResultList().isEmpty());
} }
@AfterEach @AfterEach
public void clearDatabase() throws IOException { public void clearDatabase() throws IOException {
Query truncateQuery = entityManager.createNativeQuery(truncateString); testDatabaseHelper.cleanDatabase();
transactional(() -> truncateQuery.executeUpdate());
}
private String createTruncateString() {
try {
InputStream resource = getClass().getResourceAsStream("/truncateTables.sql");
return IOUtils.toString(resource, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Test @Test
public void testSave() { public void testSave() {
transactional(() -> personDao.save(person)); testDatabaseHelper.transactional(() -> personDao.save(person));
List<Person> stored = q.getResultList();
List<Person> stored = entityManager.createNamedQuery(Person.QUERY_FINDALL, Person.class).getResultList();
assertEquals(1, stored.size()); assertEquals(1, stored.size());
assertEquals(person, stored.get(0)); assertEquals(person, stored.get(0));
assertEquals(person, personDao.get(person.getId())); assertEquals(person, personDao.get(person.getId()));
@ -80,37 +65,28 @@ public class PersonDaoTest {
@Test @Test
public void testUpdate() { public void testUpdate() {
transactional(() -> personDao.save(person)); testDatabaseHelper.transactional(() -> personDao.save(person));
person.setSurname("surname2"); person.setSurname("surname2");
person.setPrename("prename2"); person.setPrename("prename2");
transactional(() -> personDao.update(person)); testDatabaseHelper.transactional(() -> personDao.update(person));
List<Person> stored = q.getResultList(); List<Person> stored = entityManager.createNamedQuery(Person.QUERY_FINDALL, Person.class).getResultList();
assertEquals(1, stored.size()); assertEquals(1, stored.size());
assertEquals(person, stored.get(0)); assertEquals(person, stored.get(0));
} }
public void transactional(Runnable r) {
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
r.run();
tx.commit();
}
@Disabled
@Test @Test
public void testListAll() { public void testListAll() {
transactional(() -> personDao.save(person)); testDatabaseHelper.transactional(() -> personDao.save(person));
entityManager.detach(person);
person = new Person(); person = new Person();
person.setId(0);
person.setSurname("surname2"); person.setSurname("surname2");
person.setPrename("prename2"); person.setPrename("prename2");
person.setBirth(LocalDate.of(2018, 11, 8)); person.setBirth(LocalDate.of(2018, 11, 8));
person.setPassword("password"); person.setPassword("password");
transactional(() -> personDao.save(person));
testDatabaseHelper.transactional(() -> personDao.save(person));
List<Person> stored = personDao.listAll(); List<Person> stored = personDao.listAll();
assertEquals(2, stored.size()); assertEquals(2, stored.size());

@ -0,0 +1,36 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import java.util.List;
import java.util.function.Consumer;
import org.hibernate.Session;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
public interface TestDatabaseHelper {
/**
* executes the given runnable within a jpa Transaction.
*
* @param r
*/
void transactional(Runnable r);
void transactional(Consumer<Session> r);
List<Person> insertPersons(int count);
List<Person> createPersons(int count);
ClubEvent creteEvent();
List<ClubeventHasPerson> loadEventPersons();
List<ClubEvent> allClubEvent();
Person testInsertPerson();
void cleanDatabase();
}

@ -2,109 +2,56 @@ package de.kreth.vaadin.clubhelper.vaadinclubhelper.dao;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import java.sql.Connection; import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction; import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.apache.commons.io.IOUtils;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.AfterEach; import org.springframework.stereotype.Component;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import de.kreth.vaadin.clubhelper.HibernateHolder;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEventBuilder; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEventBuilder;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubeventHasPerson;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
public abstract class AbstractDatabaseTest { @Component
public final class TestDatabaseHelperImpl implements TestDatabaseHelper {
private static final AtomicInteger eventIdSequence = new AtomicInteger(); private static final AtomicInteger eventIdSequence = new AtomicInteger();
protected static SessionFactory sessionFactory; private final String truncateString = createTruncateString();
protected Session session;
@BeforeAll @Autowired
public static void setUpDatabase() throws Exception { protected EntityManager entityManager;
sessionFactory = HibernateHolder.sessionFactory();
}
public enum DB_TYPE {
MYSQL("SET @@foreign_key_checks = 0", "SET @@foreign_key_checks = 1"),
H2("SET REFERENTIAL_INTEGRITY FALSE", "SET REFERENTIAL_INTEGRITY TRUE");
private DB_TYPE(String disableReferentialIntegrety, String enableReferentialIntegrety) { private String createTruncateString() {
this.disableReferentialIntegrety = disableReferentialIntegrety; try {
this.enableReferentialIntegrety = enableReferentialIntegrety; InputStream resource = getClass().getResourceAsStream("/truncateTables.sql");
return IOUtils.toString(resource, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException(e);
} }
final String disableReferentialIntegrety;
final String enableReferentialIntegrety;
} }
@AfterEach @Override
public void cleanH2Database() { public void cleanDatabase() {
if (session.getTransaction().isActive()) { Query truncateQuery = entityManager.createNativeQuery(truncateString);
session.flush(); transactional(() -> truncateQuery.executeUpdate());
}
session.doWork(conn -> {
AbstractDatabaseTest.cleanDatabase(conn, DB_TYPE.H2);
});
}
@BeforeEach
void createSession() {
if (session != null) {
session.close();
}
session = sessionFactory.openSession();
}
public static void cleanDatabase(Connection connection, DB_TYPE type) throws SQLException {
String TABLE_NAME = "TABLE_NAME";
String[] TABLE_TYPES = { "TABLE" };
Set<String> tableNames = new HashSet<>();
try (ResultSet tables = connection.getMetaData().getTables(null, null, null, TABLE_TYPES)) {
while (tables.next()) {
tableNames.add(tables.getString(TABLE_NAME));
}
}
try (Statement stm = connection.createStatement()) {
stm.execute(type.disableReferentialIntegrety);
try {
for (String tableName : tableNames) {
try {
stm.executeUpdate("TRUNCATE TABLE " + tableName);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
} finally {
stm.execute(type.enableReferentialIntegrety);
}
}
if (connection.getAutoCommit() == false) {
connection.commit();
}
} }
/** /**
@ -112,12 +59,15 @@ public abstract class AbstractDatabaseTest {
* *
* @param r * @param r
*/ */
protected void transactional(Runnable r) { @Override
public void transactional(Runnable r) {
transactional(session -> r.run()); transactional(session -> r.run());
} }
protected void transactional(Consumer<Session> r) { @Override
public void transactional(Consumer<Session> r) {
Session session = (Session) entityManager;
EntityTransaction tx = session.getTransaction(); EntityTransaction tx = session.getTransaction();
tx.begin(); tx.begin();
try { try {
@ -129,23 +79,25 @@ public abstract class AbstractDatabaseTest {
} }
} }
@Override
public Person testInsertPerson() { public Person testInsertPerson() {
Person p = new Person(); Person p = new Person();
p.setPrename("prename"); p.setPrename("prename");
p.setSurname("surname"); p.setSurname("surname");
p.setBirth(LocalDate.now()); p.setBirth(LocalDate.now());
transactional(() -> session.save(p)); transactional(() -> entityManager.persist(p));
return p; return p;
} }
@Override
public List<Person> insertPersons(int count) { public List<Person> insertPersons(int count) {
final List<Person> inserted = createPersons(count); final List<Person> inserted = createPersons(count);
transactional(() -> { transactional(() -> {
for (Person p : inserted) { for (Person p : inserted) {
session.save(p); entityManager.persist(p);
} }
}); });
for (Person p : inserted) { for (Person p : inserted) {
@ -154,14 +106,14 @@ public abstract class AbstractDatabaseTest {
return inserted; return inserted;
} }
public static List<Person> createPersons(int count) { @Override
public List<Person> createPersons(int count) {
final List<Person> inserted = new ArrayList<>(); final List<Person> inserted = new ArrayList<>();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
Person p = new Person(); Person p = new Person();
p.setId(i + 1);
p.setPrename("prename_" + i); p.setPrename("prename_" + i);
p.setSurname("surname_" + i); p.setSurname("surname_" + i);
p.setBirth(LocalDate.now()); p.setBirth(LocalDate.now());
@ -170,7 +122,8 @@ public abstract class AbstractDatabaseTest {
return inserted; return inserted;
} }
public static ClubEvent creteEvent() { @Override
public ClubEvent creteEvent() {
ClubEvent ev = ClubEventBuilder.builder().withId("id_" + eventIdSequence.getAndIncrement()).withAllDay(true) ClubEvent ev = ClubEventBuilder.builder().withId("id_" + eventIdSequence.getAndIncrement()).withAllDay(true)
.withCaption("caption").withDescription("description") .withCaption("caption").withDescription("description")
.withStart(ZonedDateTime.of(2018, 8, 13, 0, 0, 0, 0, ZoneId.systemDefault())) .withStart(ZonedDateTime.of(2018, 8, 13, 0, 0, 0, 0, ZoneId.systemDefault()))
@ -179,8 +132,10 @@ public abstract class AbstractDatabaseTest {
return ev; return ev;
} }
@Override
public List<ClubeventHasPerson> loadEventPersons() { public List<ClubeventHasPerson> loadEventPersons() {
Session session = (Session) entityManager;
return session.doReturningWork(conn -> { return session.doReturningWork(conn -> {
List<ClubeventHasPerson> link = new ArrayList<>(); List<ClubeventHasPerson> link = new ArrayList<>();
@ -201,4 +156,9 @@ public abstract class AbstractDatabaseTest {
} }
@Override
public List<ClubEvent> allClubEvent() {
return entityManager.createNamedQuery("ClubEvent.findAll", ClubEvent.class).getResultList();
}
} }

@ -10,26 +10,38 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.AbstractDatabaseTest;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.PersonDao;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.TestDatabaseHelper;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.tests.TestConfiguration;
@SpringBootTest
@ContextConfiguration(classes = TestConfiguration.class)
class PersonFilterTest { class PersonFilterTest {
private PersonFilter filter; private PersonFilter filter;
private List<Person> persons; private List<Person> persons;
private final List<GroupDef> groups; private final List<GroupDef> groups = setupData();
@Autowired
TestDatabaseHelper testDatabaseHelper;
@Mock @Mock
private PersonDao dao; private PersonDao dao;
public PersonFilterTest() { static List<GroupDef> setupData() {
GroupDef adminGroup = new GroupDef(); GroupDef adminGroup = new GroupDef();
adminGroup.setId(1); adminGroup.setId(1);
adminGroup.setName("ADMIN"); adminGroup.setName("ADMIN");
@ -46,8 +58,7 @@ class PersonFilterTest {
judgesGroup.setName("Kampfrichter"); judgesGroup.setName("Kampfrichter");
judgesGroup.setId(4); judgesGroup.setId(4);
groups = Collections return Collections.unmodifiableList(Arrays.asList(adminGroup, competitorGroup, participantGroup, judgesGroup));
.unmodifiableList(Arrays.asList(adminGroup, competitorGroup, participantGroup, judgesGroup));
} }
@ -55,7 +66,9 @@ class PersonFilterTest {
void setUp() throws Exception { void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
filter = new PersonFilter(dao); filter = new PersonFilter(dao);
persons = Collections.unmodifiableList(AbstractDatabaseTest.createPersons(5)); persons = Collections.unmodifiableList(testDatabaseHelper.createPersons(5));
AtomicInteger id = new AtomicInteger(0);
persons.forEach(p -> p.setId(id.incrementAndGet()));
assertEquals(5, persons.size()); assertEquals(5, persons.size());
when(dao.listAll()).thenReturn(persons); when(dao.listAll()).thenReturn(persons);

@ -7,31 +7,25 @@ import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import de.kreth.vaadin.clubhelper.HibernateHolder; import de.kreth.vaadin.clubhelper.HibernateHolder;
//@Configuration
@SpringBootConfiguration @SpringBootConfiguration
@ComponentScan(basePackages = { "de.kreth" }) @ComponentScan(basePackages = { "de.kreth" })
@EnableAutoConfiguration @EnableAutoConfiguration
public class TestConfiguration { public class TestConfiguration {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
System.setProperty("spring.config.name", "test");
}
private SessionFactory sessionFactory; private SessionFactory sessionFactory;
public TestConfiguration() { public TestConfiguration() {
sessionFactory = HibernateHolder.sessionFactory(); sessionFactory = HibernateHolder.sessionFactory();
} }
@Bean
public LocalSessionFactoryBean sessionFactory() throws Exception {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setHibernateProperties(HibernateHolder.getProperties());
return sessionFactoryBean;
}
@Bean @Bean
public EntityManager entityManager() { public EntityManager entityManager() {
return sessionFactory.openSession(); return sessionFactory.openSession();

@ -20,7 +20,6 @@ import javax.persistence.EntityTransaction;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.hibernate.Session;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -36,8 +35,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.TestPropertySource;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.AbstractDatabaseTest; import de.kreth.vaadin.clubhelper.vaadinclubhelper.dao.TestDatabaseHelper;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEvent;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEventBuilder; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.ClubEventBuilder;
import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef; import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.GroupDef;
@ -46,6 +46,7 @@ import de.kreth.vaadin.clubhelper.vaadinclubhelper.data.Person;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient @AutoConfigureWebTestClient
@Disabled @Disabled
@TestPropertySource(locations = "classpath:test.properties")
public class VaadinClubhelperApplicationTests { public class VaadinClubhelperApplicationTests {
private static ChromeOptions options; private static ChromeOptions options;
@ -58,6 +59,9 @@ public class VaadinClubhelperApplicationTests {
@Autowired @Autowired
EntityManager entityManager; EntityManager entityManager;
@Autowired
TestDatabaseHelper testDatabaseHelper;
private WebDriver driver; private WebDriver driver;
private ZonedDateTime now; private ZonedDateTime now;
private WebDriverWait driverWait; private WebDriverWait driverWait;
@ -166,11 +170,7 @@ public class VaadinClubhelperApplicationTests {
if (driver != null) { if (driver != null) {
driver.close(); driver.close();
} }
org.hibernate.Session session = (Session) entityManager; testDatabaseHelper.cleanDatabase();
session.doWork(connection -> {
AbstractDatabaseTest.cleanDatabase(connection, AbstractDatabaseTest.DB_TYPE.H2);
});
} }
@Test @Test

@ -0,0 +1,8 @@
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Loading…
Cancel
Save