r31 - in trunk: magalie-persistence magalie-persistence/src/main/java/com/franciaflex/magalie magalie-services/src/main/java/com/franciaflex/magalie/services magalie-services/src/test/java/com/franciaflex/magalie magalie-services/src/test/java/com/franciaflex/magalie/services magalie-web/src/main/java/com/franciaflex/magalie/web
Author: bleny Date: 2013-03-21 14:55:30 +0100 (Thu, 21 Mar 2013) New Revision: 31 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: introduce JUnit rule to open/close entityManager in each test, sandbox every test in a single H2 instance Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/AbstractMagalieServiceTest.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/JpaEntityManagerRule.java Modified: trunk/magalie-persistence/pom.xml trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/MagalieApplicationConfig.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieJpaTransactionFilter.java Modified: trunk/magalie-persistence/pom.xml =================================================================== --- trunk/magalie-persistence/pom.xml 2013-03-19 16:05:56 UTC (rev 30) +++ trunk/magalie-persistence/pom.xml 2013-03-21 13:55:30 UTC (rev 31) @@ -28,16 +28,19 @@ <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> + <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> + <scope>compile</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> + <scope>compile</scope> </dependency> <dependency> Added: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java (rev 0) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/JpaUtil.java 2013-03-21 13:55:30 UTC (rev 31) @@ -0,0 +1,70 @@ +package com.franciaflex.magalie; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hibernate.cfg.Environment; +import org.hibernate.ejb.AvailableSettings; + +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import java.io.File; +import java.util.Collections; +import java.util.Map; + +public class JpaUtil { + + private static final Log log = LogFactory.getLog(JpaUtil.class); + + private JpaUtil() {} + + protected static final ImmutableMap<String, String> JPA_H2_CONFIG = + ImmutableMap.of( + AvailableSettings.JDBC_DRIVER, org.h2.Driver.class.getName(), + AvailableSettings.JDBC_USER, "sa", + AvailableSettings.JDBC_PASSWORD, "", + Environment.DIALECT, org.hibernate.dialect.H2Dialect.class.getName(), + Environment.HBM2DDL_AUTO, "create" + ); + + public static EntityManagerFactory createTempEntityManagerFactory(String persistenceUnitName, String context) { + + EntityManagerFactory tempEntityManagerFactory = + createTempEntityManagerFactory( + persistenceUnitName, + context, Collections.<String, String>emptyMap()); + + return tempEntityManagerFactory; + + } + + public static EntityManagerFactory createTempEntityManagerFactory(String persistenceUnitName, String context, Map<String, String> jpaParameters) { + + Map<String, String> allJpaParameters = Maps.newHashMap(); + + allJpaParameters.putAll(jpaParameters); + + allJpaParameters.putAll(JPA_H2_CONFIG); + + File tempDirFile = SystemUtils.getJavaIoTmpDir(); + + File databaseFile = new File(tempDirFile, context); + + String h2dataPath = databaseFile.getAbsolutePath() + File.separator + "h2data"; + + allJpaParameters.put(AvailableSettings.JDBC_URL, "jdbc:h2:file:" + h2dataPath); + + if (log.isTraceEnabled()) { + log.trace("will store H2 data in " + h2dataPath); + log.trace("allJpaParameters = " + allJpaParameters); + } + + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, allJpaParameters); + + return entityManagerFactory; + + } + +} Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/MagalieApplicationConfig.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/MagalieApplicationConfig.java 2013-03-19 16:05:56 UTC (rev 30) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/MagalieApplicationConfig.java 2013-03-21 13:55:30 UTC (rev 31) @@ -29,8 +29,8 @@ } } - public Map<String, Object> getJpaParameters() { - Map<String, Object> jpaParameters = Maps.newHashMap(); + public Map<String, String> getJpaParameters() { + Map<String, String> jpaParameters = Maps.newHashMap(); Properties hibernateProperties = applicationConfig.getOptionStartsWith("hibernate"); jpaParameters.putAll((Map) hibernateProperties); Properties jpaProperties = applicationConfig.getOptionStartsWith("javax.persistence"); Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-19 16:05:56 UTC (rev 30) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/DefaultMagalieServiceContext.java 2013-03-21 13:55:30 UTC (rev 31) @@ -1,5 +1,6 @@ package com.franciaflex.magalie.services; +import com.franciaflex.magalie.MagalieApplicationConfig; import com.franciaflex.magalie.MagalieTechnicalException; import com.franciaflex.magalie.dao.ArticleDao; import com.franciaflex.magalie.dao.RequestedArticleDao; @@ -18,10 +19,20 @@ protected EntityManager entityManager; + protected MagalieApplicationConfig magalieApplicationConfig; + public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } + public MagalieApplicationConfig getMagalieApplicationConfig() { + return magalieApplicationConfig; + } + + public void setMagalieApplicationConfig(MagalieApplicationConfig magalieApplicationConfig) { + this.magalieApplicationConfig = magalieApplicationConfig; + } + @Override public <E extends MagalieService> E newService(Class<E> serviceClass) { Added: trunk/magalie-services/src/test/java/com/franciaflex/magalie/AbstractMagalieServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/AbstractMagalieServiceTest.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/AbstractMagalieServiceTest.java 2013-03-21 13:55:30 UTC (rev 31) @@ -0,0 +1,114 @@ +package com.franciaflex.magalie; + +import com.franciaflex.magalie.entity.AbstractJpaEntity; +import com.franciaflex.magalie.services.DefaultMagalieServiceContext; +import com.franciaflex.magalie.services.MagalieService; +import com.franciaflex.magalie.services.MagalieServiceContext; +import com.google.common.collect.Lists; +import org.junit.Rule; + +import javax.persistence.EntityManager; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public abstract class AbstractMagalieServiceTest { + + protected static final double DELTA = 0.0001; + + protected static MagalieFixtures fixtures; + + protected static MagalieApplicationConfig magalieApplicationConfig; + + protected JpaEntityManagerRule jpaEntityManagerRule; + + protected MagalieServiceContext serviceContext; + + protected static MagalieApplicationConfig getMagalieApplicationConfig() { + + if (magalieApplicationConfig == null) { + + magalieApplicationConfig = new MagalieApplicationConfig(); + + } + + return magalieApplicationConfig; + + } + + public static MagalieFixtures getFixtures() { + + if (fixtures == null) { + + fixtures = new MagalieFixtures("fixtures"); + + } + + return fixtures; + } + + protected static <E> E fixture(String id) { + + return getFixtures().fixture(id); + + } + + protected MagalieServiceContext getServiceContext() { + + if (serviceContext == null) { + + DefaultMagalieServiceContext serviceContext = new DefaultMagalieServiceContext(); + + serviceContext.setMagalieApplicationConfig(getMagalieApplicationConfig()); + + EntityManager entityManager = getJpaEntityManagerRule().getEntityManager(); + + serviceContext.setEntityManager(entityManager); + + MagalieFixtures fixtures = getFixtures(); + + List<AbstractJpaEntity> toPersist = Lists.newArrayList(); + + toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("users")); + toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("sites")); + toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("articles")); + toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("storedArticles")); + + for (AbstractJpaEntity entity : toPersist) { + + entityManager.persist(entity); + + } + + entityManager.getTransaction().commit(); + + this.serviceContext = serviceContext; + + } + + return serviceContext; + + } + + protected <E extends MagalieService> E newService(Class<E> serviceClass) { + + return getServiceContext().newService(serviceClass); + + } + + @Rule + public JpaEntityManagerRule getJpaEntityManagerRule() { + + if (jpaEntityManagerRule == null) { + + Map<String, String> jpaParameters = getMagalieApplicationConfig().getJpaParameters(); + + jpaEntityManagerRule = new JpaEntityManagerRule("magaliePersistenceUnit", jpaParameters); + + } + + return jpaEntityManagerRule; + + } + +} Added: trunk/magalie-services/src/test/java/com/franciaflex/magalie/JpaEntityManagerRule.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/JpaEntityManagerRule.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/JpaEntityManagerRule.java 2013-03-21 13:55:30 UTC (rev 31) @@ -0,0 +1,100 @@ +package com.franciaflex.magalie; + +import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import java.util.Date; +import java.util.Map; + +public class JpaEntityManagerRule implements TestRule { + + private static final Log log = LogFactory.getLog(JpaEntityManagerRule.class); + + protected String persistenceUnitName; + + protected String timestamp = String.valueOf(new Date().getTime()); + + protected EntityManager entityManager; + + protected boolean open = false; + + protected Map<String, String> jpaParameters; + + public JpaEntityManagerRule(String persistenceUnitName, Map<String, String> jpaParameters) { + this.persistenceUnitName = persistenceUnitName; + this.jpaParameters = jpaParameters; + } + + @Override + public Statement apply(final Statement base, Description description) { + + final String testClassName = description.getClassName(); + + final String testMethodName = description.getMethodName(); + + if (log.isDebugEnabled()) { + log.debug("will create entityManager for test class " + testClassName + " and method " + testMethodName); + } + + return new Statement() { + @Override + public void evaluate() throws Throwable { + createEntityManager(testClassName, testMethodName); + try { + base.evaluate(); + } finally { + closeEntityManager(); + } + } + }; + } + + protected void createEntityManager(String testClassName, String testMethodName) { + + String context = Joiner.on('_').join(testClassName, testMethodName, timestamp); + + EntityManagerFactory entityManagerFactory = JpaUtil.createTempEntityManagerFactory(persistenceUnitName, context, jpaParameters); + + entityManager = entityManagerFactory.createEntityManager(); + + if (log.isDebugEnabled()) { + log.debug("created entityManager " + entityManager + " and opened transaction"); + } + + entityManager.getTransaction().begin(); + + open = true; + + } + + public EntityManager getEntityManager() { + + Preconditions.checkState(open); + + return entityManager; + + } + + /** + * Override to tear down your specific external resource. + */ + protected void closeEntityManager() { + + if (log.isDebugEnabled()) { + log.debug("close entityManager " + entityManager); + } + + open = false; + + entityManager.close(); + + } + +} Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-19 16:05:56 UTC (rev 30) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/ArticleStorageServiceTest.java 2013-03-21 13:55:30 UTC (rev 31) @@ -1,87 +1,33 @@ package com.franciaflex.magalie.services; -import com.franciaflex.magalie.MagalieApplicationConfig; -import com.franciaflex.magalie.MagalieFixtures; -import com.franciaflex.magalie.dao.ArticleDao; -import com.franciaflex.magalie.dao.MagalieUserDao; -import com.franciaflex.magalie.dao.RequestedArticleDao; -import com.franciaflex.magalie.dao.StoredArticleDao; -import com.franciaflex.magalie.entity.AbstractJpaEntity; +import com.franciaflex.magalie.AbstractMagalieServiceTest; import com.franciaflex.magalie.entity.Article; import com.franciaflex.magalie.entity.MagalieUser; -import com.franciaflex.magalie.entity.StoredArticle; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; -import org.mockito.Mockito; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import java.util.Collection; -import java.util.List; -import java.util.Map; +public class ArticleStorageServiceTest extends AbstractMagalieServiceTest { -public class ArticleStorageServiceTest { - private static final Log log = LogFactory.getLog(ArticleStorageServiceTest.class); - protected static final double DELTA = 0.0001; - protected ArticleStorageService service; - protected MagalieFixtures fixtures; - @Before - public void setUp() throws Exception { + public void setUp() { - service = new ArticleStorageService(); + service = newService(ArticleStorageService.class); - fixtures = new MagalieFixtures("fixtures"); - - service.setServiceContext(new MagalieServiceContext() { - - @Override - public <E extends MagalieService> E newService(Class<E> serviceClass) { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public MagalieUserDao getMagalieUserDao() { - throw new UnsupportedOperationException(); - } - - @Override - public StoredArticleDao getStoredArticleDao() { - StoredArticleDao storedArticleDaoMock = Mockito.mock(StoredArticleDao.class); - Mockito.when(storedArticleDaoMock.findAllForArticle(Mockito.<Article>any())).thenReturn( - fixtures.<List<StoredArticle>>fixture("storedArticlesForArticle1") - ); - return storedArticleDaoMock; - } - - @Override - public RequestedArticleDao getRequestedArticleDao() { - return null; - } - - @Override - public ArticleDao getArticleDao() { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - }); } @Test public void testThrowUnavailableArticle() throws Exception { - MagalieUser basile = fixtures.fixture("basile"); - Article article = fixtures.fixture("article1"); + MagalieUser basile = fixture("basile"); + Article article = fixture("article1"); WithdrawTask withdrawTask; try { @@ -101,8 +47,8 @@ @Test public void testThrowRequiredDriverLicenceException() throws Exception { - MagalieUser basile = fixtures.fixture("basile"); - Article article = fixtures.fixture("article1"); + MagalieUser basile = fixture("basile"); + Article article = fixture("article1"); WithdrawTask withdrawTask; try { @@ -122,8 +68,8 @@ @Test public void testWithdrawArticleWithoutDriverLicense() throws Exception { - MagalieUser basile = fixtures.fixture("basile"); - Article article = fixtures.fixture("article1"); + MagalieUser basile = fixture("basile"); + Article article = fixture("article1"); WithdrawTask withdrawTask = null; try { @@ -149,8 +95,8 @@ @Test public void testWithdrawArticleWithDriverLicense() throws Exception { - MagalieUser alexandre = fixtures.fixture("alexandre"); - Article article = fixtures.fixture("article1"); + MagalieUser alexandre = fixture("alexandre"); + Article article = fixture("article1"); WithdrawTask withdrawTask = null; try { @@ -177,47 +123,4 @@ Assert.assertEquals(30., site2.getQuantity(), DELTA); } - @Test - @Ignore - public void testName() throws Exception { - - MagalieFixtures fixtures = new MagalieFixtures("fixtures"); - - MagalieApplicationConfig applicationConfig = new MagalieApplicationConfig(); - - Map<String, Object> jpaParameters = applicationConfig.getJpaParameters(); - - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("magaliePersistenceUnit", jpaParameters); - - EntityManager entityManager = entityManagerFactory.createEntityManager(); - - entityManager.getTransaction().begin(); - -// entityManager.persist(new MagalieUser()); -// entityManager.persist(new Article()); -// entityManager.persist(new StoredArticle()); -// entityManager.persist(new Site()); -// entityManager.persist(new RequestedArticle()); - -// entityManager.persist(new SiteError()); -// entityManager.persist(new StorageMovement()); - - List<AbstractJpaEntity> toPersist = Lists.newArrayList(); - - toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("users")); - toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("sites")); - toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("articles")); - toPersist.addAll(fixtures.<Collection<? extends AbstractJpaEntity>>fixture("storedArticles")); - - for (AbstractJpaEntity entity : toPersist) { - - entityManager.persist(entity); - - } - - entityManager.getTransaction().commit(); - - entityManager.close(); - - } } Modified: trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieJpaTransactionFilter.java =================================================================== --- trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieJpaTransactionFilter.java 2013-03-19 16:05:56 UTC (rev 30) +++ trunk/magalie-web/src/main/java/com/franciaflex/magalie/web/MagalieJpaTransactionFilter.java 2013-03-21 13:55:30 UTC (rev 31) @@ -22,7 +22,7 @@ MagalieApplicationConfig applicationConfig = new MagalieApplicationConfig(); - Map<String, Object> jpaParameters = applicationConfig.getJpaParameters(); + Map<String, String> jpaParameters = applicationConfig.getJpaParameters(); entityManagerFactory = Persistence.createEntityManagerFactory("magaliePersistenceUnit", jpaParameters);
participants (1)
-
bleny@users.forge.codelutin.com