diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 601a3a2355a876358628c8def1f027f52f90aa24..79834a9e3ffd33f6befb3148c3305175b2c758ef 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -15,7 +15,7 @@ <version>1.8.0-SNAPSHOT</version> <properties> - <vorgang-manager.version>2.2.1</vorgang-manager.version> + <vorgang-manager.version>2.4.0-SNAPSHOT</vorgang-manager.version> <api-lib.version>0.5.0</api-lib.version> </properties> @@ -57,6 +57,10 @@ <groupId>net.devh</groupId> <artifactId>grpc-client-spring-boot-starter</artifactId> </dependency> + <dependency> + <groupId>net.devh</groupId> + <artifactId>grpc-server-spring-boot-starter</artifactId> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java new file mode 100644 index 0000000000000000000000000000000000000000..d4618c11c3619087bce4460850047e3f476fa530 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java @@ -0,0 +1,30 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import net.devh.boot.grpc.server.service.GrpcService; + +@GrpcService +@RequiredArgsConstructor +class BescheidGrpcService extends BescheidServiceImplBase { + + private final GrpcBescheidMapper mapper; + + @Override + public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) { + // dummy implementation + // TODO OZG-5099 du real implementation - load Bescheid + var bescheid = Bescheid.builder().build(); + + responseObserver.onNext(buildResponse(bescheid)); + responseObserver.onCompleted(); + + } + + GrpcGetBescheidDraftResponse buildResponse(Bescheid bescheid) { + return GrpcGetBescheidDraftResponse.newBuilder() + .setBescheid(mapper.fromBescheid(bescheid)) + .build(); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..371bf37a8d7262e6e46857b6b4b6853a7a033194 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java @@ -0,0 +1,36 @@ +package de.ozgcloud.bescheid; + +import java.util.Optional; + +import org.apache.commons.lang3.StringUtils; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper +public interface GrpcBescheidMapper { + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "bescheidDocument", ignore = true) + @Mapping(target = "bescheidDocumentBytes", ignore = true) + @Mapping(target = "beschiedenAm", ignore = true) + @Mapping(target = "beschiedenAmBytes", ignore = true) + @Mapping(target = "nachrichtSubject", ignore = true) + @Mapping(target = "nachrichtSubjectBytes", ignore = true) + @Mapping(target = "nachrichtTextBytes", ignore = true) + @Mapping(target = "sendBy", ignore = true) + @Mapping(target = "sendByBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "attachmentsList", ignore = true) + + @Mapping(target = "nachrichtText", source = "nachrichtText") + @Mapping(target = "bewilligt", source = "genehmigt") + GrpcBescheid fromBescheid(Bescheid bescheid); + + default String fromOptional(Optional<String> optionalString) { + return optionalString.orElse(StringUtils.EMPTY); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..57c05af52506e9d033711af9fc4744d88ba1438e --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java @@ -0,0 +1,80 @@ +package de.ozgcloud.bescheid; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import io.grpc.stub.StreamObserver; + +class BescheidGrpcServiceTest { + + @Spy + @InjectMocks + private BescheidGrpcService service; + + @Mock + private GrpcBescheidMapper mapper; + + @BeforeEach + void initMapperMock() { + when(mapper.fromBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); + } + + @Nested + class TestGetBescheidDraft { + + @Mock + private GrpcGetBescheidDraftRequest request; + @Mock + private StreamObserver<GrpcGetBescheidDraftResponse> responseObserver; + + private static final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponse.newBuilder().build(); + + @BeforeEach + void initMocks() { + when(service.buildResponse(any())).thenReturn(response); + } + + @Test + void shouldBuildResponse() { + service.getBescheidDraft(request, responseObserver); + + verify(service).buildResponse(any()); + } + + @Test + void shouldCallNext() { + service.getBescheidDraft(request, responseObserver); + + verify(responseObserver).onNext(response); + } + + @Test + void shouldCallCompleted() { + service.getBescheidDraft(request, responseObserver); + + verify(responseObserver).onCompleted(); + } + + } + + @Nested + class TestBuildResponse { + + @Test + void shouldCallMapper() { + Bescheid bescheid = BescheidTestFactory.create(); + + service.buildResponse(bescheid); + + verify(mapper).fromBescheid(bescheid); + } + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f58b9c2405f1d1ad4cc57c38425d800b08fe7bda --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidMapperTest.java @@ -0,0 +1,24 @@ +package de.ozgcloud.bescheid; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +class GrpcBescheidMapperTest { + + private GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class); + + @Nested + class TestFromBescheid { + + @Test + void shouldMapAllFields() { + var result = mapper.fromBescheid(BescheidTestFactory.create()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidTestFactory.create()); + } + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..1b348feafd596790ed9a3a9138d512aa93bd57a9 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.bescheid; + +class GrpcBescheidTestFactory { + + public static GrpcBescheid create() { + return createBuilder().build(); + } + + public static GrpcBescheid.Builder createBuilder() { + return GrpcBescheid.newBuilder() + .setBewilligt(true) + .setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT); + } +}