Added a test that reuses classes and mappings from a real project
[jpa-converters] / src / test / java / de / juplo / jpa / converters / JPAConverterTest.java
1 package de.juplo.jpa.converters;
2
3 import de.juplo.jpa.converters.TimeConversions.FixedZoneIdStrategy;
4 import de.juplo.jpa.converters.TimeConversions.FixedZoneOffsetStrategy;
5 import de.juplo.yourshouter.api.model.Date;
6 import java.time.LocalDate;
7 import java.time.OffsetDateTime;
8 import java.time.ZoneId;
9 import java.time.ZoneOffset;
10 import java.time.ZonedDateTime;
11 import javax.persistence.EntityManager;
12 import javax.persistence.EntityTransaction;
13 import javax.persistence.Persistence;
14 import org.junit.Test;
15 import static org.junit.Assert.assertEquals;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19
20 /**
21  *
22  * @author kai
23  */
24 public class JPAConverterTest
25 {
26   final static Logger log = LoggerFactory.getLogger(JPAConverterTest.class);
27
28
29   EntityManager em;
30
31   ZonedDateTime zdt = ZonedDateTime.now();
32   OffsetDateTime odt = OffsetDateTime.now();
33   LocalDate ld = LocalDate.now();
34
35   ZoneId defaultZone = ZoneId.systemDefault();
36   ZoneId otherZone = defaultZone.getId().equals("America/New_York") ? ZoneId.of("Europe/Berlin") : ZoneId.of("America/New_York");
37
38   ZoneOffset defaultOffset = defaultZone.getRules().getOffset(odt.toLocalDateTime());
39   ZoneOffset otherOffset = ZoneOffset.ofTotalSeconds(defaultOffset.getTotalSeconds() + 3 * 60 * 60);
40
41
42   @Test
43   public void testOffsetDateTimeAnnotated()
44   {
45     em = Persistence.createEntityManagerFactory("annotated").createEntityManager();
46     testOffsetDateTime();
47   }
48
49   @Test
50   public void testOffsetDateTimeXml()
51   {
52     em = Persistence.createEntityManagerFactory("xml").createEntityManager();
53     testOffsetDateTime();
54   }
55
56   public void testOffsetDateTime()
57   {
58     EierlegendeWollmilchSau ews;
59
60     TimeConversions.setZoneOffsetStrategy(new FixedZoneOffsetStrategy(defaultOffset));
61     ews = new EierlegendeWollmilchSau();
62     ews.odt = odt;
63     persist(ews);
64     ews = retrieve(EierlegendeWollmilchSau.class, ews.id);
65     assertEquals(odt, ews.odt);
66
67     TimeConversions.setZoneOffsetStrategy(new FixedZoneOffsetStrategy(otherOffset));
68     ews = new EierlegendeWollmilchSau();
69     ews.odt = odt;
70     persist(ews);
71     ews = retrieve(EierlegendeWollmilchSau.class, ews.id);
72     assertEquals(odt.toInstant(), ews.odt.toInstant());
73   }
74
75
76   @Test
77   public void testZonedDateTimeAnnotated()
78   {
79     em = Persistence.createEntityManagerFactory("annotated").createEntityManager();
80     testZonedDateTime();
81   }
82
83   @Test
84   public void testZonedDateTimeXml()
85   {
86     em = Persistence.createEntityManagerFactory("xml").createEntityManager();
87     testZonedDateTime();
88   }
89
90   public void testZonedDateTime()
91   {
92     EierlegendeWollmilchSau ews;
93
94     TimeConversions.setZoneIdStrategy(new FixedZoneIdStrategy(defaultZone));
95     ews = new EierlegendeWollmilchSau();
96     ews.zdt = zdt;
97     persist(ews);
98     ews = retrieve(EierlegendeWollmilchSau.class, ews.id);
99     assertEquals(zdt, ews.zdt);
100
101     TimeConversions.setZoneIdStrategy(new FixedZoneIdStrategy(otherZone));
102     ews = new EierlegendeWollmilchSau();
103     ews.zdt = zdt;
104     persist(ews);
105     ews = retrieve(EierlegendeWollmilchSau.class, ews.id);
106     assertEquals(zdt.toInstant(), ews.zdt.toInstant());
107   }
108
109
110   @Test
111   public void testDataModel()
112   {
113     em = Persistence.createEntityManagerFactory("data-model").createEntityManager();
114     Date date;
115
116     TimeConversions.setZoneIdStrategy(new FixedZoneIdStrategy(defaultZone));
117     date = new Date();
118     date.setId("TEST");
119     date.setDate(ld);
120     date.setStart(zdt);
121     date.setEnd(zdt);
122     persist(date);
123     date = retrieve(Date.class, date.getId());
124     assertEquals(ld, date.getDate());
125     assertEquals(zdt, date.getStart());
126     assertEquals(zdt, date.getEnd());
127   }
128
129
130   private void persist(Object entity)
131   {
132     EntityTransaction tx = em.getTransaction();
133     tx.begin();
134     em.persist(entity);
135     log.info("persisting {}", entity);
136     tx.commit();
137     em.clear();
138   }
139
140   private <T> T retrieve(Class<T> entityClass, Object id)
141   {
142     EntityTransaction tx = em.getTransaction();
143     tx.begin();
144     try
145     {
146       log.info("retrieving {} of class {}", id, entityClass);
147       return em.find(entityClass, id);
148     }
149     finally
150     {
151       tx.rollback();
152     }
153   }
154 }