package org.openlca.core.database; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openlca.core.Tests; import org.openlca.core.database.usage.IUseSearch; import org.openlca.core.model.AbstractEntity; import org.openlca.core.model.Actor; import org.openlca.core.model.AllocationFactor; import org.openlca.core.model.CategorizedEntity; import org.openlca.core.model.Category; import org.openlca.core.model.Currency; import org.openlca.core.model.Exchange; import org.openlca.core.model.Flow; import org.openlca.core.model.FlowProperty; import org.openlca.core.model.FlowPropertyFactor; import org.openlca.core.model.ImpactCategory; import org.openlca.core.model.ImpactFactor; import org.openlca.core.model.ImpactMethod; import org.openlca.core.model.Location; import org.openlca.core.model.ModelType; import org.openlca.core.model.NwFactor; import org.openlca.core.model.NwSet; import org.openlca.core.model.Parameter; import org.openlca.core.model.Process; import org.openlca.core.model.ProcessDocumentation; import org.openlca.core.model.ProcessGroupSet; import org.openlca.core.model.ProductSystem; import org.openlca.core.model.Project; import org.openlca.core.model.SocialIndicator; import org.openlca.core.model.Source; import org.openlca.core.model.Unit; import org.openlca.core.model.UnitGroup; import org.openlca.core.model.descriptors.CategorizedDescriptor; import org.openlca.core.model.descriptors.Descriptors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // @RunWith(Theories.class) public class BaseDaoTest { private Logger log = LoggerFactory.getLogger(getClass()); // we cannot use @Theory and @DataPoints with an array of classes // see https://github.com/junit-team/junit/issues/76 // @DataPoints @SuppressWarnings("unchecked") private Class<? extends AbstractEntity>[] classes = new Class[] { Actor.class, AllocationFactor.class, Category.class, Currency.class, Exchange.class, Flow.class, FlowProperty.class, FlowPropertyFactor.class, ImpactCategory.class, ImpactFactor.class, ImpactMethod.class, Location.class, NwFactor.class, NwSet.class, Parameter.class, Process.class, ProcessGroupSet.class, ProcessDocumentation.class, ProductSystem.class, Project.class, SocialIndicator.class, Source.class, Unit.class, UnitGroup.class, }; @Test public void runTests() throws Exception { for (Class<? extends AbstractEntity> clazz : classes) { try { testCrud(clazz); } catch (Exception e) { throw new Exception("CRUD functions faild for " + clazz, e); } } } // @Theory private <T extends AbstractEntity> void testCrud(Class<T> clazz) throws Exception { log.trace("run base dao test with {}", clazz); T instance = clazz.newInstance(); BaseDao<T> dao = new BaseDao<>(clazz, Tests.getDb()); dao.insert(instance); testUsage(instance); dao.update(instance); Tests.emptyCache(); T alias = dao.getForId(instance.getId()); Assert.assertEquals(alias, instance); dao.delete(instance); Assert.assertNull(dao.getForId(instance.getId())); } private <T extends AbstractEntity> void testUsage(T instance) { log.trace("test simple usage tests with {}", instance); Class<?> clazz = instance.getClass(); if (!CategorizedEntity.class.isAssignableFrom(clazz)) return; CategorizedEntity entity = (CategorizedEntity) instance; ModelType type = ModelType.forModelClass(clazz); List<CategorizedDescriptor> descriptors = IUseSearch.FACTORY .createFor(type, Tests.getDb()) .findUses(Descriptors.toDescriptor(entity)); Assert.assertTrue(descriptors.isEmpty()); } }