+package de.juplo.jpa.converters;
+
+import de.juplo.jpa.converters.TimeConversions.FixedZoneIdStrategy;
+import de.juplo.jpa.converters.TimeConversions.FixedZoneOffsetStrategy;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ *
+ * @author kai
+ */
+public class JPAConverterTest
+{
+ final static Logger log = LoggerFactory.getLogger(JPAConverterTest.class);
+
+
+ EntityManager em =
+ Persistence.createEntityManagerFactory("test").createEntityManager();
+
+ ZonedDateTime zdt = ZonedDateTime.now();
+ OffsetDateTime odt = OffsetDateTime.now();
+
+ ZoneId defaultZone = ZoneId.systemDefault();
+ ZoneId otherZone = defaultZone.getId().equals("America/New_York") ? ZoneId.of("Europe/Berlin") : ZoneId.of("America/New_York");
+
+ ZoneOffset defaultOffset = defaultZone.getRules().getOffset(odt.toLocalDateTime());
+ ZoneOffset otherOffset = ZoneOffset.ofTotalSeconds(defaultOffset.getTotalSeconds() + 3 * 60 * 60);
+
+
+ @Test
+ public void testOffsetDateTime()
+ {
+ EierlegendeWollmilchSau ews;
+ Long id;
+
+ TimeConversions.setZoneOffsetStrategy(new FixedZoneOffsetStrategy(defaultOffset));
+ ews = new EierlegendeWollmilchSau();
+ ews.odt = odt;
+ id = persist(ews);
+ ews = retrieve(id);
+ assertEquals(odt, ews.odt);
+
+ TimeConversions.setZoneOffsetStrategy(new FixedZoneOffsetStrategy(otherOffset));
+ ews = new EierlegendeWollmilchSau();
+ ews.odt = odt;
+ id = persist(ews);
+ ews = retrieve(id);
+ assertEquals(odt.toInstant(), ews.odt.toInstant());
+ }
+
+ @Test
+ public void testZonedDateTime()
+ {
+ EierlegendeWollmilchSau ews;
+ Long id;
+
+ TimeConversions.setZoneIdStrategy(new FixedZoneIdStrategy(defaultZone));
+ ews = new EierlegendeWollmilchSau();
+ ews.zdt = zdt;
+ id = persist(ews);
+ ews = retrieve(id);
+ assertEquals(zdt, ews.zdt);
+
+ TimeConversions.setZoneIdStrategy(new FixedZoneIdStrategy(otherZone));
+ ews = new EierlegendeWollmilchSau();
+ ews.zdt = zdt;
+ id = persist(ews);
+ ews = retrieve(id);
+ assertEquals(zdt.toInstant(), ews.zdt.toInstant());
+ }
+
+
+ private Long persist(EierlegendeWollmilchSau ews)
+ {
+ EntityTransaction tx = em.getTransaction();
+ tx.begin();
+ em.persist(ews);
+ log.info("persisting {}", ews);
+ tx.commit();
+ em.clear();
+ return ews.id;
+ }
+
+ private EierlegendeWollmilchSau retrieve(Long id)
+ {
+ EierlegendeWollmilchSau ews;
+ EntityTransaction tx = em.getTransaction();
+ tx.begin();
+ ews = em.find(EierlegendeWollmilchSau.class, id);
+ tx.rollback();
+ log.info("retrieved {}", ews);
+ return ews;
+ }
+}