Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,26 @@ private static EntityManager getEntityManager() {
}

@SuppressWarnings("unused")
public static <E extends Identified<?> & ChangeAware> WriteOperationAsserter<E> assertThatEntity(@NonNull E before) {
return new WriteOperationAsserter<>(getEntityManager(), before);
public static <ID extends EntityId<?>, E extends Identified<ID> & ChangeAware, M extends Identified<ID> & ChangeAware> WriteOperationAsserter<ID, E, M> assertThatEntity(
@NonNull E before,
@NonNull Class<M> modelClass
) {
return new WriteOperationAsserter<>(getEntityManager(), before, modelClass);
}

@SuppressWarnings("unused")
public static <ID extends EntityId<?>> WriteOperationIdAsserter<ID> assertThatEntity(@NonNull ID id) {
return new WriteOperationIdAsserter<>(getEntityManager(), id);
public static <ID extends EntityId<?>, M extends Identified<ID>> WriteOperationIdAsserter<ID, M> assertThatEntity(
@NonNull ID id,
@NonNull Class<M> modelClass
) {
return new WriteOperationIdAsserter<>(getEntityManager(), id, modelClass);
}

@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static final class WriteOperationAsserter<E extends Identified<?> & ChangeAware> {
public static final class WriteOperationAsserter<ID extends EntityId<?>, E extends Identified<ID> & ChangeAware, M extends Identified<ID> & ChangeAware> {
private final EntityManager entityManager;
private final E entity;
private final Class<M> modelClass;

@SuppressWarnings("unused")
public void hasBeenCreatedInDatabase() {
Expand Down Expand Up @@ -90,35 +97,19 @@ public void isPresentInDatabase() {
assertThat(savedInstance).isNotNull();
}

@SuppressWarnings("unchecked")
private E getSavedInstance() {
return (E) entityManager.find(
entity.getClass(),
private M getSavedInstance() {
return entityManager.find(
modelClass,
entity.getId()
);
}
}

public static final class WriteOperationIdAsserter<ID extends EntityId<?>> {
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static final class WriteOperationIdAsserter<ID extends EntityId<?>, M extends Identified<ID>> {
private final EntityManager entityManager;
private final ID id;
private final Class<? extends Identified<? extends ID>> clazz;

@SuppressWarnings("unchecked")
private WriteOperationIdAsserter(
EntityManager entityManager,
ID id
) {
this.entityManager = entityManager;
this.id = id;

var enclosingClass = id.getClass().getEnclosingClass();
if (Identified.class.isAssignableFrom(enclosingClass)) {
this.clazz = (Class<? extends Identified<? extends ID>>) enclosingClass;
} else {
throw new IllegalArgumentException("EntityId is not a subclass of Identified!");
}
}
private final Class<M> modelClass;

@SuppressWarnings("unused")
public void isAbsentInDatabase() {
Expand All @@ -136,9 +127,9 @@ public void isPresentInDatabase() {
assertThat(savedInstance).isNotNull();
}

private Object getSavedInstance() {
private M getSavedInstance() {
return entityManager.find(
clazz,
modelClass,
id
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package it.aboutbits.springboot.testing.testdata.base;

import it.aboutbits.springboot.testing.spring.BeanAccessor;
import jakarta.persistence.EntityManager;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.support.TransactionTemplate;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -80,17 +77,5 @@ protected List<ITEM> create() {
return result;
}

protected ITEM saveMutation(@NonNull ITEM item) {
var entityManager = BeanAccessor.getBean(EntityManager.class);
var transactionTemplate = BeanAccessor.getBean(TransactionTemplate.class);

return transactionTemplate.execute(status -> {
try {
return entityManager.merge(item);
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});
}
protected abstract ITEM saveMutation(@NonNull ITEM item);
}