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

Merge branch 'refs/heads/master' into...

Merge branch 'refs/heads/master' into OZG-6259-Anlegen-einer-ZusammenarbeitAnfrage-Edit-Add-comment-Assign-More-IN-PROGRESS-Export

# Conflicts:
#	Jenkinsfile
#	vorgang-manager-server/pom.xml
parents d4b93f16 2f9b9850
No related branches found
No related tags found
No related merge requests found
Showing
with 49 additions and 652 deletions
...@@ -85,7 +85,6 @@ pipeline { ...@@ -85,7 +85,6 @@ pipeline {
} }
configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
sh 'mvn --no-transfer-progress -s $MAVEN_SETTINGS -DskipTests deploy -Dmaven.wagon.http.retryHandler.count=3' sh 'mvn --no-transfer-progress -s $MAVEN_SETTINGS -DskipTests deploy -Dmaven.wagon.http.retryHandler.count=3'
// sh "mvn -s $MAVEN_SETTINGS versions:revert"
} }
} }
} }
......
...@@ -5,19 +5,19 @@ ...@@ -5,19 +5,19 @@
<parent> <parent>
<groupId>de.ozgcloud.common</groupId> <groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-parent</artifactId> <artifactId>ozgcloud-common-parent</artifactId>
<version>4.3.0</version> <version>4.3.1</version>
<relativePath /> <relativePath />
</parent> </parent>
<groupId>de.ozgcloud.bescheid</groupId> <groupId>de.ozgcloud.bescheid</groupId>
<artifactId>bescheid-manager</artifactId> <artifactId>bescheid-manager</artifactId>
<name>OZG-Cloud Bescheid Manager</name> <name>OZG-Cloud Bescheid Manager</name>
<version>1.15.0-SNAPSHOT</version> <version>1.16.0-SNAPSHOT</version>
<properties> <properties>
<vorgang-manager.version>2.9.0</vorgang-manager.version> <vorgang-manager.version>2.9.0</vorgang-manager.version>
<nachrichten-manager.version>2.9.0</nachrichten-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version>
<api-lib.version>0.11.0-SNAPSHOT</api-lib.version> <api-lib.version>0.11.0</api-lib.version>
</properties> </properties>
<dependencies> <dependencies>
......
...@@ -44,7 +44,6 @@ import de.ozgcloud.bescheid.attacheditem.AttachedItemService; ...@@ -44,7 +44,6 @@ import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.common.user.UserProfileService; import de.ozgcloud.bescheid.common.user.UserProfileService;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangId;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandCreatedEvent;
...@@ -94,14 +93,12 @@ class BescheidEventListener { ...@@ -94,14 +93,12 @@ class BescheidEventListener {
private final BescheidService service; private final BescheidService service;
private final BinaryFileService fileService; private final BinaryFileService fileService;
private final NachrichtService nachrichtService;
private final AttachedItemService attachedItemService; private final AttachedItemService attachedItemService;
private final DocumentService documentService; private final DocumentService documentService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final CurrentUserService userService; private final CurrentUserService userService;
private final UserProfileService userProfileService; private final UserProfileService userProfileService;
private final BescheidFeatureProperties bescheidFeatureProperties;
@EventListener(condition = IS_CREATE_BESCHEID) @EventListener(condition = IS_CREATE_BESCHEID)
public void onCreateBescheidCommand(CommandCreatedEvent event) { public void onCreateBescheidCommand(CommandCreatedEvent event) {
...@@ -109,12 +106,6 @@ class BescheidEventListener { ...@@ -109,12 +106,6 @@ class BescheidEventListener {
} }
void doCreateBescheid(Command command) { void doCreateBescheid(Command command) {
if (bescheidFeatureProperties.isKielHackathonRoute()) {
var bescheid = doCreateBescheidBiz(command);
nachrichtService.createNachrichtDraft(bescheid);
eventPublisher.publishEvent(new BescheidCreatedEvent(command));
return;
}
var createdItemId = attachedItemService.createBescheidDraft(command); var createdItemId = attachedItemService.createBescheidDraft(command);
eventPublisher.publishEvent(new BescheidCreatedEvent(command, createdItemId)); eventPublisher.publishEvent(new BescheidCreatedEvent(command, createdItemId));
} }
......
/*
* 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;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import lombok.Getter;
import lombok.Setter;
@Configuration
@ConfigurationProperties(prefix = "ozgcloud.feature.bescheid")
@Getter
@Setter
public class BescheidFeatureProperties {
private boolean storeAsDocument = false;
private boolean kielHackathonRoute = false;
}
...@@ -26,7 +26,6 @@ import de.ozgcloud.bescheid.attacheditem.AttachedItem; ...@@ -26,7 +26,6 @@ import de.ozgcloud.bescheid.attacheditem.AttachedItem;
import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.attributes.ClientAttributeService; import de.ozgcloud.bescheid.attributes.ClientAttributeService;
import de.ozgcloud.bescheid.common.user.UserProfileService; import de.ozgcloud.bescheid.common.user.UserProfileService;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.Vorgang;
import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangId;
import de.ozgcloud.bescheid.vorgang.VorgangService; import de.ozgcloud.bescheid.vorgang.VorgangService;
...@@ -43,10 +42,19 @@ import lombok.extern.log4j.Log4j2; ...@@ -43,10 +42,19 @@ import lombok.extern.log4j.Log4j2;
class BescheidService { class BescheidService {
private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured."; private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured.";
static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN"; static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN";
static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL";
static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT";
static final String FIELD_POSTFACH_ID = "postfachId";
static final String FIELD_REPLY_OPTION = "replyOption";
static final String REPLY_OPTION = "FORBIDDEN";
static final String FIELD_SUBJECT = "subject";
static final String FIELD_MAIL_BODY = "mailBody";
static final String FIELD_ATTACHMENTS = "attachments";
static final String SUBJECT = "Ihr Bescheid zum Antrag";
private final VorgangService vorgangService; private final VorgangService vorgangService;
private final AttachedItemService attachedItemService; private final AttachedItemService attachedItemService;
private final UserProfileService userProfileService; private final UserProfileService userProfileService;
...@@ -210,10 +218,10 @@ class BescheidService { ...@@ -210,10 +218,10 @@ class BescheidService {
Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> postfachAddress) { Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> postfachAddress) {
return Map.of( return Map.of(
NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION, FIELD_REPLY_OPTION, REPLY_OPTION,
NachrichtService.FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(NachrichtService.SUBJECT), FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(SUBJECT),
NachrichtService.FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY), FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY),
NachrichtService.FIELD_ATTACHMENTS, buildAttachments(bescheidItem), FIELD_ATTACHMENTS, buildAttachments(bescheidItem),
Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress); Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress);
} }
......
package de.ozgcloud.bescheid.nachricht;
import java.time.ZonedDateTime;
import de.ozgcloud.bescheid.UserId;
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.NonNull;
@Getter
@Builder
public class Nachricht {
private NachrichtId id;
private VorgangId vorgangId;
@NonNull
private String subject;
@NonNull
private String mailBody;
private FileId bescheidFileId;
@NonNull
private UserId createdBy;
@Builder.Default
private ZonedDateTime createdAt = ZonedDateTime.now();
private Vorgang.PostfachAddress postfachAddress;
}
package de.ozgcloud.bescheid.nachricht;
import de.ozgcloud.common.datatype.StringBasedValue;
public class NachrichtId extends StringBasedValue {
NachrichtId(String nachrichtId) {
super(nachrichtId);
}
public static NachrichtId from(String nachrichtId) {
return new NachrichtId(nachrichtId);
}
}
package de.ozgcloud.bescheid.nachricht;
import org.mapstruct.CollectionMappingStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.ReportingPolicy;
import de.ozgcloud.bescheid.UserId;
import de.ozgcloud.bescheid.vorgang.Vorgang;
import de.ozgcloud.common.binaryfile.FileId;
import de.ozgcloud.nachrichten.postfach.GrpcPostfachNachricht;
import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress;
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, //
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.ERROR, uses = { GrpcObjectMapper.class })
public interface NachrichtMapper {
@Mapping(target = "createdAtBytes", ignore = true)
@Mapping(target = "mergePostfachAddress", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "idBytes", ignore = true)
@Mapping(target = "mailBodyBytes", ignore = true)
@Mapping(target = "replyOptionBytes", ignore = true)
@Mapping(target = "subjectBytes", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "allFields", ignore = true)
@Mapping(target = "id", ignore = true)
@Mapping(target = "attachmentList", source = "bescheidFileId")
@Mapping(target = "replyOption", constant = "FORBIDDEN")
GrpcPostfachNachricht mapToGrpc(Nachricht nachricht);
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "mergeIdentifier", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "versionBytes", ignore = true)
@Mapping(target = "allFields", ignore = true)
GrpcPostfachAddress mapAddress(Vorgang.PostfachAddress address);
default String mapToString(FileId fileId) {
return fileId.toString();
}
default String mapToString(UserId userId) {
return userId.toString();
}
}
package de.ozgcloud.bescheid.nachricht;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.nachrichten.postfach.GrpcSaveNachrichtDraftRequest;
import de.ozgcloud.nachrichten.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub;
import io.grpc.ClientInterceptor;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class NachrichtRemoteService {
@GrpcClient("nachrichten-manager")
private PostfachServiceBlockingStub serviceStub;
@Autowired
private NachrichtMapper mapper;
@Autowired
private ClientInterceptor bescheidCallContextInterceptor;
public void saveDraft(Nachricht nachricht) {
serviceStub.withInterceptors(bescheidCallContextInterceptor)
.saveNachrichtDraft(buildRequest(nachricht));
}
GrpcSaveNachrichtDraftRequest buildRequest(Nachricht nachricht) {
return GrpcSaveNachrichtDraftRequest.newBuilder()
.setVorgangId(nachricht.getVorgangId().toString())
.setNachricht(mapper.mapToGrpc(nachricht))
.build();
}
}
package de.ozgcloud.bescheid.nachricht;
import java.util.Objects;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.bescheid.Bescheid;
import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress;
import lombok.extern.log4j.Log4j2;
@Service
@Log4j2
public class NachrichtService {
public static final String FIELD_POSTFACH_ID = "postfachId";
public static final String FIELD_REPLY_OPTION = "replyOption";
public static final String REPLY_OPTION = "FORBIDDEN";
public static final String FIELD_SUBJECT = "subject";
public static final String FIELD_MAIL_BODY = "mailBody";
public static final String FIELD_ATTACHMENTS = "attachments";
public static final String SUBJECT = "Ihr Bescheid zum Antrag";
@Autowired
private NachrichtRemoteService remoteService;
@Autowired
@Qualifier("bescheid_OzgCloudCommandService")
private OzgCloudCommandService commandService;
@Autowired
private CommandMapper commandMapper;
@Autowired
private TemplateHandler templateHandler;
private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh";
public void createNachrichtDraft(Bescheid bescheid) {
buildNachricht(bescheid).ifPresentOrElse(remoteService::saveDraft, () -> LOG.warn("No ServiceKonto given on Vorgang."));
}
Optional<Nachricht> buildNachricht(Bescheid bescheid) {
return getAddress(bescheid).map(address -> Nachricht.builder()
.vorgangId(bescheid.getVorgangId())
.postfachAddress(address)
.subject(bescheid.getNachrichtSubject().orElse(SUBJECT))
.mailBody(buildMessage(bescheid))
.createdBy(bescheid.getCreatedBy())
.bescheidFileId(bescheid.getBescheidFileId())
.build());
}
String buildMessage(Bescheid bescheid) {
return bescheid.getNachrichtText()
.orElseGet(() -> templateHandler.fillTemplate(TEMPLATE_FILE, bescheid));
}
Optional<PostfachAddress> getAddress(Bescheid bescheid) {
var serviceKonto = bescheid.getServiceKonto();
if (Objects.nonNull(serviceKonto)) {
return Optional.of(serviceKonto.getPostfachAddresses().get(0));
}
return Optional.empty();
}
}
...@@ -33,8 +33,6 @@ class BescheidEventListenerITCase { ...@@ -33,8 +33,6 @@ class BescheidEventListenerITCase {
private ApplicationEventPublisher publisher; private ApplicationEventPublisher publisher;
@SpyBean @SpyBean
private BescheidEventListener listener; private BescheidEventListener listener;
@Autowired
private BescheidFeatureProperties bescheidFeatureProperties;
@MockBean @MockBean
private BescheidService service; private BescheidService service;
...@@ -62,16 +60,11 @@ class BescheidEventListenerITCase { ...@@ -62,16 +60,11 @@ class BescheidEventListenerITCase {
private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.CREATE_BESCHEID_ORDER).build(); private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.CREATE_BESCHEID_ORDER).build();
@BeforeEach
void init() {
bescheidFeatureProperties.setKielHackathonRoute(true);
}
@Test @Test
void shouldCallService() { void shouldCallService() {
publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command));
verify(service).createBescheid(any()); verify(attachedItemService).createBescheidDraft(command);
} }
@Test @Test
......
...@@ -32,7 +32,6 @@ import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; ...@@ -32,7 +32,6 @@ import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
import de.ozgcloud.bescheid.common.user.UserProfile; import de.ozgcloud.bescheid.common.user.UserProfile;
import de.ozgcloud.bescheid.common.user.UserProfileService; import de.ozgcloud.bescheid.common.user.UserProfileService;
import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEventTestFactory; import de.ozgcloud.command.CommandCreatedEventTestFactory;
import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandExecutedEvent;
...@@ -55,12 +54,8 @@ class BescheidEventListenerTest { ...@@ -55,12 +54,8 @@ class BescheidEventListenerTest {
@Mock @Mock
private BinaryFileService fileService; private BinaryFileService fileService;
@Mock @Mock
private NachrichtService nachrichtService;
@Mock
private AttachedItemService attachedItemService; private AttachedItemService attachedItemService;
@Mock @Mock
private BescheidFeatureProperties featureProperties;
@Mock
private DocumentService documentService; private DocumentService documentService;
@Mock @Mock
...@@ -105,50 +100,11 @@ class BescheidEventListenerTest { ...@@ -105,50 +100,11 @@ class BescheidEventListenerTest {
@Captor @Captor
private ArgumentCaptor<BescheidCreatedEvent> eventCaptor; private ArgumentCaptor<BescheidCreatedEvent> eventCaptor;
@Nested
class TestKielConfigured {
@BeforeEach
void init() {
when(featureProperties.isKielHackathonRoute()).thenReturn(true);
}
@Test
void shouldCallDoCreateBescheidBiz() {
listener.doCreateBescheid(COMMAND);
verify(listener).doCreateBescheidBiz(COMMAND);
verify(attachedItemService, never()).createBescheidDraft(any());
}
@Test
void shouldCallNachrichtService() {
var bescheid = BescheidTestFactory.create();
doReturn(bescheid).when(listener).doCreateBescheidBiz(any());
listener.doCreateBescheid(COMMAND);
verify(nachrichtService).createNachrichtDraft(bescheid);
}
@Test
void shouldPublishBescheidCreatedEvent() {
listener.doCreateBescheid(COMMAND);
verify(eventPublisher).publishEvent(eventCaptor.capture());
assertThat(eventCaptor.getValue().getSource()).isEqualTo(CommandTestFactory.ID);
}
}
@Nested
class TestNotKielConfigured {
@Test @Test
void shouldCallCreateBescheidDraft() { void shouldCallCreateBescheidDraft() {
listener.doCreateBescheid(COMMAND); listener.doCreateBescheid(COMMAND);
verify(attachedItemService).createBescheidDraft(COMMAND); verify(attachedItemService).createBescheidDraft(COMMAND);
verify(listener, never()).doCreateBescheidBiz(any());
} }
@Test @Test
...@@ -176,8 +132,6 @@ class BescheidEventListenerTest { ...@@ -176,8 +132,6 @@ class BescheidEventListenerTest {
} }
} }
}
@Nested @Nested
class TestCreateBescheidRequest { class TestCreateBescheidRequest {
......
package de.ozgcloud.bescheid; package de.ozgcloud.bescheid;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.InstanceOfAssertFactories.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
...@@ -45,7 +46,6 @@ import de.ozgcloud.bescheid.attributes.ClientAttributeService; ...@@ -45,7 +46,6 @@ import de.ozgcloud.bescheid.attributes.ClientAttributeService;
import de.ozgcloud.bescheid.common.user.UserProfile; import de.ozgcloud.bescheid.common.user.UserProfile;
import de.ozgcloud.bescheid.common.user.UserProfileService; import de.ozgcloud.bescheid.common.user.UserProfileService;
import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.common.user.UserProfileTestFactory;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory; import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory;
import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory;
import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.Vorgang;
...@@ -930,7 +930,7 @@ class BescheidServiceTest { ...@@ -930,7 +930,7 @@ class BescheidServiceTest {
var result = buildPostfachAddress(); var result = buildPostfachAddress();
assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP) assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP)
.containsEntry(NachrichtService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID); .containsEntry(BescheidService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID);
} }
@Test @Test
...@@ -971,7 +971,7 @@ class BescheidServiceTest { ...@@ -971,7 +971,7 @@ class BescheidServiceTest {
void shouldSetReplyOption() { void shouldSetReplyOption() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).containsEntry(NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION); assertThat(result).containsEntry(BescheidService.FIELD_REPLY_OPTION, BescheidService.REPLY_OPTION);
} }
@Test @Test
...@@ -985,7 +985,7 @@ class BescheidServiceTest { ...@@ -985,7 +985,7 @@ class BescheidServiceTest {
void shouldSetSubject() { void shouldSetSubject() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT); assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, AttachedItemTestFactory.NACHRICHT_SUBJECT);
} }
@Test @Test
...@@ -999,7 +999,7 @@ class BescheidServiceTest { ...@@ -999,7 +999,7 @@ class BescheidServiceTest {
void shouldSetMailBody() { void shouldSetMailBody() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT); assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, AttachedItemTestFactory.NACHRICHT_TEXT);
} }
@Test @Test
...@@ -1013,7 +1013,7 @@ class BescheidServiceTest { ...@@ -1013,7 +1013,7 @@ class BescheidServiceTest {
void shouldSetAttachments() { void shouldSetAttachments() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).extracting(NachrichtService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.ATTACHMENT); assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(AttachedItemTestFactory.ATTACHMENT);
} }
@Test @Test
...@@ -1038,14 +1038,14 @@ class BescheidServiceTest { ...@@ -1038,14 +1038,14 @@ class BescheidServiceTest {
void shouldSetSubject() { void shouldSetSubject() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).containsEntry(NachrichtService.FIELD_SUBJECT, NachrichtService.SUBJECT); assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidService.SUBJECT);
} }
@Test @Test
void shouldSetMailBody() { void shouldSetMailBody() {
var result = buildSendNachrichtCommandBody(); var result = buildSendNachrichtCommandBody();
assertThat(result).containsEntry(NachrichtService.FIELD_MAIL_BODY, StringUtils.EMPTY); assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, StringUtils.EMPTY);
} }
} }
} }
......
package de.ozgcloud.bescheid.nachricht;
import de.ozgcloud.nachrichten.postfach.GrpcPostfachNachricht;
public class GrpcPostfachNachrichtTestFactory {
public static final GrpcPostfachNachricht create() {
return createBuilder().build();
}
public static final GrpcPostfachNachricht.Builder createBuilder() {
return GrpcPostfachNachricht.newBuilder()
.setCreatedAt(NachrichtTestFactory.CREATED_AT.toString())
.setMailBody(NachrichtTestFactory.MAIL_BODY)
.setSubject(NachrichtTestFactory.SUBJECT);
}
}
package de.ozgcloud.bescheid.nachricht;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers;
import org.mockito.InjectMocks;
class NachrichtMapperTest {
@InjectMocks
private NachrichtMapper mapper = Mappers.getMapper(NachrichtMapper.class);;
@Nested
class TestMapToGrpc {
@Test
void shouldMapNachricht() {
var mapped = mapper.mapToGrpc(NachrichtTestFactory.create());
assertThat(mapped).usingRecursiveComparison()
.ignoringFields("replyOption_", "memoizedHashCode")
.isEqualTo(GrpcPostfachNachrichtTestFactory.create());
}
@Test
void shouldIgnoreMissingFileId() {
var mapped = mapper.mapToGrpc(NachrichtTestFactory.createBuilder().bescheidFileId(null).build());
assertThat(mapped.getAttachmentList()).isEmpty();
}
@Test
void shouldSetReplyOption() {
var mapped = mapper.mapToGrpc(NachrichtTestFactory.create());
assertThat(mapped.getReplyOption()).isEqualTo("FORBIDDEN");
}
@Test
void shouldNotMapId() {
var mapped = mapper.mapToGrpc(NachrichtTestFactory.create());
assertThat(mapped.getId()).isEmpty();
}
}
}
package de.ozgcloud.bescheid.nachricht;
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.mockito.InjectMocks;
import org.mockito.Mock;
import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
import de.ozgcloud.nachrichten.postfach.GrpcPostfachNachricht;
class NachrichtRemoteServiceTest {
@InjectMocks
private NachrichtRemoteService remoteService;
@Mock
private NachrichtMapper mapper;
@Nested
class TestSaveDarft {
@Nested
class BuildRequest {
private Nachricht nachricht = NachrichtTestFactory.create();
private GrpcPostfachNachricht grpcNachricht = GrpcPostfachNachrichtTestFactory.create();
@BeforeEach
void initMocks() {
when(mapper.mapToGrpc(any())).thenReturn(grpcNachricht);
}
@Test
void shouldCallMapper() {
remoteService.buildRequest(nachricht);
verify(mapper).mapToGrpc(nachricht);
}
@Test
void shouldSetNachricht() {
var request = remoteService.buildRequest(nachricht);
assertThat(request.getNachricht()).isSameAs(grpcNachricht);
}
@Test
void shouldSetVorgangId() {
var request = remoteService.buildRequest(nachricht);
assertThat(request.getVorgangId()).isEqualTo(VorgangTestFactory.ID.toString());
}
}
}
}
package de.ozgcloud.bescheid.nachricht;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.bescheid.BescheidTestFactory;
import de.ozgcloud.common.test.ITCase;
@ITCase
class NachrichtServiceITCase {
@Autowired
private NachrichtService service;
@MockBean
private OzgCloudCommandService commandService;
@MockBean
private CommandMapper commandMapper;
@DisplayName("Build message")
@Nested
class TestBuildMessage {
@Test
void shouldBuildMessage() {
var message = service.buildMessage(BescheidTestFactory.create());
assertThat(message).isNotBlank();
}
}
}
\ No newline at end of file
package de.ozgcloud.bescheid.nachricht;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.bescheid.BescheidTestFactory;
import de.ozgcloud.bescheid.common.freemarker.TemplateHandler;
import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
class NachrichtServiceTest {
@Spy
@InjectMocks
private NachrichtService service;
@Mock
private NachrichtRemoteService remoteService;
@Mock
private TemplateHandler templateHandler;
@Nested
class TestCreateNachrichtDraft {
private final Nachricht nachricht = NachrichtTestFactory.create();
@Test
void shouldCallRemoteService() {
doReturn(Optional.of(nachricht)).when(service).buildNachricht(any());
service.createNachrichtDraft(BescheidTestFactory.create());
verify(remoteService).saveDraft(nachricht);
}
@Nested
class BuildNachricht {
@BeforeEach
void init() {
doReturn(NachrichtTestFactory.MAIL_BODY).when(service).buildMessage(any());
}
@Test
void shouldFillMailBody() {
var nachricht = service.buildNachricht(BescheidTestFactory.create()).get();
assertThat(nachricht.getMailBody()).isEqualTo(NachrichtTestFactory.MAIL_BODY);
}
@Test
void shouldSetSubject() {
var nachricht = service.buildNachricht(BescheidTestFactory.create()).get();
assertThat(nachricht.getSubject()).isEqualTo(BescheidTestFactory.NACHRICHT_SUBJECT);
}
@Test
void shouldSetDefaultSubject() {
var bescheid = BescheidTestFactory.createBuilder().nachrichtSubject(Optional.empty()).build();
var nachricht = service.buildNachricht(bescheid).get();
assertThat(nachricht.getSubject()).isEqualTo(NachrichtService.SUBJECT);
}
@Test
void shouldSetUser() {
var nachricht = service.buildNachricht(BescheidTestFactory.create()).get();
assertThat(nachricht.getCreatedBy()).isEqualTo(BescheidTestFactory.CREATED_BY);
}
@Test
void shouldSetVorgangId() {
var nachricht = service.buildNachricht(BescheidTestFactory.create()).get();
assertThat(nachricht.getVorgangId()).isEqualTo(VorgangTestFactory.ID);
}
}
}
@Nested
class TestBuildMessage {
@Test
void shouldUseTextFromBescheid() {
var message = service.buildMessage(BescheidTestFactory.create());
assertThat(message).isEqualTo(BescheidTestFactory.NACHRICHT_TEXT);
}
@Test
void shouldUseDefaultTemplate() {
doReturn("FROM_TEMPLATE").when(templateHandler).fillTemplate(any(), any());
var message = service.buildMessage(BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build());
assertThat(message).isEqualTo("FROM_TEMPLATE");
}
}
}
package de.ozgcloud.bescheid.nachricht;
import java.time.ZonedDateTime;
import java.util.UUID;
import de.ozgcloud.bescheid.UserId;
import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
public class NachrichtTestFactory {
public static final NachrichtId ID = NachrichtId.from(UUID.randomUUID().toString());
public static final String SUBJECT = "subject of message";
public static final String MAIL_BODY = "Lorem ipsum";
public static final UserId CREATED_BY = UserId.from(UUID.randomUUID().toString());
public static final ZonedDateTime CREATED_AT = ZonedDateTime.now().withNano(0);
public static Nachricht create() {
return createBuilder().build();
}
public static Nachricht.NachrichtBuilder createBuilder() {
return Nachricht.builder()
.id(ID)
.vorgangId(VorgangTestFactory.ID)
.subject(SUBJECT)
.mailBody(MAIL_BODY)
.createdBy(CREATED_BY)
.createdAt(CREATED_AT);
}
}
...@@ -26,12 +26,13 @@ package de.ozgcloud.bescheid.vorgang; ...@@ -26,12 +26,13 @@ package de.ozgcloud.bescheid.vorgang;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder; import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder;
public class PostfachAddressTestFactory { public class PostfachAddressTestFactory {
public static final String POSTFACH_ID = UUID.randomUUID().toString(); public static final String POSTFACH_ID = UUID.randomUUID().toString();
public static final String FIELD_POSTFACH_ID = "postfachId";
public static final int TYPE = 1; public static final int TYPE = 1;
public static final String VERSION = "1.0"; public static final String VERSION = "1.0";
...@@ -43,6 +44,6 @@ public class PostfachAddressTestFactory { ...@@ -43,6 +44,6 @@ public class PostfachAddressTestFactory {
return Vorgang.PostfachAddress.builder() return Vorgang.PostfachAddress.builder()
.type(TYPE) .type(TYPE)
.version(VERSION) .version(VERSION)
.identifier(Map.of(NachrichtService.FIELD_POSTFACH_ID, POSTFACH_ID)); .identifier(Map.of(FIELD_POSTFACH_ID, POSTFACH_ID));
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment