Skip to content
Snippets Groups Projects
Commit eba7db4f authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-5321 Erstellung des Bescheid aus einer Datei schlägt...

Merge pull request 'OZG-5321 Erstellung des Bescheid aus einer Datei schlägt fehl' (#328) from OZG-5321-Erstellung-Bescheid-aus-Datei-schlaegt-fehl into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/vorgang-manager/pulls/328


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents c34e99a0 169302a5
No related branches found
No related tags found
No related merge requests found
Showing
with 326 additions and 22 deletions
...@@ -17,7 +17,7 @@ class BescheidGrpcService extends BescheidServiceImplBase { ...@@ -17,7 +17,7 @@ class BescheidGrpcService extends BescheidServiceImplBase {
@Override @Override
public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) { public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) {
var response = attachedItemService.getBescheidItem(request.getVorgangId()) var response = attachedItemService.findBescheidItem(request.getVorgangId())
.map(this::buildResponse) .map(this::buildResponse)
.orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance); .orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance);
......
...@@ -48,7 +48,6 @@ import lombok.extern.log4j.Log4j2; ...@@ -48,7 +48,6 @@ import lombok.extern.log4j.Log4j2;
public class AttachedItemService { public class AttachedItemService {
static final String BESCHEID_ITEM_NAME = "Bescheid"; static final String BESCHEID_ITEM_NAME = "Bescheid";
static final String BESCHEID_DRAFT_STATUS = "DRAFT";
static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM"; static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM";
static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM"; static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM";
...@@ -59,10 +58,14 @@ public class AttachedItemService { ...@@ -59,10 +58,14 @@ public class AttachedItemService {
private final VorgangAttachedItemRemoteService remoteService; private final VorgangAttachedItemRemoteService remoteService;
private final CommandMapper commandMapper; private final CommandMapper commandMapper;
public Optional<BescheidItem> getBescheidItem(String vorgangId) { public Optional<BescheidItem> findBescheidItem(String vorgangId) {
return remoteService.findBescheidDraft(vorgangId); return remoteService.findBescheidDraft(vorgangId);
} }
public BescheidItem getBescheidItem(String id) {
return remoteService.getBescheid(id);
}
public String createBescheidDraft(Command command) { public String createBescheidDraft(Command command) {
validateBescheidData(command.getBodyObject()); validateBescheidData(command.getBodyObject());
return remoteService.findBescheidDraft(command.getVorgangId()) return remoteService.findBescheidDraft(command.getVorgangId())
...@@ -129,7 +132,7 @@ public class AttachedItemService { ...@@ -129,7 +132,7 @@ public class AttachedItemService {
Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) { Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) {
var result = new HashMap<String, Object>(); var result = new HashMap<String, Object>();
result.put(BescheidItem.FIELD_STATUS, BESCHEID_DRAFT_STATUS); result.put(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name());
addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHIEDEN_AM, result); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHIEDEN_AM, result);
addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BEWILLIGT, result); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BEWILLIGT, result);
addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHEID_DOCUMENT, result); addValueFromMapIfExists(command.getBodyObject(), BescheidItem.FIELD_BESCHEID_DOCUMENT, result);
...@@ -168,7 +171,7 @@ public class AttachedItemService { ...@@ -168,7 +171,7 @@ public class AttachedItemService {
void validateBescheidStatus(BescheidItem bescheid) { void validateBescheidStatus(BescheidItem bescheid) {
var bescheidStatus = MapUtils.getString(bescheid.getBescheidData(), BescheidItem.FIELD_STATUS); var bescheidStatus = MapUtils.getString(bescheid.getBescheidData(), BescheidItem.FIELD_STATUS);
if (!BESCHEID_DRAFT_STATUS.equals(bescheidStatus)) { if (BescheidItem.Status.DRAFT.not(bescheidStatus)) {
throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus)); throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus));
} }
} }
......
...@@ -60,4 +60,16 @@ public class BescheidItem { ...@@ -60,4 +60,16 @@ public class BescheidItem {
private String itemName; private String itemName;
private Map<String, Object> bescheidData; private Map<String, Object> bescheidData;
public enum Status {
DRAFT, BESCHEID;
public boolean not(String value) {
return !hasValue(value);
}
public boolean hasValue(String value) {
return this.name().equalsIgnoreCase(value);
}
}
} }
...@@ -72,14 +72,17 @@ class VorgangAttachedItemRemoteService { ...@@ -72,14 +72,17 @@ class VorgangAttachedItemRemoteService {
Optional<BescheidItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) { Optional<BescheidItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) {
var grpcResponse = getServiceStub().find(request); var grpcResponse = getServiceStub().find(request);
var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse) var bescheidItems = bescheidItemMapper.fromFindVorgangAttachedItemResponse(grpcResponse).filter(this::hasStatusDraft)
.filter(item -> BESCHEID_DRAFT_STATUS.equals(MapUtils.getString(item.getBescheidData(), BescheidItem.FIELD_STATUS)))
.sorted(BY_BESCHIEDEN_AM_DESC).toList(); .sorted(BY_BESCHIEDEN_AM_DESC).toList();
if (bescheidItems.size() > 1) { if (bescheidItems.size() > 1) {
LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(), LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(),
bescheidItems.get(0).getVorgangId()); bescheidItems.getFirst().getVorgangId());
} }
return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.get(0)); return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst());
}
boolean hasStatusDraft(BescheidItem bescheidItem) {
return BescheidItem.Status.DRAFT.hasValue(MapUtils.getString(bescheidItem.getBescheidData(), BescheidItem.FIELD_STATUS));
} }
public BescheidItem getBescheid(String bescheidId) { public BescheidItem getBescheid(String bescheidId) {
......
...@@ -27,12 +27,14 @@ import java.util.HashMap; ...@@ -27,12 +27,14 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.apache.commons.collections.MapUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.attacheditem.BescheidItem; import de.ozgcloud.bescheid.attacheditem.BescheidItem;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
...@@ -48,20 +50,30 @@ public class DocumentService { ...@@ -48,20 +50,30 @@ public class DocumentService {
static final String DOCUMENT_TYPE = "BESCHEID"; static final String DOCUMENT_TYPE = "BESCHEID";
static final String FIELD_DOCUMENT_FILE = "documentFile"; static final String FIELD_DOCUMENT_FILE = "documentFile";
private final AttachedItemService attachedItemService;
private final OzgCloudCommandService commandService; private final OzgCloudCommandService commandService;
private final CommandMapper commandMapper; private final CommandMapper commandMapper;
public String createBescheidDocument(Command command) { public String createBescheidDocument(Command command) {
validateBescheidItem(command.getRelationId());
var ozgCloudCommand = buildCreateDocumentOzgCommand(command); var ozgCloudCommand = buildCreateDocumentOzgCommand(command);
var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand); var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand);
return executedCommand.getCreatedResource(); return executedCommand.getCreatedResource();
} }
void validateBescheidItem(String bescheidId) {
var bescheidData = attachedItemService.getBescheidItem(bescheidId).getBescheidData();
var status = MapUtils.getString(bescheidData, BescheidItem.FIELD_STATUS);
if (BescheidItem.Status.DRAFT.not(status)) {
throw new TechnicalException("Bescheid is not in draft status");
}
}
OzgCloudCommand buildCreateDocumentOzgCommand(Command command) { OzgCloudCommand buildCreateDocumentOzgCommand(Command command) {
return OzgCloudCommand.builder() return OzgCloudCommand.builder()
.order(CREATE_ATTACHED_ITEM_ORDER) .order(CREATE_ATTACHED_ITEM_ORDER)
.vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId()))
.relationId(commandMapper.mapRelationId(command.getRelationId())) .relationId(commandMapper.mapRelationId(command.getVorgangId()))
.bodyObject(buildAttachedItem(command)) .bodyObject(buildAttachedItem(command))
.build(); .build();
} }
......
...@@ -45,7 +45,7 @@ class BescheidGrpcServiceTest { ...@@ -45,7 +45,7 @@ class BescheidGrpcServiceTest {
@Test @Test
void shouldBuildResponse() { void shouldBuildResponse() {
when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
service.getBescheidDraft(request, responseObserver); service.getBescheidDraft(request, responseObserver);
...@@ -56,7 +56,7 @@ class BescheidGrpcServiceTest { ...@@ -56,7 +56,7 @@ class BescheidGrpcServiceTest {
void shouldCallNext() { void shouldCallNext() {
when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); when(mapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create());
when(service.buildResponse(any())).thenReturn(response); when(service.buildResponse(any())).thenReturn(response);
when(attachedItemService.getBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create())); when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(BescheidItemTestFactory.create()));
service.getBescheidDraft(request, responseObserver); service.getBescheidDraft(request, responseObserver);
......
...@@ -72,7 +72,7 @@ class AttachedItemServiceTest { ...@@ -72,7 +72,7 @@ class AttachedItemServiceTest {
@Test @Test
void shouldCallGetBescheidDraft() { void shouldCallGetBescheidDraft() {
service.getBescheidItem(CommandTestFactory.VORGANG_ID); service.findBescheidItem(CommandTestFactory.VORGANG_ID);
verify(remoteService).findBescheidDraft(CommandTestFactory.VORGANG_ID); verify(remoteService).findBescheidDraft(CommandTestFactory.VORGANG_ID);
} }
...@@ -82,12 +82,33 @@ class AttachedItemServiceTest { ...@@ -82,12 +82,33 @@ class AttachedItemServiceTest {
var expected = BescheidItemTestFactory.create(); var expected = BescheidItemTestFactory.create();
when(remoteService.findBescheidDraft(anyString())).thenReturn(Optional.of(expected)); when(remoteService.findBescheidDraft(anyString())).thenReturn(Optional.of(expected));
var actual = service.getBescheidItem(CommandTestFactory.VORGANG_ID); var actual = service.findBescheidItem(CommandTestFactory.VORGANG_ID);
assertThat(actual).contains(expected); assertThat(actual).contains(expected);
} }
} }
@Nested
class TestGetBescheidItem {
@Test
void shouldCallGetBescheid() {
service.getBescheidItem(BescheidItemTestFactory.ID);
verify(remoteService).getBescheid(BescheidItemTestFactory.ID);
}
@Test
void shouldReturnBescheidItem() {
var expected = BescheidItemTestFactory.create();
when(remoteService.getBescheid(anyString())).thenReturn(expected);
var actual = service.getBescheidItem(BescheidItemTestFactory.ID);
assertThat(actual).isEqualTo(expected);
}
}
@Nested @Nested
class TestCreateBescheidDraft { class TestCreateBescheidDraft {
...@@ -484,7 +505,7 @@ class AttachedItemServiceTest { ...@@ -484,7 +505,7 @@ class AttachedItemServiceTest {
void shouldSetStatus() { void shouldSetStatus() {
var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); var bescheidMap = service.buildItemMapWithExistingBescheidFields(command);
assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS); assertThat(bescheidMap).containsEntry(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name());
} }
@Test @Test
......
...@@ -58,7 +58,7 @@ public class BescheidItemTestFactory { ...@@ -58,7 +58,7 @@ public class BescheidItemTestFactory {
public static Map<String, Object> createBescheidBody() { public static Map<String, Object> createBescheidBody() {
return Map.of( return Map.of(
BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS, BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT,
BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM, BescheidItem.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM,
BescheidItem.FIELD_BEWILLIGT, true, BescheidItem.FIELD_BEWILLIGT, true,
BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT, BescheidItem.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT,
......
...@@ -130,11 +130,40 @@ class VorgangAttachedItemRemoteServiceTest { ...@@ -130,11 +130,40 @@ class VorgangAttachedItemRemoteServiceTest {
verify(bescheidItemMapper).fromFindVorgangAttachedItemResponse(response); verify(bescheidItemMapper).fromFindVorgangAttachedItemResponse(response);
} }
@Test
void shouldCallHasStatusDraft() {
var item = BescheidItemTestFactory.create();
when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item));
service.findBescheidDraft(request);
verify(service).hasStatusDraft(item);
}
@Test @Test
void shouldFilterDraftItems() { void shouldFilterDraftItems() {
var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of( var item = BescheidItemTestFactory.create();
BescheidItem.FIELD_STATUS, "other")).build(); when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item));
when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1)); doReturn(true).when(service).hasStatusDraft(any());
var result = service.findBescheidDraft(request);
assertThat(result).contains(item);
}
@Test
void shouldReturnEmptyWhenNotFound() {
when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.empty());
var result = service.findBescheidDraft(request);
assertThat(result).isEmpty();
}
@Test
void shouldReturnEmptyWhenNotDraft() {
when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(BescheidItemTestFactory.create()));
doReturn(false).when(service).hasStatusDraft(any());
var result = service.findBescheidDraft(request); var result = service.findBescheidDraft(request);
...@@ -144,10 +173,10 @@ class VorgangAttachedItemRemoteServiceTest { ...@@ -144,10 +173,10 @@ class VorgangAttachedItemRemoteServiceTest {
@Test @Test
void shouldReturnLastBescheid() { void shouldReturnLastBescheid() {
var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of( var item1 = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(
BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01", BescheidItem.FIELD_BESCHIEDEN_AM, "2021-01-01")).build();
BescheidItem.FIELD_STATUS, AttachedItemService.BESCHEID_DRAFT_STATUS)).build();
var item2 = BescheidItemTestFactory.create(); var item2 = BescheidItemTestFactory.create();
when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1, item2)); when(bescheidItemMapper.fromFindVorgangAttachedItemResponse(any())).thenReturn(Stream.of(item1, item2));
doReturn(true).when(service).hasStatusDraft(any());
var result = service.findBescheidDraft(request); var result = service.findBescheidDraft(request);
...@@ -191,6 +220,30 @@ class VorgangAttachedItemRemoteServiceTest { ...@@ -191,6 +220,30 @@ class VorgangAttachedItemRemoteServiceTest {
} }
} }
@Nested
class TestHasStatusDraft {
@Test
void shouldReturnTrueIfDraft() {
var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.DRAFT.name()))
.build();
var result = service.hasStatusDraft(item);
assertThat(result).isTrue();
}
@Test
void shouldReturnFalseIfNotDraft() {
var item = BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, BescheidItem.Status.BESCHEID.name()))
.build();
var result = service.hasStatusDraft(item);
assertThat(result).isFalse();
}
}
@Nested @Nested
class TestGetBescheid { class TestGetBescheid {
......
...@@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test; ...@@ -35,6 +35,7 @@ import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import org.springframework.web.server.ResponseStatusException;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
...@@ -42,7 +43,9 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper; ...@@ -42,7 +43,9 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.apilib.common.datatypes.GenericId;
import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.attacheditem.BescheidItem; import de.ozgcloud.bescheid.attacheditem.BescheidItem;
import de.ozgcloud.bescheid.attacheditem.BescheidItemTestFactory;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandTestFactory; import de.ozgcloud.command.CommandTestFactory;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
...@@ -60,6 +63,8 @@ class DocumentServiceTest { ...@@ -60,6 +63,8 @@ class DocumentServiceTest {
private OzgCloudCommandService commandService; private OzgCloudCommandService commandService;
@Mock @Mock
private CommandMapper commandMapper; private CommandMapper commandMapper;
@Mock
private AttachedItemService attachedItemService;
private Command command = CommandTestFactory.createBuilder() private Command command = CommandTestFactory.createBuilder()
.relationId(RELATION_ID) .relationId(RELATION_ID)
...@@ -76,6 +81,14 @@ class DocumentServiceTest { ...@@ -76,6 +81,14 @@ class DocumentServiceTest {
@BeforeEach @BeforeEach
void init() { void init() {
when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand); when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand);
doNothing().when(service).validateBescheidItem(any());
}
@Test
void shouldCallValidateBescheidItem() {
service.createBescheidDocument(command);
verify(service).validateBescheidItem(RELATION_ID);
} }
@Test @Test
...@@ -104,6 +117,44 @@ class DocumentServiceTest { ...@@ -104,6 +117,44 @@ class DocumentServiceTest {
} }
} }
@Nested
class TestValidateBescheidItem {
@Test
void shouldCallGetBescheidItem() {
when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create());
validateBescheidItem();
verify(attachedItemService).getBescheidItem(BescheidItemTestFactory.ID);
}
@Test
void shouldThrowExceptionWhenNoBescheidDraft() {
when(attachedItemService.getBescheidItem(any())).thenThrow(ResponseStatusException.class);
assertThrows(ResponseStatusException.class, this::validateBescheidItem);
}
@Test
void shouldNotThrowExceptionIfNotDraft() {
when(attachedItemService.getBescheidItem(any())).thenReturn(
BescheidItemTestFactory.createBuilder().bescheidData(Map.of(BescheidItem.FIELD_STATUS, "not-draft")).build());
assertThrows(TechnicalException.class, this::validateBescheidItem);
}
@Test
void shouldValidateBescheidItem() {
when(attachedItemService.getBescheidItem(any())).thenReturn(BescheidItemTestFactory.create());
assertDoesNotThrow(this::validateBescheidItem);
}
void validateBescheidItem() {
service.validateBescheidItem(BescheidItemTestFactory.ID);
}
}
@Nested @Nested
class TestBuildCreateDocumentOzgCommand { class TestBuildCreateDocumentOzgCommand {
...@@ -135,7 +186,7 @@ class DocumentServiceTest { ...@@ -135,7 +186,7 @@ class DocumentServiceTest {
void shouldCallRelationIdMapper() { void shouldCallRelationIdMapper() {
service.buildCreateDocumentOzgCommand(command); service.buildCreateDocumentOzgCommand(command);
verify(commandMapper).mapRelationId(RELATION_ID); verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID);
} }
@Test @Test
......
...@@ -24,87 +24,126 @@ ...@@ -24,87 +24,126 @@
package de.ozgcloud.document; package de.ozgcloud.document;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.awaitility.Awaitility.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.test.annotation.DirtiesContext;
import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.common.callcontext.UserProfile;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEventTestFactory; import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandTestFactory; import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.common.test.ITCase; import de.ozgcloud.common.test.DataITCase;
import de.ozgcloud.vorgang.VorgangManagerServerApplication;
@SpringBootTest(classes = DocumentTestApplication.class) import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
@ITCase import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
import de.ozgcloud.vorgang.command.CommandTestFactory;
@SpringBootTest(classes = VorgangManagerServerApplication.class, properties = {
"grpc.server.inProcessName=test",
"grpc.server.port=-1",
"grpc.client.ozgcloud-command-manager.address=in-process:test",
"grpc.client.vorgang-manager.address=in-process:test"
})
@DataITCase
@DirtiesContext
class DocumentEventListenerITCase { class DocumentEventListenerITCase {
@Spy private static final String FILE_ID = "file-id";
@Autowired @Autowired
private ApplicationEventPublisher eventPublisher; private ApplicationEventPublisher eventPublisher;
@SpyBean @SpyBean
private DocumentEventListener documentEventListener; private DocumentEventListener eventListener;
@Autowired
private CommandMapper mapper;
@Autowired
private MongoOperations mongoOperations;
@MockBean @MockBean
private OzgCloudCommandService ozgCloudCommandService; private CurrentUserService currentUserService;
@MockBean
private CommandMapper commandMapper;
@MockBean
private CurrentUserService userService;
@Mock @Mock
private UserProfile userProfile; private CallContextUser callContextUser;
@Captor
private ArgumentCaptor<BescheidDocumentCreatedEvent> bescheidDocumentCreatedEventCaptor;
@Captor
private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
@BeforeEach @BeforeEach
void init() { void init() {
when(userService.getUserProfile()).thenReturn(userProfile); mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
when(currentUserService.getUser()).thenReturn(callContextUser);
} }
@Nested @Test
class TestCreateBescheidDocument { void shouldCreateDocument() {
var bescheidItem = mongoOperations.save(createBescheidItem("DRAFT"));
var command = createCommand(bescheidItem.getId());
private static final String CREATED_RESOURCE_ID = "created-resource-id"; eventPublisher.publishEvent(new CommandCreatedEvent(command));
@Mock assertThat(loadBescheidDocument()).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID);
private OzgCloudCommand executedCommand; }
@Captor @Test
private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor; void shouldFailWhenNoBescheidFound() {
var command = createCommand("non-existing-id");
private Command command = CommandTestFactory.createBuilder() eventPublisher.publishEvent(new CommandCreatedEvent(command));
.order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER)
.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, "file-id")) await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
.build(); verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture());
assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
});
}
@Test @Test
void shouldPublishBescheidDocumentCreatedEvent() { void shouldFailWhenNotDraft() {
when(executedCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE_ID); var bescheidItem = mongoOperations.save(createBescheidItem("BESCHEID"));
when(ozgCloudCommandService.createAndWaitUntilDone(any())).thenReturn(executedCommand); var command = createCommand(bescheidItem.getId());
eventPublisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); eventPublisher.publishEvent(new CommandCreatedEvent(command));
verify(documentEventListener, timeout(60000)).publishEvent(documentCreatedEventCaptor.capture()); await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
assertThat(documentCreatedEventCaptor.getValue()).satisfies(event -> { verify(eventListener, timeout(5000)).publishEvent(commandFailedEventCaptor.capture());
assertThat(event.getCommand()).isEqualTo(command); assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId());
assertThat(event.getCreatedResource()).isEqualTo(CREATED_RESOURCE_ID);
}); });
} }
private VorgangAttachedItem createBescheidItem(String status) {
return VorgangAttachedItemTestFactory.createBuilder().id(null).version(0)
.item(Map.of("status", status))
.build();
}
private Map<String, Object> loadBescheidDocument() {
verify(eventListener, timeout(5000)).publishEvent(bescheidDocumentCreatedEventCaptor.capture());
var bescheidDocumentId = bescheidDocumentCreatedEventCaptor.getValue().getCreatedResource();
return mongoOperations.findById(bescheidDocumentId, VorgangAttachedItem.class).getItem();
}
private Command createCommand(String relationId) {
return CommandTestFactory.createBuilder()
.relationId(relationId)
.order(DocumentEventListener.CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER)
.bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID))
.build();
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment