package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.junit.Test;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import io.oasp.gastronomy.restaurant.SpringBootApp;
import io.oasp.gastronomy.restaurant.general.common.api.builders.DrinkEntityBuilder;
import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity;
import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.DrinkDao;
import io.oasp.module.jpa.dataaccess.api.RevisionMetadata;
import io.oasp.module.test.common.base.ComponentTest;
/**
* Test class to test the {@link DrinkDao}.
*
*/
@SpringApplicationConfiguration(classes = { SpringBootApp.class })
@WebAppConfiguration
public class DrinkDaoTest extends ComponentTest {
@Inject
DrinkDaoTestBean testBean;
/**
* Test to check if the DrinkEntity is audited. All steps are executed in separate transactions in order to actually
* write to the database. Otherwise hibernate envers won't work.
*/
@Test
public void checkAudit() {
DrinkEntity drink = this.testBean.create();
long drinkId = drink.getId();
this.testBean.update(drinkId);
this.testBean.verify(drinkId);
}
/**
*
* This type provides methods in a transactional environment for the containing test class. All methods, annotated
* with the {@link Transactional} annotation, are executed in separate transaction, thus one test case can execute
* multiple transactions.
*
*/
@Named
static class DrinkDaoTestBean {
private final String description = "some description";
private final String changedDescription = "some changed description";
@Inject
private DrinkDao drinkDao;
@PersistenceContext
private EntityManager entityManager;
@Transactional
public DrinkEntity create() {
DrinkEntity drink =
new DrinkEntityBuilder().alcoholic(false).description(this.description).name("some name").createNew();
assertThat(drink.getId()).isNull();
drink = this.drinkDao.save(drink);
return drink;
}
@Transactional
public void update(long id) {
DrinkEntity drink = this.drinkDao.find(id);
drink.setAlcoholic(true);
drink.setDescription(this.changedDescription);
this.drinkDao.save(drink);
}
@Transactional
public void verify(long id) {
AuditReader auditReader = AuditReaderFactory.get(this.entityManager);
assertThat(auditReader.isEntityClassAudited(DrinkEntity.class)).isTrue();
List<Number> revisions = auditReader.getRevisions(DrinkEntity.class, id);
assertThat(2).isEqualTo(revisions.size());
List<RevisionMetadata> history = this.drinkDao.getRevisionHistoryMetadata(id);
assertThat(2).isEqualTo(history.size());
// get first revision
Number rev = history.get(0).getRevision();
DrinkEntity drink = this.drinkDao.load(id, rev);
assertThat(drink.getDescription()).isEqualTo(this.description);
// get second revision
rev = history.get(1).getRevision();
drink = this.drinkDao.load(id, rev);
assertThat(drink.getDescription()).isEqualTo(this.changedDescription);
}
/**
* @param entityManager the entityManager to set
*/
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
};
}