diff --git a/Jenkinsfile b/Jenkinsfile index 68d5ff909746390e066b0536415c8385e7c263c4..b76916e3910566d713e0e2f32087aa3349dd9dc5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -57,15 +57,15 @@ pipeline { steps { script { FAILED_STAGE=env.STAGE_NAME - JAR_TAG = getPomVersion('pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT") + VORGANG_MANAGER_TAG = getPomVersion('pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT"); BESCHEID_MANAGER_TAG = getPomVersion('bescheid-manager/pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT") - updateBescheidManagerDependencyVersion(BESCHEID_MANAGER_TAG) + updateDependencyVersions(BESCHEID_MANAGER_TAG, VORGANG_MANAGER_TAG) } configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${JAR_TAG} -DprocessAllModules=true" + sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${VORGANG_MANAGER_TAG} -DprocessAllModules=true -X" dir('bescheid-manager') { - sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${BESCHEID_MANAGER_TAG}" + sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${BESCHEID_MANAGER_TAG} -X" } } } @@ -297,11 +297,16 @@ String getPomVersion(String pomFile){ return pom.version } -void updateBescheidManagerDependencyVersion(String snapshotVersion) { +void updateDependencyVersions(String bescheidManagerSnapshotVersion, String vorgangManagerSnapshotVersion) { def vorgangManagerServerPom = readMavenPom file: 'vorgang-manager-server/pom.xml' if ( vorgangManagerServerPom.properties['bescheid-manager.version'] ==~ SNAPSHOT_REGEX ) { - vorgangManagerServerPom.properties['bescheid-manager.version'] = snapshotVersion + vorgangManagerServerPom.properties['bescheid-manager.version'] = bescheidManagerSnapshotVersion writeMavenPom model: vorgangManagerServerPom, file: 'vorgang-manager-server/pom.xml' + } + def bescheidManagerServerPom = readMavenPom file: 'bescheid-manager/pom.xml' + if ( bescheidManagerServerPom.properties['vorgang-manager.version'] ==~ SNAPSHOT_REGEX ) { + bescheidManagerServerPom.properties['vorgang-manager.version'] = vorgangManagerSnapshotVersion + writeMavenPom model: bescheidManagerServerPom, file: 'bescheid-manager/pom.xml' } } diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 1ad2f48abe90b5e1adb825e420486d79b16df89c..e3189111b7a0c25fa59215dfbcbfebce985fd65b 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -15,7 +15,7 @@ <version>1.17.0-SNAPSHOT</version> <properties> - <vorgang-manager.version>2.9.0</vorgang-manager.version> + <vorgang-manager.version>2.13.0-SNAPSHOT</vorgang-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version> <api-lib.version>0.11.0</api-lib.version> </properties> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java index 1b6db89f94dfb7bb2162a66fa694c598f9a6b20c..d181389e9cba0ebc0b7fa4f0ae3eecf9a1df3e3b 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java @@ -1,44 +1,46 @@ package de.ozgcloud.bescheid; -import java.io.File; +import java.time.LocalDate; import java.util.List; import java.util.Optional; -import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.common.binaryfile.FileId; import lombok.Builder; import lombok.Getter; import lombok.Singular; -import lombok.With; -@Builder(toBuilder = true) +@Builder @Getter public class Bescheid { - public static final String FIELD_STATUS = "status"; - public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm"; + public static final String FIELD_VORGANG_ID = "vorgangId"; + public static final String FIELD_CREATED_BY = "createdBy"; + public static final String FIELD_BEWILLIGT = "bewilligt"; + public static final String FIELD_STATUS = "status"; public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument"; - public static final String FIELD_ATTACHMENTS = "attachments"; + public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm"; public static final String FIELD_SEND_BY = "sendBy"; + public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject"; + public static final String FIELD_ATTACHMENTS = "attachments"; public static final String FIELD_SENT_INFO = "sentInfo"; - public static final String FIELD_SENT_BY = "sentBy"; - public static final String FIELD_SENT_AT = "sentAt"; - private VorgangId vorgangId; + private BescheidId id; + private long version; - private boolean genehmigt; + private VorgangId vorgangId; private UserId createdBy; - private String bescheidFileName; - private File bescheidFile; - @With - private FileId bescheidFileId; - private String contentType; - private long size; + private boolean bewilligt; + private Status status; + private FileId bescheidDocument; + private LocalDate beschiedenAm; + private SendBy sendBy; + + private SentInfo sentInfo; @Builder.Default private Optional<String> nachrichtSubject = Optional.empty(); @@ -48,8 +50,6 @@ public class Bescheid { @Singular private List<FileId> attachments; - private Vorgang.ServiceKonto serviceKonto; - public enum Status { DRAFT, SENT; @@ -74,4 +74,4 @@ public class Bescheid { } } -} +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java index ada68e5d7b3dcc83dd1aeacc8998ba32b8702820..6e6cdaf0d38f5e31d8ec32b6e6353ceb23b357ee 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -40,7 +40,6 @@ import org.springframework.security.core.context.SecurityContext; import org.springframework.stereotype.Component; import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.user.UserProfileService; @@ -49,6 +48,7 @@ import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.BescheidDocumentCreatedEvent; import de.ozgcloud.document.Document; @@ -147,7 +147,7 @@ class BescheidEventListener { eventPublisher.publishEvent(new BescheidDocumentCreatedEvent(command, bescheidDocument)); } - Bescheid doCreateBescheidBiz(@NonNull Command command) { + BescheidResponse doCreateBescheidBiz(@NonNull Command command) { var bescheid = service.createBescheid(createRequest(command)); return fileService.uploadBescheidFile(bescheid); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java index d7d033e480e6259f3a08eeda83fa4e7548d23b66..a4636f96286f70d63b1edc7c45ea6d317744cc2f 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java @@ -1,12 +1,9 @@ package de.ozgcloud.bescheid; -import java.util.Collection; -import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemMapper; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.vorgang.VorgangId; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; @@ -16,45 +13,44 @@ import net.devh.boot.grpc.server.service.GrpcService; @RequiredArgsConstructor class BescheidGrpcService extends BescheidServiceImplBase { - private final AttachedItemService attachedItemService; - private final AttachedItemMapper attachedItemMapper; - private final BescheidService bescheidService; - private final GrpcBescheidMapper grpcBescheidMapper; + private final BescheidService service; + private final BescheidMapper mapper; @Override public void getBescheidDraft(GrpcGetBescheidDraftRequest request, StreamObserver<GrpcGetBescheidDraftResponse> responseObserver) { - var response = attachedItemService.findBescheidItem(request.getVorgangId()) - .map(this::buildGetBescheidDraftResponse) - .orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance); + var bescheidDraft = service.findDraft(request.getVorgangId()); - responseObserver.onNext(response); + responseObserver.onNext(buildGetBescheidDraftResponse(bescheidDraft)); responseObserver.onCompleted(); - } - GrpcGetBescheidDraftResponse buildGetBescheidDraftResponse(AttachedItem bescheidItem) { - return GrpcGetBescheidDraftResponse.newBuilder() - .setBescheid(attachedItemMapper.toBescheid(bescheidItem)) - .build(); + private GrpcGetBescheidDraftResponse buildGetBescheidDraftResponse(Optional<Bescheid> bescheidDraft) { + return bescheidDraft.map(mapper::toGetBescheidDraftResponse).orElseGet(GrpcGetBescheidDraftResponse::getDefaultInstance); } @Override public void getConfig(GrpcBescheidManagerConfigRequest request, StreamObserver<GrpcBescheidManagerConfigResponse> responseObserver) { - responseObserver.onNext(grpcBescheidMapper.fromBescheidManagerConfig(bescheidService.getConfig())); + responseObserver.onNext(mapper.fromBescheidManagerConfig(service.getConfig())); responseObserver.onCompleted(); } @Override public void getAll(GrpcGetAllBescheidRequest request, StreamObserver<GrpcGetAllBescheidResponse> responseObserver) { - responseObserver.onNext(buildGetAllBescheidResponse(attachedItemService.findAllBescheid(VorgangId.from(request.getVorgangId())))); + var bescheide = service.findAll(VorgangId.from(request.getVorgangId())); + + responseObserver.onNext(buildGetAllBescheidResponse(bescheide)); responseObserver.onCompleted(); } - GrpcGetAllBescheidResponse buildGetAllBescheidResponse(Collection<AttachedItem> bescheidItems) { - return GrpcGetAllBescheidResponse.newBuilder().addAllBescheid(mapBescheid(bescheidItems)).build(); + GrpcGetAllBescheidResponse buildGetAllBescheidResponse(Stream<Bescheid> bescheidItems) { + return GrpcGetAllBescheidResponse.newBuilder().addAllBescheid(bescheidItems.map(mapper::toBescheid).toList()).build(); } - List<GrpcBescheid> mapBescheid(Collection<AttachedItem> bescheidItems) { - return bescheidItems.stream().map(attachedItemMapper::toBescheid).toList(); + @Override + public void getBescheid(GrpcGetBescheidRequest request, StreamObserver<GrpcGetBescheidResponse> responseObserver) { + var bescheid = service.getBescheid(request.getId()); + + responseObserver.onNext(mapper.toGetBescheidResponse(bescheid)); + responseObserver.onCompleted(); } -} +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java new file mode 100644 index 0000000000000000000000000000000000000000..4c0f60434f23ebdc201ed906cdc5eb80f9a363cd --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java @@ -0,0 +1,14 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.common.datatype.StringBasedValue; + +public class BescheidId extends StringBasedValue { + + BescheidId(String id) { + super(id); + } + + public static BescheidId from(String id) { + return new BescheidId(id); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..8abe425a3a1187b737bb41c851c1578a8db3e12c --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java @@ -0,0 +1,148 @@ +package de.ozgcloud.bescheid; + +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.mapstruct.CollectionMappingStrategy; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.ReportingPolicy; + +import de.ozgcloud.bescheid.Bescheid.SendBy; +import de.ozgcloud.bescheid.Bescheid.Status; +import de.ozgcloud.bescheid.vorgang.VorgangId; +import de.ozgcloud.common.attached_item.AttachedItem; +import de.ozgcloud.common.binaryfile.FileId; + +@Mapper(uses = { SentInfoMapper.class }, // + unmappedTargetPolicy = ReportingPolicy.WARN, // + collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // + nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) // +public interface BescheidMapper { + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeSentInfo", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "bescheidDocumentBytes", ignore = true) + @Mapping(target = "beschiedenAmBytes", ignore = true) + @Mapping(target = "idBytes", ignore = true) + @Mapping(target = "nachrichtSubjectBytes", ignore = true) + @Mapping(target = "nachrichtTextBytes", ignore = true) + @Mapping(target = "sendByBytes", ignore = true) + @Mapping(target = "statusBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "beschiedenAm", source = "beschiedenAm", dateFormat = "yyyy-MM-dd") + @Mapping(target = "nachrichtText", expression = "java(fromOptional(bescheid.getNachrichtText()))") + @Mapping(target = "nachrichtSubject", expression = "java(fromOptional(bescheid.getNachrichtSubject()))") + @Mapping(target = "attachmentsList", source = "attachments") + GrpcBescheid toBescheid(Bescheid bescheid); + + default String toString(FileId fileId) { + return fileId.toString(); + } + + default String toString(BescheidId bescheidId) { + return bescheidId.toString(); + } + + default String fromOptional(Optional<String> optionalString) { + return optionalString.orElse(StringUtils.EMPTY); + } + + default Bescheid mapFromAttachedItem(AttachedItem item) { + var itemMap = item.getItem(); + var builder = Bescheid.builder() + .id(BescheidId.from(item.getId())) + .version(item.getVersion()) + .vorgangId(VorgangId.from(item.getVorgangId())) + .createdBy(UserId.from(MapUtils.getString(itemMap, Bescheid.FIELD_CREATED_BY))) + .bewilligt(MapUtils.getBoolean(itemMap, Bescheid.FIELD_BEWILLIGT)) + .nachrichtText(Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_NACHRICHT_TEXT))) + .nachrichtSubject(Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_NACHRICHT_SUBJECT))) + .status(Status.valueOf(MapUtils.getString(itemMap, Bescheid.FIELD_STATUS))) + .beschiedenAm(LocalDate.parse(MapUtils.getString(itemMap, Bescheid.FIELD_BESCHIEDEN_AM))); + + getBescheidDocument(itemMap).ifPresent(builder::bescheidDocument); + getAttachments(itemMap).ifPresent(builder::attachments); + getSendBy(itemMap).ifPresent(builder::sendBy); + getSentInfo(itemMap).ifPresent(builder::sentInfo); + + return builder.build(); + } + + default Optional<FileId> getBescheidDocument(Map<String, Object> itemMap) { + return Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_BESCHEID_DOCUMENT)).map(FileId::from); + } + + default Optional<List<FileId>> getAttachments(Map<String, Object> itemMap) { + return mapToAttachments(MapUtils.getObject(itemMap, Bescheid.FIELD_ATTACHMENTS)); + } + + default Optional<List<FileId>> mapToAttachments(Object attachments) { + if (Objects.isNull(attachments) || StringUtils.isEmpty(String.valueOf(attachments))) { + return Optional.empty(); + } + if (attachments instanceof Collection<?> attachmentList) { + return Optional.of(attachmentList.stream().map(String::valueOf).map(FileId::from).toList()); + } + return Optional.of(Collections.singletonList(FileId.from((String) attachments))); + } + + default Optional<SendBy> getSendBy(Map<String, Object> itemMap) { + return Optional.ofNullable(MapUtils.getString(itemMap, Bescheid.FIELD_SEND_BY)).map(SendBy::valueOf); + } + + default Optional<SentInfo> getSentInfo(Map<String, Object> itemMap) { + return Optional.ofNullable(MapUtils.getMap(itemMap, Bescheid.FIELD_SENT_INFO)).map(this::toSentInfo); + } + + default SentInfo toSentInfo(Map<String, Object> sentInfoMap) { + return SentInfo.builder() + .sentBy(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_BY)) + .sentAt(ZonedDateTime.parse(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_AT))) + .build(); + } + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeFeatures", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "javaVersionBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "versionBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcBescheidManagerConfigResponse fromBescheidManagerConfig(BescheidManagerConfig bescheidManagerConfig); + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeBescheid", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcGetBescheidResponse toGetBescheidResponse(Bescheid bescheid); + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeBescheid", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcGetBescheidDraftResponse toGetBescheidDraftResponse(Bescheid bescheid); +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java index 61d871a9202649eb02dc1208b9e2a08127cdebc1..3110e878975886da00f8989e378afc465415f67c 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java @@ -4,5 +4,5 @@ import de.ozgcloud.bescheid.vorgang.Vorgang; public interface BescheidRemoteService { - Bescheid create(BescheidRequest request, Vorgang vorgang); + BescheidResponse create(BescheidRequest request, Vorgang vorgang); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..234aec472536d4d2b549abda4606d2368f2bbd74 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java @@ -0,0 +1,40 @@ +package de.ozgcloud.bescheid; + +import java.io.File; +import java.util.List; +import java.util.Optional; + +import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; +import de.ozgcloud.bescheid.vorgang.VorgangId; +import de.ozgcloud.common.binaryfile.FileId; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; +import lombok.With; + +@Builder(toBuilder = true) +@Getter +public class BescheidResponse { + + private VorgangId vorgangId; + + private boolean bewilligt; + private UserId createdBy; + + private String bescheidFileName; + private File bescheidFile; + @With + private FileId bescheidFileId; + private String contentType; + private long size; + + @Builder.Default + private Optional<String> nachrichtSubject = Optional.empty(); + @Builder.Default + private Optional<String> nachrichtText = Optional.empty(); + + @Singular + private List<FileId> attachments; + + private ServiceKonto serviceKonto; +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java index fb010f5dff17f3406354455944fab3a4f168be2c..372e07eb95400196f7cb1d540716314f5994ef44 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -22,14 +22,14 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attributes.ClientAttributeService; import de.ozgcloud.bescheid.common.user.UserProfileService; import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangService; import de.ozgcloud.command.Command; +import de.ozgcloud.common.attached_item.AttachedItem; +import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.Document; @@ -64,6 +64,7 @@ class BescheidService { private final ClientAttributeService bescheidClientAttributeService; private final BuildProperties buildProperties; private final Optional<BescheidRemoteService> remoteService; + private final BescheidMapper mapper; @PostConstruct void logStatus() { @@ -72,20 +73,28 @@ class BescheidService { () -> LOG.info("No BescheidRemoteService configured - Bescheid creation is not possible.")); } - public Bescheid createBescheid(BescheidRequest request) { + public Optional<Bescheid> findDraft(String vorgangId) { + return attachedItemService.findBescheidItem(vorgangId).map(mapper::mapFromAttachedItem); + } + + public Stream<Bescheid> findAll(VorgangId vorgangId) { + return attachedItemService.findAllBescheid(vorgangId).stream().map(mapper::mapFromAttachedItem); + } + + public BescheidResponse createBescheid(BescheidRequest request) { checkRemoteService(); return doCreateBescheid(request); } - private Bescheid doCreateBescheid(BescheidRequest request) { + private BescheidResponse doCreateBescheid(BescheidRequest request) { var vorgang = vorgangService.getById(request.getVorgangId()); return remoteService.map(service -> service.create(request, vorgang)) .map(bescheid -> updateBescheid(bescheid, vorgang)) .orElseThrow(() -> new TechnicalException(ERROR_MESSAGE_NO_SERVICE)); } - private Bescheid updateBescheid(Bescheid bescheid, Vorgang vorgang) { + private BescheidResponse updateBescheid(BescheidResponse bescheid, Vorgang vorgang) { return bescheid.toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()).build(); } @@ -106,7 +115,8 @@ class BescheidService { validateBescheid(bescheidItem, version); var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); if (Bescheid.SendBy.MANUAL.notValue(sendBy)) { - throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL)); + throw new TechnicalException( + "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL)); } } @@ -123,7 +133,8 @@ class BescheidService { validateBescheid(bescheidItem, version); var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) { - throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT)); + throw new TechnicalException( + "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT)); } if (getNachrichtSubject(bescheidItem).isEmpty()) { throw new TechnicalException("Bescheid has no nachricht subject"); @@ -147,11 +158,13 @@ class BescheidService { } Optional<String> getNachrichtSubject(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull); + return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT)) + .map(StringUtils::trimToNull); } Optional<String> getNachrichtText(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT)).map(StringUtils::trimToNull); + return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT)) + .map(StringUtils::trimToNull); } String getUserId() { @@ -193,8 +206,8 @@ class BescheidService { Map<String, Object> buildSentInfoMap(String userId) { return Map.of( - Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), - Bescheid.FIELD_SENT_BY, userId); + SentInfo.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), + SentInfo.FIELD_SENT_BY, userId); } OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) { @@ -292,4 +305,8 @@ class BescheidService { .canCreateBescheidDocument(remoteService.isPresent()) .build(); } + + public Bescheid getBescheid(String id) { + return mapper.mapFromAttachedItem(attachedItemService.getItem(id)); + } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java deleted file mode 100644 index 7a8ee52f6ed2cee71cf8bffd38763b7fa9e58b48..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/GrpcBescheidMapper.java +++ /dev/null @@ -1,46 +0,0 @@ -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); - } - - @Mapping(target = "versionBytes", ignore = true) - @Mapping(target = "unknownFields", ignore = true) - @Mapping(target = "mergeUnknownFields", ignore = true) - @Mapping(target = "mergeFrom", ignore = true) - @Mapping(target = "mergeFeatures", ignore = true) - @Mapping(target = "javaVersionBytes", ignore = true) - @Mapping(target = "clearOneof", ignore = true) - @Mapping(target = "clearField", ignore = true) - GrpcBescheidManagerConfigResponse fromBescheidManagerConfig(BescheidManagerConfig bescheidManagerConfig); -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java index b65c69e4715a8704ae2275299a2f398d64b95a93..a3e1fb0389b3612d212fa0678aedfd11ecf950e4 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java @@ -32,6 +32,9 @@ import lombok.Getter; @Getter public class SentInfo { + public static final String FIELD_SENT_BY = "sentBy"; + public static final String FIELD_SENT_AT = "sentAt"; + private String sentBy; private ZonedDateTime sentAt; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..a16e4a4aa3a7717c0c74905602962de176537df4 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java @@ -0,0 +1,21 @@ +package de.ozgcloud.bescheid; + +import org.mapstruct.CollectionMappingStrategy; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; + +@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) +public interface SentInfoMapper { + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "sentAtBytes", ignore = true) + @Mapping(target = "sentByBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "sentAt", source = "sentAt", dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'") + GrpcSentInfo mapTo(SentInfo sentInfo); +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java deleted file mode 100644 index 9e546d2b97dc8edaefd121f3a2bad3502b386d59..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.bescheid.attacheditem; - -import static java.util.Objects.*; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.mapstruct.Mapper; - -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.GrpcBescheid; -import de.ozgcloud.bescheid.GrpcSentInfo; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - -@Mapper(uses = { GrpcObjectMapper.class }) -public interface AttachedItemMapper { - - AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item); - - default GrpcBescheid toBescheid(AttachedItem bescheidItem) { - var bescheidBuilder = GrpcBescheid.newBuilder().setVersion(bescheidItem.getVersion()); - Optional.ofNullable(bescheidItem.getId()).ifPresent(bescheidBuilder::setId); - var bescheidData = bescheidItem.getItem(); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_BESCHIEDEN_AM)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setBeschiedenAm); - Optional.ofNullable(MapUtils.getBoolean(bescheidData, Bescheid.FIELD_BEWILLIGT)).ifPresent(bescheidBuilder::setBewilligt); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_BESCHEID_DOCUMENT)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setBescheidDocument); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_SEND_BY)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setSendBy); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_NACHRICHT_TEXT)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setNachrichtText); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_NACHRICHT_SUBJECT)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setNachrichtSubject); - Optional.ofNullable(MapUtils.getString(bescheidData, Bescheid.FIELD_STATUS)).map(StringUtils::trimToNull) - .ifPresent(bescheidBuilder::setStatus); - Optional.ofNullable(bescheidData.get(Bescheid.FIELD_ATTACHMENTS)).map(this::toAttachments).ifPresent(bescheidBuilder::addAllAttachments); - Optional.ofNullable(MapUtils.getMap(bescheidData, Bescheid.FIELD_SENT_INFO)).map(this::toSentInfo).ifPresent(bescheidBuilder::setSentInfo); - return bescheidBuilder.build(); - } - - @SuppressWarnings("unchecked") - default Collection<String> toAttachments(Object attachmentsObject) { - if (attachmentsObject instanceof Collection<?> attachments) { - return (Collection<String>) attachments; - } - if (attachmentsObject instanceof String attachment) { - attachment = StringUtils.trimToNull(attachment); - if (nonNull(attachment)) { - return List.of(attachment); - } - } else if (nonNull(attachmentsObject)) { - return List.of(String.valueOf(attachmentsObject)); - } - return null; //NOSONAR - } - - default GrpcSentInfo toSentInfo(Map<String, Object> sentInfoData) { - return GrpcSentInfo.newBuilder() - .setSentBy(MapUtils.getString(sentInfoData, Bescheid.FIELD_SENT_BY)) - .setSentAt(MapUtils.getString(sentInfoData, Bescheid.FIELD_SENT_AT)).build(); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java deleted file mode 100644 index d8d3d59256d47d46f24f0c6521ff35d74367b220..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/Utils.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.bescheid.attacheditem; - -import org.apache.commons.collections.MapUtils; - -import de.ozgcloud.command.Command; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class Utils { - - public static String extractClient(Command command) { - return MapUtils.getString(command.getBodyObject(), AttachedItem.PROPERTY_CLIENT); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java index 8b65837276138c6f93a0b2b9d351a4f0c9db78f4..08cac0cfb0bb41e32c4c71b4ad88556326607c4f 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service; import com.google.protobuf.ByteString; -import de.ozgcloud.bescheid.Bescheid; +import de.ozgcloud.bescheid.BescheidResponse; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; @@ -38,7 +38,7 @@ class BinaryFileRemoteService { @GrpcClient("vorgang-manager") private BinaryFileServiceStub binaryFileRemoteStub; - public FileId uploadBescheidFile(@NonNull Bescheid bescheid) { + public FileId uploadBescheidFile(@NonNull BescheidResponse bescheid) { try (var in = openFile(bescheid.getBescheidFile())) { var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, in, this::buildCallStreamObserver) @@ -59,7 +59,7 @@ class BinaryFileRemoteService { } } - private GrpcUploadBinaryFileRequest buildMetaDataRequest(Bescheid bescheid) { + private GrpcUploadBinaryFileRequest buildMetaDataRequest(BescheidResponse bescheid) { return GrpcUploadBinaryFileRequest.newBuilder() .setMetadata(GrpcUploadBinaryFileMetaData.newBuilder() // TODO remove context - check why needed! diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java index 68f3a7b068e819c3a517535216cafe40a87d729a..11ddd6e95554acaf4a7839057a92489f373fa1c2 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java @@ -3,7 +3,7 @@ package de.ozgcloud.bescheid.binaryfile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.ozgcloud.bescheid.Bescheid; +import de.ozgcloud.bescheid.BescheidResponse; import lombok.NonNull; @Service @@ -12,7 +12,7 @@ public class BinaryFileService { @Autowired private BinaryFileRemoteService remoteService; - public Bescheid uploadBescheidFile(@NonNull Bescheid bescheid) { + public BescheidResponse uploadBescheidFile(@NonNull BescheidResponse bescheid) { var fileId = remoteService.uploadBescheidFile(bescheid); return bescheid.withBescheidFileId(fileId); diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java index 7a1152e6663a98cb91510d776b920aa3d12fa725..ef9589219948ef6c2db265e1d6653b1f06403ba3 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Service; import com.google.common.net.MediaType; -import de.ozgcloud.bescheid.Bescheid; +import de.ozgcloud.bescheid.BescheidResponse; import de.ozgcloud.bescheid.BescheidRemoteService; import de.ozgcloud.bescheid.BescheidRequest; import de.ozgcloud.bescheid.vorgang.Vorgang; @@ -21,10 +21,10 @@ class DummyBescheidRemoteService implements BescheidRemoteService { private static final String DUMMY_BESCHEID_CONTENT_TYPE = MediaType.PDF.toString(); @Override - public Bescheid create(BescheidRequest request, Vorgang vorgang) { + public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { var file = TempFileUtils.writeTmpFile(this.getClass().getClassLoader().getResourceAsStream(DUMMY_BESCHEID_FILE_NAME)); - return Bescheid.builder() + return BescheidResponse.builder() .bescheidFile(file) .bescheidFileName(DUMMY_BESCHEID_FILE_NAME) .contentType(DUMMY_BESCHEID_CONTENT_TYPE) diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java index 651017599265902ee54a2e1c153ecfe5dd744f57..b93412e26623f5b7f04b7f96a1e38a51b56018d2 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java @@ -11,7 +11,6 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.http.HttpStatusCode; @@ -28,7 +27,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import de.ozgcloud.bescheid.Bescheid; +import de.ozgcloud.bescheid.BescheidResponse; import de.ozgcloud.bescheid.BescheidRemoteService; import de.ozgcloud.bescheid.BescheidRequest; import de.ozgcloud.bescheid.common.user.UserProfile; @@ -45,11 +44,13 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import reactor.core.publisher.Mono; @Log4j2 @Service +@RequiredArgsConstructor @ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { @@ -57,20 +58,18 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { private static final String FILE_TYPE_XML = "XML"; static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR - static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; //NOSONAR + static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; // NOSONAR @SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8; - @Autowired @Qualifier("smartDocuments") - private WebClient smartDocumentsWebClient; + private final WebClient smartDocumentsWebClient; - @Autowired - private SmartDocumentsProperties properties; + private final SmartDocumentsProperties properties; @Override - public Bescheid create(BescheidRequest request, Vorgang vorgang) { + public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { var sdRequest = createRequest(request, vorgang); LOG.debug(() -> buildLogRequest(sdRequest)); @@ -99,16 +98,16 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { } } - Bescheid buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) { + BescheidResponse buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) { var smartDocumentsFile = getSmartDocumentsFile(smartDocumentsResponse); - return Bescheid.builder() + return BescheidResponse.builder() .bescheidFile(smartDocumentsFile.getDocument().getData()) .bescheidFileName(smartDocumentsFile.getFilename()) .size(smartDocumentsFile.getDocument().getData().length()) .contentType(MediaType.APPLICATION_PDF_VALUE) .nachrichtText(getNachrichtText(smartDocumentsResponse)) - .genehmigt(request.isGenehmigt()) + .bewilligt(request.isGenehmigt()) .createdBy(request.getCreateFor().getId()) .vorgangId(request.getVorgangId()) .build(); @@ -199,9 +198,9 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) { return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder() - .templateGroup(properties.getTemplateGroup()) - .template(vorgang.getVorgangName()) - .build()) + .templateGroup(properties.getTemplateGroup()) + .template(vorgang.getVorgangName()) + .build()) .build(); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java similarity index 97% rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java index c3407d72ea4d4a13e26d68571dc329ad174dcdbd..f47223bc22488d80380ad986dd37ebf79e4c27db 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItem.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import java.util.Map; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java similarity index 73% rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java index 27fc9bdb61c5a392ef4f9eca0851082cefa6a66a..73d20952c8b05bf3fa0dd93c8d284c7583c319a5 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/FieldId.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java @@ -21,14 +21,15 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; -import lombok.Builder; -import lombok.Getter; +import org.mapstruct.Mapper; -@Builder -@Getter -class FieldId { +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - private String id; -} +@Mapper(uses = { GrpcObjectMapper.class }) +public interface AttachedItemMapper { + + AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item); +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java similarity index 94% rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java index 24a67a215b953478b6bf2518432c37469eb94e42..551279332894c5c12395a7a43a2a93de52c180dc 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import static java.util.Objects.*; @@ -42,6 +42,7 @@ 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.bescheid.Bescheid; +import de.ozgcloud.bescheid.Bescheid.Status; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidManagerConfiguration; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; @@ -50,9 +51,7 @@ import de.ozgcloud.command.Command; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.Document; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -@Log4j2 @Service @RequiredArgsConstructor public class AttachedItemService { @@ -100,8 +99,10 @@ public class AttachedItemService { void validateSendBy(String sendBy) { if (isUnknownSendByValue(sendBy)) { - var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name).collect(Collectors.joining(",")); - var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy, possibleSendByValues); + var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name) + .collect(Collectors.joining(",")); + var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy, + possibleSendByValues); throw new TechnicalException(message); } } @@ -120,10 +121,12 @@ public class AttachedItemService { var result = new HashMap<String, Object>(); result.put(Bescheid.FIELD_BESCHIEDEN_AM, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM)); result.put(Bescheid.FIELD_BEWILLIGT, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT)); - result.put(Bescheid.FIELD_BESCHEID_DOCUMENT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)); + result.put(Bescheid.FIELD_BESCHEID_DOCUMENT, + MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)); result.put(Bescheid.FIELD_SEND_BY, getSendBy(command.getBodyObject())); result.put(Bescheid.FIELD_NACHRICHT_TEXT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT)); - result.put(Bescheid.FIELD_NACHRICHT_SUBJECT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT)); + result.put(Bescheid.FIELD_NACHRICHT_SUBJECT, + MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT)); result.put(Bescheid.FIELD_ATTACHMENTS, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS)); return result; } @@ -144,7 +147,8 @@ public class AttachedItemService { var itemMap = buildItemMapWithExistingBescheidFields(command); var savedBescheid = getItem(command.getRelationId()); - getNewNachrichtText(savedBescheid, newDocument).ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText)); + getNewNachrichtText(savedBescheid, newDocument) + .ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText)); return itemMap; } @@ -258,7 +262,7 @@ public class AttachedItemService { .build(); } - Map<String, Object> buildItemMap(Bescheid.Status status) { + Map<String, Object> buildItemMap(Status status) { var itemMap = new HashMap<String, Object>(); itemMap.put(Bescheid.FIELD_STATUS, status.name()); return itemMap; @@ -267,4 +271,4 @@ public class AttachedItemService { public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) { return remoteService.findAllBescheid(vorgangId); } -} +} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java similarity index 97% rename from bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java rename to bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java index 418361772a1446dfe7923822906111ae4b5c46a3..6bc59454c9bd380608d7594e82a4df4f48174101 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; -import static de.ozgcloud.bescheid.attacheditem.AttachedItemService.*; +import static de.ozgcloud.common.attached_item.AttachedItemService.*; import java.time.LocalDate; import java.util.Comparator; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java index 41180bab88ef3c302300bd1e51ca34e3ed89619b..a0e8848a34a11b3f1f1a12c961b178563d935647 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java @@ -28,7 +28,7 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.NullValueCheckStrategy; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; +import de.ozgcloud.common.attached_item.AttachedItem; @Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) interface DocumentMapper { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java index a49c8581074b511f05bc5c13b0666933753a457e..0a4d0f0660902d0e74d1b93db4a5ac09d877ddda 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java @@ -40,9 +40,10 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; +import de.ozgcloud.bescheid.BescheidResponse; import de.ozgcloud.command.Command; +import de.ozgcloud.common.attached_item.AttachedItemService; +import de.ozgcloud.common.attached_item.AttachedItem; import de.ozgcloud.common.errorhandling.TechnicalException; @Service @@ -70,7 +71,7 @@ public class DocumentService { return createBescheidDocument(command, buildItemMap(command)); } - public String createBescheidDocument(Command command, Bescheid bescheid) { + public String createBescheidDocument(Command command, BescheidResponse bescheid) { return createBescheidDocument(command, buildItemMap(bescheid)); } @@ -113,7 +114,7 @@ public class DocumentService { return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId); } - Map<String, Object> buildItemMap(Bescheid bescheid) { + Map<String, Object> buildItemMap(BescheidResponse bescheid) { if (isNull(bescheid.getBescheidFileId())) { throw new TechnicalException("Bescheid file id is missing."); } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java index a4c77b54a873cf167eb1ce027467114391322744..2700586f2f8dd27bd9940ad790f6d2cc395370df 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java @@ -14,7 +14,6 @@ import org.springframework.context.ApplicationEventPublisher; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.user.UserProfile; import de.ozgcloud.bescheid.common.user.UserProfileService; @@ -22,6 +21,7 @@ import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEventTestFactory; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.test.ITCase; @ITCase diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java index ba29a266aeb99969217d43cee2a15a485b12718a..5d2d0689225962c1127644fe1f38063cb1e13c01 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java @@ -6,6 +6,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; @@ -23,9 +24,7 @@ import org.mockito.Spy; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.core.context.SecurityContext; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; +import de.ozgcloud.bescheid.Bescheid.SendBy; import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; @@ -37,6 +36,9 @@ import de.ozgcloud.command.CommandCreatedEventTestFactory; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandFailedEvent; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.attached_item.AttachedItem; +import de.ozgcloud.common.attached_item.AttachedItemService; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.BescheidDocumentCreatedEvent; import de.ozgcloud.document.Document; @@ -313,7 +315,7 @@ class BescheidEventListenerTest { void shouldCallService() { listener.getDocument(command); - verify(documentService).getDocument(AttachedItemTestFactory.BESCHEID_DOCUMENT); + verify(documentService).getDocument(DocumentTestFactory.ID); } @Test @@ -333,7 +335,7 @@ class BescheidEventListenerTest { private Command createCommandWithoutDocument() { var bescheidItemMap = AttachedItemTestFactory.createBescheidItem(); - bescheidItemMap.remove(AttachedItemTestFactory.BESCHEID_DOCUMENT); + bescheidItemMap.remove(DocumentTestFactory.ID); return CommandTestFactory.createBuilder().bodyObject(bescheidItemMap).build(); } } @@ -362,7 +364,7 @@ class BescheidEventListenerTest { class TestDoCreateBescheidDocument { private static final Command COMMAND = CommandTestFactory.create(); - private static final Bescheid BESCHEID = BescheidTestFactory.create(); + private static final BescheidResponse BESCHEID = BescheidResponseTestFactory.create(); @Captor private ArgumentCaptor<BescheidDocumentCreatedEvent> eventCaptor; @@ -399,7 +401,7 @@ class BescheidEventListenerTest { @DisplayName("should publish BescheidDocumentCreatedEvent with createdResource") void shouldPublishEventWithCreatedResource() { var bescheidDocument = "document-id"; - when(documentService.createBescheidDocument(any(), any(Bescheid.class))).thenReturn(bescheidDocument); + when(documentService.createBescheidDocument(any(), any(BescheidResponse.class))).thenReturn(bescheidDocument); listener.doCreateBescheidDocument(COMMAND); @@ -432,7 +434,7 @@ class BescheidEventListenerTest { @Test void shouldCallFileService() { - var bescheid = BescheidTestFactory.create(); + var bescheid = BescheidResponseTestFactory.create(); when(service.createBescheid(any())).thenReturn(bescheid); listener.doCreateBescheidBiz(command); @@ -442,7 +444,7 @@ class BescheidEventListenerTest { @Test void shouldReturnBescheid() { - var bescheid = BescheidTestFactory.create(); + var bescheid = BescheidResponseTestFactory.create(); when(fileService.uploadBescheidFile(any())).thenReturn(bescheid); var result = listener.doCreateBescheidBiz(command); @@ -495,7 +497,16 @@ class BescheidEventListenerTest { private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID) .relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); + private AttachedItem bescheidItem = createManuallyBescheidItem(); + + private AttachedItem createManuallyBescheidItem() { + var attachedItem = AttachedItemTestFactory.createBescheid(); + var item = new HashMap<>(attachedItem.getItem()); + + item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL); + + return attachedItem.toBuilder().item(item).build(); + } @BeforeEach void init() { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java index d5add97a8f5ac99853f9e90a44534a8174f4d76a..04871bb15ac3d213da2197b73610bd3660bd410e 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java @@ -4,11 +4,11 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.util.Collections; -import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -17,101 +17,95 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemMapper; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; +import de.ozgcloud.common.attached_item.AttachedItemMapper; +import de.ozgcloud.common.attached_item.AttachedItemService; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import io.grpc.stub.StreamObserver; class BescheidGrpcServiceTest { @Spy @InjectMocks - private BescheidGrpcService service; + private BescheidGrpcService grpcService; @Mock private AttachedItemService attachedItemService; @Mock private AttachedItemMapper attachedItemMapper; @Mock - private BescheidService bescheidService; + private BescheidService service; @Mock - private GrpcBescheidMapper grpcBescheidMapper; + private BescheidMapper mapper; + @DisplayName("Get bescheid draft") @Nested class TestGetBescheidDraft { - @Mock - private GrpcGetBescheidDraftRequest request; @Mock private StreamObserver<GrpcGetBescheidDraftResponse> responseObserver; @Captor private ArgumentCaptor<GrpcGetBescheidDraftResponse> responseCaptor; - private static final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponse.newBuilder().build(); + private final GrpcGetBescheidDraftRequest request = GrpcGetBescheidDraftRequestTestFactory.create(); - @Test - void shouldBuildResponse() { - when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); - var bescheidItem = AttachedItemTestFactory.createBescheid(); - when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(bescheidItem)); + private final GrpcGetBescheidDraftResponse response = GrpcGetBescheidDraftResponseTestFactory.create(); - service.getBescheidDraft(request, responseObserver); + private final Bescheid bescheid = BescheidTestFactory.create(); - verify(service).buildGetBescheidDraftResponse(bescheidItem); - } + @DisplayName("on existing draft") + @Nested + class TestOnExistingDraft { - @Test - void shouldCallNext() { - when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); - when(service.buildGetBescheidDraftResponse(any())).thenReturn(response); - when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(AttachedItemTestFactory.createBescheid())); + @BeforeEach + void mock() { + when(service.findDraft(any())).thenReturn(Optional.of(bescheid)); + when(mapper.toGetBescheidDraftResponse(any())).thenReturn(response); + } - service.getBescheidDraft(request, responseObserver); + @Test + void shouldCallService() { + grpcService.getBescheidDraft(request, responseObserver); - verify(responseObserver).onNext(response); - } + verify(service).findDraft(VorgangTestFactory.ID_STR); + } - @Test - void shouldCallNextWhenNoBescheid() { - service.getBescheidDraft(request, responseObserver); + @Test + void shouldCallMapper() { + grpcService.getBescheidDraft(request, responseObserver); - verify(responseObserver).onNext(responseCaptor.capture()); - assertThat(responseCaptor.getValue().hasBescheid()).isFalse(); - } + verify(mapper).toGetBescheidDraftResponse(bescheid); + } - @Test - void shouldCallCompleted() { - service.getBescheidDraft(request, responseObserver); + @Test + void shouldCallNext() { + grpcService.getBescheidDraft(request, responseObserver); - verify(responseObserver).onCompleted(); - } + verify(responseObserver).onNext(response); + } - } - - @Nested - class TestBuildGetBescheidDraftResponse { - - @Test - void shouldCallMapper() { - when(attachedItemMapper.toBescheid(any())).thenReturn(GrpcBescheidTestFactory.create()); - var bescheid = AttachedItemTestFactory.createBescheid(); + @Test + void shouldCallCompleted() { + grpcService.getBescheidDraft(request, responseObserver); - service.buildGetBescheidDraftResponse(bescheid); - - verify(attachedItemMapper).toBescheid(bescheid); + verify(responseObserver).onCompleted(); + } } - @Test - void shouldSetBescheid() { - var grpcBescheid = GrpcBescheidTestFactory.create(); - when(attachedItemMapper.toBescheid(any())).thenReturn(grpcBescheid); + @DisplayName("on missing draft") + @Nested + class TestOnMissingDraft { + + @Test + void shouldCallNextWhenNoBescheid() { + when(service.findDraft(any())).thenReturn(Optional.empty()); - var response = service.buildGetBescheidDraftResponse(AttachedItemTestFactory.createBescheid()); + grpcService.getBescheidDraft(request, responseObserver); - assertThat(response.getBescheid()).isEqualTo(grpcBescheid); + verify(responseObserver).onNext(responseCaptor.capture()); + assertThat(responseCaptor.getValue().hasBescheid()).isFalse(); + } } } @@ -131,22 +125,22 @@ class BescheidGrpcServiceTest { void shouldCallBescheidService() { getConfig(); - verify(bescheidService).getConfig(); + verify(service).getConfig(); } @Test void shouldCallGrpcBescheidMapper() { var config = BescheidManagerConfigTestFactory.create(); - when(bescheidService.getConfig()).thenReturn(config); + when(service.getConfig()).thenReturn(config); getConfig(); - verify(grpcBescheidMapper).fromBescheidManagerConfig(config); + verify(mapper).fromBescheidManagerConfig(config); } @Test void shouldCallNext() { - when(grpcBescheidMapper.fromBescheidManagerConfig(any())).thenReturn(RESPONSE); + when(mapper.fromBescheidManagerConfig(any())).thenReturn(RESPONSE); getConfig(); @@ -161,16 +155,17 @@ class BescheidGrpcServiceTest { } private void getConfig() { - service.getConfig(request, responseObserver); + grpcService.getConfig(request, responseObserver); } } @Nested class TestGetAll { - private static final GrpcGetAllBescheidResponse RESPONSE = GrpcGetAllBescheidResponse.newBuilder().build(); - @Mock - private GrpcGetAllBescheidRequest request; + private final GrpcGetAllBescheidResponse response = GrpcGetAllBescheidResponse.newBuilder().build(); + + private final GrpcGetAllBescheidRequest request = GrpcGetAllBescheidRequestTestFactory.create(); + @Mock private StreamObserver<GrpcGetAllBescheidResponse> responseObserver; @Captor @@ -178,103 +173,121 @@ class BescheidGrpcServiceTest { @Captor private ArgumentCaptor<VorgangId> vorgangIdCaptor; + private final Stream<Bescheid> bescheide = Stream.of(BescheidTestFactory.create()); + @BeforeEach void init() { - when(request.getVorgangId()).thenReturn(CommandTestFactory.VORGANG_ID); - doReturn(RESPONSE).when(service).buildGetAllBescheidResponse(anyCollection()); + when(service.findAll(any())).thenReturn(bescheide); + doReturn(response).when(grpcService).buildGetAllBescheidResponse(any()); } @Test void shouldCallFindAllBescheid() { - service.getAll(request, responseObserver); + getAll(); - verify(attachedItemService).findAllBescheid(vorgangIdCaptor.capture()); - assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID); + verify(service).findAll(VorgangTestFactory.ID); } @Test void shouldCallBuildResponse() { - var expectedBescheidItem = AttachedItemTestFactory.createBescheid(); - when(attachedItemService.findAllBescheid(any())).thenReturn(List.of(expectedBescheidItem)); - - service.getAll(request, responseObserver); + getAll(); - verify(service).buildGetAllBescheidResponse(List.of(expectedBescheidItem)); + verify(grpcService).buildGetAllBescheidResponse(bescheide); } @Test void shouldCallOnNext() { - service.getAll(request, responseObserver); + getAll(); - verify(responseObserver).onNext(RESPONSE); + verify(responseObserver).onNext(response); } @Test void shouldCallOnCompleted() { - service.getAll(request, responseObserver); + getAll(); verify(responseObserver).onCompleted(); } + + private void getAll() { + grpcService.getAll(request, responseObserver); + } } @Nested class TestBuildResponseAllBescheid { - private static final GrpcBescheid GRPC_BESCHEID = GrpcBescheidTestFactory.create(); + private final Bescheid bescheid = BescheidTestFactory.create(); + private final Stream<Bescheid> bescheide = Stream.of(bescheid); - @Mock - private AttachedItem attachedItem; + private final GrpcBescheid grpcBescheid = GrpcBescheidTestFactory.create(); @BeforeEach void init() { - doReturn(Collections.singletonList(GRPC_BESCHEID)).when(service).mapBescheid(anyCollection()); + when(mapper.toBescheid(any())).thenReturn(grpcBescheid); } @Test - void shouldCallMapBescheid() { - var bescheidItems = Collections.singleton(attachedItem); - - service.buildGetAllBescheidResponse(bescheidItems); + void shouldCallMapper() { + grpcService.buildGetAllBescheidResponse(bescheide); - verify(service).mapBescheid(bescheidItems); + verify(mapper).toBescheid(bescheid); } @Test void shouldReturnResponse() { - var bescheidItems = Collections.singleton(attachedItem); + var response = grpcService.buildGetAllBescheidResponse(bescheide); - var response = service.buildGetAllBescheidResponse(bescheidItems); - - assertThat(response.getBescheidList()).containsExactly(GRPC_BESCHEID); + assertThat(response.getBescheidList()).containsExactly(grpcBescheid); } } + @DisplayName("Get bescheid") @Nested - class TestMapBescheid { + class TestGetBescheid { - private static final GrpcBescheid GRPC_BESCHEID = GrpcBescheidTestFactory.create(); + private final Bescheid bescheid = BescheidTestFactory.create(); + private final GrpcGetBescheidResponse response = GrpcGetBescheidResponseTestFactory.create(); @Mock - private AttachedItem attachedItem; + private StreamObserver<GrpcGetBescheidResponse> responseObserver; @BeforeEach - void init() { - when(attachedItemMapper.toBescheid(attachedItem)).thenReturn(GRPC_BESCHEID); + void mock() { + when(service.getBescheid(any())).thenReturn(bescheid); + when(mapper.toGetBescheidResponse(any())).thenReturn(response); + } + + @Test + void shouldCallService() { + getBescheid(); + + verify(service).getBescheid(AttachedItemTestFactory.ID); } @Test void shouldCallMapper() { - service.mapBescheid(Collections.singleton(attachedItem)); + getBescheid(); + + verify(mapper).toGetBescheidResponse(bescheid); + } + + @Test + void shouldCallOnNext() { + getBescheid(); - verify(attachedItemMapper).toBescheid(attachedItem); + verify(responseObserver).onNext(response); } @Test - void shouldSetBescheid() { - var result = service.mapBescheid(Collections.singleton(attachedItem)); + void shouldCallCompleted() { + getBescheid(); - assertThat(result).containsExactly(GRPC_BESCHEID); + verify(responseObserver).onCompleted(); } + private void getBescheid() { + grpcService.getBescheid(GrpcGetBescheidRequestTestFactory.create(), responseObserver); + } } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8feda3dfe1ac673133247f758d71d3a413fa4a52 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java @@ -0,0 +1,123 @@ +package de.ozgcloud.bescheid; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Spy; + +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; + +class BescheidMapperTest { + + @InjectMocks + private final BescheidMapper mapper = Mappers.getMapper(BescheidMapper.class); + @Spy + private final SentInfoMapper sentInfoMapper = Mappers.getMapper(SentInfoMapper.class); + + @Nested + class TestToBescheid { + + @BeforeEach + void mock() { + when(sentInfoMapper.mapTo(any())).thenReturn(GrpcSentInfoTestFactory.create()); + } + + @Test + void shouldCallSentInfoMapper() { + mapper.toBescheid(BescheidTestFactory.create()); + + verify(sentInfoMapper).mapTo(BescheidTestFactory.SENT_INFO); + } + + @Test + void shouldMapAllFields() { + var result = mapper.toBescheid(BescheidTestFactory.create()); + + assertThat(result).usingRecursiveComparison() + .ignoringFields("memoizedHashCode", "sentInfo_") + .isEqualTo(GrpcBescheidWithoutDocumentTestFactory.create()); + } + } + + @Nested + class TestFromBescheidManagerConfig { + + @Test + void shouldMapAllFields() { + var result = mapper.fromBescheidManagerConfig(BescheidManagerConfigTestFactory.create()); + + assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidManagerConfigResponseTestFactory.create()); + } + } + + @DisplayName("Map from attachedItem ") + @Nested + class TestMapFromAttachItem { + + @Test + void shouldMapItem() { + var bescheidWithoutDocument = AttachedItemTestFactory.createBescheidWithoutDocumentBuilder().vorgangId(VorgangTestFactory.ID_STR).build(); + + var bescheid = mapper.mapFromAttachedItem(bescheidWithoutDocument); + + assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create()); + } + } + + @DisplayName("Map to attachments") + @Nested + class TestMapToAttachments { + + @Test + void shouldMapAttachmentsToEmptyList() { + var attachments = mapper.mapToAttachments(null); + + assertThat(attachments).isEmpty(); + } + + @Test + void shouldMapAttachmentsToList() { + var attachments = mapper.mapToAttachments(BescheidTestFactory.ATTACHMENTS); + + assertThat(attachments).hasValue(BescheidTestFactory.ATTACHMENTS); + } + + @Test + void shouldMapOneElementToList() { + var attachments = mapper.mapToAttachments(List.of(BescheidTestFactory.ATTACHMENT)); + + assertThat(attachments).hasValue(Collections.singletonList(BescheidTestFactory.ATTACHMENT)); + } + + @Test + void shouldMapEmptyStringToEmptyList() { + var attachments = mapper.mapToAttachments(StringUtils.EMPTY); + + assertThat(attachments).isEmpty(); + } + } + + @DisplayName("To get bescheid draft response") + @Nested + class TestToGetBescheidDraftResponse { + + @Test + void shouldMap() { + var response = mapper.toGetBescheidDraftResponse(BescheidTestFactory.create()); + + assertThat(response).usingRecursiveComparison().isEqualTo(GrpcGetBescheidDraftResponseTestFactory.create()); + } + } +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..94581c9fe21016dfb70cdb0b7f5279b42f877b94 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java @@ -0,0 +1,42 @@ +package de.ozgcloud.bescheid; + +import java.io.File; +import java.util.Optional; + +import org.springframework.http.MediaType; + +import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; +import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; +import de.ozgcloud.common.binaryfile.FileId; +import de.ozgcloud.common.binaryfile.TempFileUtils; +import de.ozgcloud.document.DocumentTestFactory; + +public class BescheidResponseTestFactory { + + public static final String BESCHEID_FILE_NAME = "testbescheid"; + public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(BESCHEID_FILE_NAME.getBytes()); + public static final int BESCHEID_FILE_SIZE = BESCHEID_FILE_NAME.getBytes().length; + + public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; + + public static BescheidResponse create() { + return createBuilder().build(); + } + + public static BescheidResponse.BescheidResponseBuilder createBuilder() { + return BescheidResponse.builder() + .createdBy(UserProfileTestFactory.ID) + .vorgangId(VorgangTestFactory.ID) + .contentType(CONTENT_TYPE) + .bescheidFileName(BESCHEID_FILE_NAME) + .bescheidFile(BESCHEID_FILE) + .bescheidFileId(FileId.from(DocumentTestFactory.ID)) + .nachrichtSubject(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)) + .nachrichtText(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)) + .bewilligt(BescheidTestFactory.BEWILLIGT) + .size(BESCHEID_FILE_SIZE) + .attachments(BescheidTestFactory.ATTACHMENTS) + .serviceKonto(ServiceKontoTestFactory.create()); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java index c810b402d1b51e1b1cea5017f3fcaf7530c1d690..1bfa29f025365178aa5a66816db937b5670b2536 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java @@ -11,6 +11,7 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -39,9 +40,7 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; +import de.ozgcloud.bescheid.Bescheid.SendBy; import de.ozgcloud.bescheid.attributes.ClientAttributeService; import de.ozgcloud.bescheid.common.user.UserProfile; import de.ozgcloud.bescheid.common.user.UserProfileService; @@ -54,6 +53,9 @@ import de.ozgcloud.bescheid.vorgang.VorgangService; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.attached_item.AttachedItem; +import de.ozgcloud.common.attached_item.AttachedItemService; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.datatype.StringBasedValue; import de.ozgcloud.common.errorhandling.TechnicalException; @@ -81,17 +83,93 @@ class BescheidServiceTest { private BuildProperties buildProperties; @Mock private BescheidRemoteService remoteService; + @Mock + private BescheidMapper mapper; @BeforeEach void init() { ReflectionTestUtils.setField(service, "remoteService", Optional.of(remoteService)); } + @Nested + class TestFindDraft { + + private final AttachedItem vorgangAttachedItem = AttachedItemTestFactory.create(); + + private final Bescheid bescheid = BescheidTestFactory.create(); + + @BeforeEach + void mock() { + when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(vorgangAttachedItem)); + when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); + } + + @Test + void shouldCallVorgangAttachedItemRemoteService() { + service.findDraft(VorgangTestFactory.ID_STR); + + verify(attachedItemService).findBescheidItem(VorgangTestFactory.ID_STR); + } + + @Test + void shouldCallMapper() { + service.findDraft(VorgangTestFactory.ID_STR); + + verify(mapper).mapFromAttachedItem(vorgangAttachedItem); + } + + @Test + void shouldReturnValue() { + var draft = service.findDraft(VorgangTestFactory.ID_STR); + + assertThat(draft).hasValue(bescheid); + } + } + + @DisplayName("Find all") + @Nested + class TestFindAll { + + private final AttachedItem attachedItem = AttachedItemTestFactory.create(); + private final Bescheid bescheid = BescheidTestFactory.create(); + + @BeforeEach + void mock() { + when(attachedItemService.findAllBescheid(any())).thenReturn(Collections.singleton(attachedItem)); + when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); + } + + @Test + void shouldCallVorgangAttachedItemService() { + findAll(); + + verify(attachedItemService).findAllBescheid(VorgangTestFactory.ID); + } + + @Test + void shouldCallMapper() { + findAll(); + + verify(mapper).mapFromAttachedItem(attachedItem); + } + + @Test + void shouldReturnValue() { + var bescheide = findAll(); + + assertThat(bescheide).containsExactly(bescheid); + } + + private List<Bescheid> findAll() { + return service.findAll(VorgangTestFactory.ID).toList(); + } + } + @Nested class TestCreateBescheid { private final Vorgang vorgang = VorgangTestFactory.create(); - private final Bescheid bescheid = BescheidTestFactory.createBuilder().vorgangId(null).build(); + private final BescheidResponse bescheid = BescheidResponseTestFactory.createBuilder().vorgangId(null).build(); @BeforeEach void initMocks() { @@ -119,7 +197,7 @@ class BescheidServiceTest { void shouldReturnCreatedBescheid() { var result = service.createBescheid(BescheidRequestTestFactory.create()); - assertThat(result).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create()); + assertThat(result).usingRecursiveComparison().isEqualTo(BescheidResponseTestFactory.create()); } } @@ -190,21 +268,29 @@ class BescheidServiceTest { @Nested class TestValidateBescheidSendManually { - @Test - void shouldCallValidateBescheid() { + private final AttachedItem attachedItem = createManuallySendBescheid(); + + private AttachedItem createManuallySendBescheid() { var bescheidItem = AttachedItemTestFactory.createBescheid(); + var item = new HashMap<>(bescheidItem.getItem()); - service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION); + item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - verify(service).validateBescheid(bescheidItem, AttachedItemTestFactory.VERSION); + return bescheidItem.toBuilder().item(item).build(); + } + + @Test + void shouldCallValidateBescheid() { + service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION); + + verify(service).validateBescheid(attachedItem, AttachedItemTestFactory.VERSION); } @Test void shouldValidate() { doNothing().when(service).validateBescheid(any(), anyLong()); - var bescheidItem = AttachedItemTestFactory.createBescheid(); - assertDoesNotThrow(() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)); + assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); } @DisplayName("should decline when") @@ -305,8 +391,8 @@ class BescheidServiceTest { void shouldCallValidateBescheid() { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build(); + .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) + .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION); @@ -318,8 +404,8 @@ class BescheidServiceTest { doNothing().when(service).validateBescheid(any(), anyLong()); var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build(); + .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) + .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); assertDoesNotThrow(() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)); } @@ -330,8 +416,8 @@ class BescheidServiceTest { void shouldDeclineSendByNotPostfach(Bescheid.SendBy sendBy) { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() .itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build(); + .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) + .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); var message = assertThrows(TechnicalException.class, () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); @@ -343,7 +429,7 @@ class BescheidServiceTest { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, null) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT).build(); + .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); var message = assertThrows(TechnicalException.class, () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); @@ -354,7 +440,7 @@ class BescheidServiceTest { void shouldDeclineWhenNoText() { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT) + .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, null).build(); var message = assertThrows(TechnicalException.class, @@ -366,11 +452,20 @@ class BescheidServiceTest { @Nested class TestValidateBescheid { - @Test - void shouldValidateBescheid() { + private final AttachedItem attachedItem = createManuallySendBescheid(); + + private AttachedItem createManuallySendBescheid() { var bescheidItem = AttachedItemTestFactory.createBescheid(); + var item = new HashMap<>(bescheidItem.getItem()); - assertDoesNotThrow(() -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)); + item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); + + return bescheidItem.toBuilder().item(item).build(); + } + + @Test + void shouldValidateBescheid() { + assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); } @DisplayName("should decline when") @@ -406,8 +501,6 @@ class BescheidServiceTest { @Nested class TestGetAttachments { - private static final FileId ATTACHMENT_FILE_ID = FileId.from(AttachedItemTestFactory.ATTACHMENT); - @Test void shouldReturnEmptyList() { var result = service.getAttachments(AttachedItemTestFactory.createBescheidBuilder().clearItem().build()); @@ -422,7 +515,7 @@ class BescheidServiceTest { void shouldReturnAttachments() { var result = service.getAttachments(AttachedItemTestFactory.createBescheid()); - assertThat(result).containsExactly(ATTACHMENT_FILE_ID); + assertThat(result).containsExactly(BescheidTestFactory.ATTACHMENT, BescheidTestFactory.ATTACHMENT); } @Test @@ -441,18 +534,18 @@ class BescheidServiceTest { class TestSingleAttachment { private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_ATTACHMENTS, AttachedItemTestFactory.ATTACHMENT).build(); + .itemEntry(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENT).build(); @Test void shouldCallGetStringAsList() { service.getAttachments(bescheidItem); - verify(service).getStringAsList(AttachedItemTestFactory.ATTACHMENT); + verify(service).getStringAsList(BescheidTestFactory.ATTACHMENT); } @Test void shouldReturnBescheidFileIdList() { - var expectedResult = List.of(ATTACHMENT_FILE_ID); + var expectedResult = List.of(BescheidTestFactory.ATTACHMENT); doReturn(expectedResult).when(service).getStringAsList(any()); var result = service.getAttachments(bescheidItem); @@ -522,7 +615,7 @@ class BescheidServiceTest { void shouldCallGetItem() { service.getBescheidFileId(AttachedItemTestFactory.createBescheid()); - verify(attachedItemService).getItem(AttachedItemTestFactory.BESCHEID_DOCUMENT); + verify(attachedItemService).getItem(DocumentTestFactory.ID); } @Test @@ -539,11 +632,11 @@ class BescheidServiceTest { @Test void shouldReturnSubject() { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_SUBJECT, - AttachedItemTestFactory.NACHRICHT_SUBJECT)).build(); + BescheidTestFactory.NACHRICHT_SUBJECT)).build(); var result = service.getNachrichtSubject(bescheidItem); - assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_SUBJECT); + assertThat(result).contains(BescheidTestFactory.NACHRICHT_SUBJECT); } } @@ -553,11 +646,11 @@ class BescheidServiceTest { @Test void shouldReturnText() { var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_TEXT, - AttachedItemTestFactory.NACHRICHT_TEXT)).build(); + BescheidTestFactory.NACHRICHT_TEXT)).build(); var result = service.getNachrichtText(bescheidItem); - assertThat(result).contains(AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(result).contains(BescheidTestFactory.NACHRICHT_TEXT); } } @@ -802,11 +895,11 @@ class BescheidServiceTest { void shouldSetSentBy() { var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR); - assertThat(result).containsEntry(Bescheid.FIELD_SENT_BY, UserProfileTestFactory.ID_STR); + assertThat(result).containsEntry(SentInfo.FIELD_SENT_BY, UserProfileTestFactory.ID_STR); } private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) { - return ZonedDateTime.parse((String) sentInfoMap.get(Bescheid.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME); + return ZonedDateTime.parse((String) sentInfoMap.get(SentInfo.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME); } } @@ -962,9 +1055,9 @@ class BescheidServiceTest { @BeforeEach void init() { - doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any()); - doReturn(Optional.of(AttachedItemTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any()); - doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(service).buildAttachments(any()); + doReturn(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any()); + doReturn(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any()); + doReturn(List.of(BescheidTestFactory.ATTACHMENT)).when(service).buildAttachments(any()); } @Test @@ -985,7 +1078,7 @@ class BescheidServiceTest { void shouldSetSubject() { var result = buildSendNachrichtCommandBody(); - assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT); + assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); } @Test @@ -999,7 +1092,7 @@ class BescheidServiceTest { void shouldSetMailBody() { var result = buildSendNachrichtCommandBody(); - assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT); } @Test @@ -1013,7 +1106,7 @@ class BescheidServiceTest { void shouldSetAttachments() { var result = buildSendNachrichtCommandBody(); - assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.ATTACHMENT); + assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(BescheidTestFactory.ATTACHMENT); } @Test @@ -1216,4 +1309,38 @@ class BescheidServiceTest { } } + + @DisplayName("Get bescheid") + @Nested + class TestGetBescheid { + + private final AttachedItem attachedItem = AttachedItemTestFactory.create(); + + @BeforeEach + void mock() { + when(attachedItemService.getItem(any())).thenReturn(attachedItem); + when(mapper.mapFromAttachedItem(any())).thenReturn(BescheidTestFactory.create()); + } + + @Test + void shouldCallVorgangAttachedItemService() { + service.getBescheid(AttachedItemTestFactory.ID); + + verify(attachedItemService).getItem(AttachedItemTestFactory.ID); + } + + @Test + void shouldCallMapper() { + service.getBescheid(AttachedItemTestFactory.ID); + + verify(mapper).mapFromAttachedItem(attachedItem); + } + + @Test + void shouldReturnValue() { + var bescheid = service.getBescheid(AttachedItemTestFactory.ID); + + assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create()); + } + } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java index f21274060c920a959b90d9ab51cd9d52d852b4f2..326882334bbe54cd6987bf3eb812f1e086639642 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java @@ -1,32 +1,37 @@ package de.ozgcloud.bescheid; -import java.io.File; +import java.time.LocalDate; import java.util.List; import java.util.Optional; - -import org.springframework.http.MediaType; +import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; +import de.ozgcloud.bescheid.Bescheid.SendBy; +import de.ozgcloud.bescheid.Bescheid.Status; import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.binaryfile.TempFileUtils; +import de.ozgcloud.document.DocumentTestFactory; public class BescheidTestFactory { - public static final UserId CREATED_BY = UserProfileTestFactory.ID; - public static final String FILE_NAME = "bescheid.pdf"; + public final static boolean BEWILLIGT = true; + + public final static Status STATUS = Status.DRAFT; + public final static String BESCHIEDEN_AM_STR = "2021-01-10"; + public final static LocalDate BESCHIEDEN_AM = LocalDate.parse(BESCHIEDEN_AM_STR); + public final static SendBy SEND_BY = SendBy.NACHRICHT; + + public final static String NACHRICHT_TEXT = LoremIpsum.getInstance().getWords(5); + public final static String NACHRICHT_SUBJECT = LoremIpsum.getInstance().getWords(5); - public static final byte[] TEST_BESCHEID = "testbescheid".getBytes(); - public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(TEST_BESCHEID); - public static final String BESCHEID_FILE_ID = "bescheid-file-id"; + public final static String ATTACHMENT_STR = UUID.randomUUID().toString(); + public final static FileId ATTACHMENT = FileId.from(ATTACHMENT_STR); + public final static List<FileId> ATTACHMENTS = List.of(ATTACHMENT, ATTACHMENT); - public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; - public static final String NACHRICHT_SUBJECT = LoremIpsum.getInstance().getWords(5); - public static final String NACHRICHT_TEXT = LoremIpsum.getInstance().getWords(5); + public final static SentInfo SENT_INFO = SentInfoTestFactory.create(); public static Bescheid create() { return createBuilder().build(); @@ -34,17 +39,18 @@ public class BescheidTestFactory { public static Bescheid.BescheidBuilder createBuilder() { return Bescheid.builder() - .createdBy(CREATED_BY) + .id(BescheidId.from(AttachedItemTestFactory.ID)) + .version(AttachedItemTestFactory.VERSION) .vorgangId(VorgangTestFactory.ID) - .contentType(CONTENT_TYPE) - .bescheidFileName(FILE_NAME) - .bescheidFile(BESCHEID_FILE) - .bescheidFileId(FileId.from(BESCHEID_FILE_ID)) + .createdBy(UserProfileTestFactory.ID) + .bewilligt(BEWILLIGT) + .status(STATUS) + .bescheidDocument(FileId.from(DocumentTestFactory.ID)) + .beschiedenAm(BESCHIEDEN_AM) + .sendBy(SEND_BY) + .sentInfo(SENT_INFO) .nachrichtSubject(Optional.of(NACHRICHT_SUBJECT)) .nachrichtText(Optional.of(NACHRICHT_TEXT)) - .genehmigt(true) - .size(TEST_BESCHEID.length) - .attachments(List.of(FileId.from(AttachedItemTestFactory.ATTACHMENT))) - .serviceKonto(ServiceKontoTestFactory.create()); + .attachments(ATTACHMENTS); } -} +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java deleted file mode 100644 index 169c80a19cc0c8251b93f846f72c40269dab08aa..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidItemMapperTest.java +++ /dev/null @@ -1,35 +0,0 @@ -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 GrpcBescheidItemMapperTest { - - private final GrpcBescheidMapper mapper = Mappers.getMapper(GrpcBescheidMapper.class); - - @Nested - class TestFromBescheid { - - @Test - void shouldMapAllFields() { - var result = mapper.fromBescheid(BescheidTestFactory.create()); - - assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidTestFactory.create()); - } - } - - @Nested - class TestFromBescheidManagerConfig { - - @Test - void shouldMapAllFields() { - var result = mapper.fromBescheidManagerConfig(BescheidManagerConfigTestFactory.create()); - - assertThat(result).usingRecursiveComparison().isEqualTo(GrpcBescheidManagerConfigResponseTestFactory.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 index 1b348feafd596790ed9a3a9138d512aa93bd57a9..e3781092bf7bf1ea93256e5297715f0a89d6b07a 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidTestFactory.java @@ -8,7 +8,7 @@ class GrpcBescheidTestFactory { public static GrpcBescheid.Builder createBuilder() { return GrpcBescheid.newBuilder() - .setBewilligt(true) + .setBewilligt(BescheidTestFactory.BEWILLIGT) .setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..532945af74f9f78d30741021b1362b51b6c4ce73 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcBescheidWithoutDocumentTestFactory.java @@ -0,0 +1,27 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; +import de.ozgcloud.common.binaryfile.FileId; +import de.ozgcloud.document.DocumentTestFactory; + +public class GrpcBescheidWithoutDocumentTestFactory { + + public static GrpcBescheid create() { + return createBuilder().build(); + } + + public static GrpcBescheid.Builder createBuilder() { + return GrpcBescheid.newBuilder() + .setId(AttachedItemTestFactory.ID) + .setVersion(AttachedItemTestFactory.VERSION) + .setStatus(BescheidTestFactory.STATUS.name()) + .setBeschiedenAm(BescheidTestFactory.BESCHIEDEN_AM_STR) + .setBewilligt(BescheidTestFactory.BEWILLIGT) + .setBescheidDocument(DocumentTestFactory.ID) + .addAllAttachments(BescheidTestFactory.ATTACHMENTS.stream().map(FileId::toString).toList()) + .setSendBy(BescheidTestFactory.SEND_BY.name()) + .setNachrichtText(BescheidTestFactory.NACHRICHT_TEXT) + .setNachrichtSubject(BescheidTestFactory.NACHRICHT_SUBJECT) + .setSentInfo(GrpcSentInfoTestFactory.create()); + } +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..af6362a99396ebfb72a8eac0ba14121e387f1a9c --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetAllBescheidRequestTestFactory.java @@ -0,0 +1,15 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; + +public class GrpcGetAllBescheidRequestTestFactory { + + public static GrpcGetAllBescheidRequest create() { + return createBuilder().build(); + } + + public static GrpcGetAllBescheidRequest.Builder createBuilder() { + return GrpcGetAllBescheidRequest.newBuilder() + .setVorgangId(VorgangTestFactory.ID_STR); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..290201a2f409bdd8462e4b6dbdd3a1f5768a1add --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftRequestTestFactory.java @@ -0,0 +1,15 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; + +public class GrpcGetBescheidDraftRequestTestFactory { + + public static GrpcGetBescheidDraftRequest create() { + return createBuilder().build(); + } + + public static GrpcGetBescheidDraftRequest.Builder createBuilder() { + return GrpcGetBescheidDraftRequest.newBuilder() + .setVorgangId(VorgangTestFactory.ID_STR); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..2e3d5d8ca5a1d1bbf74211ebd20de9b674ee7f6f --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidDraftResponseTestFactory.java @@ -0,0 +1,13 @@ +package de.ozgcloud.bescheid; + +public class GrpcGetBescheidDraftResponseTestFactory { + + public static GrpcGetBescheidDraftResponse create() { + return createBuilder().build(); + } + + public static GrpcGetBescheidDraftResponse.Builder createBuilder() { + return GrpcGetBescheidDraftResponse.newBuilder() + .setBescheid(GrpcBescheidWithoutDocumentTestFactory.create()); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..43f93b3eddbfc345130af34f26e6b9d6c85cfc0c --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidRequestTestFactory.java @@ -0,0 +1,15 @@ +package de.ozgcloud.bescheid; + +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; + +public class GrpcGetBescheidRequestTestFactory { + + public static GrpcGetBescheidRequest create() { + return createBuilder().build(); + } + + public static GrpcGetBescheidRequest.Builder createBuilder() { + return GrpcGetBescheidRequest.newBuilder() + .setId(AttachedItemTestFactory.ID); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..3b87d8e4924566bd6028982f1760b86d5362468b --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcGetBescheidResponseTestFactory.java @@ -0,0 +1,13 @@ +package de.ozgcloud.bescheid; + +public class GrpcGetBescheidResponseTestFactory { + + public static GrpcGetBescheidResponse create() { + return createBuilder().build(); + } + + public static GrpcGetBescheidResponse.Builder createBuilder() { + return GrpcGetBescheidResponse.newBuilder() + .setBescheid(GrpcBescheidWithoutDocumentTestFactory.create()); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..86fd1c8373f7d09940ade469b09ba9bdfebb437c --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/GrpcSentInfoTestFactory.java @@ -0,0 +1,14 @@ +package de.ozgcloud.bescheid; + +public class GrpcSentInfoTestFactory { + + public static GrpcSentInfo create() { + return createBuilder().build(); + } + + public static GrpcSentInfo.Builder createBuilder() { + return GrpcSentInfo.newBuilder() + .setSentAt(SentInfoTestFactory.SENT_AT_STR) + .setSentBy(SentInfoTestFactory.SENT_BY); + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2fa8f14b830b3c980e207d41ef1af3cafe69d00b --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoMapperTest.java @@ -0,0 +1,25 @@ +package de.ozgcloud.bescheid; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +class SentInfoMapperTest { + + private SentInfoMapper mapper = Mappers.getMapper(SentInfoMapper.class); + + @DisplayName("Map to") + @Nested + class TestMapTo { + + @Test + void shouldMap() { + var mappedSentInfo = mapper.mapTo(SentInfoTestFactory.create()); + + assertThat(mappedSentInfo).usingRecursiveComparison().isEqualTo(GrpcSentInfoTestFactory.create()); + } + } +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java index 90253c5ec4e2ff14504ae04ade55645f73bd7b43..8361e82f8c1459da781d70b4603f5e673ec77c81 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java @@ -46,7 +46,7 @@ public class SentInfoTestFactory { public static Map<String, Object> asMap() { return Map.of( - Bescheid.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY, - Bescheid.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR); + SentInfo.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY, + SentInfo.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java deleted file mode 100644 index a2da15ff9475d6fed63b149dcb2a496d85caf79d..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemMapperTest.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.bescheid.attacheditem; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.GrpcBescheid; -import de.ozgcloud.bescheid.GrpcSentInfo; -import de.ozgcloud.bescheid.SentInfoTestFactory; -import de.ozgcloud.document.DocumentService; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; - -class AttachedItemMapperTest { - - @Spy - @InjectMocks - private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class); - - @Mock - private GrpcObjectMapper grpcObjectMapper; - - @Nested - class TestMapFromVorgangAttachedItem { - - @BeforeEach - void init() { - when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem()); - } - - @Test - void shouldMapFromVorgangAttachedItem() { - var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME) - .setVersion(AttachedItemTestFactory.VERSION).build(); - - var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - - assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument()); - } - } - - @Nested - class TestToBescheid { - - @Mock - private GrpcSentInfo grpcSentInfo; - - @Test - void shouldSetBeschiedenAm() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getBeschiedenAm()).isEqualTo(AttachedItemTestFactory.BESCHEIDEN_AM); - } - - @Test - void shouldSetBewilligt() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getBewilligt()).isTrue(); - } - - @Test - void shouldSetBescheidDocument() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getBescheidDocument()).isEqualTo(AttachedItemTestFactory.BESCHEID_DOCUMENT); - } - - @Test - void shouldSetSendBy() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getSendBy()).isEqualTo(AttachedItemTestFactory.SEND_BY.name()); - } - - @Test - void shouldSetNachrichtText() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getNachrichtText()).isEqualTo(AttachedItemTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetNachrichtSubject() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getNachrichtSubject()).isEqualTo(AttachedItemTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldCallToAttachments() { - var expectedAttachments = List.of(AttachedItemTestFactory.ATTACHMENT); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .item(Map.of(Bescheid.FIELD_ATTACHMENTS, expectedAttachments)).build(); - - mapper.toBescheid(bescheidItem); - - verify(mapper).toAttachments(expectedAttachments); - } - - @Test - void shouldNotCallToAttachments() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build(); - - mapper.toBescheid(bescheidItem); - - verify(mapper, never()).toAttachments(any()); - } - - @Test - void shouldSetAttachments() { - doReturn(List.of(AttachedItemTestFactory.ATTACHMENT)).when(mapper).toAttachments(any()); - - var bescheid = mapBescheid(); - - assertThat(bescheid.getAttachmentsList()).containsExactly(AttachedItemTestFactory.ATTACHMENT); - } - - @Test - void shouldSetId() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getId()).isEqualTo(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetVersion() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetStatus() { - var bescheid = mapBescheid(); - - assertThat(bescheid.getStatus()).isEqualTo(Bescheid.Status.DRAFT.name()); - } - - @Test - void shouldCallToSentInfo() { - var sentInfoMap = SentInfoTestFactory.asMap(); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_SENT_INFO, sentInfoMap).build(); - - mapper.toBescheid(bescheidItem); - - verify(mapper).toSentInfo(sentInfoMap); - } - - @Test - void shouldSetSentInfo() { - doReturn(grpcSentInfo).when(mapper).toSentInfo(any()); - - var bescheid = mapBescheid(); - - assertThat(bescheid.getSentInfo()).isSameAs(grpcSentInfo); - } - - private GrpcBescheid mapBescheid() { - return mapper.toBescheid(AttachedItemTestFactory.createBescheid()); - } - } - - @Nested - class TestToAttachments { - - @Test - void shouldMapCollection() { - var result = mapper.toAttachments(List.of(AttachedItemTestFactory.ATTACHMENT)); - - assertThat(result).containsExactly(AttachedItemTestFactory.ATTACHMENT); - } - - @Test - void shouldMapSingleValue() { - var result = mapper.toAttachments(AttachedItemTestFactory.ATTACHMENT); - - assertThat(result).containsExactly(AttachedItemTestFactory.ATTACHMENT); - } - - @DisplayName("should return null") - @ParameterizedTest(name = "when attachmentsObject is \"{0}\"") - @NullAndEmptySource - void shouldReturnNull(String attachmentsObject) { - var result = mapper.toAttachments(attachmentsObject); - - assertThat(result).isNull(); - } - } - - @Nested - class TestToSentInfo { - - private static final Map<String, Object> SENT_INFO_MAP = Map.of( - Bescheid.FIELD_SENT_BY, SentInfoTestFactory.SENT_BY, - Bescheid.FIELD_SENT_AT, SentInfoTestFactory.SENT_AT_STR); - - @Test - void shouldSetSentBy() { - var sentInfo = mapper.toSentInfo(SENT_INFO_MAP); - - assertThat(sentInfo.getSentBy()).isEqualTo(SentInfoTestFactory.SENT_BY); - } - - @Test - void shouldSetSentAt() { - var sentInfo = mapper.toSentInfo(SENT_INFO_MAP); - - assertThat(sentInfo.getSentAt()).isEqualTo(SentInfoTestFactory.SENT_AT_STR); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java deleted file mode 100644 index c6ba16773eaf8c543412d378709d506d7996cd3a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/UtilsTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.bescheid.attacheditem; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Map; - -import org.junit.jupiter.api.Test; - -import de.ozgcloud.command.CommandTestFactory; - -class UtilsTest { - - @Test - void shouldReturnClient() { - var command = CommandTestFactory.createBuilder().bodyObject(Map.of(AttachedItem.PROPERTY_CLIENT, AttachedItemTestFactory.CLIENT)).build(); - - var client = Utils.extractClient(command); - - assertThat(client).isEqualTo(AttachedItemTestFactory.CLIENT); - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java index 4db4b0e81338307b7af8df53bf85667096e738e3..86bc7f747b0e95edb9f633b95ba93879124f71ca 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java @@ -17,7 +17,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Text; import de.ozgcloud.bescheid.BescheidRequestTestFactory; -import de.ozgcloud.bescheid.BescheidTestFactory; +import de.ozgcloud.bescheid.BescheidResponseTestFactory; import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; @@ -44,7 +44,7 @@ class SmartDocumentsBescheidRemoteServiceTest { var bescheid = service.buildBescheid(BescheidRequestTestFactory.create(), SmartDocumentsResponseTestFactory.create()); assertThat(bescheid).usingRecursiveComparison().ignoringFields("serviceKonto", "nachrichtSubject", "bescheidFileId", "attachments") - .isEqualTo(BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build()); + .isEqualTo(BescheidResponseTestFactory.createBuilder().nachrichtText(Optional.empty()).build()); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java index 1d4a46cc0b786f81f6c6255558696c3f5074e14c..32a0b3ac98768e565da86a25437605fa7c37cd60 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java @@ -2,7 +2,7 @@ package de.ozgcloud.bescheid.smartdocuments; import java.util.List; -import de.ozgcloud.bescheid.BescheidTestFactory; +import de.ozgcloud.bescheid.BescheidResponseTestFactory; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile; @@ -18,10 +18,10 @@ public class SmartDocumentsResponseTestFactory { static SmartDocumentsResponse.SmartDocumentsResponseBuilder createBuilder() { return SmartDocumentsResponse.builder() .file(List.of(SmartDocumentFile.builder() - .filename(BescheidTestFactory.FILE_NAME) + .filename(BescheidResponseTestFactory.BESCHEID_FILE_NAME) .outputFormat(OUTPUT_FORMAT) .document(SmartDocumentDocument.builder() - .data(BescheidTestFactory.BESCHEID_FILE) + .data(BescheidResponseTestFactory.BESCHEID_FILE) .build()) .build())); } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java index 62009fca650eef4534876936e5ec328f0ddd593c..000bc28d0aea983e85485a76638fbb0e33727ba2 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java @@ -4,7 +4,8 @@ import java.util.UUID; public class VorgangTestFactory { - public static final VorgangId ID = VorgangId.from(UUID.randomUUID().toString()); + public static final String ID_STR = UUID.randomUUID().toString(); + public static final VorgangId ID = VorgangId.from(ID_STR); public static final long VERSION = 1L; public static Vorgang create() { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..986f208f2f4ab75effbf1a4c42744624a2f8f202 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.common.attached_item; + +import static org.assertj.core.api.Assertions.*; +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.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.document.DocumentService; +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; + +class AttachedItemMapperTest { + + @Spy + @InjectMocks + private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class); + + @Mock + private GrpcObjectMapper grpcObjectMapper; + + @Nested + class TestMapFromVorgangAttachedItem { + + @BeforeEach + void init() { + when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem()); + } + + @Test + void shouldMapFromVorgangAttachedItem() { + var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME).build(); + + var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem); + + assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument()); + } + } +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java similarity index 97% rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java index 9f4272fed782bba1aef9ea7236c4430752002e88..1c2e8557104da84c83ebc6d37565bc357c5461e9 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -58,6 +58,7 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.Bescheid.SendBy; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.bescheid.BescheidTestFactory; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; @@ -73,14 +74,17 @@ class AttachedItemServiceTest { @Spy @InjectMocks private AttachedItemService service; + @Mock + private AttachedItemMapper mapper; + @Mock + private VorgangAttachedItemRemoteService remoteService; @Mock private OzgCloudCommandService commandService; @Mock private CommandMapper commandMapper; @Mock - private VorgangAttachedItemRemoteService remoteService; - @Mock + private TemplateHandler templateHandler; @Nested @@ -517,7 +521,7 @@ class AttachedItemServiceTest { var bescheidItem = service.buildBescheidItemAsMap(command, document); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); } } @@ -695,49 +699,50 @@ class AttachedItemServiceTest { void shouldHaveSetBescheidenAm() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, AttachedItemTestFactory.BESCHEIDEN_AM); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); } @Test void shouldHaveSetBewilligt() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, AttachedItemTestFactory.BEWILLIGT); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT); } @Test void shouldHaveSetBescheidDocument() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, AttachedItemTestFactory.BESCHEID_DOCUMENT); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); } @Test void shouldHaveSetSendBy() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, AttachedItemTestFactory.SEND_BY.name()); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); } @Test void shouldHaveSetNachrichtText() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); } @Test void shouldHaveSetNachrichtSubject() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); } @Test void shouldHaveSetAttachments() { var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS, List.of(AttachedItemTestFactory.ATTACHMENT)); + assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS, + List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); } } @@ -795,7 +800,7 @@ class AttachedItemServiceTest { void shouldSetBeschiedenAm() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, AttachedItemTestFactory.BESCHEIDEN_AM); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); } @Test @@ -809,35 +814,36 @@ class AttachedItemServiceTest { void shouldSetBescheidDocument() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, AttachedItemTestFactory.BESCHEID_DOCUMENT); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); } @Test void shouldSetSendBy() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, AttachedItemTestFactory.SEND_BY.name()); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); } @Test void shouldSetNachrichtText() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, AttachedItemTestFactory.NACHRICHT_TEXT); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); } @Test void shouldSetNachrichtSubject() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); } @Test void shouldSetAttachments() { var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS, List.of(AttachedItemTestFactory.ATTACHMENT)); + assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS, + List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); } } @@ -1004,7 +1010,8 @@ class AttachedItemServiceTest { @Test void shouldThrowExceptionIfBescheidIsNotDraft() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus").build(); + var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus") + .build(); assertThrows(TechnicalException.class, () -> service.validateBescheidStatus(bescheidItem)); } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java similarity index 50% rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java index 201fd3f6444931b06f9c1ffec5baab3a90771a6c..6f95bc5930e980d4818394d9cf83cafcae4ab65f 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/AttachedItemTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java @@ -21,18 +21,23 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import static de.ozgcloud.bescheid.SentInfoTestFactory.*; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.Bescheid.Status; -import de.ozgcloud.bescheid.attacheditem.AttachedItem.AttachedItemBuilder; +import de.ozgcloud.bescheid.BescheidTestFactory; +import de.ozgcloud.bescheid.SentInfo; +import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.attached_item.AttachedItem.AttachedItemBuilder; +import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.document.Document; import de.ozgcloud.document.DocumentService; import de.ozgcloud.document.DocumentTestFactory; @@ -43,13 +48,9 @@ public class AttachedItemTestFactory { public static final long VERSION = 10L; public static final String CLIENT = "client"; - public static final String BESCHEIDEN_AM = "2024-01-01"; - public static final boolean BEWILLIGT = true; - public static final String BESCHEID_DOCUMENT = "bescheid-document"; - public static final String ATTACHMENT = "attachment-id"; - public static final Bescheid.SendBy SEND_BY = Bescheid.SendBy.MANUAL; - public static final String NACHRICHT_TEXT = "nachricht-text"; - public static final String NACHRICHT_SUBJECT = "nachricht-subject"; + public static AttachedItem create() { + return createBuilder().build(); + } public static AttachedItem createBescheid() { return createBescheidBuilder().build(); @@ -63,17 +64,48 @@ public class AttachedItemTestFactory { public static Map<String, Object> createBescheidItem() { var item = new HashMap<String, Object>(); - item.put(Bescheid.FIELD_STATUS, Status.DRAFT); - item.put(Bescheid.FIELD_BESCHIEDEN_AM, BESCHEIDEN_AM); - item.put(Bescheid.FIELD_BEWILLIGT, BEWILLIGT); - item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, BESCHEID_DOCUMENT); - item.put(Bescheid.FIELD_ATTACHMENTS, List.of(ATTACHMENT)); - item.put(Bescheid.FIELD_SEND_BY, SEND_BY.name()); - item.put(Bescheid.FIELD_NACHRICHT_TEXT, NACHRICHT_TEXT); - item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, NACHRICHT_SUBJECT); + item.put(AttachedItem.PROPERTY_VORGANG_ID, VorgangTestFactory.ID); + item.put(Bescheid.FIELD_STATUS, BescheidTestFactory.STATUS.name()); + item.put(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); + item.put(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT); + item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); + item.put(Bescheid.FIELD_ATTACHMENTS, new ArrayList<>(List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR))); + item.put(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); + item.put(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); + item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); item.put(Bescheid.FIELD_SENT_INFO, Map.of( - Bescheid.FIELD_SENT_BY, SENT_BY, - Bescheid.FIELD_SENT_AT, SENT_AT_STR)); + SentInfo.FIELD_SENT_BY, SENT_BY, + SentInfo.FIELD_SENT_AT, SENT_AT_STR)); + return item; + } + + public static AttachedItem createBescheidWithoutDocument() { + return createBescheidWithoutDocumentBuilder().build(); + } + + public static AttachedItem.AttachedItemBuilder createBescheidWithoutDocumentBuilder() { + return createBuilder() + .itemName(AttachedItemService.BESCHEID_ITEM_NAME) + .item(createBescheidItemWithoutDocument()); + } + + private static Map<String, Object> createBescheidItemWithoutDocument() { + var item = new HashMap<String, Object>(); + item.put(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID); + item.put(AttachedItem.PROPERTY_VERSION, AttachedItemTestFactory.VERSION); + item.put(Bescheid.FIELD_VORGANG_ID, VorgangTestFactory.ID); + item.put(Bescheid.FIELD_CREATED_BY, UserProfileTestFactory.ID); + item.put(Bescheid.FIELD_STATUS, BescheidTestFactory.STATUS.name()); + item.put(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM); + item.put(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT); + item.put(Bescheid.FIELD_BESCHEID_DOCUMENT, FileId.from(DocumentTestFactory.ID)); + item.put(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENTS); + item.put(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); + item.put(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); + item.put(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); + item.put(Bescheid.FIELD_SENT_INFO, Map.of( + SentInfo.FIELD_SENT_BY, SENT_BY, + SentInfo.FIELD_SENT_AT, SENT_AT_STR)); return item; } @@ -103,5 +135,4 @@ public class AttachedItemTestFactory { .client(CLIENT) .vorgangId(CommandTestFactory.VORGANG_ID); } - -} +} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java similarity index 97% rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java index da539078f64cab22747c341af6758453d56d633a..6a1ebaafcff9eb040990d3d2809fd1cc7ba8194a 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcFindVorgangAttachedItemResponseTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java similarity index 95% rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java index fa3431732af5d052b593ed5b8827d0565741f44c..daa37d39f9417cb153ae0d83361be572634698e2 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/GrpcVorgangAttachedItemTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import de.ozgcloud.command.CommandTestFactory; import de.ozgcloud.vorgang.common.GrpcObject; @@ -29,12 +29,12 @@ import de.ozgcloud.vorgang.common.GrpcProperty; import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; public class GrpcVorgangAttachedItemTestFactory { + public static final String PROPERTY_NAME = "propertyName"; public static final String PROPERTY_NAME_VALUE = "propertyNameValue"; public static final GrpcObject OBJECT = GrpcObject.newBuilder() .addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE)).build(); - static GrpcVorgangAttachedItem create() { return createBuilder().build(); } @@ -42,6 +42,7 @@ public class GrpcVorgangAttachedItemTestFactory { static GrpcVorgangAttachedItem.Builder createBuilder() { return GrpcVorgangAttachedItem.newBuilder() .setId(AttachedItemTestFactory.ID) + .setVersion(AttachedItemTestFactory.VERSION) .setVorgangId(CommandTestFactory.VORGANG_ID) .setClient(AttachedItemTestFactory.CLIENT) .setItemName(AttachedItemService.BESCHEID_ITEM_NAME) diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java similarity index 98% rename from bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java rename to bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java index 0fc0a06502b2896cdfb67125649c1ede7c047926..7e1a5140b048e87f07aa2c005f6595234a5ea669 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attacheditem/VorgangAttachedItemRemoteServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java @@ -23,7 +23,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -package de.ozgcloud.bescheid.attacheditem; +package de.ozgcloud.common.attached_item; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; @@ -300,7 +300,8 @@ class VorgangAttachedItemRemoteServiceTest { } private AttachedItem createAttachedItem(String beschiedenAm) { - return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm).build(); + return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm) + .build(); } } @@ -309,7 +310,8 @@ class VorgangAttachedItemRemoteServiceTest { @Test void shouldReturnTrueIfDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()) + var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() + .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()) .build(); var result = service.hasStatusDraft(item); @@ -319,7 +321,8 @@ class VorgangAttachedItemRemoteServiceTest { @Test void shouldReturnFalseIfNotDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()) + var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() + .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()) .build(); var result = service.hasStatusDraft(item); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java index 9ba02e1e11c796f19fc771e9ed29000f911690cd..50405df503f49f1a8ef42d20921d9cb0dbc62e99 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java @@ -30,7 +30,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; class DocumentMapperTest { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java index d9666c6f3edcccc48c5ce830547086ab2f9f8d30..9a059e860e5fd527fdc18b6e236f5363ce7311e4 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java @@ -48,11 +48,13 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.attacheditem.AttachedItem; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; -import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory; +import de.ozgcloud.bescheid.BescheidResponse; +import de.ozgcloud.bescheid.BescheidResponseTestFactory; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.attached_item.AttachedItem; +import de.ozgcloud.common.attached_item.AttachedItemService; +import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.errorhandling.TechnicalException; @@ -123,7 +125,8 @@ class DocumentServiceTest { @Nested class TestWithBescheid { - private final Bescheid bescheid = BescheidTestFactory.create().withBescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID)); + private final BescheidResponse bescheid = BescheidResponseTestFactory.create() + .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); @BeforeEach void init() { @@ -140,7 +143,7 @@ class DocumentServiceTest { @Test void shouldCallCreateBescheidDocument() { var itemMap = Map.of("key", (Object) "value"); - doReturn(itemMap).when(service).buildItemMap(any(Bescheid.class)); + doReturn(itemMap).when(service).buildItemMap(any(BescheidResponse.class)); service.createBescheidDocument(command, bescheid); @@ -367,7 +370,8 @@ class DocumentServiceTest { @Nested class TestBuildFromBescheid { - private Bescheid bescheid = BescheidTestFactory.create().withBescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID)); + private BescheidResponse bescheid = BescheidResponseTestFactory.create() + .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); @Test void shouldDetDocumentType() { @@ -380,7 +384,7 @@ class DocumentServiceTest { void shouldSetDocumentFile() { var itemMap = buildItemMap(); - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, BescheidTestFactory.BESCHEID_FILE_ID); + assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, DocumentTestFactory.ID); } @Test @@ -392,7 +396,8 @@ class DocumentServiceTest { @Test void shouldSetEmptyNachrichtText() { - bescheid = BescheidTestFactory.createBuilder().bescheidFileId(FileId.from(BescheidTestFactory.BESCHEID_FILE_ID)) + bescheid = BescheidResponseTestFactory.createBuilder() + .bescheidFileId(FileId.from(DocumentTestFactory.ID)) .nachrichtText(Optional.empty()).build(); var itemMap = buildItemMap(); @@ -402,7 +407,7 @@ class DocumentServiceTest { @Test void shouldThrowExceptionIfFileIdMissing() { - bescheid = BescheidTestFactory.createBuilder().bescheidFileId(null).build(); + bescheid = BescheidResponseTestFactory.createBuilder().bescheidFileId(null).build(); assertThrows(TechnicalException.class, () -> service.buildItemMap(bescheid)); diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto index 920fdd91d321c9c811b380b19a2c4eca8b518e18..3c6990c88bbc2b9194a1927b3347dc12902fe867 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto @@ -74,4 +74,12 @@ message GrpcBescheidManagerConfigResponse { message GrpcBescheidManagerFeatures { bool canCreateBescheidDocument = 1; +} + +message GrpcGetBescheidRequest { + string id = 1; +} + +message GrpcGetBescheidResponse { + GrpcBescheid bescheid = 1; } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.proto index 49d355a435c9cad12c457229967db728b886053e..e99d06390e5aab694b512cac8cd4edd8b5a72f2f 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto @@ -40,4 +40,7 @@ service BescheidService { rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) { } + + rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) { + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index c65e33018262555e9b38727cf434e221ec3ac4eb..1b932d19d2a567520bbdc4d0b0b3b0e73730f5ce 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -3,13 +3,17 @@ package de.ozgcloud.vorgang.servicekonto; import java.util.List; import java.util.Set; +import jakarta.validation.constraints.NotEmpty; + import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.annotation.Validated; import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.extern.log4j.Log4j2; +@Validated @Getter @Builder @Log4j2 @@ -21,6 +25,8 @@ public class ServiceKonto { private String type; private String trustLevel; + + @NotEmpty @Singular private List<PostfachAddress> postfachAddresses; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java index d8c1ab65d0365d32fed233f872c76569ecc36dfc..4c564cad1b2a2455c0a345371ef0a511c3df13d7 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Eingang.java @@ -26,11 +26,16 @@ package de.ozgcloud.vorgang.vorgang; import java.util.List; import java.util.Map; +import jakarta.validation.Valid; + +import org.springframework.validation.annotation.Validated; + import lombok.Builder; import lombok.Getter; import lombok.Singular; import lombok.ToString; +@Validated @ToString(onlyExplicitlyIncluded = true) @Getter @Builder(toBuilder = true) @@ -39,6 +44,7 @@ public class Eingang { @ToString.Include private String id; + @Valid @ToString.Include private EingangHeader header; private Antragsteller antragsteller; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java index d092cc381f65bc11bc918bf1e3a157ceda3cb492..ac8a3dc88ce4437216d904438e3a53254d418003 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangHeader.java @@ -25,11 +25,16 @@ package de.ozgcloud.vorgang.vorgang; import java.time.ZonedDateTime; +import jakarta.validation.Valid; + +import org.springframework.validation.annotation.Validated; + import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.Builder; import lombok.Getter; import lombok.ToString; +@Validated @ToString @Getter @Builder @@ -44,5 +49,6 @@ public class EingangHeader { private String vorgangNummer; private String sender; + @Valid private ServiceKonto serviceKonto; } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java similarity index 98% rename from vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java rename to vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java index 647303f1968fcf6ae80edad3dbe42e87497e6579..3adf3dcf4bf4b7d352039c64292abffdfe1068dc 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcService.java @@ -35,7 +35,7 @@ import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @RequiredArgsConstructor -class GrpcVorgangService extends VorgangServiceGrpc.VorgangServiceImplBase { +class VorgangGrpcService extends VorgangServiceGrpc.VorgangServiceImplBase { private final VorgangService vorgangService; private final VorgangHeaderService vorgangHeaderService; diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java index 3b69aa9e535b41598d1f2d76f9645436e3c8e75c..51e2ba9baad098db8ba6c73cd84f6ee75ddd8d1a 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Stream; +import jakarta.validation.Valid; + import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import de.ozgcloud.command.Command; import de.ozgcloud.command.VorgangCreatedEvent; @@ -47,6 +50,7 @@ import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.servicekonto.ServiceKonto; import lombok.NonNull; +@Validated @Service public class VorgangService { @@ -72,7 +76,7 @@ public class VorgangService { @Autowired private VorgangStubMapper stubMapper; - public Vorgang startCreation(Eingang eingang) { + public Vorgang startCreation(@Valid Eingang eingang) { var mappedEingang = kopControlDataMapper.moveLabelsToControlData(eingang); return repository.save(buildVorgang(mappedEingang, true)); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java index b0aacf0b8b577f54891934831ce0ebf7d71ae466..b0526dd894a7583fd5c89e06e8fd05af4941d872 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceITCase.java @@ -39,11 +39,11 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.test.annotation.DirtiesContext; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceBlockingStub; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.common.callcontext.CallContextUser; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.user.UserProfile; import de.ozgcloud.bescheid.common.user.UserProfileService; +import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.vorgang.VorgangManagerServerApplication; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; @@ -116,20 +116,19 @@ class BescheidGrpcServiceITCase { private Map<String, Object> createItemWithSentInfo() { return Map.of( + Bescheid.FIELD_BEWILLIGT, "true", Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(), Bescheid.FIELD_BESCHIEDEN_AM, "2022-10-01", Bescheid.FIELD_SENT_INFO, Map.of( - Bescheid.FIELD_SENT_AT, GrpcSentInfoTestFactory.SENT_AT_STR, - Bescheid.FIELD_SENT_BY, CallContextUserTestFactory.ID - ) - ); + SentInfo.FIELD_SENT_AT, GrpcSentInfoTestFactory.SENT_AT_STR, + SentInfo.FIELD_SENT_BY, CallContextUserTestFactory.ID)); } private VorgangAttachedItem createBescheidAttachedItem(String vorgangId, String beschiedenAm) { - var itemMap = Map.of( + var itemMap = Map.<String, Object>of( + Bescheid.FIELD_BEWILLIGT, "true", Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name(), - Bescheid.FIELD_BESCHIEDEN_AM, (Object) beschiedenAm - ); + Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm); return createBescheidAttachedItem(vorgangId, itemMap); } @@ -143,7 +142,6 @@ class BescheidGrpcServiceITCase { .item(itemMap) .build(); } - } @Nested @@ -158,5 +156,4 @@ class BescheidGrpcServiceITCase { assertThat(config.getFeatures().getCanCreateBescheidDocument()).isFalse(); } } - -} +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java index deabb903e2e37c99c2e45d41c8d88006e0077764..87fe08890aa9295fbda6a51d5a63f054845f907b 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/bescheid/BescheidITCase.java @@ -57,9 +57,9 @@ import com.mongodb.client.gridfs.model.GridFSFile; import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.user.OzgCloudUserProfile; import de.ozgcloud.apilib.user.OzgCloudUserProfileService; -import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandStatus; +import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.document.BescheidDocumentCreatedEvent; import de.ozgcloud.document.Document; @@ -311,7 +311,7 @@ class BescheidITCase { await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture()); var sentInfoMap = MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO); - assertThat(MapUtils.getString(sentInfoMap, Bescheid.FIELD_SENT_BY)).isNotBlank(); + assertThat(MapUtils.getString(sentInfoMap, SentInfo.FIELD_SENT_BY)).isNotBlank(); }); } @@ -322,7 +322,7 @@ class BescheidITCase { await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> { verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture()); var sentAtStr = MapUtils.getString( - MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO), Bescheid.FIELD_SENT_AT); + MapUtils.getMap(loadBescheid(bescheidItem.getId()).getItem(), Bescheid.FIELD_SENT_INFO), SentInfo.FIELD_SENT_AT); assertThat(ZonedDateTime.parse(sentAtStr)).isCloseTo(ZonedDateTime.now(), within(2, ChronoUnit.SECONDS)); }); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java index acd60e5393d455769e639db9f61e24cf23e11f2a..32db2a67bebf61625a2e5eea835a61eaa5c87665 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/collaboration/CollaborationITCase.java @@ -24,14 +24,21 @@ package de.ozgcloud.vorgang.collaboration; import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.InstanceOfAssertFactories.*; import static org.awaitility.Awaitility.*; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import org.bson.types.ObjectId; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -41,29 +48,41 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.test.annotation.DirtiesContext; +import com.google.protobuf.ByteString; + import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.user.OzgCloudUserProfile; import de.ozgcloud.apilib.user.OzgCloudUserProfileService; +import de.ozgcloud.collaboration.CollaborationServiceGrpc.CollaborationServiceBlockingStub; +import de.ozgcloud.collaboration.GrpcGetFileContentRequest; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandStatus; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; import de.ozgcloud.vorgang.callcontext.CallContext; +import de.ozgcloud.vorgang.callcontext.TestCallContextAttachingInterceptor; import de.ozgcloud.vorgang.callcontext.WithMockCustomUser; import de.ozgcloud.vorgang.command.CommandService; import de.ozgcloud.vorgang.command.CommandTestFactory; import de.ozgcloud.vorgang.command.CreateCommandRequest; +import de.ozgcloud.vorgang.files.FileService; +import de.ozgcloud.vorgang.files.GridFsTestFactory; +import de.ozgcloud.vorgang.files.OzgFileTestFactory; import de.ozgcloud.vorgang.vorgang.Vorgang; import de.ozgcloud.vorgang.vorgang.VorgangHead; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.ZustaendigeStelleTestFactory; +import net.devh.boot.grpc.client.inject.GrpcClient; @SpringBootTest(properties = { "grpc.server.inProcessName=test", "grpc.client.vorgang-manager.address=in-process:test", "grpc.client.ozgcloud-command-manager.address=in-process:test", + "grpc.client.file-manager.address=in-process:test", + "grpc.client.inProcess.address=in-process:test" }) @DataITCase @WithMockCustomUser @@ -78,32 +97,30 @@ class CollaborationITCase { @MockBean private OzgCloudUserProfileService ozgCloudUserProfileService; + @Mock private OzgCloudUserProfile ozgCloudUserProfile; - @BeforeEach - void init() { - mongoOperations.dropCollection(Command.class); - mongoOperations.dropCollection(Vorgang.class); - mongoOperations.dropCollection(VorgangAttachedItem.class); - when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); - when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); - } - @Nested class TestCreateCollaborationVorgang { + @BeforeEach + void init() { + mongoOperations.dropCollection(Command.class); + mongoOperations.dropCollection(Vorgang.class); + mongoOperations.dropCollection(VorgangAttachedItem.class); + when(ozgCloudUserProfile.getId()).thenReturn(OzgCloudUserId.from(CommandTestFactory.CREATED_BY)); + when(ozgCloudUserProfileService.getById(any())).thenReturn(ozgCloudUserProfile); + + vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId(); + } + private static final String FIELD_COLLABORATION_VORGANG_ID = "collaborationVorgangId"; private static final String TITEL = "Collaboration Vorgang"; private static final String ANFRAGE = "Anfrage"; private String vorgangId; - @BeforeEach - void init() { - vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0L).build()).getId(); - } - @Test void shouldSetCollaborationVorgangId() { var command = commandService.createCommand(buildCreateCollaborationVorgangCommand(vorgangId)); @@ -138,16 +155,14 @@ class CollaborationITCase { .bodyObject(Map.of( "titel", TITEL, "anfrage", ANFRAGE, - "zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID - )) + "zustaendigeStelle", ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)) .build(); } private void waitUntilCommandFinished(String commandId) { await().atMost(60, TimeUnit.SECONDS).until( () -> mongoOperations.findById(commandId, Command.class), - command -> command.getStatus() == CommandStatus.FINISHED - ); + command -> command.getStatus() == CommandStatus.FINISHED); } private Vorgang loadCollaborationVorgang(String sourceVorgangId) { @@ -158,10 +173,75 @@ class CollaborationITCase { private List<VorgangAttachedItem> loadCollaborationRequest(String vorgangId) { var query = new Query(new Criteria().andOperator( Criteria.where(VorgangAttachedItem.FIELDNAME_VORGANG_ID).is(vorgangId), - Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest") - )); + Criteria.where(VorgangAttachedItem.FIELDNAME_ITEM_NAME).is("CollaborationRequest"))); return mongoOperations.find(query, VorgangAttachedItem.class); } } + @DisplayName("Get file content") + @Nested + class TestGetFileContent { + + @GrpcClient("inProcess") + private CollaborationServiceBlockingStub collaborationStub; + + @Autowired + private GridFsTemplate gridFsTemplate; + + @BeforeEach + void initDatabase() { + gridFsTemplate.delete(new Query()); + } + + @Test + void shouldReturnStoredSmallFile() { + var fileId = gridFsTemplate.store(GridFsTestFactory.createUpload()); + + var file = downloadBinaryFile(fileId); + + assertThat(file).hasSameSizeAs(OzgFileTestFactory.CONTENT).isEqualTo(OzgFileTestFactory.CONTENT); + } + + @Test + void shouldReturnStoredFileWithSizeEqualChunkSize() { + var content = OzgFileTestFactory.createContentInByte(FileService.CHUNK_SIZE); + var fileId = gridFsTemplate.store(GridFsTestFactory.createUpload(content)); + + var file = downloadBinaryFile(fileId); + + assertThat(file).hasSameSizeAs(content).isEqualTo(content); + } + + @Test + void shouldReturnStoredLargeFile() { + var input = OzgFileTestFactory.createContentInMiB(5); + var fileId = gridFsTemplate + .store(GridFsTestFactory.createUpload(input)); + + var downloadedFile = downloadBinaryFile(fileId); + + assertThat(downloadedFile).hasSameSizeAs(input).isEqualTo(input); + } + + private byte[] downloadBinaryFile(ObjectId fileId) { + var request = GrpcGetFileContentRequest.newBuilder() + .setId(fileId.toHexString()).build(); + var it = prepareBinaryFileServiceBlockingStub().getFileContent(request); + var content = new ByteArrayOutputStream(); + while (it.hasNext()) { + ByteString chunkContent = it.next().getFileContent(); + try { + content.write(chunkContent.toByteArray()); + } catch (IOException e) { + fail(e); + } + } + + return content.toByteArray(); + } + + private CollaborationServiceBlockingStub prepareBinaryFileServiceBlockingStub() { + return collaborationStub.withInterceptors(new TestCallContextAttachingInterceptor()); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java similarity index 86% rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java index 64f5d92f697a27617174aa251c471232b00423ad..c2984475269832306c7462326caffeaadab6f276 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceITCase.java @@ -27,14 +27,11 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import java.time.LocalDate; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Optional; -import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -42,32 +39,17 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.annotation.DirtiesContext; -import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.vorgang.callcontext.CallContextUserTestFactory; -import de.ozgcloud.vorgang.callcontext.CurrentUserService; -import de.ozgcloud.vorgang.clientattribute.ClientAttribute; -import de.ozgcloud.vorgang.clientattribute.ClientAttributeTestFactory; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap; -import de.ozgcloud.vorgang.clientattribute.ClientAttributesMapTestFactory; -import de.ozgcloud.vorgang.common.GrpcQueryOperator; -import de.ozgcloud.vorgang.common.db.CriteriaUtil; import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcFormFieldTestFactory; import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory; -import de.ozgcloud.vorgang.common.operator.OperatorBuilder; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; import io.grpc.stub.StreamObserver; -import net.devh.boot.grpc.client.inject.GrpcClient; @ITCase -class GrpcVorgangServiceITCase { +class VorgangGrpcServiceITCase { static final String VALUE_KEY = "value"; static final String LABEL_KEY = "label"; @@ -97,7 +79,7 @@ class GrpcVorgangServiceITCase { private static final String TITLE_SUBFORM_3 = "SUBFORM_3"; @Autowired - private GrpcVorgangService grpcVorgangService; + private VorgangGrpcService grpcVorgangService; @MockBean private VorgangService service; @@ -117,7 +99,7 @@ class GrpcVorgangServiceITCase { void shouldKeepFieldsOrder() { var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); assertThat(removeControlData(formData)).containsExactly( entry(NAME_FIELD_1, FIELD_1), @@ -131,7 +113,7 @@ class GrpcVorgangServiceITCase { .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2)) .addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build(); - Map<String, Object> formData = startCreation(grpcFormData); + var formData = startCreation(grpcFormData); verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3); } @@ -140,7 +122,7 @@ class GrpcVorgangServiceITCase { @Test void shouldKeepFieldsOrderInSubForm() { var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm( - GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) + GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields)) .build(); var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java similarity index 99% rename from vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java rename to vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java index 3b78df2424dfa62ae1048907e663065de5110e27..e555f66338c6679e81c68b4aa0a2dbcdb483f2b4 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcVorgangServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangGrpcServiceTest.java @@ -51,7 +51,7 @@ import de.ozgcloud.vorgang.collaboration.GrpcCollaborationRequestTestFactory; import de.ozgcloud.vorgang.collaboration.GrpcCreateCollaborationVorgangResponseTestFactory; import io.grpc.stub.StreamObserver; -class GrpcVorgangServiceTest { +class VorgangGrpcServiceTest { private static final int LIMIT = 10; private static final int OFFSET = 0; @@ -59,7 +59,7 @@ class GrpcVorgangServiceTest { @Spy @InjectMocks - private GrpcVorgangService service; + private VorgangGrpcService service; @Mock private VorgangService vorgangService; @Mock diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java index c15c4a2244378fdedae6b7608784aed4876aeb9a..1daf6ec91d576e4022724eda11620c3dfedb04fe 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangITCase.java @@ -52,7 +52,7 @@ import io.grpc.stub.StreamObserver; class VorgangITCase { @Autowired - private GrpcVorgangService service; + private VorgangGrpcService service; @Autowired private MongoOperations mongoOperations; diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java index 443303a1c8212f534df06dfb03c17def5d0c6ca3..5835a656a9cd2ed08c8002665bbc679e6439691f 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangServiceITCase.java @@ -29,6 +29,8 @@ import static org.mockito.Mockito.*; import java.util.List; +import jakarta.validation.ConstraintViolationException; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -40,6 +42,7 @@ import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.notification.antragsteller.AntragstellerNotificationEventListener; import de.ozgcloud.notification.user.UserNotificationEventListener; import de.ozgcloud.vorgang.command.CommandService; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; @DataITCase @WithMockUser @@ -80,5 +83,20 @@ class VorgangServiceITCase { verify(antragstellerNotificationEventListener, timeout(60000)).onVorgangCreated(any()); verify(userNotificationEventListener, timeout(60000)).onVorgangCreated(any()); } + + @DisplayName("validation") + @Nested + class TestValidation { + + @DisplayName("should be invalid on missing postfachAddress in serviceKonto") + @Test + void shouldBeInvalidOnMissingPostfachAddress() { + var eingang = EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder() + .serviceKonto(ServiceKontoTestFactory.createBuilder().clearPostfachAddresses().build()).build()) + .build(); + + assertThatThrownBy(() -> vorgangService.startCreation(eingang)).isInstanceOf(ConstraintViolationException.class); + } + } } } \ No newline at end of file