add DomainSetup-HostingAssets for new BookingItem via created-event #111
@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import net.hostsharing.hsadminng.hs.booking.generated.api.v1.model.HsHostingAssetAutoInsertResource;
|
import net.hostsharing.hsadminng.hs.booking.generated.api.v1.model.HsHostingAssetAutoInsertResource;
|
||||||
import net.hostsharing.hsadminng.hs.booking.item.BookingItemCreatedAppEvent;
|
import net.hostsharing.hsadminng.hs.booking.item.BookingItemCreatedAppEvent;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset;
|
||||||
import net.hostsharing.hsadminng.mapper.StandardMapper;
|
import net.hostsharing.hsadminng.mapper.StandardMapper;
|
||||||
import net.hostsharing.hsadminng.persistence.EntityManagerWrapper;
|
import net.hostsharing.hsadminng.persistence.EntityManagerWrapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -40,7 +42,8 @@ public class HsBookingItemCreatedListener implements ApplicationListener<Booking
|
|||||||
final var newBookingItemRealEntity = event.getEntity().getBookingItem();
|
final var newBookingItemRealEntity = event.getEntity().getBookingItem();
|
||||||
final var asset = jsonMapper.readValue(event.getEntity().getAssetJson(), HsHostingAssetAutoInsertResource.class);
|
final var asset = jsonMapper.readValue(event.getEntity().getAssetJson(), HsHostingAssetAutoInsertResource.class);
|
||||||
final var factory = switch (newBookingItemRealEntity.getType()) {
|
final var factory = switch (newBookingItemRealEntity.getType()) {
|
||||||
case PRIVATE_CLOUD, CLOUD_SERVER, MANAGED_SERVER -> null; // for now, no automatic HostingAsset possible
|
case PRIVATE_CLOUD, CLOUD_SERVER, MANAGED_SERVER ->
|
||||||
|
forNowNoAutomaticHostingAssetCreationPossible(emw, newBookingItemRealEntity, asset, standardMapper);
|
||||||
case MANAGED_WEBSPACE -> new ManagedWebspaceHostingAssetFactory(emw, newBookingItemRealEntity, asset, standardMapper);
|
case MANAGED_WEBSPACE -> new ManagedWebspaceHostingAssetFactory(emw, newBookingItemRealEntity, asset, standardMapper);
|
||||||
case DOMAIN_SETUP -> new DomainSetupHostingAssetFactory(emw, newBookingItemRealEntity, asset, standardMapper);
|
case DOMAIN_SETUP -> new DomainSetupHostingAssetFactory(emw, newBookingItemRealEntity, asset, standardMapper);
|
||||||
};
|
};
|
||||||
@ -53,4 +56,25 @@ public class HsBookingItemCreatedListener implements ApplicationListener<Booking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HostingAssetFactory forNowNoAutomaticHostingAssetCreationPossible(
|
||||||
|
final EntityManagerWrapper emw,
|
||||||
|
final HsBookingItemRealEntity fromBookingItem,
|
||||||
|
final HsHostingAssetAutoInsertResource asset,
|
||||||
|
final StandardMapper standardMapper
|
||||||
|
) {
|
||||||
|
return new HostingAssetFactory(emw, fromBookingItem, asset, standardMapper) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected HsHostingAsset create() {
|
||||||
|
// TODO.impl: we should validate the asset JSON, but some violations are un-avoidable at that stage
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String performSaveProcess() {
|
||||||
|
return "waiting for manual setup of hosting asset for booking item of type " + fromBookingItem.getType();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.factories;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import net.hostsharing.hsadminng.config.JsonObjectMapperConfiguration;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.debitor.HsBookingDebitorEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.BookingItemCreatedAppEvent;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.BookingItemCreatedEventEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemRealEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
||||||
|
import net.hostsharing.hsadminng.lambda.Reducer;
|
||||||
|
import net.hostsharing.hsadminng.mapper.StandardMapper;
|
||||||
|
import net.hostsharing.hsadminng.persistence.EntityManagerWrapper;
|
||||||
|
import net.hostsharing.hsadminng.persistence.EntityManagerWrapperFake;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Spy;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.DOMAIN_SETUP;
|
||||||
|
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType.MANAGED_WEBSPACE;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
class HsBookingItemCreatedListenerUnitTest {
|
||||||
|
|
||||||
|
final HsBookingDebitorEntity debitor = HsBookingDebitorEntity.builder()
|
||||||
|
.debitorNumber(12345)
|
||||||
|
.defaultPrefix("xyz")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private EntityManagerWrapperFake emwFake = new EntityManagerWrapperFake();
|
||||||
|
|
||||||
|
@Spy
|
||||||
|
private EntityManagerWrapper emw = emwFake;
|
||||||
|
|
||||||
|
@Spy
|
||||||
|
private ObjectMapper jsonMapper = new JsonObjectMapperConfiguration().customObjectMapper().build();
|
||||||
|
|
||||||
|
@Spy
|
||||||
|
private StandardMapper standardMapper = new StandardMapper(emw);
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private HsBookingItemCreatedListener listener;
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("bookingItemTypesWithoutAutomaticAssetCreation")
|
||||||
|
void persistsEventEntityIfBookingItemTypeDoesNotSupportAutomaticHostingAssetCreation(final HsBookingItemType bookingItemType) {
|
||||||
|
// given
|
||||||
|
final var givenBookingItem = createBookingItemFromResources(bookingItemType);
|
||||||
|
final var givenAssetJson = """
|
||||||
|
{
|
||||||
|
// anything should be rejected
|
||||||
|
}
|
||||||
|
""";
|
||||||
|
|
||||||
|
// when
|
||||||
|
listener.onApplicationEvent(
|
||||||
|
new BookingItemCreatedAppEvent(this, givenBookingItem, givenAssetJson)
|
||||||
|
);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEventStatus(givenBookingItem, givenAssetJson,
|
||||||
|
"waiting for manual setup of hosting asset for booking item of type " + bookingItemType);
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<HsBookingItemType> bookingItemTypesWithoutAutomaticAssetCreation() {
|
||||||
|
return Arrays.stream(HsBookingItemType.values())
|
||||||
|
.filter(v -> v != MANAGED_WEBSPACE && v != DOMAIN_SETUP)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HsBookingItemRealEntity createBookingItemFromResources(
|
||||||
|
final HsBookingItemType bookingItemType
|
||||||
|
) {
|
||||||
|
return HsBookingItemRealEntity.builder()
|
||||||
|
.type(bookingItemType)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertEventStatus(
|
||||||
|
final HsBookingItemRealEntity givenBookingItem,
|
||||||
|
final String givenAssetJson,
|
||||||
|
final String expectedErrorMessage) {
|
||||||
|
emwFake.stream(BookingItemCreatedEventEntity.class)
|
||||||
|
.reduce(Reducer::toSingleElement)
|
||||||
|
.map(eventEntity -> {
|
||||||
|
assertThat(eventEntity.getBookingItem()).isSameAs(givenBookingItem);
|
||||||
|
assertThat(eventEntity.getAssetJson()).isEqualTo(givenAssetJson);
|
||||||
|
assertThat(eventEntity.getStatusMessage()).isEqualTo(expectedErrorMessage);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -19,7 +19,6 @@ import org.springframework.http.MediaType;
|
|||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
|
|
||||||
import jakarta.persistence.EntityManager;
|
|
||||||
import jakarta.persistence.EntityManagerFactory;
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
import jakarta.persistence.EntityNotFoundException;
|
import jakarta.persistence.EntityNotFoundException;
|
||||||
import jakarta.persistence.SynchronizationType;
|
import jakarta.persistence.SynchronizationType;
|
||||||
|
@ -6,7 +6,6 @@ import net.hostsharing.hsadminng.persistence.EntityManagerWrapper;
|
|||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
|
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
@ -16,7 +15,6 @@ import org.springframework.test.context.junit4.SpringRunner;
|
|||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
|
|
||||||
import jakarta.persistence.EntityManager;
|
|
||||||
import jakarta.persistence.EntityManagerFactory;
|
import jakarta.persistence.EntityManagerFactory;
|
||||||
import jakarta.persistence.SynchronizationType;
|
import jakarta.persistence.SynchronizationType;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -10,7 +10,6 @@ import org.mockito.InjectMocks;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
import jakarta.persistence.EntityManager;
|
|
||||||
import jakarta.persistence.ManyToOne;
|
import jakarta.persistence.ManyToOne;
|
||||||
import jakarta.validation.ValidationException;
|
import jakarta.validation.ValidationException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
Loading…
Reference in New Issue
Block a user