Skip to content

Commit a2c8265

Browse files
committed
add PersistenceAssert
1 parent 844b4dc commit a2c8265

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package it.aboutbits.springboot.testing.persistance;
2+
3+
import it.aboutbits.springboot.testing.spring.BeanAccessor;
4+
import it.aboutbits.springboot.toolbox.persistence.ChangeAware;
5+
import it.aboutbits.springboot.toolbox.type.identity.EntityId;
6+
import it.aboutbits.springboot.toolbox.type.identity.Identified;
7+
import jakarta.persistence.EntityManager;
8+
import lombok.AccessLevel;
9+
import lombok.NonNull;
10+
import lombok.RequiredArgsConstructor;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
14+
public final class PersistenceAssert {
15+
private PersistenceAssert() {
16+
}
17+
18+
private static EntityManager getEntityManager() {
19+
return BeanAccessor.getBean(EntityManager.class);
20+
}
21+
22+
@SuppressWarnings("unused")
23+
public static <E extends Identified<?> & ChangeAware> WriteOperationAsserter<E> assertThatEntity(@NonNull E before) {
24+
return new WriteOperationAsserter<>(getEntityManager(), before);
25+
}
26+
27+
@SuppressWarnings("unused")
28+
public static <ID extends EntityId<?>> WriteOperationIdAsserter<ID> assertThatEntity(@NonNull ID id) {
29+
return new WriteOperationIdAsserter<>(getEntityManager(), id);
30+
}
31+
32+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
33+
public static final class WriteOperationAsserter<E extends Identified<?> & ChangeAware> {
34+
private final EntityManager entityManager;
35+
private final E entity;
36+
37+
@SuppressWarnings("unused")
38+
public void hasBeenCreatedInDatabase() {
39+
entityManager.clear();
40+
var savedInstance = getSavedInstance();
41+
42+
assertThat(
43+
savedInstance.getId()
44+
).isNotNull();
45+
46+
assertThat(
47+
savedInstance.getCreatedAt()
48+
).isNotNull();
49+
}
50+
51+
@SuppressWarnings("unused")
52+
public void hasBeenUpdatedInDatabase() {
53+
entityManager.clear();
54+
var savedInstance = getSavedInstance();
55+
56+
assertThat(
57+
savedInstance.getUpdatedAt()
58+
).isAfter(
59+
entity.getUpdatedAt()
60+
);
61+
}
62+
63+
@SuppressWarnings("unused")
64+
public void hasNotChangedInDatabase() {
65+
entityManager.clear();
66+
var savedInstance = getSavedInstance();
67+
68+
assertThat(savedInstance).isNotNull();
69+
70+
assertThat(
71+
savedInstance.getUpdatedAt()
72+
).isEqualTo(
73+
entity.getUpdatedAt()
74+
);
75+
}
76+
77+
@SuppressWarnings("unused")
78+
public void isAbsentInDatabase() {
79+
entityManager.clear();
80+
var savedInstance = getSavedInstance();
81+
82+
assertThat(savedInstance).isNull();
83+
}
84+
85+
@SuppressWarnings("unused")
86+
public void isPresentInDatabase() {
87+
entityManager.clear();
88+
var savedInstance = getSavedInstance();
89+
90+
assertThat(savedInstance).isNotNull();
91+
}
92+
93+
@SuppressWarnings("unchecked")
94+
private E getSavedInstance() {
95+
return (E) entityManager.find(
96+
entity.getClass(),
97+
entity.getId()
98+
);
99+
}
100+
}
101+
102+
public static final class WriteOperationIdAsserter<ID extends EntityId<?>> {
103+
private final EntityManager entityManager;
104+
private final ID id;
105+
private final Class<? extends Identified<? extends ID>> clazz;
106+
107+
@SuppressWarnings("unchecked")
108+
private WriteOperationIdAsserter(
109+
EntityManager entityManager,
110+
ID id
111+
) {
112+
this.entityManager = entityManager;
113+
this.id = id;
114+
115+
var enclosingClass = id.getClass().getEnclosingClass();
116+
if (Identified.class.isAssignableFrom(enclosingClass)) {
117+
this.clazz = (Class<? extends Identified<? extends ID>>) enclosingClass;
118+
} else {
119+
throw new IllegalArgumentException("EntityId is not a subclass of Identified!");
120+
}
121+
}
122+
123+
@SuppressWarnings("unused")
124+
public void isAbsentInDatabase() {
125+
entityManager.clear();
126+
var savedInstance = getSavedInstance();
127+
128+
assertThat(savedInstance).isNull();
129+
}
130+
131+
@SuppressWarnings("unused")
132+
public void isPresentInDatabase() {
133+
entityManager.clear();
134+
var savedInstance = getSavedInstance();
135+
136+
assertThat(savedInstance).isNotNull();
137+
}
138+
139+
private Object getSavedInstance() {
140+
return entityManager.find(
141+
clazz,
142+
id
143+
);
144+
}
145+
}
146+
}

0 commit comments

Comments
 (0)