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